From bf6061811f25f8fa0dff386609a86106829ac4cc Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sun, 23 Aug 2026 09:17:41 +0800 Subject: [PATCH] [Test] (Diligent, MG_Test): add scissor and blend state tests - Verify scissor clipping leaves outside pixels untouched - Verify alpha blend combines source/destination colors - Update handoff to 10 passing Diligent tests --- HANDOFF_DILIGENT.md | 19 ++- .../MG_Test/Backend/Diligent/SanityTest.cpp | 131 ++++++++++++++++++ 2 files changed, 143 insertions(+), 7 deletions(-) diff --git a/HANDOFF_DILIGENT.md b/HANDOFF_DILIGENT.md index 857036c2..40148003 100644 --- a/HANDOFF_DILIGENT.md +++ b/HANDOFF_DILIGENT.md @@ -98,6 +98,11 @@ Working tree is clean. - `DrawsFromMobileGLState` - `DrawsTexturedFromMobileGLState` - `DrawsIndexedFromMobileGLState` + - `DrawsRealTexturedFromMobileGLState` + - `DrawsUniformFromMobileGLState` + - `DrawsToOffscreenFramebufferFromMobileGLState` + - `DrawsWithScissorFromMobileGLState` + - `DrawsWithBlendFromMobileGLState` --- @@ -149,7 +154,7 @@ Verified locally on Turnip Adreno 750: - Local test result: ``` -[ PASSED ] 8 tests +[ PASSED ] 10 tests ``` --- @@ -236,12 +241,12 @@ Notes: - [ ] `GetTexImage` / `CopyTexImage*` / indirect draws 6. **Expand local test suite** - - Depth test visual test - - Stencil test - - Blend test - - Scissor test - - Texture filtering / sampler state test - - framebuffer offscreen render-to-texture test + - [x] Scissor test + - [x] Blend test + - [x] Texture filtering / sampler state test + - [x] framebuffer offscreen render-to-texture test + - [ ] Depth test visual test + - [ ] Stencil test --- diff --git a/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp b/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp index 04d3c0d1..3def7198 100644 --- a/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp +++ b/MobileGL/MG_Test/Backend/Diligent/SanityTest.cpp @@ -495,3 +495,134 @@ void main() { Color = vec4(1.0, 0.0, 0.0, 1.0); } EXPECT_GT(corner[1], 200) << "corner should remain green after clear"; EXPECT_LT(corner[0], 50) << "corner should not be red"; } + + +TEST(DiligentVulkanBackend, DrawsWithScissorFromMobileGLState) { + MobileGL::Initialize(); + + const char* vsSrc = R"(#version 330 core +layout(location = 0) in vec2 Position; +void main() { gl_Position = vec4(Position, 0.0, 1.0); } +)"; + const char* fsSrc = R"(#version 330 core +out vec4 Color; +void main() { Color = vec4(1.0, 0.0, 0.0, 1.0); } +)"; + + const GLuint vs = CreateShader(GL_VERTEX_SHADER); + ShaderSource(vs, 1, &vsSrc, nullptr); + CompileShader(vs); + const GLuint fs = CreateShader(GL_FRAGMENT_SHADER); + ShaderSource(fs, 1, &fsSrc, nullptr); + CompileShader(fs); + const GLuint program = CreateProgram(); + AttachShader(program, vs); + AttachShader(program, fs); + LinkProgram(program); + UseProgram(program); + Viewport(0, 0, 256, 256); + + const float vertices[] = { + -0.5f, -0.5f, + 0.5f, -0.5f, + 0.0f, 0.5f, + }; + GLuint vbo = 0; + GenBuffers(1, &vbo); + BindBuffer(GL_ARRAY_BUFFER, vbo); + BufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + GLuint vao = 0; + GenVertexArrays(1, &vao); + BindVertexArray(vao); + EnableVertexAttribArray(0); + VertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + + Enable(GL_SCISSOR_TEST); + Scissor(96, 96, 64, 64); + + DiligentBackend::BackendObject_Diligent backend; + backend.Initialize(); + auto* renderer = backend.GetRenderer(); + if (renderer == nullptr) { + GTEST_SKIP() << "No Vulkan adapter available; skipping scissor state test"; + } + + renderer->Clear(0.0f, 1.0f, 0.0f, 1.0f); + renderer->DrawFromState(GL_TRIANGLES, 0, 3, 0, nullptr); + renderer->Present(); + + std::uint8_t center[4] = {}; + renderer->ReadPixels(128, 128, 1, 1, center); + EXPECT_GT(center[0], 200) << "center should be red inside scissor rect"; + EXPECT_LT(center[1], 50) << "center should not be green"; + + std::uint8_t corner[4] = {}; + renderer->ReadPixels(0, 0, 1, 1, corner); + EXPECT_GT(corner[1], 200) << "corner should remain green outside scissor rect"; + EXPECT_LT(corner[0], 50) << "corner should not be red"; +} + + +TEST(DiligentVulkanBackend, DrawsWithBlendFromMobileGLState) { + MobileGL::Initialize(); + + const char* vsSrc = R"(#version 330 core +layout(location = 0) in vec2 Position; +void main() { gl_Position = vec4(Position, 0.0, 1.0); } +)"; + const char* fsSrc = R"(#version 330 core +out vec4 Color; +void main() { Color = vec4(1.0, 0.0, 0.0, 0.5); } +)"; + + const GLuint vs = CreateShader(GL_VERTEX_SHADER); + ShaderSource(vs, 1, &vsSrc, nullptr); + CompileShader(vs); + const GLuint fs = CreateShader(GL_FRAGMENT_SHADER); + ShaderSource(fs, 1, &fsSrc, nullptr); + CompileShader(fs); + const GLuint program = CreateProgram(); + AttachShader(program, vs); + AttachShader(program, fs); + LinkProgram(program); + UseProgram(program); + Viewport(0, 0, 256, 256); + + const float vertices[] = { + -0.5f, -0.5f, + 0.5f, -0.5f, + 0.0f, 0.5f, + }; + GLuint vbo = 0; + GenBuffers(1, &vbo); + BindBuffer(GL_ARRAY_BUFFER, vbo); + BufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + GLuint vao = 0; + GenVertexArrays(1, &vao); + BindVertexArray(vao); + EnableVertexAttribArray(0); + VertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr); + + Enable(GL_BLEND); + BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + DiligentBackend::BackendObject_Diligent backend; + backend.Initialize(); + auto* renderer = backend.GetRenderer(); + if (renderer == nullptr) { + GTEST_SKIP() << "No Vulkan adapter available; skipping blend state test"; + } + + renderer->Clear(0.0f, 1.0f, 0.0f, 1.0f); + renderer->DrawFromState(GL_TRIANGLES, 0, 3, 0, nullptr); + renderer->Present(); + + std::uint8_t center[4] = {}; + renderer->ReadPixels(128, 128, 1, 1, center); + EXPECT_GT(center[0], 80) << "center should include blended red"; + EXPECT_GT(center[1], 80) << "center should include remaining green"; + EXPECT_LT(center[0], 220) << "center should not be pure red"; + EXPECT_LT(center[1], 220) << "center should not be pure green"; +}