raSystem  1.0 bata
raDirectX.cpp
Go to the documentation of this file.
1 #include "..\include\raMain.h"
2 
3 namespace System
4 {
5  D3D_DRIVER_TYPE driverTypes[] =
6  {
7  D3D_DRIVER_TYPE_HARDWARE,
8  D3D_DRIVER_TYPE_WARP,
9  };
10  UINT numDriverTypes = ARRAYSIZE( driverTypes );
11 
12  D3D_FEATURE_LEVEL featureLevels[] =
13  {
14  D3D_FEATURE_LEVEL_11_0,
15  D3D_FEATURE_LEVEL_10_1
16  };
17  UINT numFeatureLevels = ARRAYSIZE( featureLevels );
18 
20  {
21  m_pDevice = NULL;
22  m_pSwapChain = NULL;
23  m_pImmediateContext = NULL;
24  m_pRenderTargetView = NULL;
25  m_standby = false;
26  m_pDXGIOutput = NULL;
27  m_withwarp = usedwarp;
28  }
29 
31  {
32  }
33  bool raDirectX::Init(HWND wnd)
34  {
35  RECT rc;
36  m_clientWindow = wnd;
37 
38  GetClientRect(m_clientWindow, &rc);
39  UINT width = rc.right - rc.left;
40  UINT height = rc.bottom - rc.top;
41 
42  m_DriverName = "DirectX11";
43 
44  ZeroMemory( &m_swapChainDesc, sizeof( m_swapChainDesc ) );
45  m_swapChainDesc.BufferCount = 1;
46  m_swapChainDesc.BufferDesc.Width = width;
47  m_swapChainDesc.BufferDesc.Height = height;
48  m_swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
49  m_swapChainDesc.BufferDesc.RefreshRate.Numerator = raConfigLoader::GetConfig().vsync ? 60 : 0;
50  m_swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
51  m_swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
52  m_swapChainDesc.OutputWindow = m_clientWindow;
53  m_swapChainDesc.SampleDesc.Count = raConfigLoader::GetConfig().MultiSamplingCount;
54  m_swapChainDesc.SampleDesc.Quality = raConfigLoader::GetConfig().MultiSamplingQualitet;
55 
56  m_swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
57  m_swapChainDesc.Windowed = !raConfigLoader::GetConfig().FullScreen;
59 
60  HRESULT hr = S_OK;
61 
62  if(m_withwarp)
63  {
64  for( int driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
65  {
66  m_driverType = driverTypes[driverTypeIndex];
67 
68  hr = D3D11CreateDeviceAndSwapChain(NULL,m_driverType, NULL, 0,
69  featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &m_swapChainDesc, &m_pSwapChain, &m_pDevice, m_featureLevel,
70  &m_pImmediateContext);
71 
72  if( SUCCEEDED( hr ) )
73  break;
74  }
75  }
76  else
77  {
78  RINFO("Verwende nur Hardware Treiber");
79 
80  m_driverType = D3D_DRIVER_TYPE_HARDWARE;
81  hr = D3D11CreateDeviceAndSwapChain( NULL ,D3D_DRIVER_TYPE_HARDWARE, NULL, 0,
82  featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &m_swapChainDesc, &m_pSwapChain, &m_pDevice, m_featureLevel,
83  &m_pImmediateContext);
84  }
85 
86  if(FAILED(hr))
87  {
88  RERROR_DX11("D3D11CreateDeviceAndSwapChain", hr);
89  return false;
90  }
91 
92  ROK("D3D11 Device und SwapChain erstellt");
93 
94  // set default render state to msaa enabled
95  ZeroMemory(&m_RSDesc, sizeof(m_RSDesc));
96  m_RSDesc.FillMode = D3D11_FILL_SOLID;
97  m_RSDesc.CullMode = D3D11_CULL_BACK;
98  m_RSDesc.FrontCounterClockwise = false;
99  m_RSDesc.DepthBias = 0;
100  m_RSDesc.DepthBiasClamp = 0.0f;
101  m_RSDesc.SlopeScaledDepthBias = 0.0f;
102  m_RSDesc.DepthClipEnable = true;
103  m_RSDesc.ScissorEnable = false;
104  m_RSDesc.MultisampleEnable = true;
105  m_RSDesc.AntialiasedLineEnable = false;
106 
107  hr = m_pDevice->CreateRasterizerState(&m_RSDesc, &m_pRS);
108  if ( FAILED( hr ) )
109  {
110  RERROR_DX11("CreateRasterizerState", hr);
111  return false;
112  }
113  this->m_pImmediateContext->RSSetState(m_pRS);
114 
115  // Create a render target view
116  ID3D11Texture2D* pBackBuffer = NULL;
117  D3D11_TEXTURE2D_DESC backBufferDesc;
118 
119  hr = m_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
120  if( FAILED( hr ) )
121  {
122  RERROR_DX11("GetBuffer", hr);
123  return false;
124  }
125 
126  // Get back-buffer surface description
127  pBackBuffer->GetDesc(&backBufferDesc);
128 
129  hr = m_pDevice->CreateRenderTargetView( pBackBuffer, NULL, &m_pRenderTargetView );
130  pBackBuffer->Release();
131  if( FAILED( hr ) )
132  {
133  RERROR_DX11("CreateRenderTargetView", hr);
134  return false;
135  }
136 
137  ROK("Render Target View erstellt");
138 
139  // Create depth stencil texture
140  ZeroMemory( &m_depthBufferDesc, sizeof(m_depthBufferDesc) );
141  m_depthBufferDesc.Width = backBufferDesc.Width;
142  m_depthBufferDesc.Height = backBufferDesc.Height;
143  m_depthBufferDesc.MipLevels = 1;
144  m_depthBufferDesc.ArraySize = 1;
145  m_depthBufferDesc.Format = DXGI_FORMAT_D32_FLOAT;
146  m_depthBufferDesc.SampleDesc = backBufferDesc.SampleDesc;
147  m_depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
148  m_depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
149  m_depthBufferDesc.CPUAccessFlags = 0;
150  m_depthBufferDesc.MiscFlags = 0;
151 
152  m_Synce = raConfigLoader::GetConfig().vsync ? 1 : 0;
153 
154  if(FAILED(hr = m_pDevice->CreateTexture2D(&m_depthBufferDesc, NULL, &m_pDepthStencil )))
155  {
156  RERROR_DX11("CreateTexture2D", hr);
157  return false;
158  }
159  ROK("DepthStencilTexture erstellt");
160 
161  // Create the depth stencil view
162  ZeroMemory( &m_descDSV, sizeof(m_descDSV) );
163 
164  m_descDSV.Format = m_depthBufferDesc.Format;
165  if (m_depthBufferDesc.SampleDesc.Count > 1) m_descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS;
166  else m_descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
167  m_descDSV.Texture2D.MipSlice = 0;
168 
169  if(FAILED(hr = m_pDevice->CreateDepthStencilView(m_pDepthStencil, &m_descDSV, &m_pDSV )))
170  {
171  RERROR_DX11("CreateDepthStencilView", hr);
172  return false;
173  }
174  // bind the render target
175  m_pImmediateContext->OMSetRenderTargets( 1, &m_pRenderTargetView, m_pDSV );
176 
177  ROK("DepthStencilView erstellt und gebunden");
178 
179  // Setup the viewport
180  m_vp.Width = (FLOAT)width;
181  m_vp.Height = (FLOAT)height;
182  m_vp.MinDepth = 0.0f;
183  m_vp.MaxDepth = 1.0f;
184  m_vp.TopLeftX = 0;
185  m_vp.TopLeftY = 0;
186  m_pImmediateContext->RSSetViewports( 1, &m_vp );
187 
188  hr = m_pDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&m_pDXGIDevice);
189  if(FAILED(hr))
190  {
191  RERROR_DX11("ID3D11Device::QueryInterface (IDXGIDevice)", hr);
192  return false;
193  }
194 
195  hr = m_pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&m_pDXGIAdapter);
196  if(FAILED(hr))
197  {
198  RERROR_DX11("IDXGIIDevice::GetParent (IDXGIAdapter)", hr);
199  return false;
200  }
201 
202  hr = m_pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&m_pIDXGIFactory);
203  if(FAILED(hr))
204  {
205  RERROR_DX11("IDXGIAdapter::GetParent (IDXGIFactory)", hr);
206  return false;
207  }
208 
209  m_pIDXGIFactory->MakeWindowAssociation(wnd, 0);
210 
211  m_pSwapChain->GetContainingOutput(&m_pDXGIOutput);
212 
213  ROK("raDirectX erfolgreich initialisiert");
214 
215  m_standby = false;
216  return true;
217  }
219  {
220  if(m_pImmediateContext)
221  {
222  m_pImmediateContext->ClearState();
223  m_pImmediateContext->Flush();
224  }
225 
226  SAFE_RELEASE(m_pRenderTargetView);
227  SAFE_RELEASE(m_pSwapChain);
228  SAFE_RELEASE(m_pImmediateContext);
229  SAFE_RELEASE(m_pDevice);
230  SAFE_RELEASE(m_pDSV);
231  SAFE_RELEASE(m_pDXGIDevice);
232  SAFE_RELEASE(m_pIDXGIFactory);
233  SAFE_RELEASE(m_pDXGIAdapter);
234 
235  m_standby = true;
236  }
237  void raDirectX::Clear(raColor clearColor, UINT ClearFlag, float Depth, UINT8 Stencil )
238  {
239  if(m_standby || !m_pImmediateContext ) return;
240 
241  m_pImmediateContext->ClearRenderTargetView(m_pRenderTargetView, clearColor);
242  m_pImmediateContext->ClearDepthStencilView(m_pDSV, ClearFlag, Depth, Stencil );
243  }
245  {
246  if(m_standby || !m_pImmediateContext ) return;
247  m_pImmediateContext->DrawAuto();
248  }
249  void raDirectX::DrawIndexed(unsigned int numTriangles)
250  {
251  if(m_standby || !m_pImmediateContext ) return;
252  m_pImmediateContext->DrawIndexed(numTriangles, 0, 0);
253  }
255  {
256  if(m_standby || !m_pImmediateContext ) return;
257 
258  m_pSwapChain->Present(m_Synce, 0);
259  }
261  {
262  HRESULT hr = S_OK;
263 
264  if(m_standby || !m_pImmediateContext ) return false;
265 
266  m_standby = true;
267 
269  if (m_IsFullScreen)
270  {
271  DXGI_MODE_DESC adapterDesktopDisplayMode =
272  {
273  800, 600, { 60, 1 }, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
274  };
275  adapterDesktopDisplayMode.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
276  adapterDesktopDisplayMode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
277 
278  DXGI_OUTPUT_DESC Desc;
279  m_pDXGIOutput->GetDesc( &Desc );
280  adapterDesktopDisplayMode.Width = Desc.DesktopCoordinates.right - Desc.DesktopCoordinates.left;
281  adapterDesktopDisplayMode.Height = Desc.DesktopCoordinates.bottom - Desc.DesktopCoordinates.top;
282 
283  m_swapChainDesc.BufferDesc = adapterDesktopDisplayMode;
284  }
285  else
286  {
287  RECT r;
288  GetWindowRect(this->GetClientWindow(), &r);
289 
290  m_swapChainDesc.BufferDesc.Height = r.bottom;
291  m_swapChainDesc.BufferDesc.Width = r.right;
292  }
293 
294  if(m_IsFullScreen == false)
295  m_pSwapChain->SetFullscreenState(false, NULL);
296  else
297  m_pSwapChain->SetFullscreenState(false, m_pDXGIOutput);
298 
299  m_pSwapChain->ResizeBuffers(
300  m_swapChainDesc.BufferCount,
301  m_swapChainDesc.BufferDesc.Width,
302  m_swapChainDesc.BufferDesc.Height,
303  m_swapChainDesc.BufferDesc.Format,
304  m_swapChainDesc.Flags);
305 
306  return true;
307  }
308  bool raDirectX::Resize(void)
309  {
310  RECT rcCurrentClient;
311  GetWindowRect(m_clientWindow, &rcCurrentClient);
312 
313  UINT width = rcCurrentClient.right - rcCurrentClient.left;
314  UINT height = rcCurrentClient.bottom - rcCurrentClient.top;
315 
316  m_pSwapChain->GetFullscreenState((BOOL*)&m_IsFullScreen, NULL);
317  if(!m_pDevice && m_IsFullScreen) return false;
318 
319  m_standby = true;
320 
321  m_pImmediateContext->OMSetRenderTargets(0, 0, 0);
322 
323  SAFE_RELEASE(m_pRenderTargetView);
324 
325  m_swapChainDesc.BufferDesc.Width = width;
326  m_swapChainDesc.BufferDesc.Height = height;
327 
328  m_pSwapChain->ResizeBuffers(
329  m_swapChainDesc.BufferCount,
330  width,
331  height,
332  m_swapChainDesc.BufferDesc.Format,
333  m_swapChainDesc.Flags);
334 
335  // Create a render target view
336  ID3D11Texture2D* pBackBuffer = NULL;
337  HRESULT hr = m_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
338  if( FAILED( hr ) )
339  {
340  RERROR_DX11("GetBuffer", hr);
341  return false;
342  }
343 
344  hr = m_pDevice->CreateRenderTargetView( pBackBuffer, NULL, &m_pRenderTargetView );
345  pBackBuffer->Release();
346  if( FAILED( hr ) )
347  {
348  RERROR_DX11("CreateRenderTargetView", hr);
349  return false;
350  }
351 
352  SAFE_RELEASE(pBackBuffer);
353 
354  m_depthBufferDesc.Width = width;
355  m_depthBufferDesc.Height = height;
356 
357  if(FAILED(hr = m_pDevice->CreateTexture2D(&m_depthBufferDesc, NULL, &m_pDepthStencil )))
358  {
359  RERROR_DX11("CreateTexture2D", hr);
360  return false;
361  }
362  ROK("DepthStencilTexture erstellt");
363 
364  if(FAILED(m_pDevice->CreateDepthStencilView(m_pDepthStencil, &m_descDSV, &m_pDSV )))
365  {
366  RERROR_DX11("CreateDepthStencilView", hr);
367  return false;
368  }
369  // bind the render target
370  m_pImmediateContext->OMSetRenderTargets( 1, &m_pRenderTargetView, m_pDSV );
371 
372  ROK("DepthStencilView erstellt und gebunden");
373 
374  // Setup the viewport
375  m_vp.Width = (FLOAT)width;
376  m_vp.Height = (FLOAT)height;
377  m_vp.MinDepth = 0.0f;
378  m_vp.MaxDepth = 1.0f;
379  m_vp.TopLeftX = 0;
380  m_vp.TopLeftY = 0;
381  m_pImmediateContext->RSSetViewports( 1, &m_vp );
382 
383  m_standby = false;
384 
385  return true;
386  }
388  {
389  m_standby = true;
390  static int m_Frame = 0;
391  m_Frame++;
392 
393  char buf[260];
394  sprintf(buf, "%s_%d.png", SaveFile, m_Frame);
395 
396  ID3D11Texture2D* pBackBuffer;
397  HRESULT hr = m_pSwapChain->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer );
398  if (hr != S_OK)
399  return;
400 
401  D3D11_TEXTURE2D_DESC dsc;
402  pBackBuffer->GetDesc(&dsc);
403  D3D11_RESOURCE_DIMENSION dim;
404  pBackBuffer->GetType(&dim);
405 
406  ID3D11Texture2D *pCompatableTexture = pBackBuffer;
407  if ( dsc.SampleDesc.Count > 1)
408  {
409  D3D11_TEXTURE2D_DESC dsc_new = dsc;
410  dsc_new.SampleDesc.Count = 1;
411  dsc_new.SampleDesc.Quality = 0;
412  dsc_new.Usage = D3D11_USAGE_DEFAULT;
413  dsc_new.BindFlags = 0;
414  dsc_new.CPUAccessFlags = 0;
415  ID3D11Texture2D *resolveTexture;
416  hr = m_pDevice->CreateTexture2D(&dsc_new, NULL, &resolveTexture);
417  if ( SUCCEEDED(hr) )
418  {
419  this->m_pImmediateContext->ResolveSubresource(resolveTexture, 0, pBackBuffer, 0, dsc.Format);
420  pCompatableTexture = resolveTexture;
421  }
422  pCompatableTexture->GetDesc(&dsc);
423  }
424 
425  hr = D3DX11SaveTextureToFile(this->m_pImmediateContext, pCompatableTexture, D3DX11_IFF_PNG, buf);
426 
427  SAFE_RELEASE(pBackBuffer);
428  SAFE_RELEASE(pCompatableTexture);
429 
430  m_standby = false;
431  }
432  long raDirectX::OnKeyUp(HWND wnd, WPARAM wParam, LPARAM lParam)
433  {
434  switch(wParam)
435  {
436  case RKEY_F11:
437  _mkdir("raScreenShots");
438  this->CreateScreenShot("raScreenShots\\raShot_");
439  break;
440  case RKEY_F10:
441  this->ChangeMode();
442  break;
443  };
444  return 0;
445  }
446  long raDirectX::OnKeyDown(HWND wnd, WPARAM wParam, LPARAM lParam)
447  {
448  return 0;
449  }
450  long raDirectX::OnClose(HWND wnd, WPARAM wParam, LPARAM lParam)
451  {
452  return 0;
453  }
454  long raDirectX::OnSize(HWND wnd, WPARAM wParam, LPARAM lParam)
455  {
456  if( SIZE_MINIMIZED == wParam )
457  {
458  m_standby = true;
459  }
460  else if( SIZE_MAXIMIZED == wParam )
461  {
462  m_standby = false;
463  this->Resize();
464  }
465  else if( SIZE_RESTORED == wParam )
466  {
467  m_standby = false;
468  this->Resize();
469  }
470  return 0;
471  }
472  long raDirectX::OnPaint(HWND wnd, WPARAM wParam, LPARAM lParam)
473  {
474  return 0;
475  }
476 };
D3D_FEATURE_LEVEL featureLevels[]
Definition: raDirectX.cpp:12
virtual bool Init(HWND wnd)
Definition: raDirectX.cpp:33
virtual void DrawIndexed(unsigned int numTriangles)
Definition: raDirectX.cpp:249
virtual bool ChangeMode(void)
Definition: raDirectX.cpp:260
virtual void Exit(void)
Definition: raDirectX.cpp:218
HWND GetClientWindow(void)
virtual ~raDirectX(void)
Definition: raDirectX.cpp:30
int MultiSamplingQualitet
Definition: raColor.h:5
void RAPI RERROR_DX11(raString x, HRESULT h)
Definition: raMain.cpp:156
virtual bool Resize(void)
Definition: raDirectX.cpp:308
#define RKEY_F11
Definition: raInputMap.h:14
#define RKEY_F10
Definition: raInputMap.h:13
virtual long OnPaint(HWND wnd, WPARAM wParam, LPARAM lParam)
Definition: raDirectX.cpp:472
virtual void CreateScreenShot(const raString SaveFile)
Definition: raDirectX.cpp:387
UINT numFeatureLevels
Definition: raDirectX.cpp:17
virtual long OnKeyUp(HWND wnd, WPARAM wParam, LPARAM lParam)
Definition: raDirectX.cpp:432
virtual long OnSize(HWND wnd, WPARAM wParam, LPARAM lParam)
Definition: raDirectX.cpp:454
raDirectX(void)
Definition: raDirectX.h:8
virtual long OnKeyDown(HWND wnd, WPARAM wParam, LPARAM lParam)
Definition: raDirectX.cpp:446
UINT numDriverTypes
Definition: raDirectX.cpp:10
bool FullScreen
int MultiSamplingCount
std::string raString
Definition: raMain.h:107
static raConfig GetConfig()
void RAPI ROK(raString x)
Definition: raMain.cpp:114
unsigned char UINT8
Definition: d3dx11dbg.h:34
virtual void Present()
Definition: raDirectX.cpp:254
#define SAFE_RELEASE(p)
Definition: d3dxGlobal.h:22
virtual void DrawAuto()
Definition: raDirectX.cpp:244
D3D_DRIVER_TYPE driverTypes[]
Definition: raDirectX.cpp:5
void RAPI RINFO(raString x)
Definition: raMain.cpp:119
virtual void Clear(raColor clearColor, UINT ClearFlag=D3D11_CLEAR_DEPTH, float Depth=1.0f, UINT8 Stencil=0)
Definition: raDirectX.cpp:237
virtual long OnClose(HWND wnd, WPARAM wParam, LPARAM lParam)
Definition: raDirectX.cpp:450