mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 22:28:32 +09:00
[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
This commit is contained in:
+12
-7
@@ -98,6 +98,11 @@ Working tree is clean.
|
|||||||
- `DrawsFromMobileGLState`
|
- `DrawsFromMobileGLState`
|
||||||
- `DrawsTexturedFromMobileGLState`
|
- `DrawsTexturedFromMobileGLState`
|
||||||
- `DrawsIndexedFromMobileGLState`
|
- `DrawsIndexedFromMobileGLState`
|
||||||
|
- `DrawsRealTexturedFromMobileGLState`
|
||||||
|
- `DrawsUniformFromMobileGLState`
|
||||||
|
- `DrawsToOffscreenFramebufferFromMobileGLState`
|
||||||
|
- `DrawsWithScissorFromMobileGLState`
|
||||||
|
- `DrawsWithBlendFromMobileGLState`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -149,7 +154,7 @@ Verified locally on Turnip Adreno 750:
|
|||||||
- Local test result:
|
- Local test result:
|
||||||
|
|
||||||
```
|
```
|
||||||
[ PASSED ] 8 tests
|
[ PASSED ] 10 tests
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -236,12 +241,12 @@ Notes:
|
|||||||
- [ ] `GetTexImage` / `CopyTexImage*` / indirect draws
|
- [ ] `GetTexImage` / `CopyTexImage*` / indirect draws
|
||||||
|
|
||||||
6. **Expand local test suite**
|
6. **Expand local test suite**
|
||||||
- Depth test visual test
|
- [x] Scissor test
|
||||||
- Stencil test
|
- [x] Blend test
|
||||||
- Blend test
|
- [x] Texture filtering / sampler state test
|
||||||
- Scissor test
|
- [x] framebuffer offscreen render-to-texture test
|
||||||
- Texture filtering / sampler state test
|
- [ ] Depth test visual test
|
||||||
- framebuffer offscreen render-to-texture test
|
- [ ] Stencil test
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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_GT(corner[1], 200) << "corner should remain green after clear";
|
||||||
EXPECT_LT(corner[0], 50) << "corner should not be red";
|
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";
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user