From 1fae5a8b06eb70bcd00fd266434c17c40a0f367d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Sun, 12 Jul 2026 18:43:24 -0700 Subject: [PATCH] D3D11/D3D12/VK/WebGPU: Fixed blend-state, and blend factor for MRT. (#3825) --- src/renderer_d3d11.cpp | 12 ++++++++++-- src/renderer_d3d12.cpp | 12 ++++++++++-- src/renderer_vk.cpp | 8 ++++++++ src/renderer_webgpu.cpp | 8 ++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 154146f4a..7587cbd87 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -2924,7 +2924,7 @@ namespace bgfx { namespace d3d11 if (desc.IndependentBlendEnable) { - for (uint32_t ii = 1, rgba = _rgba; ii < BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS; ++ii, rgba >>= 11) + for (uint32_t ii = 1, rgba = _rgba; ii < BX_COUNTOF(desc.RenderTarget); ++ii, rgba >>= 11) { drt = &desc.RenderTarget[ii]; drt->BlendEnable = 0 != (rgba & 0x7ff); @@ -2946,7 +2946,7 @@ namespace bgfx { namespace d3d11 } else { - for (uint32_t ii = 1; ii < BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS; ++ii) + for (uint32_t ii = 1; ii < BX_COUNTOF(desc.RenderTarget); ++ii) { bx::memCopy(&desc.RenderTarget[ii], drt, sizeof(D3D11_RENDER_TARGET_BLEND_DESC) ); } @@ -2961,11 +2961,19 @@ namespace bgfx { namespace d3d11 const uint64_t f1 = BGFX_STATE_BLEND_INV_FACTOR; const uint64_t f2 = BGFX_STATE_BLEND_FACTOR<<4; const uint64_t f3 = BGFX_STATE_BLEND_INV_FACTOR<<4; + const uint64_t f4 = BGFX_STATE_BLEND_FACTOR<<8; + const uint64_t f5 = BGFX_STATE_BLEND_INV_FACTOR<<8; + const uint64_t f6 = BGFX_STATE_BLEND_FACTOR<<12; + const uint64_t f7 = BGFX_STATE_BLEND_INV_FACTOR<<12; bool hasFactor = 0 || f0 == (_state & f0) || f1 == (_state & f1) || f2 == (_state & f2) || f3 == (_state & f3) + || f4 == (_state & f4) + || f5 == (_state & f5) + || f6 == (_state & f6) + || f7 == (_state & f7) ; float blendFactor[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index 8fa73d446..1bbb2fa81 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -3200,7 +3200,7 @@ namespace bgfx { namespace d3d12 if (_desc.IndependentBlendEnable) { - for (uint32_t ii = 1, rgba = _rgba; ii < BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS; ++ii, rgba >>= 11) + for (uint32_t ii = 1, rgba = _rgba; ii < BX_COUNTOF(_desc.RenderTarget); ++ii, rgba >>= 11) { drt = &_desc.RenderTarget[ii]; drt->BlendEnable = 0 != (rgba & 0x7ff); @@ -3224,7 +3224,7 @@ namespace bgfx { namespace d3d12 } else { - for (uint32_t ii = 1; ii < BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS; ++ii) + for (uint32_t ii = 1; ii < BX_COUNTOF(_desc.RenderTarget); ++ii) { bx::memCopy(&_desc.RenderTarget[ii], drt, sizeof(D3D12_RENDER_TARGET_BLEND_DESC) ); } @@ -7565,6 +7565,10 @@ namespace bgfx { namespace d3d12 const uint64_t f1 = BGFX_STATE_BLEND_INV_FACTOR; const uint64_t f2 = BGFX_STATE_BLEND_FACTOR<<4; const uint64_t f3 = BGFX_STATE_BLEND_INV_FACTOR<<4; + const uint64_t f4 = BGFX_STATE_BLEND_FACTOR<<8; + const uint64_t f5 = BGFX_STATE_BLEND_INV_FACTOR<<8; + const uint64_t f6 = BGFX_STATE_BLEND_FACTOR<<12; + const uint64_t f7 = BGFX_STATE_BLEND_INV_FACTOR<<12; D3D12_GPU_DESCRIPTOR_HANDLE gpuHandle; ScratchBufferD3D12& scratchBuffer = m_scratchBuffer[m_backBufferColorIdx]; @@ -8004,6 +8008,10 @@ namespace bgfx { namespace d3d12 || f1 == (state & f1) || f2 == (state & f2) || f3 == (state & f3) + || f4 == (state & f4) + || f5 == (state & f5) + || f6 == (state & f6) + || f7 == (state & f7) ; const VertexLayout* layouts[BGFX_CONFIG_MAX_VERTEX_STREAMS]; diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index bcfb777c0..464ba6d26 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -9405,6 +9405,10 @@ VK_DESTROY const uint64_t f1 = BGFX_STATE_BLEND_INV_FACTOR; const uint64_t f2 = BGFX_STATE_BLEND_FACTOR<<4; const uint64_t f3 = BGFX_STATE_BLEND_INV_FACTOR<<4; + const uint64_t f4 = BGFX_STATE_BLEND_FACTOR<<8; + const uint64_t f5 = BGFX_STATE_BLEND_INV_FACTOR<<8; + const uint64_t f6 = BGFX_STATE_BLEND_FACTOR<<12; + const uint64_t f7 = BGFX_STATE_BLEND_INV_FACTOR<<12; const uint32_t descriptorFrame = m_cmd.m_currentFrameInFlight; for (uint32_t ii = 0; ii < m_numDescriptorPools[descriptorFrame]; ++ii) @@ -10008,6 +10012,10 @@ VK_DESTROY || f1 == (draw.m_stateFlags & f1) || f2 == (draw.m_stateFlags & f2) || f3 == (draw.m_stateFlags & f3) + || f4 == (draw.m_stateFlags & f4) + || f5 == (draw.m_stateFlags & f5) + || f6 == (draw.m_stateFlags & f6) + || f7 == (draw.m_stateFlags & f7) ; if (hasFactor diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index 2a212c3ea..acc98f7a1 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -6301,11 +6301,19 @@ m_resolution.formatColor = TextureFormat::BGRA8; constexpr uint64_t kF1 = BGFX_STATE_BLEND_INV_FACTOR; constexpr uint64_t kF2 = BGFX_STATE_BLEND_FACTOR<<4; constexpr uint64_t kF3 = BGFX_STATE_BLEND_INV_FACTOR<<4; + constexpr uint64_t kF4 = BGFX_STATE_BLEND_FACTOR<<8; + constexpr uint64_t kF5 = BGFX_STATE_BLEND_INV_FACTOR<<8; + constexpr uint64_t kF6 = BGFX_STATE_BLEND_FACTOR<<12; + constexpr uint64_t kF7 = BGFX_STATE_BLEND_INV_FACTOR<<12; bool hasFactor = 0 || kF0 == (state & kF0) || kF1 == (state & kF1) || kF2 == (state & kF2) || kF3 == (state & kF3) + || kF4 == (state & kF4) + || kF5 == (state & kF5) + || kF6 == (state & kF6) + || kF7 == (state & kF7) ; if (hasFactor