/src/Core_WindowEvents/Win32D3D10/RenderContextPimpl_DIRECTX10.cpp

http://github.com/Akranar/daguerreo · C++ · 210 lines · 122 code · 56 blank · 32 comment · 0 complexity · 1efb9fb2009e7fa7dfdf5a9e3e749bac MD5 · raw file

  1. #include "RenderContextPimpl_DIRECTX10.h"
  2. #include "WindowData_DIRECTX10.h"
  3. #include "../WindowPixelFormat.h"
  4. #include "../RenderContext.h"
  5. #include <iostream>
  6. RenderContextPimpl::RenderContextPimpl(WindowData * window_data, const WindowPixelFormat * pixel_format)
  7. {
  8. // Initializing Direct3D
  9. // 1. Create ID3D10Device and IDXGISwapChain with D3D10CreateDeviceAndSwapChain.
  10. // 2. Create the Render Target View To Back Buffer.
  11. // 3. Set Viewport.
  12. // 4. Set Projection and View Matrices.
  13. //int width = 800;
  14. //int height = 600;
  15. int width = 1920;
  16. int height = 1080;
  17. //1. Create ID3D10Device and IDXGISwapChain with D3D10CreateDeviceAndSwapChain {
  18. DXGI_SWAP_CHAIN_DESC swap_chain_description;
  19. //Back buffer descriptions
  20. swap_chain_description.BufferDesc.Width = width; // use window’s client area dims
  21. swap_chain_description.BufferDesc.Height = height;
  22. swap_chain_description.BufferDesc.RefreshRate.Numerator = 60;
  23. swap_chain_description.BufferDesc.RefreshRate.Denominator = 1;
  24. swap_chain_description.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  25. swap_chain_description.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
  26. swap_chain_description.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
  27. // Sampling descriptions
  28. swap_chain_description.SampleDesc.Count = 1;
  29. swap_chain_description.SampleDesc.Quality = 0;
  30. // Swap chain descriptions
  31. swap_chain_description.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  32. swap_chain_description.BufferCount = 1;
  33. swap_chain_description.OutputWindow = window_data->GetWindowHandle();
  34. swap_chain_description.Windowed = true;
  35. swap_chain_description.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
  36. swap_chain_description.Flags = 0;
  37. UINT createDeviceFlags = 0;
  38. D3D10CreateDeviceAndSwapChain(0, D3D10_DRIVER_TYPE_HARDWARE, 0, createDeviceFlags, D3D10_SDK_VERSION,
  39. &swap_chain_description, &swap_chain, &d3d_device);
  40. //1. Create ID3D10Device and IDXGISwapChain with D3D10CreateDeviceAndSwapChain. }
  41. //2. Create the Render Target View To Back Buffer. {
  42. ID3D10Texture2D* back_buffer;
  43. swap_chain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&back_buffer);
  44. d3d_device->CreateRenderTargetView(back_buffer, NULL, &render_target_view);
  45. back_buffer->Release();
  46. D3D10_TEXTURE2D_DESC descDepth;
  47. descDepth.Width = width;
  48. descDepth.Height = height;
  49. descDepth.MipLevels = 1;
  50. descDepth.ArraySize = 1;
  51. descDepth.Format = DXGI_FORMAT_D32_FLOAT;
  52. descDepth.SampleDesc.Count = 1;
  53. descDepth.SampleDesc.Quality = 0;
  54. descDepth.Usage = D3D10_USAGE_DEFAULT;
  55. descDepth.BindFlags = D3D10_BIND_DEPTH_STENCIL;
  56. descDepth.CPUAccessFlags = 0;
  57. descDepth.MiscFlags = 0;
  58. d3d_device->CreateTexture2D(&descDepth, NULL, &depth_stencil);
  59. D3D10_DEPTH_STENCIL_VIEW_DESC descDSV;
  60. descDSV.Format = descDepth.Format;
  61. descDSV.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2D;
  62. descDSV.Texture2D.MipSlice = 0;
  63. d3d_device->CreateDepthStencilView(depth_stencil, &descDSV, &depth_stencil_view);
  64. d3d_device->OMSetRenderTargets(1, &render_target_view, depth_stencil_view);
  65. //2. Create the Render Target View To Back Buffer. }
  66. //3. Set Viewport. {
  67. D3D10_VIEWPORT view_port;
  68. view_port.Width = width;
  69. view_port.Height = height;
  70. view_port.MinDepth = 0.0f;
  71. view_port.MaxDepth = 1.0f;
  72. view_port.TopLeftX = 0;
  73. view_port.TopLeftY = 0;
  74. d3d_device->RSSetViewports(1, &view_port);
  75. //3. Set Viewport. }
  76. }
  77. RenderContextPimpl::RenderContextPimpl(WindowData * window_data, const RenderContext * render_context)
  78. {
  79. // Initializing Direct3D
  80. // 1. Create ID3D10Device and IDXGISwapChain with D3D10CreateDeviceAndSwapChain.
  81. // 2. Create the Render Target View To Back Buffer.
  82. // 3. Set Viewport.
  83. // 4. Set Projection and View Matrices.
  84. //int width = 800;
  85. //int height = 600;
  86. int width = 1024;
  87. int height = 768;
  88. //1. Create ID3D10Device and IDXGISwapChain with D3D10CreateDeviceAndSwapChain {
  89. DXGI_SWAP_CHAIN_DESC swap_chain_description;
  90. //Back buffer descriptions
  91. swap_chain_description.BufferDesc.Width = width; // use window’s client area dims
  92. swap_chain_description.BufferDesc.Height = height;
  93. swap_chain_description.BufferDesc.RefreshRate.Numerator = 60;
  94. swap_chain_description.BufferDesc.RefreshRate.Denominator = 1;
  95. swap_chain_description.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  96. swap_chain_description.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
  97. swap_chain_description.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
  98. // Sampling descriptions
  99. swap_chain_description.SampleDesc.Count = 1;
  100. swap_chain_description.SampleDesc.Quality = 0;
  101. // Swap chain descriptions
  102. swap_chain_description.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
  103. swap_chain_description.BufferCount = 1;
  104. swap_chain_description.OutputWindow = window_data->GetWindowHandle();
  105. swap_chain_description.Windowed = true;
  106. swap_chain_description.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
  107. swap_chain_description.Flags = 0;
  108. UINT createDeviceFlags = 0;
  109. D3D10CreateDeviceAndSwapChain(0, D3D10_DRIVER_TYPE_HARDWARE, 0, createDeviceFlags, D3D10_SDK_VERSION,
  110. &swap_chain_description, &swap_chain, &d3d_device);
  111. //1. Create ID3D10Device and IDXGISwapChain with D3D10CreateDeviceAndSwapChain. }
  112. //2. Create the Render Target View To Back Buffer. {
  113. ID3D10Texture2D* back_buffer;
  114. swap_chain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&back_buffer);
  115. d3d_device->CreateRenderTargetView(back_buffer, NULL, &render_target_view);
  116. back_buffer->Release();
  117. D3D10_TEXTURE2D_DESC descDepth;
  118. descDepth.Width = width;
  119. descDepth.Height = height;
  120. descDepth.MipLevels = 1;
  121. descDepth.ArraySize = 1;
  122. descDepth.Format = DXGI_FORMAT_D32_FLOAT;
  123. descDepth.SampleDesc.Count = 1;
  124. descDepth.SampleDesc.Quality = 0;
  125. descDepth.Usage = D3D10_USAGE_DEFAULT;
  126. descDepth.BindFlags = D3D10_BIND_DEPTH_STENCIL;
  127. descDepth.CPUAccessFlags = 0;
  128. descDepth.MiscFlags = 0;
  129. d3d_device->CreateTexture2D(&descDepth, NULL, &depth_stencil);
  130. D3D10_DEPTH_STENCIL_VIEW_DESC descDSV;
  131. descDSV.Format = descDepth.Format;
  132. descDSV.ViewDimension = D3D10_DSV_DIMENSION_TEXTURE2D;
  133. descDSV.Texture2D.MipSlice = 0;
  134. d3d_device->CreateDepthStencilView(depth_stencil, &descDSV, &depth_stencil_view);
  135. d3d_device->OMSetRenderTargets(1, &render_target_view, depth_stencil_view);
  136. //2. Create the Render Target View To Back Buffer. }
  137. //3. Set Viewport. {
  138. D3D10_VIEWPORT view_port;
  139. view_port.Width = width;
  140. view_port.Height = height;
  141. view_port.MinDepth = 0.0f;
  142. view_port.MaxDepth = 1.0f;
  143. view_port.TopLeftX = 0;
  144. view_port.TopLeftY = 0;
  145. d3d_device->RSSetViewports(1, &view_port);
  146. //3. Set Viewport. }
  147. }
  148. RenderContextPimpl::~RenderContextPimpl()
  149. {
  150. d3d_device->Release();
  151. swap_chain->Release();
  152. render_target_view->Release();
  153. depth_stencil_view->Release();
  154. }