From b12eef18b583d1294c5caf691c1d7d7d1afda143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Fri, 14 Aug 2026 01:04:54 +0000 Subject: [PATCH] Fixed clear quad not writing stencil. (#3887) --- src/renderer_d3d11.cpp | 26 ++++++++++++++------------ src/renderer_mtl.cpp | 24 +++++++++++++----------- src/renderer_webgpu.cpp | 29 ++++++++++++++++------------- 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 4d5ea1a22..c0d7c74ce 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -3392,7 +3392,7 @@ namespace bgfx { namespace d3d11 desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY; desc.Texture2DArray.ArraySize = arrayed ? bx::max(_numLayers, 1) - : uint16_t(bx::max(texture.m_numLayers, 1) * 6) + : uint16_t(bx::max(texture.m_numLayers, 1u) * 6) ; desc.Texture2DArray.FirstArraySlice = _firstLayer; desc.Texture2DArray.MipSlice = _mip; @@ -3708,18 +3708,20 @@ namespace bgfx { namespace d3d11 { ID3D11DeviceContext* deviceCtx = m_deviceCtx; - uint64_t state = 0; - state |= _clear.m_flags & BGFX_CLEAR_COLOR ? BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A : 0; - state |= _clear.m_flags & BGFX_CLEAR_DEPTH ? BGFX_STATE_DEPTH_TEST_ALWAYS|BGFX_STATE_WRITE_Z : 0; + const uint64_t state = 0 + | (_clear.m_flags & BGFX_CLEAR_COLOR ? BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A : 0) + | (_clear.m_flags & BGFX_CLEAR_DEPTH ? BGFX_STATE_DEPTH_TEST_ALWAYS|BGFX_STATE_WRITE_Z : 0) + ; - uint64_t stencil = 0; - stencil |= _clear.m_flags & BGFX_CLEAR_STENCIL ? 0 - | BGFX_STENCIL_TEST_ALWAYS - | BGFX_STENCIL_FUNC_REF(_clear.m_stencil) - | BGFX_STENCIL_FUNC_RMASK(0xff) - | BGFX_STENCIL_OP_FAIL_S_REPLACE - | BGFX_STENCIL_OP_FAIL_Z_REPLACE - | BGFX_STENCIL_OP_PASS_Z_REPLACE + const uint64_t stencil = _clear.m_flags & BGFX_CLEAR_STENCIL + ? packStencil(0 + | BGFX_STENCIL_TEST_ALWAYS + | BGFX_STENCIL_FUNC_REF(_clear.m_stencil) + | BGFX_STENCIL_FUNC_RMASK(0xff) + | BGFX_STENCIL_OP_FAIL_S_REPLACE + | BGFX_STENCIL_OP_FAIL_Z_REPLACE + | BGFX_STENCIL_OP_PASS_Z_REPLACE + , BGFX_STENCIL_NONE) : 0 ; diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp index 1aec17924..ce600ed42 100644 --- a/src/renderer_mtl.cpp +++ b/src/renderer_mtl.cpp @@ -2155,18 +2155,20 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames void clearQuad(const ClearQuad& _clearQuad, const Rect& /*_rect*/, const Clear& _clear, const float _palette[][4]) { - uint64_t state = 0; - state |= _clear.m_flags & BGFX_CLEAR_COLOR ? BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A : 0; - state |= _clear.m_flags & BGFX_CLEAR_DEPTH ? BGFX_STATE_DEPTH_TEST_ALWAYS|BGFX_STATE_WRITE_Z : 0; + const uint64_t state = 0 + | (_clear.m_flags & BGFX_CLEAR_COLOR ? BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A : 0) + | (_clear.m_flags & BGFX_CLEAR_DEPTH ? BGFX_STATE_DEPTH_TEST_ALWAYS|BGFX_STATE_WRITE_Z : 0) + ; - uint64_t stencil = 0; - stencil |= _clear.m_flags & BGFX_CLEAR_STENCIL ? 0 - | BGFX_STENCIL_TEST_ALWAYS - | BGFX_STENCIL_FUNC_REF(_clear.m_stencil) - | BGFX_STENCIL_FUNC_RMASK(0xff) - | BGFX_STENCIL_OP_FAIL_S_REPLACE - | BGFX_STENCIL_OP_FAIL_Z_REPLACE - | BGFX_STENCIL_OP_PASS_Z_REPLACE + const uint64_t stencil = _clear.m_flags & BGFX_CLEAR_STENCIL + ? packStencil(0 + | BGFX_STENCIL_TEST_ALWAYS + | BGFX_STENCIL_FUNC_REF(_clear.m_stencil) + | BGFX_STENCIL_FUNC_RMASK(0xff) + | BGFX_STENCIL_OP_FAIL_S_REPLACE + | BGFX_STENCIL_OP_FAIL_Z_REPLACE + | BGFX_STENCIL_OP_PASS_Z_REPLACE + , BGFX_STENCIL_NONE) : 0 ; diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index dfec4d317..6ee456b99 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -2149,18 +2149,21 @@ WGPU_IMPORT { BX_UNUSED(_clearQuad, _rect, _clear, _palette); - uint64_t state = BGFX_STATE_PT_TRISTRIP; - state |= _clear.m_flags & BGFX_CLEAR_COLOR ? BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A : 0; - state |= _clear.m_flags & BGFX_CLEAR_DEPTH ? BGFX_STATE_DEPTH_TEST_ALWAYS|BGFX_STATE_WRITE_Z : 0; + const uint64_t state = 0 + | BGFX_STATE_PT_TRISTRIP + | (_clear.m_flags & BGFX_CLEAR_COLOR ? BGFX_STATE_WRITE_RGB|BGFX_STATE_WRITE_A : 0) + | (_clear.m_flags & BGFX_CLEAR_DEPTH ? BGFX_STATE_DEPTH_TEST_ALWAYS|BGFX_STATE_WRITE_Z : 0) + ; - uint64_t stencil = 0; - stencil |= _clear.m_flags & BGFX_CLEAR_STENCIL ? 0 - | BGFX_STENCIL_TEST_ALWAYS - | BGFX_STENCIL_FUNC_REF(_clear.m_stencil) - | BGFX_STENCIL_FUNC_RMASK(0xff) - | BGFX_STENCIL_OP_FAIL_S_REPLACE - | BGFX_STENCIL_OP_FAIL_Z_REPLACE - | BGFX_STENCIL_OP_PASS_Z_REPLACE + const uint64_t stencil = _clear.m_flags & BGFX_CLEAR_STENCIL + ? packStencil(0 + | BGFX_STENCIL_TEST_ALWAYS + | BGFX_STENCIL_FUNC_REF(_clear.m_stencil) + | BGFX_STENCIL_FUNC_RMASK(0xff) + | BGFX_STENCIL_OP_FAIL_S_REPLACE + | BGFX_STENCIL_OP_FAIL_Z_REPLACE + | BGFX_STENCIL_OP_PASS_Z_REPLACE + , BGFX_STENCIL_NONE) : 0 ; @@ -2608,7 +2611,7 @@ WGPU_IMPORT const uint32_t resolvedFlags = 0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & bind.m_samplerFlags) ? bind.m_samplerFlags - : texture.m_flags + : uint32_t(texture.m_flags) ; WGPUTextureSampleType sampleType = WGPUTextureSampleType_Depth != shaderBind.sampleType @@ -3162,7 +3165,7 @@ WGPU_IMPORT const uint32_t resolvedFlags = 0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & bind.m_samplerFlags) ? bind.m_samplerFlags - : texture.m_flags + : uint32_t(texture.m_flags) ; const bool sampleStencil = Binding::Texture == bind.m_type && 0 != (resolvedFlags & BGFX_SAMPLER_SAMPLE_STENCIL)