From 65d4fb7649db44ec362e353738f1e7d8ea5f2cdc Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Mon, 18 Apr 2022 10:57:45 +0200 Subject: [PATCH] LibGL: Set W-coordinate to 1 in `glRect*` According to the spec, these calls should be identical to an invocation of `glVertex2*`, which sets the W-coordinate to 1 by default. This fixes the credits sequence rendering of Tux Racer. --- Tests/LibGL/TestRender.cpp | 46 ++++++++++++------ .../0003_rect_w_coordinate_regression.qoi | Bin 0 -> 344 bytes Userland/Libraries/LibGL/GLContext.cpp | 8 +-- 3 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 Tests/LibGL/reference-images/0003_rect_w_coordinate_regression.qoi diff --git a/Tests/LibGL/TestRender.cpp b/Tests/LibGL/TestRender.cpp index 7c67097b07..640c54252f 100644 --- a/Tests/LibGL/TestRender.cpp +++ b/Tests/LibGL/TestRender.cpp @@ -26,6 +26,15 @@ static NonnullOwnPtr create_testing_context(int width, int height auto bitmap = MUST(Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRx8888, { width, height })); auto context = GL::create_context(*bitmap); GL::make_context_current(context); + + // Assume some defaults for our testing contexts + glFrontFace(GL_CCW); + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + return context; } @@ -51,13 +60,6 @@ TEST_CASE(0001_simple_triangle) { auto context = create_testing_context(64, 64); - glFrontFace(GL_CCW); - glCullFace(GL_BACK); - glEnable(GL_CULL_FACE); - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - glBegin(GL_TRIANGLES); glColor3f(1, 1, 1); glVertex2f(0, 1); @@ -75,13 +77,6 @@ TEST_CASE(0002_quad_color_interpolation) { auto context = create_testing_context(64, 64); - glFrontFace(GL_CCW); - glCullFace(GL_BACK); - glEnable(GL_CULL_FACE); - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - glBegin(GL_QUADS); glColor3f(1, 0, 0); @@ -99,3 +94,26 @@ TEST_CASE(0002_quad_color_interpolation) context->present(); expect_bitmap_equals_reference(context->frontbuffer(), "0002_quad_color_interpolation"); } + +TEST_CASE(0003_rect_w_coordinate_regression) +{ + auto context = create_testing_context(64, 64); + + glEnable(GL_DEPTH_TEST); + glClear(GL_DEPTH_BUFFER_BIT); + + glColor3f(0, 1, 0); + glRectf(-0.5f, -0.5f, 0.5f, 0.5f); + + glBegin(GL_TRIANGLES); + glColor3f(1, 0, 0); + glVertex2i(-1, -1); + glVertex2i(1, -1); + glVertex2i(-1, 1); + glEnd(); + + EXPECT_EQ(glGetError(), 0u); + + context->present(); + expect_bitmap_equals_reference(context->frontbuffer(), "0003_rect_w_coordinate_regression"); +} diff --git a/Tests/LibGL/reference-images/0003_rect_w_coordinate_regression.qoi b/Tests/LibGL/reference-images/0003_rect_w_coordinate_regression.qoi new file mode 100644 index 0000000000000000000000000000000000000000..262ab88039f78801baf5b6a6e733a70a61537b46 GIT binary patch literal 344 zcmXTS&rD-rU~m9o7KXnE|NUoRF#T(E!1RyNLDSzxhfIGN9X9=Gbj0+B(NWXyM#oIQ z867wMYIMT%i_uBb&qk+AKN+1i{b+Q?^n=k^)AvT_{xSS#xMzCK=$ye&CEuBzGkR}& z*64%j8KaM;r;R?Do-+DudeZ2N=?SB+rpJxGnI1FxZhF+{hv^ZcpQeY6ewiLJ`fYm9 P=#S|EqravM5Wolk$uFvE literal 0 HcmV?d00001 diff --git a/Userland/Libraries/LibGL/GLContext.cpp b/Userland/Libraries/LibGL/GLContext.cpp index de73623923..4618383689 100644 --- a/Userland/Libraries/LibGL/GLContext.cpp +++ b/Userland/Libraries/LibGL/GLContext.cpp @@ -2878,10 +2878,10 @@ void GLContext::gl_rect(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); gl_begin(GL_POLYGON); - gl_vertex(x1, y1, 0.0, 0.0); - gl_vertex(x2, y1, 0.0, 0.0); - gl_vertex(x2, y2, 0.0, 0.0); - gl_vertex(x1, y2, 0.0, 0.0); + gl_vertex(x1, y1, 0.0, 1.0); + gl_vertex(x2, y1, 0.0, 1.0); + gl_vertex(x2, y2, 0.0, 1.0); + gl_vertex(x1, y2, 0.0, 1.0); gl_end(); }