~_Data() { if(BlendStateUseCount == 1) //Release if last { if (blendStateAlphaBlend) blendStateAlphaBlend->Release(); if (blendStateDisabledBlend) blendStateDisabledBlend->Release(); } BlendStateUseCount--; if (custom) custom->Release(); }
inline BlendState::~BlendState() { blend_state_->Release(); }
// Create render states HRESULT CFW1GlyphRenderStates::createRenderStates(bool anisotropicFiltering) { // Create blend-state D3D11_BLEND_DESC blendDesc; ID3D11BlendState *pBlendState; ZeroMemory(&blendDesc, sizeof(blendDesc)); for(int i=0; i < 4; ++i) { blendDesc.RenderTarget[i].BlendEnable = TRUE; blendDesc.RenderTarget[i].SrcBlend = D3D11_BLEND_ONE; blendDesc.RenderTarget[i].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blendDesc.RenderTarget[i].BlendOp = D3D11_BLEND_OP_ADD; blendDesc.RenderTarget[i].SrcBlendAlpha = D3D11_BLEND_ONE; blendDesc.RenderTarget[i].DestBlendAlpha = D3D11_BLEND_ZERO; blendDesc.RenderTarget[i].BlendOpAlpha = D3D11_BLEND_OP_ADD; blendDesc.RenderTarget[i].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; } HRESULT hResult = m_pDevice->CreateBlendState(&blendDesc, &pBlendState); if(FAILED(hResult)) { m_lastError = L"Failed to create blend state"; } else { // Create sampler state D3D11_SAMPLER_DESC samplerDesc; ID3D11SamplerState *pSamplerState; ZeroMemory(&samplerDesc, sizeof(samplerDesc)); if(anisotropicFiltering) { samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC; samplerDesc.MaxAnisotropy = 2; if(m_featureLevel >= D3D_FEATURE_LEVEL_9_2) samplerDesc.MaxAnisotropy = 5; } else samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; samplerDesc.MaxLOD = D3D11_FLOAT32_MAX; hResult = m_pDevice->CreateSamplerState(&samplerDesc, &pSamplerState); if(FAILED(hResult)) { m_lastError = L"Failed to create sampler state"; } else { // Create rasterizer state D3D11_RASTERIZER_DESC rasterizerDesc; ID3D11RasterizerState *pRasterizerState; ZeroMemory(&rasterizerDesc, sizeof(rasterizerDesc)); rasterizerDesc.FillMode = D3D11_FILL_SOLID; rasterizerDesc.CullMode = D3D11_CULL_NONE; rasterizerDesc.FrontCounterClockwise = FALSE; rasterizerDesc.DepthClipEnable = TRUE; hResult = m_pDevice->CreateRasterizerState(&rasterizerDesc, &pRasterizerState); if(FAILED(hResult)) { m_lastError = L"Failed to create rasterizer state"; } else { // Create depth-stencil state D3D11_DEPTH_STENCIL_DESC depthStencilDesc; ID3D11DepthStencilState *pDepthStencilState; ZeroMemory(&depthStencilDesc, sizeof(depthStencilDesc)); depthStencilDesc.DepthEnable = FALSE; hResult = m_pDevice->CreateDepthStencilState(&depthStencilDesc, &pDepthStencilState); if(FAILED(hResult)) { m_lastError = L"Failed to create depth stencil state"; } else { // Success m_pBlendState = pBlendState; m_pSamplerState = pSamplerState; m_pRasterizerState = pRasterizerState; m_pDepthStencilState = pDepthStencilState; hResult = S_OK; } if(FAILED(hResult)) pRasterizerState->Release(); } if(FAILED(hResult)) pSamplerState->Release(); } if(FAILED(hResult)) pBlendState->Release(); } return hResult; }