1 #include "..\include\raMain.h" 7 D3D_DRIVER_TYPE_HARDWARE,
14 D3D_FEATURE_LEVEL_11_0,
15 D3D_FEATURE_LEVEL_10_1
23 m_pImmediateContext = NULL;
24 m_pRenderTargetView = NULL;
27 m_withwarp = usedwarp;
39 UINT width = rc.right - rc.left;
40 UINT height = rc.bottom - rc.top;
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;
50 m_swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
51 m_swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
56 m_swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
64 for(
int driverTypeIndex = 0; driverTypeIndex <
numDriverTypes; driverTypeIndex++ )
66 m_driverType = driverTypes[driverTypeIndex];
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);
78 RINFO(
"Verwende nur Hardware Treiber");
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);
92 ROK(
"D3D11 Device und SwapChain erstellt");
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;
107 hr = m_pDevice->CreateRasterizerState(&m_RSDesc, &m_pRS);
113 this->m_pImmediateContext->RSSetState(m_pRS);
116 ID3D11Texture2D* pBackBuffer = NULL;
117 D3D11_TEXTURE2D_DESC backBufferDesc;
119 hr = m_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
127 pBackBuffer->GetDesc(&backBufferDesc);
129 hr = m_pDevice->CreateRenderTargetView( pBackBuffer, NULL, &m_pRenderTargetView );
130 pBackBuffer->Release();
137 ROK(
"Render Target View erstellt");
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;
154 if(FAILED(hr = m_pDevice->CreateTexture2D(&m_depthBufferDesc, NULL, &m_pDepthStencil )))
159 ROK(
"DepthStencilTexture erstellt");
162 ZeroMemory( &m_descDSV,
sizeof(m_descDSV) );
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;
169 if(FAILED(hr = m_pDevice->CreateDepthStencilView(m_pDepthStencil, &m_descDSV, &m_pDSV )))
175 m_pImmediateContext->OMSetRenderTargets( 1, &m_pRenderTargetView, m_pDSV );
177 ROK(
"DepthStencilView erstellt und gebunden");
180 m_vp.Width = (FLOAT)width;
181 m_vp.Height = (FLOAT)height;
182 m_vp.MinDepth = 0.0f;
183 m_vp.MaxDepth = 1.0f;
186 m_pImmediateContext->RSSetViewports( 1, &m_vp );
188 hr = m_pDevice->QueryInterface(__uuidof(IDXGIDevice), (
void **)&m_pDXGIDevice);
191 RERROR_DX11(
"ID3D11Device::QueryInterface (IDXGIDevice)", hr);
195 hr = m_pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (
void **)&m_pDXGIAdapter);
198 RERROR_DX11(
"IDXGIIDevice::GetParent (IDXGIAdapter)", hr);
202 hr = m_pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (
void **)&m_pIDXGIFactory);
205 RERROR_DX11(
"IDXGIAdapter::GetParent (IDXGIFactory)", hr);
209 m_pIDXGIFactory->MakeWindowAssociation(wnd, 0);
211 m_pSwapChain->GetContainingOutput(&m_pDXGIOutput);
213 ROK(
"raDirectX erfolgreich initialisiert");
220 if(m_pImmediateContext)
222 m_pImmediateContext->ClearState();
223 m_pImmediateContext->Flush();
239 if(
m_standby || !m_pImmediateContext )
return;
241 m_pImmediateContext->ClearRenderTargetView(m_pRenderTargetView, clearColor);
242 m_pImmediateContext->ClearDepthStencilView(m_pDSV, ClearFlag, Depth, Stencil );
246 if(
m_standby || !m_pImmediateContext )
return;
247 m_pImmediateContext->DrawAuto();
251 if(
m_standby || !m_pImmediateContext )
return;
252 m_pImmediateContext->DrawIndexed(numTriangles, 0, 0);
256 if(
m_standby || !m_pImmediateContext )
return;
258 m_pSwapChain->Present(m_Synce, 0);
264 if(
m_standby || !m_pImmediateContext )
return false;
271 DXGI_MODE_DESC adapterDesktopDisplayMode =
273 800, 600, { 60, 1 }, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
275 adapterDesktopDisplayMode.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
276 adapterDesktopDisplayMode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
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;
283 m_swapChainDesc.BufferDesc = adapterDesktopDisplayMode;
290 m_swapChainDesc.BufferDesc.Height = r.bottom;
291 m_swapChainDesc.BufferDesc.Width = r.right;
295 m_pSwapChain->SetFullscreenState(
false, NULL);
297 m_pSwapChain->SetFullscreenState(
false, m_pDXGIOutput);
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);
310 RECT rcCurrentClient;
313 UINT width = rcCurrentClient.right - rcCurrentClient.left;
314 UINT height = rcCurrentClient.bottom - rcCurrentClient.top;
317 if(!m_pDevice && m_IsFullScreen)
return false;
321 m_pImmediateContext->OMSetRenderTargets(0, 0, 0);
325 m_swapChainDesc.BufferDesc.Width = width;
326 m_swapChainDesc.BufferDesc.Height = height;
328 m_pSwapChain->ResizeBuffers(
329 m_swapChainDesc.BufferCount,
332 m_swapChainDesc.BufferDesc.Format,
333 m_swapChainDesc.Flags);
336 ID3D11Texture2D* pBackBuffer = NULL;
337 HRESULT hr = m_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer );
344 hr = m_pDevice->CreateRenderTargetView( pBackBuffer, NULL, &m_pRenderTargetView );
345 pBackBuffer->Release();
354 m_depthBufferDesc.Width = width;
355 m_depthBufferDesc.Height = height;
357 if(FAILED(hr = m_pDevice->CreateTexture2D(&m_depthBufferDesc, NULL, &m_pDepthStencil )))
362 ROK(
"DepthStencilTexture erstellt");
364 if(FAILED(m_pDevice->CreateDepthStencilView(m_pDepthStencil, &m_descDSV, &m_pDSV )))
370 m_pImmediateContext->OMSetRenderTargets( 1, &m_pRenderTargetView, m_pDSV );
372 ROK(
"DepthStencilView erstellt und gebunden");
375 m_vp.Width = (FLOAT)width;
376 m_vp.Height = (FLOAT)height;
377 m_vp.MinDepth = 0.0f;
378 m_vp.MaxDepth = 1.0f;
381 m_pImmediateContext->RSSetViewports( 1, &m_vp );
390 static int m_Frame = 0;
394 sprintf(buf,
"%s_%d.png", SaveFile, m_Frame);
396 ID3D11Texture2D* pBackBuffer;
397 HRESULT hr = m_pSwapChain->GetBuffer( 0, __uuidof( *pBackBuffer ), ( LPVOID* )&pBackBuffer );
401 D3D11_TEXTURE2D_DESC dsc;
402 pBackBuffer->GetDesc(&dsc);
403 D3D11_RESOURCE_DIMENSION dim;
404 pBackBuffer->GetType(&dim);
406 ID3D11Texture2D *pCompatableTexture = pBackBuffer;
407 if ( dsc.SampleDesc.Count > 1)
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);
419 this->m_pImmediateContext->ResolveSubresource(resolveTexture, 0, pBackBuffer, 0, dsc.Format);
420 pCompatableTexture = resolveTexture;
422 pCompatableTexture->GetDesc(&dsc);
425 hr = D3DX11SaveTextureToFile(this->m_pImmediateContext, pCompatableTexture, D3DX11_IFF_PNG, buf);
437 _mkdir(
"raScreenShots");
456 if( SIZE_MINIMIZED == wParam )
460 else if( SIZE_MAXIMIZED == wParam )
465 else if( SIZE_RESTORED == wParam )
D3D_FEATURE_LEVEL featureLevels[]
virtual bool Init(HWND wnd)
virtual void DrawIndexed(unsigned int numTriangles)
virtual bool ChangeMode(void)
HWND GetClientWindow(void)
int MultiSamplingQualitet
void RAPI RERROR_DX11(raString x, HRESULT h)
virtual bool Resize(void)
virtual long OnPaint(HWND wnd, WPARAM wParam, LPARAM lParam)
virtual void CreateScreenShot(const raString SaveFile)
virtual long OnKeyUp(HWND wnd, WPARAM wParam, LPARAM lParam)
virtual long OnSize(HWND wnd, WPARAM wParam, LPARAM lParam)
virtual long OnKeyDown(HWND wnd, WPARAM wParam, LPARAM lParam)
static raConfig GetConfig()
void RAPI ROK(raString x)
D3D_DRIVER_TYPE driverTypes[]
void RAPI RINFO(raString x)
virtual void Clear(raColor clearColor, UINT ClearFlag=D3D11_CLEAR_DEPTH, float Depth=1.0f, UINT8 Stencil=0)
virtual long OnClose(HWND wnd, WPARAM wParam, LPARAM lParam)