diff options
Diffstat (limited to 'src/gallium/targets/osmesa')
-rw-r--r-- | src/gallium/targets/osmesa/test-render.cpp | 110 |
1 files changed, 68 insertions, 42 deletions
diff --git a/src/gallium/targets/osmesa/test-render.cpp b/src/gallium/targets/osmesa/test-render.cpp index feff9f420c6..55d449c2132 100644 --- a/src/gallium/targets/osmesa/test-render.cpp +++ b/src/gallium/targets/osmesa/test-render.cpp @@ -7,9 +7,14 @@ #include <gtest/gtest.h> #include "GL/osmesa.h" +#include "util/macros.h" - -typedef std::array<GLenum, 2> Params; +typedef struct { + unsigned format; + GLenum type; + int bpp; + uint64_t expected; +} Params; class OSMesaRenderTestFixture : public testing::TestWithParam<Params> {}; @@ -17,7 +22,7 @@ std::string name_params(const testing::TestParamInfo<Params> params) { auto p = params.param; std::string first, second; - switch (p[0]) { + switch (p.format) { case OSMESA_RGBA: first = "rgba"; break; @@ -35,7 +40,7 @@ name_params(const testing::TestParamInfo<Params> params) { break; } - switch (p[1]) { + switch (p.type) { case GL_UNSIGNED_SHORT: second = "unsigned_short"; break; @@ -55,52 +60,69 @@ name_params(const testing::TestParamInfo<Params> params) { TEST_P(OSMesaRenderTestFixture, Render) { - auto params = GetParam(); + auto p = GetParam(); const int w = 2, h = 2; - uint8_t pixels[w * h * 4] = { 0 }; - uint32_t expected; // This should be green for the given color model + uint8_t pixels[w * h * 8] = { 0 }; std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx{ - OSMesaCreateContext(params[0], NULL), &OSMesaDestroyContext}; + OSMesaCreateContext(p.format, NULL), &OSMesaDestroyContext}; ASSERT_TRUE(ctx); - auto ret = OSMesaMakeCurrent(ctx.get(), &pixels, params[1], w, h); + auto ret = OSMesaMakeCurrent(ctx.get(), &pixels, p.type, w, h); ASSERT_EQ(ret, GL_TRUE); - int bpp = 4; - switch (params[0]) { - case OSMESA_RGB: - bpp = 3; - break; - case OSMESA_RGB_565: - bpp = 2; - break; - } + glClearColor(0.25, 1.0, 0.5, 0.75); + + uint64_t expected = p.expected; - switch (params[0]) { - case OSMESA_RGBA: - case OSMESA_BGRA: - case OSMESA_RGB: - expected = 0xff << 8; - glClearColor(0, 1, 0, 0); - break; - case OSMESA_RGB_565: - expected = 0x3f << 5; - glClearColor(0, 1, 0, 0); - break; - case OSMESA_ARGB: - expected = 0xff << 24; - glClearColor(0, 0, 1, 0); - break; - } glClear(GL_COLOR_BUFFER_BIT); glFinish(); - for (unsigned i = 0; i < w * h; i++) { - uint32_t color = 0; - memcpy(&color, &pixels[i * bpp], bpp); +#if 0 /* XXX */ + for (unsigned i = 0; i < ARRAY_SIZE(pixels); i += 4) { + fprintf(stderr, "pixel %d: %02x %02x %02x %02x\n", + i / 4, + pixels[i + 0], + pixels[i + 1], + pixels[i + 2], + pixels[i + 3]); + } +#endif - ASSERT_EQ(expected, color); + for (unsigned i = 0; i < w * h; i++) { + switch (p.bpp) { + case 2: { + uint16_t color = 0; + memcpy(&color, &pixels[i * p.bpp], p.bpp); + ASSERT_EQ(expected, color); + break; + } + + case 3: { + uint32_t color = ((pixels[i * p.bpp + 0] << 0) | + (pixels[i * p.bpp + 1] << 8) | + (pixels[i * p.bpp + 2] << 16)); + ASSERT_EQ(expected, color); + break; + } + + case 4: { + uint32_t color = 0; + memcpy(&color, &pixels[i * p.bpp], p.bpp); + ASSERT_EQ(expected, color); + break; + } + + case 8: { + uint64_t color = 0; + memcpy(&color, &pixels[i * p.bpp], p.bpp); + ASSERT_EQ(expected, color); + break; + } + + default: + unreachable("bad bpp"); + } } } @@ -108,10 +130,14 @@ INSTANTIATE_TEST_CASE_P( OSMesaRenderTest, OSMesaRenderTestFixture, testing::Values( - Params{ OSMESA_RGBA, GL_UNSIGNED_BYTE }, - Params{ OSMESA_BGRA, GL_UNSIGNED_BYTE }, - Params{ OSMESA_ARGB, GL_UNSIGNED_BYTE }, - Params{ OSMESA_RGB, GL_UNSIGNED_BYTE } + Params{ OSMESA_RGBA, GL_UNSIGNED_BYTE, 4, 0xbf80ff40 }, + Params{ OSMESA_BGRA, GL_UNSIGNED_BYTE, 4, 0xbf40ff80 }, + Params{ OSMESA_ARGB, GL_UNSIGNED_BYTE, 4, 0x80ff40bf}, + Params{ OSMESA_RGB, GL_UNSIGNED_BYTE, 3, 0x80ff40 }, + Params{ OSMESA_RGBA, GL_UNSIGNED_SHORT, 8, 0xbfff8000ffff4000ull }, + Params{ OSMESA_RGB_565, GL_UNSIGNED_SHORT_5_6_5, 2, ((0x10 << 0) | + (0x3f << 5) | + (0x8 << 11)) } ), name_params ); |