xref: /aosp_15_r20/external/mesa3d/src/gallium/targets/osmesa/test-render.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker #include <cstdint>
2*61046927SAndroid Build Coastguard Worker #include <cstdio>
3*61046927SAndroid Build Coastguard Worker #include <cstdlib>
4*61046927SAndroid Build Coastguard Worker #include <array>
5*61046927SAndroid Build Coastguard Worker #include <memory>
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "GL/osmesa.h"
10*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
11*61046927SAndroid Build Coastguard Worker #include "util/u_endian.h"
12*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker typedef struct {
15*61046927SAndroid Build Coastguard Worker    unsigned format;
16*61046927SAndroid Build Coastguard Worker    GLenum type;
17*61046927SAndroid Build Coastguard Worker    int bpp;
18*61046927SAndroid Build Coastguard Worker    uint64_t expected;
19*61046927SAndroid Build Coastguard Worker } Params;
20*61046927SAndroid Build Coastguard Worker 
21*61046927SAndroid Build Coastguard Worker class OSMesaRenderTestFixture : public testing::TestWithParam<Params> {};
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker std::string
name_params(const testing::TestParamInfo<Params> params)24*61046927SAndroid Build Coastguard Worker name_params(const testing::TestParamInfo<Params> params) {
25*61046927SAndroid Build Coastguard Worker    auto p = params.param;
26*61046927SAndroid Build Coastguard Worker    std::string first, second;
27*61046927SAndroid Build Coastguard Worker    switch (p.format) {
28*61046927SAndroid Build Coastguard Worker    case OSMESA_RGBA:
29*61046927SAndroid Build Coastguard Worker       first = "rgba";
30*61046927SAndroid Build Coastguard Worker       break;
31*61046927SAndroid Build Coastguard Worker    case OSMESA_BGRA:
32*61046927SAndroid Build Coastguard Worker       first = "bgra";
33*61046927SAndroid Build Coastguard Worker       break;
34*61046927SAndroid Build Coastguard Worker    case OSMESA_RGB:
35*61046927SAndroid Build Coastguard Worker       first = "rgb";
36*61046927SAndroid Build Coastguard Worker       break;
37*61046927SAndroid Build Coastguard Worker    case OSMESA_RGB_565:
38*61046927SAndroid Build Coastguard Worker       first = "rgb_565";
39*61046927SAndroid Build Coastguard Worker       break;
40*61046927SAndroid Build Coastguard Worker    case OSMESA_ARGB:
41*61046927SAndroid Build Coastguard Worker       first = "argb";
42*61046927SAndroid Build Coastguard Worker       break;
43*61046927SAndroid Build Coastguard Worker    }
44*61046927SAndroid Build Coastguard Worker 
45*61046927SAndroid Build Coastguard Worker    switch (p.type) {
46*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_SHORT:
47*61046927SAndroid Build Coastguard Worker       second = "unsigned_short";
48*61046927SAndroid Build Coastguard Worker       break;
49*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_BYTE:
50*61046927SAndroid Build Coastguard Worker       second = "unsigned_byte";
51*61046927SAndroid Build Coastguard Worker       break;
52*61046927SAndroid Build Coastguard Worker    case GL_FLOAT:
53*61046927SAndroid Build Coastguard Worker       second = "float";
54*61046927SAndroid Build Coastguard Worker       break;
55*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_SHORT_5_6_5:
56*61046927SAndroid Build Coastguard Worker       second = "unsigned_short_565";
57*61046927SAndroid Build Coastguard Worker       break;
58*61046927SAndroid Build Coastguard Worker    }
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    return first + "_" + second;
61*61046927SAndroid Build Coastguard Worker };
62*61046927SAndroid Build Coastguard Worker 
TEST_P(OSMesaRenderTestFixture,Render)63*61046927SAndroid Build Coastguard Worker TEST_P(OSMesaRenderTestFixture, Render)
64*61046927SAndroid Build Coastguard Worker {
65*61046927SAndroid Build Coastguard Worker    auto p = GetParam();
66*61046927SAndroid Build Coastguard Worker    const int w = 2, h = 2;
67*61046927SAndroid Build Coastguard Worker    uint8_t pixels[w * h * 8] = { 0 };
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker    std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx{
70*61046927SAndroid Build Coastguard Worker       OSMesaCreateContext(p.format, NULL), &OSMesaDestroyContext};
71*61046927SAndroid Build Coastguard Worker    ASSERT_TRUE(ctx);
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    auto ret = OSMesaMakeCurrent(ctx.get(), &pixels, p.type, w, h);
74*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(ret, GL_TRUE);
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    glClearColor(0.25, 1.0, 0.5, 0.75);
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    uint64_t expected = p.expected;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    /* All the formats other than 565 and RGB/byte are array formats, but our
81*61046927SAndroid Build Coastguard Worker     * expected values are packed, so byte swap appropriately.
82*61046927SAndroid Build Coastguard Worker     */
83*61046927SAndroid Build Coastguard Worker    if (UTIL_ARCH_BIG_ENDIAN) {
84*61046927SAndroid Build Coastguard Worker       switch (p.bpp) {
85*61046927SAndroid Build Coastguard Worker       case 8:
86*61046927SAndroid Build Coastguard Worker          expected = util_bswap64(expected);
87*61046927SAndroid Build Coastguard Worker          break;
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker       case 4:
90*61046927SAndroid Build Coastguard Worker          expected = util_bswap32(expected);
91*61046927SAndroid Build Coastguard Worker          break;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker       case 3:
94*61046927SAndroid Build Coastguard Worker       case 2:
95*61046927SAndroid Build Coastguard Worker          break;
96*61046927SAndroid Build Coastguard Worker       }
97*61046927SAndroid Build Coastguard Worker    }
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
100*61046927SAndroid Build Coastguard Worker    glFinish();
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker #if 0 /* XXX */
103*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(pixels); i += 4) {
104*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "pixel %d: %02x %02x %02x %02x\n",
105*61046927SAndroid Build Coastguard Worker               i / 4,
106*61046927SAndroid Build Coastguard Worker               pixels[i + 0],
107*61046927SAndroid Build Coastguard Worker               pixels[i + 1],
108*61046927SAndroid Build Coastguard Worker               pixels[i + 2],
109*61046927SAndroid Build Coastguard Worker               pixels[i + 3]);
110*61046927SAndroid Build Coastguard Worker    }
111*61046927SAndroid Build Coastguard Worker #endif
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < w * h; i++) {
114*61046927SAndroid Build Coastguard Worker       switch (p.bpp) {
115*61046927SAndroid Build Coastguard Worker       case 2: {
116*61046927SAndroid Build Coastguard Worker          uint16_t color = 0;
117*61046927SAndroid Build Coastguard Worker          memcpy(&color, &pixels[i * p.bpp], p.bpp);
118*61046927SAndroid Build Coastguard Worker          ASSERT_EQ(expected, color);
119*61046927SAndroid Build Coastguard Worker          break;
120*61046927SAndroid Build Coastguard Worker       }
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker       case 3: {
123*61046927SAndroid Build Coastguard Worker          uint32_t color = ((pixels[i * p.bpp + 0] << 0) |
124*61046927SAndroid Build Coastguard Worker                            (pixels[i * p.bpp + 1] << 8) |
125*61046927SAndroid Build Coastguard Worker                            (pixels[i * p.bpp + 2] << 16));
126*61046927SAndroid Build Coastguard Worker          ASSERT_EQ(expected, color);
127*61046927SAndroid Build Coastguard Worker          break;
128*61046927SAndroid Build Coastguard Worker       }
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker       case 4: {
131*61046927SAndroid Build Coastguard Worker          uint32_t color = 0;
132*61046927SAndroid Build Coastguard Worker          memcpy(&color, &pixels[i * p.bpp], p.bpp);
133*61046927SAndroid Build Coastguard Worker          ASSERT_EQ(expected, color);
134*61046927SAndroid Build Coastguard Worker          break;
135*61046927SAndroid Build Coastguard Worker       }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker       case 8: {
138*61046927SAndroid Build Coastguard Worker          uint64_t color = 0;
139*61046927SAndroid Build Coastguard Worker          memcpy(&color, &pixels[i * p.bpp], p.bpp);
140*61046927SAndroid Build Coastguard Worker          ASSERT_EQ(expected, color);
141*61046927SAndroid Build Coastguard Worker          break;
142*61046927SAndroid Build Coastguard Worker       }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker       default:
145*61046927SAndroid Build Coastguard Worker          unreachable("bad bpp");
146*61046927SAndroid Build Coastguard Worker       }
147*61046927SAndroid Build Coastguard Worker    }
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker 
150*61046927SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
151*61046927SAndroid Build Coastguard Worker    OSMesaRenderTest,
152*61046927SAndroid Build Coastguard Worker    OSMesaRenderTestFixture,
153*61046927SAndroid Build Coastguard Worker    testing::Values(
154*61046927SAndroid Build Coastguard Worker       Params{ OSMESA_RGBA, GL_UNSIGNED_BYTE,  4, 0xbf80ff40 },
155*61046927SAndroid Build Coastguard Worker       Params{ OSMESA_BGRA, GL_UNSIGNED_BYTE,  4, 0xbf40ff80 },
156*61046927SAndroid Build Coastguard Worker       Params{ OSMESA_ARGB, GL_UNSIGNED_BYTE,  4, 0x80ff40bf},
157*61046927SAndroid Build Coastguard Worker       Params{ OSMESA_RGB,  GL_UNSIGNED_BYTE,  3, 0x80ff40 },
158*61046927SAndroid Build Coastguard Worker       Params{ OSMESA_RGBA, GL_UNSIGNED_SHORT, 8, 0xbfff8000ffff4000ull },
159*61046927SAndroid Build Coastguard Worker       Params{ OSMESA_RGB_565, GL_UNSIGNED_SHORT_5_6_5, 2, ((0x10 << 0) |
160*61046927SAndroid Build Coastguard Worker                                                            (0x3f << 5) |
161*61046927SAndroid Build Coastguard Worker                                                            (0x8 << 11)) }
162*61046927SAndroid Build Coastguard Worker    ),
163*61046927SAndroid Build Coastguard Worker    name_params
164*61046927SAndroid Build Coastguard Worker );
165*61046927SAndroid Build Coastguard Worker 
TEST(OSMesaRenderTest,depth)166*61046927SAndroid Build Coastguard Worker TEST(OSMesaRenderTest, depth)
167*61046927SAndroid Build Coastguard Worker {
168*61046927SAndroid Build Coastguard Worker    std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx{
169*61046927SAndroid Build Coastguard Worker       OSMesaCreateContextExt(OSMESA_RGB_565, 24, 8, 0, NULL), &OSMesaDestroyContext};
170*61046927SAndroid Build Coastguard Worker    ASSERT_TRUE(ctx);
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    const int w = 3, h = 2;
173*61046927SAndroid Build Coastguard Worker    uint8_t pixels[4096 * h * 2] = {0}; /* different cpp from our depth! */
174*61046927SAndroid Build Coastguard Worker    auto ret = OSMesaMakeCurrent(ctx.get(), &pixels, GL_UNSIGNED_SHORT_5_6_5, w, h);
175*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(ret, GL_TRUE);
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker    /* Expand the row length for the color buffer so we can see that it doesn't affect depth. */
178*61046927SAndroid Build Coastguard Worker    OSMesaPixelStore(OSMESA_ROW_LENGTH, 4096);
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    uint32_t *depth;
181*61046927SAndroid Build Coastguard Worker    GLint dw, dh, depth_cpp;
182*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(true, OSMesaGetDepthBuffer(ctx.get(), &dw, &dh, &depth_cpp, (void **)&depth));
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(dw, w);
185*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(dh, h);
186*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(depth_cpp, 4);
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker    glClearDepth(1.0);
189*61046927SAndroid Build Coastguard Worker    glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
190*61046927SAndroid Build Coastguard Worker    glFinish();
191*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 0 + 0], 0x00ffffff);
192*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 0 + 1], 0x00ffffff);
193*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 1 + 0], 0x00ffffff);
194*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 1 + 1], 0x00ffffff);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker    /* Scissor to the top half and clear */
197*61046927SAndroid Build Coastguard Worker    glEnable(GL_SCISSOR_TEST);
198*61046927SAndroid Build Coastguard Worker    glScissor(0, 1, 2, 1);
199*61046927SAndroid Build Coastguard Worker    glClearDepth(0.0);
200*61046927SAndroid Build Coastguard Worker    glClear(GL_DEPTH_BUFFER_BIT);
201*61046927SAndroid Build Coastguard Worker    glFinish();
202*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 0 + 0], 0x00ffffff);
203*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 0 + 1], 0x00ffffff);
204*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 1 + 0], 0x00000000);
205*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 1 + 1], 0x00000000);
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    /* Y_UP didn't affect depth buffer orientation in classic osmesa. */
208*61046927SAndroid Build Coastguard Worker    OSMesaPixelStore(OSMESA_Y_UP, false);
209*61046927SAndroid Build Coastguard Worker    glScissor(0, 1, 1, 1);
210*61046927SAndroid Build Coastguard Worker    glClearDepth(1.0);
211*61046927SAndroid Build Coastguard Worker    glClear(GL_DEPTH_BUFFER_BIT);
212*61046927SAndroid Build Coastguard Worker    glFinish();
213*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 0 + 0], 0x00ffffff);
214*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 0 + 1], 0x00ffffff);
215*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 1 + 0], 0x00ffffff);
216*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(depth[w * 1 + 1], 0x00000000);
217*61046927SAndroid Build Coastguard Worker }
218*61046927SAndroid Build Coastguard Worker 
TEST(OSMesaRenderTest,depth_get_no_attachment)219*61046927SAndroid Build Coastguard Worker TEST(OSMesaRenderTest, depth_get_no_attachment)
220*61046927SAndroid Build Coastguard Worker {
221*61046927SAndroid Build Coastguard Worker    std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx{
222*61046927SAndroid Build Coastguard Worker       OSMesaCreateContextExt(OSMESA_RGBA, 0, 0, 0, NULL), &OSMesaDestroyContext};
223*61046927SAndroid Build Coastguard Worker    ASSERT_TRUE(ctx);
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker    uint32_t pixel;
226*61046927SAndroid Build Coastguard Worker    auto ret = OSMesaMakeCurrent(ctx.get(), &pixel, GL_UNSIGNED_BYTE, 1, 1);
227*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(ret, GL_TRUE);
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker    uint32_t *depth;
230*61046927SAndroid Build Coastguard Worker    GLint dw = 1, dh = 1, depth_cpp = 1;
231*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(false, OSMesaGetDepthBuffer(ctx.get(), &dw, &dh, &depth_cpp, (void **)&depth));
232*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(depth_cpp, NULL);
233*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(dw, 0);
234*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(dh, 0);
235*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(depth_cpp, 0);
236*61046927SAndroid Build Coastguard Worker }
237*61046927SAndroid Build Coastguard Worker 
be_bswap32(uint32_t x)238*61046927SAndroid Build Coastguard Worker static uint32_t be_bswap32(uint32_t x)
239*61046927SAndroid Build Coastguard Worker {
240*61046927SAndroid Build Coastguard Worker    if (UTIL_ARCH_BIG_ENDIAN)
241*61046927SAndroid Build Coastguard Worker       return util_bswap32(x);
242*61046927SAndroid Build Coastguard Worker    else
243*61046927SAndroid Build Coastguard Worker       return x;
244*61046927SAndroid Build Coastguard Worker }
245*61046927SAndroid Build Coastguard Worker 
TEST(OSMesaRenderTest,separate_buffers_per_context)246*61046927SAndroid Build Coastguard Worker TEST(OSMesaRenderTest, separate_buffers_per_context)
247*61046927SAndroid Build Coastguard Worker {
248*61046927SAndroid Build Coastguard Worker    std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx1{
249*61046927SAndroid Build Coastguard Worker       OSMesaCreateContext(GL_RGBA, NULL), &OSMesaDestroyContext};
250*61046927SAndroid Build Coastguard Worker    std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx2{
251*61046927SAndroid Build Coastguard Worker       OSMesaCreateContext(GL_RGBA, NULL), &OSMesaDestroyContext};
252*61046927SAndroid Build Coastguard Worker    ASSERT_TRUE(ctx1);
253*61046927SAndroid Build Coastguard Worker    ASSERT_TRUE(ctx2);
254*61046927SAndroid Build Coastguard Worker 
255*61046927SAndroid Build Coastguard Worker    uint32_t pixel1, pixel2;
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(OSMesaMakeCurrent(ctx1.get(), &pixel1, GL_UNSIGNED_BYTE, 1, 1), GL_TRUE);
258*61046927SAndroid Build Coastguard Worker    glClearColor(1.0, 0.0, 0.0, 0.0);
259*61046927SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
260*61046927SAndroid Build Coastguard Worker    glFinish();
261*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(pixel1, be_bswap32(0x000000ff));
262*61046927SAndroid Build Coastguard Worker 
263*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(OSMesaMakeCurrent(ctx2.get(), &pixel2, GL_UNSIGNED_BYTE, 1, 1), GL_TRUE);
264*61046927SAndroid Build Coastguard Worker    glClearColor(0.0, 1.0, 0.0, 0.0);
265*61046927SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
266*61046927SAndroid Build Coastguard Worker    glFinish();
267*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(pixel1, be_bswap32(0x000000ff));
268*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(pixel2, be_bswap32(0x0000ff00));
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker    /* Leave a dangling render to pixel2 as we switch contexts (there should be
271*61046927SAndroid Build Coastguard Worker     */
272*61046927SAndroid Build Coastguard Worker    glClearColor(0.0, 0.0, 1.0, 0.0);
273*61046927SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(OSMesaMakeCurrent(ctx1.get(), &pixel1, GL_UNSIGNED_BYTE, 1, 1), GL_TRUE);
276*61046927SAndroid Build Coastguard Worker    /* Draw something off screen to trigger a real flush.  We should have the
277*61046927SAndroid Build Coastguard Worker     * same contents in pixel1 as before
278*61046927SAndroid Build Coastguard Worker     */
279*61046927SAndroid Build Coastguard Worker    glBegin(GL_TRIANGLES);
280*61046927SAndroid Build Coastguard Worker    glVertex2f(-2, -2);
281*61046927SAndroid Build Coastguard Worker    glVertex2f(-2, -2);
282*61046927SAndroid Build Coastguard Worker    glVertex2f(-2, -2);
283*61046927SAndroid Build Coastguard Worker    glEnd();
284*61046927SAndroid Build Coastguard Worker    glFinish();
285*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(pixel1, be_bswap32(0x000000ff));
286*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(pixel2, be_bswap32(0x00ff0000));
287*61046927SAndroid Build Coastguard Worker }
288*61046927SAndroid Build Coastguard Worker 
TEST(OSMesaRenderTest,resize)289*61046927SAndroid Build Coastguard Worker TEST(OSMesaRenderTest, resize)
290*61046927SAndroid Build Coastguard Worker {
291*61046927SAndroid Build Coastguard Worker    std::unique_ptr<osmesa_context, decltype(&OSMesaDestroyContext)> ctx{
292*61046927SAndroid Build Coastguard Worker       OSMesaCreateContext(GL_RGBA, NULL), &OSMesaDestroyContext};
293*61046927SAndroid Build Coastguard Worker    ASSERT_TRUE(ctx);
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker    uint32_t draw1[1], draw2[4];
296*61046927SAndroid Build Coastguard Worker 
297*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(OSMesaMakeCurrent(ctx.get(), draw1, GL_UNSIGNED_BYTE, 1, 1), GL_TRUE);
298*61046927SAndroid Build Coastguard Worker    glClearColor(1.0, 0.0, 0.0, 0.0);
299*61046927SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
300*61046927SAndroid Build Coastguard Worker    glFinish();
301*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(draw1[0], be_bswap32(0x000000ff));
302*61046927SAndroid Build Coastguard Worker 
303*61046927SAndroid Build Coastguard Worker    ASSERT_EQ(OSMesaMakeCurrent(ctx.get(), draw2, GL_UNSIGNED_BYTE, 2, 2), GL_TRUE);
304*61046927SAndroid Build Coastguard Worker    glClearColor(0.0, 1.0, 0.0, 0.0);
305*61046927SAndroid Build Coastguard Worker    glClear(GL_COLOR_BUFFER_BIT);
306*61046927SAndroid Build Coastguard Worker    glFinish();
307*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(draw2); i++)
308*61046927SAndroid Build Coastguard Worker       EXPECT_EQ(draw2[i], be_bswap32(0x0000ff00));
309*61046927SAndroid Build Coastguard Worker    EXPECT_EQ(draw1[0], be_bswap32(0x000000ff));
310*61046927SAndroid Build Coastguard Worker }
311