Files
mesa/src/gallium/targets/osmesa/test-render.cpp
T
Eric Anholt dd899fd43e gallium/osmesa: Fill out other format tests.
Move expected values/bpp into the test params, add more formats now that
we've fixed context setup so that they work.

Reviewed-by: Danylo Piliaiev <danylo.piliaiev@globallogic.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3216>
2020-02-04 17:48:08 +00:00

144 lines
3.4 KiB
C++

#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <array>
#include <memory>
#include <gtest/gtest.h>
#include "GL/osmesa.h"
#include "util/macros.h"
typedef struct {
unsigned format;
GLenum type;
int bpp;
uint64_t expected;
} Params;
class OSMesaRenderTestFixture : public testing::TestWithParam<Params> {};
std::string
name_params(const testing::TestParamInfo<Params> params) {
auto p = params.param;
std::string first, second;
switch (p.format) {
case OSMESA_RGBA:
first = "rgba";
break;
case OSMESA_BGRA:
first = "bgra";
break;
case OSMESA_RGB:
first = "rgb";
break;
case OSMESA_RGB_565:
first = "rgb_565";
break;
case OSMESA_ARGB:
first = "argb";
break;
}
switch (p.type) {
case GL_UNSIGNED_SHORT:
second = "unsigned_short";
break;
case GL_UNSIGNED_BYTE:
second = "unsigned_byte";
break;
case GL_FLOAT:
second = "float";
break;
case GL_UNSIGNED_SHORT_5_6_5:
second = "unsigned_short_565";
break;
}
return first + "_" + second;
};
TEST_P(OSMesaRenderTestFixture, Render)
{
auto p = GetParam();
const int w = 2, h = 2;
uint8_t pixels[w * h * 8] = { 0 };
std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx{
OSMesaCreateContext(p.format, NULL), &OSMesaDestroyContext};
ASSERT_TRUE(ctx);
auto ret = OSMesaMakeCurrent(ctx.get(), &pixels, p.type, w, h);
ASSERT_EQ(ret, GL_TRUE);
glClearColor(0.25, 1.0, 0.5, 0.75);
uint64_t expected = p.expected;
glClear(GL_COLOR_BUFFER_BIT);
glFinish();
#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
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");
}
}
}
INSTANTIATE_TEST_CASE_P(
OSMesaRenderTest,
OSMesaRenderTestFixture,
testing::Values(
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
);