重构原因: - D3D12 PSO是不可变的,SetDepthStencilState/SetBlendState调用原本就是空实现(TODO) - 这些方法在D3D12中完全无效,是死代码 移除的方法: - SetDepthStencilState(const DepthStencilState&) - D3D12空实现,OpenGL直接调用GL函数 - SetBlendState(const BlendState&) - D3D12只设置BlendFactor其他忽略,OpenGL直接调用GL函数 保留的真正动态状态: - SetViewport/SetViewports - SetScissorRect/SetScissorRects - SetStencilRef (D3D12动态状态) - SetBlendFactor (D3D12动态状态) 注:PrimitiveTopology保留在CommandList,因为D3D12允许动态改变topology type 测试状态:150个RHI单元测试全部通过,8个集成测试全部通过
163 lines
4.4 KiB
C++
163 lines
4.4 KiB
C++
#include "fixtures/OpenGLTestFixture.h"
|
|
#include "XCEngine/RHI/OpenGL/OpenGLCommandList.h"
|
|
#include "XCEngine/RHI/OpenGL/OpenGLBuffer.h"
|
|
#include "XCEngine/RHI/OpenGL/OpenGLVertexArray.h"
|
|
|
|
using namespace XCEngine::RHI;
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_Clear_ColorBuffer) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.ClearColor(1.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
GLfloat color[4] = {};
|
|
glGetFloatv(GL_COLOR_CLEAR_VALUE, color);
|
|
EXPECT_FLOAT_EQ(color[0], 1.0f);
|
|
EXPECT_FLOAT_EQ(color[1], 0.0f);
|
|
EXPECT_FLOAT_EQ(color[2], 0.0f);
|
|
EXPECT_FLOAT_EQ(color[3], 1.0f);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_Clear_DepthStencil) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.ClearDepth(0.5f);
|
|
cmdList.ClearStencil(2);
|
|
|
|
GLfloat depth = 0.0f;
|
|
glGetFloatv(GL_DEPTH_CLEAR_VALUE, &depth);
|
|
EXPECT_FLOAT_EQ(depth, 0.5f);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_SetIndexBuffer) {
|
|
OpenGLCommandList cmdList;
|
|
OpenGLBuffer buffer;
|
|
buffer.InitializeIndexBuffer(nullptr, 12);
|
|
|
|
cmdList.SetIndexBuffer(buffer.GetID(), GL_UNSIGNED_INT, 0);
|
|
|
|
GLenum error = glGetError();
|
|
EXPECT_EQ(error, GL_NO_ERROR);
|
|
|
|
buffer.Shutdown();
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_Draw_VAO) {
|
|
OpenGLCommandList cmdList;
|
|
OpenGLVertexArray vao;
|
|
vao.Initialize();
|
|
|
|
OpenGLBuffer vbo;
|
|
float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f };
|
|
vbo.InitializeVertexBuffer(vertices, sizeof(vertices));
|
|
|
|
VertexAttribute attr;
|
|
attr.index = 0;
|
|
attr.count = 3;
|
|
attr.type = VertexAttributeType::Float;
|
|
attr.normalized = VertexAttributeNormalized::False;
|
|
attr.stride = sizeof(float) * 3;
|
|
attr.offset = 0;
|
|
vao.AddVertexBuffer(vbo.GetID(), attr);
|
|
|
|
OpenGLBuffer ibo;
|
|
unsigned int indices[] = { 0, 1, 2 };
|
|
ibo.InitializeIndexBuffer(indices, sizeof(indices));
|
|
vao.SetIndexBuffer(ibo.GetID(), GL_UNSIGNED_INT);
|
|
|
|
cmdList.BindVertexArray(vao.GetID());
|
|
|
|
cmdList.SetPrimitiveType(PrimitiveType::Triangles);
|
|
cmdList.Draw(PrimitiveType::Triangles, 3, 0);
|
|
|
|
GLenum error = glGetError();
|
|
EXPECT_EQ(error, GL_NO_ERROR);
|
|
|
|
vbo.Shutdown();
|
|
ibo.Shutdown();
|
|
vao.Shutdown();
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_SetViewport) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.SetViewport(0, 0, 800, 600);
|
|
|
|
GLint viewport[4] = {};
|
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
|
EXPECT_EQ(viewport[0], 0);
|
|
EXPECT_EQ(viewport[1], 0);
|
|
EXPECT_EQ(viewport[2], 800);
|
|
EXPECT_EQ(viewport[3], 600);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_SetScissor) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.EnableScissorTest(true);
|
|
cmdList.SetScissor(0, 0, 800, 600);
|
|
|
|
GLint scissor[4] = {};
|
|
glGetIntegerv(GL_SCISSOR_BOX, scissor);
|
|
EXPECT_EQ(scissor[0], 0);
|
|
EXPECT_EQ(scissor[1], 0);
|
|
EXPECT_EQ(scissor[2], 800);
|
|
EXPECT_EQ(scissor[3], 600);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_EnableDisable_DepthTest) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.EnableDepthTest(true);
|
|
GLint depthTest = 0;
|
|
glGetIntegerv(GL_DEPTH_TEST, &depthTest);
|
|
EXPECT_EQ(depthTest, 1);
|
|
|
|
cmdList.EnableDepthTest(false);
|
|
glGetIntegerv(GL_DEPTH_TEST, &depthTest);
|
|
EXPECT_EQ(depthTest, 0);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_EnableDisable_Blending) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.EnableBlending(true);
|
|
GLint blend = 0;
|
|
glGetIntegerv(GL_BLEND, &blend);
|
|
EXPECT_EQ(blend, 1);
|
|
|
|
cmdList.EnableBlending(false);
|
|
glGetIntegerv(GL_BLEND, &blend);
|
|
EXPECT_EQ(blend, 0);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_SetPrimitiveTopology) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
cmdList.SetPrimitiveTopology(PrimitiveTopology::TriangleList);
|
|
GLenum error = glGetError();
|
|
EXPECT_EQ(error, GL_NO_ERROR);
|
|
|
|
cmdList.SetPrimitiveTopology(PrimitiveTopology::LineList);
|
|
error = glGetError();
|
|
EXPECT_EQ(error, GL_NO_ERROR);
|
|
|
|
cmdList.SetPrimitiveTopology(PrimitiveTopology::PointList);
|
|
error = glGetError();
|
|
EXPECT_EQ(error, GL_NO_ERROR);
|
|
}
|
|
|
|
TEST_F(OpenGLTestFixture, CommandList_SetBlendFactor) {
|
|
OpenGLCommandList cmdList;
|
|
|
|
float factor[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
|
|
cmdList.SetBlendFactor(factor);
|
|
|
|
GLfloat color[4] = {};
|
|
glGetFloatv(GL_BLEND_COLOR, color);
|
|
EXPECT_FLOAT_EQ(color[0], 0.5f);
|
|
EXPECT_FLOAT_EQ(color[1], 0.5f);
|
|
EXPECT_FLOAT_EQ(color[2], 0.5f);
|
|
EXPECT_FLOAT_EQ(color[3], 1.0f);
|
|
}
|