void BBWin8Game::CreateD3dDevice(){ CoreWindow ^window=CoreWindow::GetForCurrentThread(); int width=DipsToPixels( window->Bounds.Width ); int height=DipsToPixels( window->Bounds.Height ); #if WINDOWS_8 switch( DisplayProperties::CurrentOrientation ){ case DisplayOrientations::Portrait: case DisplayOrientations::PortraitFlipped: std::swap( width,height ); break; } #endif UINT creationFlags=D3D11_CREATE_DEVICE_BGRA_SUPPORT; #ifdef _DEBUG creationFlags|=D3D11_CREATE_DEVICE_DEBUG; #endif #if WINDOWS_8 D3D_FEATURE_LEVEL featureLevels[]={ D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; #elif WINDOWS_PHONE_8 D3D_FEATURE_LEVEL featureLevels[]={ D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3 }; #endif ID3D11Device *device; ID3D11DeviceContext *context; DXASS( D3D11CreateDevice( 0, D3D_DRIVER_TYPE_HARDWARE, 0, creationFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &_featureLevel, &context ) ); DXASS( device->QueryInterface( __uuidof( ID3D11Device1 ),(void**)&_d3dDevice ) ); DXASS( context->QueryInterface( __uuidof( ID3D11DeviceContext1 ),(void**)&_d3dContext ) ); device->Release(); context->Release(); //create swap chain if( _swapChain ){ DXASS( _swapChain->ResizeBuffers( 2,width,height,DXGI_FORMAT_B8G8R8A8_UNORM,0 ) ); }else{ #if WINDOWS_8 DXGI_SWAP_CHAIN_DESC1 swapChainDesc={0}; swapChainDesc.Width=width; swapChainDesc.Height=height; swapChainDesc.Format=DXGI_FORMAT_B8G8R8A8_UNORM; swapChainDesc.Stereo=false; swapChainDesc.SampleDesc.Count=1; swapChainDesc.SampleDesc.Quality=0; swapChainDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount=2; swapChainDesc.Scaling=DXGI_SCALING_NONE; swapChainDesc.SwapEffect=DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; swapChainDesc.Flags=0; #elif WINDOWS_PHONE_8 DXGI_SWAP_CHAIN_DESC1 swapChainDesc={0}; swapChainDesc.Width=width; swapChainDesc.Height=height; swapChainDesc.Format=DXGI_FORMAT_B8G8R8A8_UNORM; swapChainDesc.Stereo=false; swapChainDesc.SampleDesc.Count=1; swapChainDesc.SampleDesc.Quality=0; swapChainDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount=1; swapChainDesc.Scaling=DXGI_SCALING_STRETCH; swapChainDesc.SwapEffect=DXGI_SWAP_EFFECT_DISCARD; swapChainDesc.Flags=0; #endif IDXGIDevice1 *dxgiDevice; DXASS( _d3dDevice->QueryInterface( __uuidof( IDXGIDevice1 ),(void**)&dxgiDevice ) ); IDXGIAdapter *dxgiAdapter; DXASS( dxgiDevice->GetAdapter( &dxgiAdapter ) ); IDXGIFactory2 *dxgiFactory; DXASS( dxgiAdapter->GetParent( __uuidof( IDXGIFactory2 ),(void**)&dxgiFactory ) ); DXASS( dxgiFactory->CreateSwapChainForCoreWindow( _d3dDevice,(IUnknown*)window,&swapChainDesc,0,&_swapChain ) ); DXASS( dxgiDevice->SetMaximumFrameLatency( 1 ) ); dxgiFactory->Release(); dxgiAdapter->Release(); dxgiDevice->Release(); } // Create a render target view of the swap chain back buffer. // ID3D11Texture2D *backBuffer; DXASS( _swapChain->GetBuffer( 0,__uuidof( ID3D11Texture2D ),(void**)&backBuffer ) ); DXASS( _d3dDevice->CreateRenderTargetView( backBuffer,0,&_renderTargetView ) ); backBuffer->Release(); /* // Create a depth stencil view // D3D11_TEXTURE2D_DESC dsdesc; ZEROMEM( dsdesc ); dsdesc.Width=width; dsdesc.Height=height; dsdesc.MipLevels=1; dsdesc.ArraySize=1; dsdesc.Format=DXGI_FORMAT_D24_UNORM_S8_UINT; dsdesc.SampleDesc.Count=1; dsdesc.SampleDesc.Quality=0; dsdesc.Usage=D3D11_USAGE_DEFAULT; dsdesc.BindFlags=D3D11_BIND_DEPTH_STENCIL; dsdesc.CpuAccessFlags=0; dsdesc.MiscFlags=0; ID3D11Texture2D *depthStencil; DXASS( _d3dDevice->CreateTexture2D( &dsdesc,0,&depthStencil ) ); DXASS( _d3dDevice->CreateDepthStencilView( depthStencil,0,&_depthStencilView ) ); depthStencil->Release(); */ D3D11_VIEWPORT viewport={ 0,0,width,height,0,1 }; _d3dContext->RSSetViewports( 1,&viewport ); }
void Graphics4::init(int windowId, int depthBufferBits, int stencilBufferBits, bool vSync) { #ifdef KORE_VR vsync = false; #else vsync = vSync; #endif for (int i = 0; i < 1024 * 4; ++i) vertexConstants[i] = 0; for (int i = 0; i < 1024 * 4; ++i) fragmentConstants[i] = 0; #ifdef KORE_WINDOWS HWND hwnd = Window::get(windowId)->_data.handle; #endif UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #ifdef _DEBUG creationFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif D3D_FEATURE_LEVEL featureLevels[] = { #ifdef KORE_WINDOWSAPP D3D_FEATURE_LEVEL_11_1, #endif D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0}; #ifdef KORE_WINDOWSAPP IDXGIAdapter3* adapter = nullptr; #ifdef KORE_HOLOLENS adapter = holographicFrameController->getCompatibleDxgiAdapter().Get(); #endif Kore_Microsoft_affirm(D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_HARDWARE, nullptr, creationFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &featureLevel, &context)); #elif KORE_OCULUS IDXGIFactory* dxgiFactory = nullptr; Windows::affirm(CreateDXGIFactory1(__uuidof(IDXGIFactory), (void**)(&dxgiFactory))); Windows::affirm(D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, creationFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &featureLevel, &context)); #endif // affirm(device0.As(&device)); // affirm(context0.As(&context)); // m_windowBounds = m_window->Bounds; const int _DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3; const int _DXGI_SWAP_EFFECT_FLIP_DISCARD = 4; if (swapChain != nullptr) { Kore_Microsoft_affirm(swapChain->ResizeBuffers(2, 0, 0, DXGI_FORMAT_B8G8R8A8_UNORM, 0)); } else { #ifdef KORE_WINDOWS DXGI_SWAP_CHAIN_DESC swapChainDesc = {0}; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; // 60Hz swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; swapChainDesc.BufferDesc.Width = System::windowWidth(windowId); // use automatic sizing swapChainDesc.BufferDesc.Height = System::windowHeight(windowId); swapChainDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // this is the most common swapchain format // swapChainDesc.Stereo = false; swapChainDesc.SampleDesc.Count = antialiasingSamples() > 1 ? antialiasingSamples() : 1; swapChainDesc.SampleDesc.Quality = antialiasingSamples() > 1 ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // use two buffers to enable flip effect swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; // DXGI_SCALING_NONE; if (isWindows10OrGreater()) { swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; //(DXGI_SWAP_EFFECT) _DXGI_SWAP_EFFECT_FLIP_DISCARD; } else if (isWindows8OrGreater()) { swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; //(DXGI_SWAP_EFFECT) _DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; } else { swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; } swapChainDesc.Flags = 0; swapChainDesc.OutputWindow = Window::get(windowId)->_data.handle; swapChainDesc.Windowed = true; #endif #if defined(KORE_WINDOWSAPP) #ifdef KORE_HOLOLENS // The Windows::Graphics::Holographic::HolographicSpace owns its own swapchain so we don't need to create one here #else DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = 0; // use automatic sizing swapChainDesc.Height = 0; swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // this is the most common swapchain format swapChainDesc.Stereo = false; swapChainDesc.SampleDesc.Count = antialiasingSamples() > 1 ? antialiasingSamples() : 1; swapChainDesc.SampleDesc.Quality = antialiasingSamples() > 1 ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // use two buffers to enable flip effect swapChainDesc.Scaling = DXGI_SCALING_NONE; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // we recommend using this swap effect for all applications swapChainDesc.Flags = 0; IDXGIDevice1* dxgiDevice; Kore_Microsoft_affirm(device->QueryInterface(IID_IDXGIDevice1, (void**)&dxgiDevice)); IDXGIAdapter* dxgiAdapter; Kore_Microsoft_affirm(dxgiDevice->GetAdapter(&dxgiAdapter)); IDXGIFactory2* dxgiFactory; Kore_Microsoft_affirm(dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), (void**)&dxgiFactory)); Kore_Microsoft_affirm(dxgiFactory->CreateSwapChainForCoreWindow(device, reinterpret_cast<IUnknown*>(CoreWindow::GetForCurrentThread()), &swapChainDesc, nullptr, &swapChain)); Kore_Microsoft_affirm(dxgiDevice->SetMaximumFrameLatency(1)); #endif #elif KORE_OCULUS DXGI_SWAP_CHAIN_DESC scDesc = {0}; scDesc.BufferCount = 2; scDesc.BufferDesc.Width = System::windowWidth(windowId); scDesc.BufferDesc.Height = System::windowHeight(windowId); scDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; scDesc.BufferDesc.RefreshRate.Denominator = 1; scDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; scDesc.OutputWindow = (HWND)System::windowHandle(windowId); ; scDesc.SampleDesc.Count = antialiasingSamples() > 1 ? antialiasingSamples() : 1; scDesc.SampleDesc.Quality = antialiasingSamples() > 1 ? D3D11_STANDARD_MULTISAMPLE_PATTERN : 0; scDesc.Windowed = true; scDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL; Windows::affirm(dxgiFactory->CreateSwapChain(device, &scDesc, &swapChain)); dxgiFactory->Release(); IDXGIDevice1* dxgiDevice = nullptr; Windows::affirm(device->QueryInterface(__uuidof(IDXGIDevice1), (void**)&dxgiDevice)); Windows::affirm(dxgiDevice->SetMaximumFrameLatency(1)); dxgiDevice->Release(); #else UINT flags = 0; #ifdef _DEBUG flags = D3D11_CREATE_DEVICE_DEBUG; #endif HRESULT result = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags, featureLevels, 3, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, nullptr, &context); if (result != S_OK) { Kore_Microsoft_affirm(D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP, nullptr, flags, featureLevels, 3, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, nullptr, &context)); } #endif } #ifdef KORE_HOLOLENS // holographicFrameController manages the targets and views for hololens. // the views have to be created/deleted on the CameraAdded/Removed events // at this point we don't know if this event has alread occured so we cannot // simply set the renderTargetWidth, renderTargetHeight, currentRenderTargetViews and currentDepthStencilView. // to bind the targets for hololens one has to use the VrInterface::beginRender(eye) instead of the methods in this class. ComPtr<ID3D11Device> devicePtr = device; ComPtr<ID3D11DeviceContext> contextPtr = context; Microsoft::WRL::ComPtr<ID3D11Device4> device4Ptr; Microsoft::WRL::ComPtr<ID3D11DeviceContext3> context3Ptr; affirm(devicePtr.As(&device4Ptr)); affirm(contextPtr.As(&context3Ptr)); holographicFrameController->setDeviceAndContext(device4Ptr, context3Ptr); #else createBackbuffer(antialiasingSamples()); currentRenderTargetViews[0] = renderTargetView; currentDepthStencilView = depthStencilView; context->OMSetRenderTargets(1, &renderTargetView, depthStencilView); CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast<float>(renderTargetWidth), static_cast<float>(renderTargetHeight)); context->RSSetViewports(1, &viewPort); #endif D3D11_SAMPLER_DESC samplerDesc; ZeroMemory(&samplerDesc, sizeof(samplerDesc)); samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; for (int i = 0; i < 16; ++i) { lastSamplers[i] = samplerDesc; } initSamplers(); D3D11_BLEND_DESC blendDesc; ZeroMemory(&blendDesc, sizeof(blendDesc)); D3D11_RENDER_TARGET_BLEND_DESC rtbd; ZeroMemory(&rtbd, sizeof(rtbd)); rtbd.BlendEnable = true; rtbd.SrcBlend = D3D11_BLEND_SRC_ALPHA; rtbd.DestBlend = D3D11_BLEND_INV_SRC_ALPHA; rtbd.BlendOp = D3D11_BLEND_OP_ADD; rtbd.SrcBlendAlpha = D3D11_BLEND_ONE; rtbd.DestBlendAlpha = D3D11_BLEND_ZERO; rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD; #ifdef KORE_WINDOWSAPP rtbd.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; #else rtbd.RenderTargetWriteMask = D3D10_COLOR_WRITE_ENABLE_ALL; #endif blendDesc.AlphaToCoverageEnable = false; blendDesc.RenderTarget[0] = rtbd; ID3D11BlendState* blending; device->CreateBlendState(&blendDesc, &blending); Kore_Microsoft_affirm(device->CreateBlendState(&blendDesc, &blending)); context->OMSetBlendState(blending, nullptr, 0xffffffff); }
void D3DWin8_Init() { // Wait for video init before we do anything WaitForSingleObjectEx( g_WaitingForVideoEvent, INFINITE, FALSE ); assert(g_Window); // Now go ahead :) QD3D11Device* device = InitDevice(); IDXGIFactory2* dxgiFactory = nullptr; HRESULT hr = QD3D::GetDxgiFactory( device, &dxgiFactory ); if ( FAILED( hr ) ) { ri.Error( ERR_FATAL, "Failed to get DXGI Factory: 0x%08x.\n", hr ); return; } // Prepare the swap chain DXGI_SWAP_CHAIN_DESC1 swapChainDesc; ZeroMemory( &swapChainDesc, sizeof(swapChainDesc) ); GetSwapChainDescFromConfig( &swapChainDesc ); // Set up win8 params. Force disable multisampling. swapChainDesc.Width = (UINT) g_WindowWidth; swapChainDesc.Height = (UINT) g_WindowHeight; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect. swapChainDesc.SampleDesc.Count = 1; swapChainDesc.SampleDesc.Quality = 0; IDXGISwapChain1* swapChain = nullptr; hr = dxgiFactory->CreateSwapChainForCoreWindow( device, g_Window, &swapChainDesc, nullptr, &swapChain); if (FAILED(hr)) { ri.Error( ERR_FATAL, "Failed to create Direct3D 11 swapchain: 0x%08x.\n", hr ); return; } QDXGIDevice* dxgiDevice = nullptr; hr = QD3D::GetDxgiDevice( device, &dxgiDevice ); if ( SUCCEEDED( hr ) ) { // Ensure that DXGI does not queue more than one frame at a time. This both reduces latency and // ensures that the application will only render after each VSync, minimizing power consumption. dxgiDevice->SetMaximumFrameLatency(1); } InitSwapChain( swapChain ); SAFE_RELEASE( swapChain ); SAFE_RELEASE( device ); // release the main thread SetEvent( g_WaitingForVideoFinishedEvent ); }
void Graphics::init(int windowId, int depthBufferBits, int stencilBufferBits) { for (int i = 0; i < 1024 * 4; ++i) vertexConstants[i] = 0; for (int i = 0; i < 1024 * 4; ++i) fragmentConstants[i] = 0; HWND hwnd = (HWND)System::windowHandle(windowId); UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT; #ifdef _DEBUG creationFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif D3D_FEATURE_LEVEL featureLevels[] = { #ifdef SYS_WINDOWSAPP D3D_FEATURE_LEVEL_11_1, #endif D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1}; // ID3D11Device* device0; // ID3D11DeviceContext* context0; #ifdef SYS_WINDOWSAPP affirm(D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, creationFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &featureLevel, &context)); #endif // affirm(device0.As(&device)); // affirm(context0.As(&context)); // m_windowBounds = m_window->Bounds; if (swapChain != nullptr) { affirm(swapChain->ResizeBuffers(2, 0, 0, DXGI_FORMAT_B8G8R8A8_UNORM, 0)); } else { #ifdef SYS_WINDOWS DXGI_SWAP_CHAIN_DESC swapChainDesc = {0}; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; // 60Hz swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; swapChainDesc.BufferDesc.Width = System::windowWidth(windowId); // use automatic sizing swapChainDesc.BufferDesc.Height = System::windowHeight(windowId); swapChainDesc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // this is the most common swapchain format // swapChainDesc.Stereo = false; swapChainDesc.SampleDesc.Count = 1; // don't use multi-sampling swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // use two buffers to enable flip effect swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; // DXGI_SCALING_NONE; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; // DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // we recommend using this swap effect for all applications swapChainDesc.Flags = 0; swapChainDesc.OutputWindow = (HWND)System::windowHandle(windowId); swapChainDesc.Windowed = true; #endif #ifdef SYS_WINDOWSAPP DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = 0; // use automatic sizing swapChainDesc.Height = 0; swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // this is the most common swapchain format swapChainDesc.Stereo = false; swapChainDesc.SampleDesc.Count = 1; // don't use multi-sampling swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // use two buffers to enable flip effect swapChainDesc.Scaling = DXGI_SCALING_NONE; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // we recommend using this swap effect for all applications swapChainDesc.Flags = 0; IDXGIDevice1* dxgiDevice; affirm(device->QueryInterface(IID_IDXGIDevice1, (void**)&dxgiDevice)); IDXGIAdapter* dxgiAdapter; affirm(dxgiDevice->GetAdapter(&dxgiAdapter)); IDXGIFactory2* dxgiFactory; affirm(dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), (void**)&dxgiFactory)); affirm(dxgiFactory->CreateSwapChainForCoreWindow(device, reinterpret_cast<IUnknown*>(CoreWindow::GetForCurrentThread()), &swapChainDesc, nullptr, &swapChain)); affirm(dxgiDevice->SetMaximumFrameLatency(1)); #else UINT flags = 0; #ifdef _DEBUG flags = D3D11_CREATE_DEVICE_DEBUG; #endif affirm(D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, flags, featureLevels, 6, D3D11_SDK_VERSION, &swapChainDesc, &swapChain, &device, nullptr, &context)); #endif } ID3D11Texture2D* backBuffer; affirm(swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer)); affirm(device->CreateRenderTargetView(backBuffer, nullptr, &renderTargetView)); D3D11_TEXTURE2D_DESC backBufferDesc; backBuffer->GetDesc(&backBufferDesc); renderTargetWidth = backBufferDesc.Width; renderTargetHeight = backBufferDesc.Height; // TODO (DK) map depth/stencilBufferBits arguments CD3D11_TEXTURE2D_DESC depthStencilDesc(DXGI_FORMAT_D24_UNORM_S8_UINT, backBufferDesc.Width, backBufferDesc.Height, 1, 1, D3D11_BIND_DEPTH_STENCIL); ID3D11Texture2D* depthStencil; affirm(device->CreateTexture2D(&depthStencilDesc, nullptr, &depthStencil)); affirm(device->CreateDepthStencilView(depthStencil, &CD3D11_DEPTH_STENCIL_VIEW_DESC(D3D11_DSV_DIMENSION_TEXTURE2D), &depthStencilView)); context->OMSetRenderTargets(1, &renderTargetView, depthStencilView); CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast<float>(backBufferDesc.Width), static_cast<float>(backBufferDesc.Height)); context->RSSetViewports(1, &viewPort); D3D11_DEPTH_STENCIL_DESC desc; ZeroMemory(&desc, sizeof(desc)); desc.DepthEnable = TRUE; desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; desc.DepthFunc = D3D11_COMPARISON_LESS; desc.StencilEnable = FALSE; desc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; desc.StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; desc.FrontFace.StencilFunc = desc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; desc.FrontFace.StencilDepthFailOp = desc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_KEEP; desc.FrontFace.StencilPassOp = desc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; desc.FrontFace.StencilFailOp = desc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; context->OMSetDepthStencilState(getDepthStencilState(desc), lastStencilReferenceValue); lastDepthStencil = desc; D3D11_RASTERIZER_DESC rasterDesc; rasterDesc.FillMode = D3D11_FILL_SOLID; rasterDesc.CullMode = D3D11_CULL_NONE; rasterDesc.FrontCounterClockwise = FALSE; rasterDesc.DepthBias = 0; rasterDesc.SlopeScaledDepthBias = 0.0f; rasterDesc.DepthBiasClamp = 0.0f; rasterDesc.DepthClipEnable = TRUE; rasterDesc.ScissorEnable = FALSE; rasterDesc.MultisampleEnable = FALSE; rasterDesc.AntialiasedLineEnable = FALSE; ID3D11RasterizerState* rasterState; device->CreateRasterizerState(&rasterDesc, &rasterState); context->RSSetState(rasterState); D3D11_BLEND_DESC blendDesc; ZeroMemory(&blendDesc, sizeof(blendDesc)); D3D11_RENDER_TARGET_BLEND_DESC rtbd; ZeroMemory(&rtbd, sizeof(rtbd)); rtbd.BlendEnable = true; rtbd.SrcBlend = D3D11_BLEND_SRC_ALPHA; rtbd.DestBlend = D3D11_BLEND_INV_SRC_ALPHA; rtbd.BlendOp = D3D11_BLEND_OP_ADD; rtbd.SrcBlendAlpha = D3D11_BLEND_ONE; rtbd.DestBlendAlpha = D3D11_BLEND_ZERO; rtbd.BlendOpAlpha = D3D11_BLEND_OP_ADD; #ifdef SYS_WINDOWSAPP rtbd.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; #else rtbd.RenderTargetWriteMask = D3D10_COLOR_WRITE_ENABLE_ALL; #endif blendDesc.AlphaToCoverageEnable = false; blendDesc.RenderTarget[0] = rtbd; ID3D11BlendState* blending; device->CreateBlendState(&blendDesc, &blending); affirm(device->CreateBlendState(&blendDesc, &blending)); context->OMSetBlendState(blending, nullptr, 0xffffffff); #ifdef SYS_WINDOWS if (System::hasShowWindowFlag()) { ShowWindow(hwnd, SW_SHOWDEFAULT); UpdateWindow(hwnd); } #endif System::makeCurrent(windowId); }