OSDN Git Service

画面クリアまで
authorSFPGMR <sfpg@git.sourceforge.jp>
Fri, 1 Jul 2011 12:01:56 +0000 (21:01 +0900)
committerSFPGMR <sfpg@git.sourceforge.jp>
Fri, 1 Jul 2011 12:01:56 +0000 (21:01 +0900)
dxgi_test/toplevel_window.cpp

index a07f2af..9b42497 100644 (file)
@@ -334,6 +334,8 @@ struct toplevel_window::impl : public base_win32_window
 
   virtual void discard_device()
   {
+    safe_release(view_);
+    safe_release(texture_);
     safe_release(render_target_);
     safe_release(swap_chain_);
     safe_release(d3d_context_);
@@ -342,29 +344,27 @@ struct toplevel_window::impl : public base_win32_window
   }
 
   virtual void create_device(){
-    //         入力_.reset(new input(HINST_THISCOMPONENT,hwnd_));
     HRESULT hr = S_OK;
 
     //ウィンドウの現在の幅、高さを求める
-
-    RECT rc;
-    GetClientRect( hwnd_, &rc );
-    uint32_t width = rc.right - rc.left;
-    uint32_t height = rc.bottom - rc.top;
+    //RECT rc;
+    //GetClientRect( hwnd_, &rc );
+    //uint32_t width = rc.right - rc.left;
+    //uint32_t height = rc.bottom - rc.top;
 
     // アダプタデバイス情報の取得
     //LARGE_INTEGER version;
     THROW_IFERR(dxgi_factory_->EnumAdapters1(0,&adapter_));
     //THROW_IFERR(adapter_->CheckInterfaceSupport( __uuidof(ID3D10Device),&version));
-    
-    
+
+
     // D3DDeviceの作成
 
     std::vector<D3D_FEATURE_LEVEL> feature_levels = 
       boost::assign::list_of<D3D_FEATURE_LEVEL>
-    (   D3D_FEATURE_LEVEL_11_0 )        // DirectX11対応GPU
-    (    D3D_FEATURE_LEVEL_10_1)        // DirectX10.1対応GPU
-    (   D3D_FEATURE_LEVEL_10_0 );       // DirectX10対応GPU
+      (D3D_FEATURE_LEVEL_11_0 )        // DirectX11対応GPU
+      (D3D_FEATURE_LEVEL_10_1)        // DirectX10.1対応GPU
+      (D3D_FEATURE_LEVEL_10_0 );       // DirectX10対応GPU
 
     D3D_FEATURE_LEVEL level;
     THROW_IFERR(::D3D11CreateDevice(
@@ -379,68 +379,41 @@ struct toplevel_window::impl : public base_win32_window
       &level,
       &d3d_context_));
 
-
-
+    THROW_IFERR(adapter_->EnumOutputs(0,&output_));
+
+    // 表示モード
+    DXGI_MODE_DESC desired_desc = {} , actual_desc = {};
+    // 各色8ビットで符号化なし正規化数
+    desired_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
+    desired_desc.Height = 480;// 高さ
+    desired_desc.Width = 640;// 幅
+    desired_desc.Scaling = DXGI_MODE_SCALING_CENTERED;// スケーリングなし
+    // リフレッシュレートを60Hzを要求する
+    desired_desc.RefreshRate.Numerator = 60000;
+    desired_desc.RefreshRate.Denominator = 1000;
+    // 近いモードを検索
+    output_->FindClosestMatchingMode(&desired_desc,&actual_desc,d3d_device_);
 
     // スワップチェーンの作成
     {
       DXGI_SWAP_CHAIN_DESC desc = {};
-      
-                       desc.BufferDesc.Width = width;
-      desc.BufferDesc.Height = height;
-      desc.BufferDesc.Format   = DXGI_FORMAT_B8G8R8A8_UNORM;
-                       desc.SampleDesc.Count   = 1;
-                       desc.BufferUsage                        = DXGI_USAGE_RENDER_TARGET_OUTPUT;
-                       desc.BufferCount                        = 1;
-                       desc.OutputWindow               = hwnd_;
-                       desc.SwapEffect                 = DXGI_SWAP_EFFECT_DISCARD;
-                       desc.Windowed                   = TRUE;
+
+      desc.BufferDesc = actual_desc;
+      desc.SampleDesc.Count    = 1;
+      desc.BufferUsage                 = DXGI_USAGE_RENDER_TARGET_OUTPUT;
+      desc.BufferCount                 = 1;
+      desc.OutputWindow                = hwnd_;
+      desc.SwapEffect                  = DXGI_SWAP_EFFECT_DISCARD;
+      desc.Windowed                    = TRUE;
       desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
-      
+
       THROW_IFERR(dxgi_factory_->CreateSwapChain(d3d_device_,&desc,&swap_chain_));
-      //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory);
-      //                       bitmap_ = load_bitmap_from_file(render_target_,wic_imaging_factory_,L"myship.png");
+
     }
 
-    // DXGIスワップチェーンの作成(デフォルトアダプタ)
-
-    //if(!render_target_)
-    //{
-    //  RECT rc;
-    //  GetClientRect(hwnd_, &rc);
-
-    //  D2D1_SIZE_U size = D2D1::SizeU(
-    //    rc.right - rc.left,
-    //    rc.bottom - rc.top
-    //    );
-    //  
-    //  const D2D1_PIXEL_FORMAT format =
-    //      D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
-    //                        D2D1_ALPHA_MODE_PREMULTIPLIED);
-    //  
-    //  const D2D1_RENDER_TARGET_PROPERTIES target_prop = 
-    //      D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,format);
-
-    //  THROW_IFERR(factory_->CreateHwndRenderTarget(
-    //    target_prop,
-    //    D2D1::HwndRenderTargetProperties(hwnd_, size,D2D1_PRESENT_OPTIONS_IMMEDIATELY),
-    //    &render_target_
-    //    ));
-    //  // Create a DC render target 
-    //  //D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(
-    //  //     D2D1_RENDER_TARGET_TYPE_DEFAULT,
-    //  //     D2D1::PixelFormat(
-    //  //             DXGI_FORMAT_B8G8R8A8_UNORM,
-    //  //             D2D1_ALPHA_MODE_IGNORE
-    //  //             ) , 0.0, 0.0,
-    //  //     D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE
-    //  //     );
-
-    //  //THROW_IFERR(factory_->CreateDCRenderTarget(
-    //  //     &props,
-    //  //     &render_target_
-    //  //     ));
-    //}
+    // ビューの作成
+    THROW_IFERR(swap_chain_->GetBuffer(0,texture_.GetIID(),(void**)&texture_));
+    THROW_IFERR(d3d_device_->CreateRenderTargetView(texture_,0,&view_));
   }
 
   virtual void create_device_independent_resources()
@@ -503,6 +476,8 @@ struct toplevel_window::impl : public base_win32_window
     static int t = 0;
     if(swap_chain_)
     {
+      float color[4] = { 0.7f, 0.0f, 0.0f, 1.0f };    
+      d3d_context_->ClearRenderTargetView(view_,color);
       swap_chain_->Present(0,0);
     }
 
@@ -632,8 +607,11 @@ private:
 
   IDXGIFactory1Ptr dxgi_factory_;
   IDXGIAdapter1Ptr adapter_;
+  IDXGIOutputPtr output_;
   ID3D11DevicePtr d3d_device_;
   ID3D11DeviceContextPtr d3d_context_;
+  ID3D11Texture2DPtr texture_;
+  ID3D11RenderTargetViewPtr view_;
 
   //IDXGISwapChainPtr; 
   ID2D1FactoryPtr factory_;