From 8cfabbcd9330fad62cace2a6c0f3a15d9b39cfe3 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Fri, 15 Apr 2022 01:08:15 +0200 Subject: [PATCH] Tests: Implement reference image testing for LibGL Each LibGL test can now be tested against a reference QOI image. Initially, these images can be generated by setting `SAVE_OUTPUT` to `true`, which will save a bunch of QOI images to `/home/anon`. --- Meta/Lagom/CMakeLists.txt | 3 +- Tests/LibGL/CMakeLists.txt | 4 +- Tests/LibGL/TestRender.cpp | 99 +++++++++++++----- .../reference-images/0001_simple_triangle.qoi | Bin 0 -> 277 bytes .../0002_quad_color_interpolation.qoi | Bin 0 -> 8342 bytes 5 files changed, 75 insertions(+), 31 deletions(-) create mode 100644 Tests/LibGL/reference-images/0001_simple_triangle.qoi create mode 100644 Tests/LibGL/reference-images/0002_quad_color_interpolation.qoi diff --git a/Meta/Lagom/CMakeLists.txt b/Meta/Lagom/CMakeLists.txt index 7219190b19..76b632a163 100644 --- a/Meta/Lagom/CMakeLists.txt +++ b/Meta/Lagom/CMakeLists.txt @@ -590,9 +590,10 @@ if (BUILD_LAGOM) endforeach() # GL + file(COPY "${SERENITY_PROJECT_ROOT}/Tests/LibGL/reference-images" DESTINATION "./") file(GLOB LIBGL_TESTS CONFIGURE_DEPENDS "../../Tests/LibGL/*.cpp") foreach(source ${LIBGL_TESTS}) - lagom_test(${source} LIBS LagomGL) + lagom_test(${source} WORKING_DIRECTORY LIBS LagomGL LagomGPU LagomSoftGPU) endforeach() # PDF diff --git a/Tests/LibGL/CMakeLists.txt b/Tests/LibGL/CMakeLists.txt index dc11cf753e..d29a58ae71 100644 --- a/Tests/LibGL/CMakeLists.txt +++ b/Tests/LibGL/CMakeLists.txt @@ -3,5 +3,7 @@ set(TEST_SOURCES ) foreach(source IN LISTS TEST_SOURCES) - serenity_test("${source}" LibGL LIBS LibGL) + serenity_test("${source}" LibGL LIBS LibCore LibGL) endforeach() + +install(DIRECTORY reference-images DESTINATION usr/Tests/LibGL) diff --git a/Tests/LibGL/TestRender.cpp b/Tests/LibGL/TestRender.cpp index a6bd64d982..7c67097b07 100644 --- a/Tests/LibGL/TestRender.cpp +++ b/Tests/LibGL/TestRender.cpp @@ -1,60 +1,101 @@ /* - * Copyright (c) 2021, Leon Albrecht . + * Copyright (c) 2021, Leon Albrecht + * Copyright (c) 2022, Jelle Raaijmakers * * SPDX-License-Identifier: BSD-2-Clause */ -#include - -#include -#include +#include +#include +#include #include #include -#include #include -#include -#include -#include +#include +#include -#define RENDER_WIDTH 16 -#define RENDER_HEIGHT 16 +#ifdef __serenity__ +# define REFERENCE_IMAGE_DIR "/usr/Tests/LibGL/reference-images" +#else +# define REFERENCE_IMAGE_DIR "reference-images" +#endif +#define SAVE_OUTPUT false -TEST_CASE(simple_triangle) +static NonnullOwnPtr create_testing_context(int width, int height) { - auto bitmap = MUST(Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRx8888, { RENDER_WIDTH, RENDER_HEIGHT })); + auto bitmap = MUST(Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRx8888, { width, height })); auto context = GL::create_context(*bitmap); - GL::make_context_current(context); + return context; +} + +static void expect_bitmap_equals_reference(Gfx::Bitmap const& bitmap, StringView test_name) +{ + auto reference_filename = String::formatted("{}.qoi", test_name); + + if constexpr (SAVE_OUTPUT) { + auto target_path = LexicalPath("/home/anon").append(reference_filename); + auto qoi_buffer = Gfx::QOIWriter::encode(bitmap); + auto qoi_output_stream = MUST(Core::OutputFileStream::open(target_path.string())); + auto number_of_bytes_written = qoi_output_stream.write(qoi_buffer); + qoi_output_stream.close(); + EXPECT_EQ(number_of_bytes_written, qoi_buffer.size()); + } + + auto reference_image_path = String::formatted(REFERENCE_IMAGE_DIR "/{}", reference_filename); + auto reference_bitmap = MUST(Gfx::Bitmap::try_load_from_file(reference_image_path)); + EXPECT_EQ(reference_bitmap->visually_equals(bitmap), true); +} + +TEST_CASE(0001_simple_triangle) +{ + auto context = create_testing_context(64, 64); glFrontFace(GL_CCW); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); - glEnable(GL_DEPTH_TEST); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClearDepth(1.0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); - glColor4f(1, 1, 1, 1); + glColor3f(1, 1, 1); glVertex2f(0, 1); glVertex2f(-1, -1); glVertex2f(1, -1); glEnd(); + EXPECT_EQ(glGetError(), 0u); + context->present(); + expect_bitmap_equals_reference(context->frontbuffer(), "0001_simple_triangle"); +} + +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); + glVertex2i(-1, -1); + glColor3f(0, 1, 0); + glVertex2i(1, -1); + glColor3f(0, 0, 1); + glVertex2i(1, 1); + glColor3f(1, 0, 1); + glVertex2i(-1, 1); + glEnd(); EXPECT_EQ(glGetError(), 0u); - // FIXME: Verify that the image is indeed correct - if constexpr (GL_DEBUG) { - // output the image to manually verify that the output is correct - Gfx::BMPWriter writer {}; - auto buffer = writer.dump(bitmap); - int fd = open("./picture.bmp", O_CREAT | O_WRONLY, 0755); - EXPECT(fd > 0); - ssize_t nwritten = write(fd, buffer.data(), buffer.size()); - EXPECT_EQ((size_t)nwritten, buffer.size()); - close(fd); - } + context->present(); + expect_bitmap_equals_reference(context->frontbuffer(), "0002_quad_color_interpolation"); } diff --git a/Tests/LibGL/reference-images/0001_simple_triangle.qoi b/Tests/LibGL/reference-images/0001_simple_triangle.qoi new file mode 100644 index 0000000000000000000000000000000000000000..cb3222aabc05b55b90e8e26847ad3400665bc423 GIT binary patch literal 277 zcmXTS&rD-rU~m9o7KXnM{{8>||A6TqwF9QV)ef2dQafb&Q|*Z9549tv-_?$pep5SU z`c>_O=@+#Vrk~YLnSN3`W%^O=jOhopGp6s=&Y8YbJ7@YH!dR6U(=@qpXrkB-TnO;(RWqMKV zjp+roH>T&+-kF|LduMu9?SttVwGXDJ)jpY?Qu}0jQtgZB3AHb#$JM@>9#i{fdQ|O) h=@GRbriayjnI2O6WqMHUkLdxmKc;Gb4=_LgBLE6$ihck9 literal 0 HcmV?d00001 diff --git a/Tests/LibGL/reference-images/0002_quad_color_interpolation.qoi b/Tests/LibGL/reference-images/0002_quad_color_interpolation.qoi new file mode 100644 index 0000000000000000000000000000000000000000..9e01a9eedeb44d636bf00712b36bb14a201e70bf GIT binary patch literal 8342 zcmXTS&rD-rU~m9o7KVR+8U8Nt7)bcA)w12VazrPG$2hIhHMVGMr`^)fgpj-g5 zAMAp+1LFdS{a_co90(V{><7ExDg9l5upjJ#hxB#WF4#yb7Z77V*ad58;{xLB2fJV;EnGmX{a_a? zrM?S@w;$|+h17NdDfWY1FqgV6AkBWT3uaQ&1*F;!cEMEYxqx*0!7i9cEfi(tfZDZ1KB*w)TTvV2RHKw6-7Y0#n>BpuPQI7Z~Dl0X^&oyFeGa3+Q7% z*ae!{TtF}T!7fn6bOHVB2fIKK-39ctAM65IR2R_Key|H9kzGJ<`@t>{MYw?e_Jds@ u2y?+e*bjCAFT@1{V?WphoFEqrl>J~AurBZzIQzjaU>r#Mm#{EE03!efCG%MT literal 0 HcmV?d00001