Metal/WebGPU: Clip view scissor and render area to the framebuffer. Fixes #3864. (#3866)

This commit is contained in:
Branimir Karadžić
2026-08-01 19:51:44 -07:00
committed by GitHub
parent 47320e39a8
commit e75ab293cc
2 changed files with 33 additions and 16 deletions

View File

@@ -5375,9 +5375,32 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
if (!isCompute)
{
const Rect& clippedRect = _render->m_view[view].m_clippedRect;
const Rect& scissorRect = _render->m_view[view].m_scissor;
viewHasScissor = !scissorRect.isZero();
const FrameBufferHandle viewFbh = _render->m_view[view].m_fbh;
uint32_t width = m_resolution.width;
uint32_t height = m_resolution.height;
if (isValid(viewFbh) )
{
const FrameBufferMtl& frameBuffer = m_frameBuffers[viewFbh.idx];
width = frameBuffer.m_width;
height = frameBuffer.m_height;
}
const Rect framebufferRect(
0
, 0
, bx::narrowCast<uint16_t>(width)
, bx::narrowCast<uint16_t>(height)
);
Rect clippedRect;
clippedRect.setIntersect(_render->m_view[view].m_clippedRect, framebufferRect);
Rect scissorRect;
scissorRect.setIntersect(_render->m_view[view].m_scissor, framebufferRect);
viewHasScissor = !_render->m_view[view].m_scissor.isZero();
viewScissorRect = viewHasScissor ? scissorRect : clippedRect;
Clear& clr = _render->m_view[view].m_clear;
@@ -5394,16 +5417,6 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames
fbh = _render->m_view[view].m_fbh;
uint32_t width = m_resolution.width;
uint32_t height = m_resolution.height;
if (isValid(fbh) )
{
FrameBufferMtl& frameBuffer = m_frameBuffers[fbh.idx];
width = frameBuffer.m_width;
height = frameBuffer.m_height;
}
clearWithRenderPass = true
&& 0 == viewRect.m_x
&& 0 == viewRect.m_y