void InitializeDirectX() { UINT createDeviceFlags = 0; #if defined(DEBUG) || defined(_DEBUG) createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0 }; ID3D11Device* direct3DDevice = nullptr; ID3D11DeviceContext* direct3DDeviceContext = nullptr; ThrowIfFailed(D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &direct3DDevice, &mFeatureLevel, &direct3DDeviceContext), "D3D11CreateDevice() failed"); ThrowIfFailed(direct3DDevice->QueryInterface(__uuidof(ID3D11Device1), reinterpret_cast<void**>(&mDirect3DDevice)), "ID3D11Device::QueryInterface() failed"); ThrowIfFailed(direct3DDeviceContext->QueryInterface(__uuidof(ID3D11DeviceContext1), reinterpret_cast<void**>(&mDirect3DDeviceContext)), "ID3D11Device::QueryInterface() failed"); ReleaseObject(direct3DDevice); ReleaseObject(direct3DDeviceContext); UINT multiSamplingCount = 4; UINT multiSamplingQualityLevels; mDirect3DDevice->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, multiSamplingCount, &multiSamplingQualityLevels); if (multiSamplingQualityLevels == 0) { throw GameException("Unsupported multi-sampling quality"); } DXGI_SWAP_CHAIN_DESC1 swapChainDesc; ZeroMemory(&swapChainDesc, sizeof(swapChainDesc)); swapChainDesc.Width = mScreenWidth; swapChainDesc.Height = mScreenHeight; swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swapChainDesc.SampleDesc.Count = multiSamplingCount; swapChainDesc.SampleDesc.Quality = multiSamplingQualityLevels - 1; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 1; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; IDXGIDevice* dxgiDevice = nullptr; ThrowIfFailed(mDirect3DDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)), "ID3D11Device::QueryInterface() failed"); IDXGIAdapter *dxgiAdapter = nullptr; HRESULT hr; if (FAILED(hr = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&dxgiAdapter)))) { ReleaseObject(dxgiDevice); throw GameException("IDXGIDevice::GetParent() failed retrieving adapter.", hr); } IDXGIFactory2* dxgiFactory = nullptr; if (FAILED(hr = dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), reinterpret_cast<void**>(&dxgiFactory)))) { ReleaseObject(dxgiDevice); ReleaseObject(dxgiAdapter); throw GameException("IDXGIAdapter::GetParent() failed retrieving factory.", hr); } DXGI_SWAP_CHAIN_FULLSCREEN_DESC fullScreenDesc; ZeroMemory(&fullScreenDesc, sizeof(fullScreenDesc)); fullScreenDesc.RefreshRate.Numerator = 60; fullScreenDesc.RefreshRate.Denominator = 1; fullScreenDesc.Windowed = true; if (FAILED(hr = dxgiFactory->CreateSwapChainForHwnd(dxgiDevice, mWindowHandle, &swapChainDesc, &fullScreenDesc, nullptr, &mSwapChain))) { ReleaseObject(dxgiDevice); ReleaseObject(dxgiAdapter); ReleaseObject(dxgiFactory); throw GameException("IDXGIDevice::CreateSwapChainForHwnd() failed.", hr); } ReleaseObject(dxgiDevice); ReleaseObject(dxgiAdapter); ReleaseObject(dxgiFactory); ID3D11Texture2D* backBuffer; ThrowIfFailed(mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&backBuffer)), "IDXGISwapChain::GetBuffer() failed."); if (FAILED(hr = mDirect3DDevice->CreateRenderTargetView(backBuffer, nullptr, &mRenderTargetView))) { ReleaseObject(backBuffer); throw GameException("IDXGIDevice::CreateRenderTargetView() failed.", hr); } ReleaseObject(backBuffer); D3D11_TEXTURE2D_DESC depthStencilDesc; ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc)); depthStencilDesc.Width = mScreenWidth; depthStencilDesc.Height = mScreenHeight; depthStencilDesc.MipLevels = 1; depthStencilDesc.ArraySize = 1; depthStencilDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; depthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthStencilDesc.Usage = D3D11_USAGE_DEFAULT; depthStencilDesc.SampleDesc.Count = multiSamplingCount; depthStencilDesc.SampleDesc.Quality = multiSamplingQualityLevels - 1; ThrowIfFailed(mDirect3DDevice->CreateTexture2D(&depthStencilDesc, nullptr, &mDepthStencilBuffer), "IDXGIDevice::CreateTexture2D() failed."); ThrowIfFailed(mDirect3DDevice->CreateDepthStencilView(mDepthStencilBuffer, nullptr, &mDepthStencilView), "IDXGIDevice::CreateDepthStencilView() failed."); D3D11_VIEWPORT viewport; viewport.TopLeftX = 0.0f; viewport.TopLeftY = 0.0f; viewport.Width = static_cast<float>(mScreenWidth); viewport.Height = static_cast<float>(mScreenHeight); viewport.MinDepth = 0.0f; viewport.MaxDepth = 1.0f; mDirect3DDeviceContext->OMSetRenderTargets(1, &mRenderTargetView, mDepthStencilView); mDirect3DDeviceContext->RSSetViewports(1, &viewport); }
int ContextD3D11::CreateWindowSizeDependentResources(uint32_t width, uint32_t height) { ID3D11RenderTargetView* nullViews[] = {nullptr}; device_context_->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr); SafeRelease(&render_target_view_); SafeRelease(&depth_stencil_view_); device_context_->Flush(); //RECT rc; //GetClientRect( window_handle_, &rc ); width_ = width;//rc.right - rc.left; height_ = height;//rc.bottom - rc.top; if(swap_chain_ != nullptr) { swap_chain_->ResizeBuffers(2, static_cast<UINT>(width_),static_cast<UINT>(height_), DXGI_FORMAT_B8G8R8A8_UNORM, 0); } else { // Otherwise, create a new one using the same adapter as the existing Direct3D device. DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0}; swapChainDesc.Width = static_cast<UINT>(width_); // Match the size of the window. swapChainDesc.Height = static_cast<UINT>(height_); swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // This is the most common swap chain 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 double-buffering to minimize latency. swapChainDesc.Scaling = DXGI_SCALING_NONE; swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect. swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; IDXGIDevice1* dxgiDevice; device_->QueryInterface(__uuidof(dxgiDevice),(void**)&dxgiDevice); //IDXGIAdapter* dxgiAdapter; //dxgiDevice->GetAdapter(&dxgiAdapter); IDXGIFactory2* dxgiFactory; adaptor_->GetParent(__uuidof(IDXGIFactory2), (void**)&dxgiFactory ); DXGI_SWAP_CHAIN_FULLSCREEN_DESC fullscreen_desc; memset(&fullscreen_desc,0,sizeof(fullscreen_desc)); fullscreen_desc.Windowed = true; dxgiFactory->CreateSwapChainForHwnd(device_,window_handle_, &swapChainDesc, &fullscreen_desc,nullptr, &swap_chain_); dxgiDevice->SetMaximumFrameLatency(1); SafeRelease(&dxgiFactory); //SafeRelease(&dxgiAdapter); SafeRelease(&dxgiDevice); } ID3D11Texture2D* backBuffer; swap_chain_->GetBuffer(0,__uuidof(ID3D11Texture2D),(void**)&backBuffer); device_->CreateRenderTargetView(backBuffer,nullptr,&render_target_view_); SafeRelease(&backBuffer); // Create a depth stencil view. CD3D11_TEXTURE2D_DESC depthStencilTextureDesc( DXGI_FORMAT_D24_UNORM_S8_UINT, static_cast<UINT>(width_), static_cast<UINT>(height_), 1, 0, D3D11_BIND_DEPTH_STENCIL ); ID3D11Texture2D* depth_stencil_tex; device_->CreateTexture2D(&depthStencilTextureDesc,nullptr,&depth_stencil_tex); CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); device_->CreateDepthStencilView(depth_stencil_tex,&depthStencilViewDesc,&depth_stencil_view_); SafeRelease(&depth_stencil_tex); SafeRelease(&default_depth_state); D3D11_DEPTH_STENCIL_DESC depthStencilDesc; // Initialize the description of the stencil state. ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc)); depthStencilDesc.DepthEnable = true; depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS; depthStencilDesc.StencilEnable = true; depthStencilDesc.StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; depthStencilDesc.StencilWriteMask = 0xFF; // Stencil operations if pixel is front-facing. depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR; depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; // Stencil operations if pixel is back-facing. depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP; depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR; depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; device_->CreateDepthStencilState(&depthStencilDesc, &default_depth_state); SetDepthState(null,0); // Set the rendering viewport to target the entire window. CD3D11_VIEWPORT viewport(0.0f,0.0f,width_,height_); device_context_->RSSetViewports(1, &viewport); device_context_->OMSetRenderTargets( 1, &render_target_view_, depth_stencil_view_ ); return S_OK; }