Set scissor during swapchain copy

This commit is contained in:
Luke Street
2026-06-16 13:23:38 -06:00
parent 39933ea02a
commit 0acac1320c
+19 -1
View File
@@ -37,6 +37,23 @@ Module Log("aurora");
using webgpu::g_device;
using webgpu::g_queue;
using webgpu::g_surface;
uint32_t clamp_scissor_coord(double value, uint32_t maximum) noexcept {
if (!std::isfinite(value)) {
return 0;
}
return static_cast<uint32_t>(std::clamp(value, 0.0, static_cast<double>(maximum)));
}
void set_present_viewport(const wgpu::RenderPassEncoder& pass, const gfx::Viewport& viewport, uint32_t surfaceWidth,
uint32_t surfaceHeight) noexcept {
pass.SetViewport(viewport.left, viewport.top, viewport.width, viewport.height, viewport.znear, viewport.zfar);
const auto scissorX = clamp_scissor_coord(std::floor(viewport.left), surfaceWidth);
const auto scissorY = clamp_scissor_coord(std::floor(viewport.top), surfaceHeight);
const auto scissorRight = clamp_scissor_coord(std::ceil(viewport.left + viewport.width), surfaceWidth);
const auto scissorBottom = clamp_scissor_coord(std::ceil(viewport.top + viewport.height), surfaceHeight);
pass.SetScissorRect(scissorX, scissorY, scissorRight - scissorX, scissorBottom - scissorY);
}
#endif
#ifdef AURORA_ENABLE_GX
@@ -296,7 +313,8 @@ void end_frame() noexcept {
// Copy EFB -> XFB (swapchain)
pass.SetPipeline(webgpu::g_CopyPipeline);
pass.SetBindGroup(0, presentBindGroup, 0, nullptr);
pass.SetViewport(viewport.left, viewport.top, viewport.width, viewport.height, viewport.znear, viewport.zfar);
set_present_viewport(pass, viewport, webgpu::g_graphicsConfig.surfaceConfiguration.width,
webgpu::g_graphicsConfig.surfaceConfiguration.height);
pass.Draw(3);
if (rmlBindGroup && rmlOverlay) {