diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp index 108b3f96..d81ca808 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.cpp +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.cpp @@ -105,6 +105,9 @@ D3D11VARenderer::~D3D11VARenderer() m_OverlayPixelShader.Reset(); + m_OverlayBlendState.Reset(); + m_VideoBlendState.Reset(); + m_RenderTargetView.Reset(); m_SwapChain.Reset(); @@ -690,8 +693,10 @@ void D3D11VARenderer::renderOverlay(Overlay::OverlayType type) m_DeviceContext->PSSetShader(m_OverlayPixelShader.Get(), nullptr, 0); m_DeviceContext->PSSetShaderResources(0, 1, overlayTextureResourceView.GetAddressOf()); - // Draw the overlay + // Draw the overlay with alpha blending + m_DeviceContext->OMSetBlendState(m_OverlayBlendState.Get(), nullptr, 0xffffffff); m_DeviceContext->DrawIndexed(6, 0, 0); + m_DeviceContext->OMSetBlendState(m_VideoBlendState.Get(), nullptr, 0xffffffff); } void D3D11VARenderer::bindColorConversion(AVFrame* frame) @@ -1379,7 +1384,7 @@ bool D3D11VARenderer::setupRenderingResources() } } - // Create our blend state + // Create our overlay blend state { D3D11_BLEND_DESC blendDesc = {}; blendDesc.AlphaToCoverageEnable = FALSE; @@ -1393,10 +1398,26 @@ bool D3D11VARenderer::setupRenderingResources() blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - ComPtr blendState; - hr = m_Device->CreateBlendState(&blendDesc, &blendState); + hr = m_Device->CreateBlendState(&blendDesc, &m_OverlayBlendState); + if (FAILED(hr)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, + "ID3D11Device::CreateBlendState() failed: %x", + hr); + return false; + } + } + + // Create and bind our video blend state + { + D3D11_BLEND_DESC blendDesc = {}; + blendDesc.AlphaToCoverageEnable = FALSE; + blendDesc.IndependentBlendEnable = FALSE; + blendDesc.RenderTarget[0].BlendEnable = FALSE; + blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + + hr = m_Device->CreateBlendState(&blendDesc, &m_VideoBlendState); if (SUCCEEDED(hr)) { - m_DeviceContext->OMSetBlendState(blendState.Get(), nullptr, 0xffffffff); + m_DeviceContext->OMSetBlendState(m_VideoBlendState.Get(), nullptr, 0xffffffff); } else { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, diff --git a/app/streaming/video/ffmpeg-renderers/d3d11va.h b/app/streaming/video/ffmpeg-renderers/d3d11va.h index 3b290b76..201def72 100644 --- a/app/streaming/video/ffmpeg-renderers/d3d11va.h +++ b/app/streaming/video/ffmpeg-renderers/d3d11va.h @@ -61,6 +61,9 @@ private: Microsoft::WRL::ComPtr m_SwapChain; Microsoft::WRL::ComPtr m_DeviceContext; Microsoft::WRL::ComPtr m_RenderTargetView; + Microsoft::WRL::ComPtr m_VideoBlendState; + Microsoft::WRL::ComPtr m_OverlayBlendState; + SupportedFenceType m_FenceType; SDL_mutex* m_ContextLock; bool m_BindDecoderOutputTextures; diff --git a/app/streaming/video/ffmpeg-renderers/dxva2.cpp b/app/streaming/video/ffmpeg-renderers/dxva2.cpp index 020e8c8e..d37ba2f6 100644 --- a/app/streaming/video/ffmpeg-renderers/dxva2.cpp +++ b/app/streaming/video/ffmpeg-renderers/dxva2.cpp @@ -375,7 +375,6 @@ bool DXVA2Renderer::initializeRenderer() m_Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); m_Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - m_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); m_Device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); m_Device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); @@ -951,7 +950,10 @@ void DXVA2Renderer::renderOverlay(Overlay::OverlayType type) return; } + // Only enable blending when drawing the overlay + m_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); hr = m_Device->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2); + m_Device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); if (FAILED(hr)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "DrawPrimitive() failed: %x",