From bd9680ad674ec951caa93cd17bc1990130fdf670 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Tue, 18 Aug 2026 13:26:20 +0800 Subject: [PATCH] [Feat] (Diligent): wire viewport/scissor state into state draws DrawFromState now uses MG_State viewport (with full-target fallback when the viewport is uninitialized) and applies the scissor test rect when enabled. The state-driven test sets an explicit glViewport and passes again. --- .../Diligent/Renderer/DiligentRenderer.cpp | 25 ++++++++++++++++++- .../MG_Test/Backend/Diligent/SanityTest.cpp | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/MobileGL/MG_Backend/Diligent/Renderer/DiligentRenderer.cpp b/MobileGL/MG_Backend/Diligent/Renderer/DiligentRenderer.cpp index 0009c1dd..8e259456 100644 --- a/MobileGL/MG_Backend/Diligent/Renderer/DiligentRenderer.cpp +++ b/MobileGL/MG_Backend/Diligent/Renderer/DiligentRenderer.cpp @@ -396,9 +396,32 @@ void main() ::Diligent::ITextureView* rtvs[] = {m_pColorRTV}; m_pContext->SetRenderTargets(1, rtvs, nullptr, ::Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION); - ::Diligent::Viewport viewport{0, 0, static_cast(m_width), static_cast(m_height), 0.0f, 1.0f}; + auto glViewport = MG_State::pGLContext->GetViewport(); + if (glViewport.z() <= 0 || glViewport.w() <= 0) { + glViewport = IntVec4(0, 0, static_cast(m_width), static_cast(m_height)); + } + ::Diligent::Viewport viewport{ + static_cast(glViewport.x()), + static_cast(glViewport.y()), + static_cast(glViewport.z()), + static_cast(glViewport.w()), + 0.0f, 1.0f}; m_pContext->SetViewports(1, &viewport, m_width, m_height); + if (MG_State::pGLContext->IsCapabilityEnabled(CapabilityInput::ScissorTest)) { + const auto scissor = MG_State::pGLContext->GetScissorBox(); + ::Diligent::Rect rect{ + scissor.x(), + scissor.y(), + scissor.x() + scissor.z(), + scissor.y() + scissor.w()}; + m_pContext->SetScissorRects(1, &rect, m_width, m_height); + } else { + ::Diligent::Rect rect{0, 0, static_cast<::Diligent::Int32>(m_width), + static_cast<::Diligent::Int32>(m_height)}; + m_pContext->SetScissorRects(1, &rect, m_width, m_height); + } + ::Diligent::IBuffer* pVBs[] = {m_pVertexBuffer}; m_pContext->SetVertexBuffers(0, 1, pVBs, nullptr, ::Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION, diff --git a/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp b/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp index 405a0120..f71341e6 100644 --- a/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp +++ b/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -94,6 +95,7 @@ void main() { Color = vec4(1.0, 0.0, 0.0, 1.0); } AttachShader(program, fs); LinkProgram(program); UseProgram(program); + Viewport(0, 0, 256, 256); // Upload a triangle into a real GL buffer and describe it through a VAO. const float vertices[] = {