mirror of
https://github.com/brl/mutter.git
synced 2024-12-24 20:12:06 +00:00
786d1b8e40
There is currently a known bug where when rendering offscreen point sprites will be rendered upside-down. For that reason test-point-sprite is marked as a known failure because it checks the orientation of the point sprites and the conformance test suite is rendered to offscreen buffers by default. However this doesn't help to catch more general failures that stop the point sprites being rendered at all. To fix this the test-point-sprite test has been split into two tests, one which verifies the orientation and one which does not. The two tests are in the same source file and internally share the same static function but pass a flag to specify whether to check the orientation. If the orientation should be ignored then it will create a 2x1 texture instead of a 2x2 texture so that it will appear the same regardless of whether it is upside-down. The checks for the colors have been altered accordingly. Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry picked from commit 51b7fdbe17f300cf2edf42c2ca740ad748c9fd78)
157 lines
5.4 KiB
C
157 lines
5.4 KiB
C
#include <cogl/cogl2-experimental.h>
|
|
|
|
#include "test-utils.h"
|
|
|
|
#define POINT_SIZE 8
|
|
|
|
static const CoglVertexP2T2
|
|
point =
|
|
{
|
|
POINT_SIZE, POINT_SIZE,
|
|
0.0f, 0.0f
|
|
};
|
|
|
|
static const uint8_t
|
|
tex_data[3 * 2 * 2] =
|
|
{
|
|
0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
|
|
0x00, 0xff, 0xff, 0xff, 0x00, 0x00
|
|
};
|
|
|
|
static void
|
|
do_test (CoglBool check_orientation)
|
|
{
|
|
int fb_width = cogl_framebuffer_get_width (fb);
|
|
int fb_height = cogl_framebuffer_get_height (fb);
|
|
CoglPrimitive *prim;
|
|
GError *error = NULL;
|
|
CoglTexture2D *tex_2d;
|
|
CoglPipeline *pipeline, *solid_pipeline;
|
|
CoglBool res;
|
|
int tex_height;
|
|
|
|
cogl_framebuffer_orthographic (fb,
|
|
0, 0, /* x_1, y_1 */
|
|
fb_width, /* x_2 */
|
|
fb_height /* y_2 */,
|
|
-1, 100 /* near/far */);
|
|
|
|
cogl_framebuffer_clear4f (fb,
|
|
COGL_BUFFER_BIT_COLOR,
|
|
1.0f, 1.0f, 1.0f, 1.0f);
|
|
|
|
/* If we're not checking the orientation of the point sprite then
|
|
* we'll set the height of the texture to 1 so that the vertical
|
|
* orientation does not matter */
|
|
if (check_orientation)
|
|
tex_height = 2;
|
|
else
|
|
tex_height = 1;
|
|
|
|
tex_2d = cogl_texture_2d_new_from_data (ctx,
|
|
2, tex_height, /* width/height */
|
|
COGL_PIXEL_FORMAT_RGB_888,
|
|
COGL_PIXEL_FORMAT_ANY,
|
|
6, /* row stride */
|
|
tex_data,
|
|
&error);
|
|
g_assert (tex_2d != NULL);
|
|
g_assert (error == NULL);
|
|
|
|
pipeline = cogl_pipeline_new (ctx);
|
|
cogl_pipeline_set_layer_texture (pipeline, 0, COGL_TEXTURE (tex_2d));
|
|
|
|
res = cogl_pipeline_set_layer_point_sprite_coords_enabled (pipeline,
|
|
/* layer_index */
|
|
0,
|
|
/* enable */
|
|
TRUE,
|
|
&error);
|
|
g_assert (res == TRUE);
|
|
g_assert (error == NULL);
|
|
|
|
cogl_pipeline_set_layer_filters (pipeline,
|
|
0, /* layer_index */
|
|
COGL_PIPELINE_FILTER_NEAREST,
|
|
COGL_PIPELINE_FILTER_NEAREST);
|
|
cogl_pipeline_set_point_size (pipeline, POINT_SIZE);
|
|
|
|
prim = cogl_primitive_new_p2t2 (ctx,
|
|
COGL_VERTICES_MODE_POINTS,
|
|
1, /* n_vertices */
|
|
&point);
|
|
|
|
cogl_framebuffer_draw_primitive (fb,
|
|
pipeline,
|
|
prim);
|
|
|
|
/* Render the primitive again without point sprites to make sure
|
|
disabling it works */
|
|
solid_pipeline = cogl_pipeline_copy (pipeline);
|
|
cogl_pipeline_set_layer_point_sprite_coords_enabled (solid_pipeline,
|
|
/* layer_index */
|
|
0,
|
|
/* enable */
|
|
FALSE,
|
|
&error);
|
|
cogl_framebuffer_push_matrix (fb);
|
|
cogl_framebuffer_translate (fb,
|
|
POINT_SIZE * 2, /* x */
|
|
0.0f, /* y */
|
|
0.0f /* z */);
|
|
cogl_framebuffer_draw_primitive (fb,
|
|
solid_pipeline,
|
|
prim);
|
|
cogl_framebuffer_pop_matrix (fb);
|
|
|
|
cogl_object_unref (prim);
|
|
cogl_object_unref (solid_pipeline);
|
|
cogl_object_unref (pipeline);
|
|
cogl_object_unref (tex_2d);
|
|
|
|
test_utils_check_pixel (fb,
|
|
POINT_SIZE - POINT_SIZE / 4,
|
|
POINT_SIZE - POINT_SIZE / 4,
|
|
0x0000ffff);
|
|
test_utils_check_pixel (fb,
|
|
POINT_SIZE + POINT_SIZE / 4,
|
|
POINT_SIZE - POINT_SIZE / 4,
|
|
0x00ff00ff);
|
|
test_utils_check_pixel (fb,
|
|
POINT_SIZE - POINT_SIZE / 4,
|
|
POINT_SIZE + POINT_SIZE / 4,
|
|
check_orientation ?
|
|
0x00ffffff :
|
|
0x0000ffff);
|
|
test_utils_check_pixel (fb,
|
|
POINT_SIZE + POINT_SIZE / 4,
|
|
POINT_SIZE + POINT_SIZE / 4,
|
|
check_orientation ?
|
|
0xff0000ff :
|
|
0x00ff00ff);
|
|
|
|
/* When rendering without the point sprites all of the texture
|
|
coordinates should be 0,0 so it should get the top-left texel
|
|
which is blue */
|
|
test_utils_check_region (fb,
|
|
POINT_SIZE * 3 - POINT_SIZE / 2 + 1,
|
|
POINT_SIZE - POINT_SIZE / 2 + 1,
|
|
POINT_SIZE - 2, POINT_SIZE - 2,
|
|
0x0000ffff);
|
|
|
|
if (cogl_test_verbose ())
|
|
g_print ("OK\n");
|
|
}
|
|
|
|
void
|
|
test_point_sprite (void)
|
|
{
|
|
do_test (FALSE /* don't check orientation */);
|
|
}
|
|
|
|
void
|
|
test_point_sprite_orientation (void)
|
|
{
|
|
do_test (TRUE /* check orientation */);
|
|
}
|