mutter/tests/conform/test-point-sprite.c
Neil Roberts 1d59fccf10 Add a conformance test for point sprites
This adds a conformance test which renders a texture point using a 2x2
texture with a different color for each texel. It then verifies that
each texel is mapped to the correct position on the point. The test is
currently failing.

The test requires the point sprite feature flag so this patch also
adds a TEST_REQUIREMENT_* flag for that.

Reviewed-by: Robert Bragg <robert@linux.intel.com>
2012-03-07 15:13:29 +00:00

130 lines
4.9 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 guint8
tex_data[3 * 2 * 2] =
{
0x00, 0x00, 0xff, 0x00, 0xff, 0x00,
0x00, 0xff, 0xff, 0xff, 0x00, 0x00
};
void
test_cogl_point_sprite (TestUtilsGTestFixture *fixture,
void *data)
{
TestUtilsSharedState *shared_state = data;
CoglContext *ctx = shared_state->ctx;
int fb_width = cogl_framebuffer_get_width (shared_state->fb);
int fb_height = cogl_framebuffer_get_height (shared_state->fb);
CoglPrimitive *prim;
GError *error = NULL;
CoglTexture2D *tex_2d;
CoglPipeline *pipeline, *solid_pipeline;
gboolean res;
cogl_framebuffer_orthographic (shared_state->fb,
0, 0, /* x_1, y_1 */
fb_width, /* x_2 */
fb_height /* y_2 */,
-1, 100 /* near/far */);
cogl_framebuffer_clear4f (shared_state->fb,
COGL_BUFFER_BIT_COLOR,
1.0f, 1.0f, 1.0f, 1.0f);
tex_2d = cogl_texture_2d_new_from_data (ctx,
2, 2, /* 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 (shared_state->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 (shared_state->fb);
cogl_framebuffer_translate (shared_state->fb,
POINT_SIZE * 2, /* x */
0.0f, /* y */
0.0f /* z */);
cogl_framebuffer_draw_primitive (shared_state->fb,
solid_pipeline,
prim);
cogl_framebuffer_pop_matrix (shared_state->fb);
cogl_object_unref (prim);
cogl_object_unref (solid_pipeline);
cogl_object_unref (pipeline);
cogl_object_unref (tex_2d);
test_utils_check_pixel (POINT_SIZE - POINT_SIZE / 4,
POINT_SIZE - POINT_SIZE / 4,
0x0000ffff);
test_utils_check_pixel (POINT_SIZE + POINT_SIZE / 4,
POINT_SIZE - POINT_SIZE / 4,
0x00ff00ff);
test_utils_check_pixel (POINT_SIZE - POINT_SIZE / 4,
POINT_SIZE + POINT_SIZE / 4,
0x00ffffff);
test_utils_check_pixel (POINT_SIZE + POINT_SIZE / 4,
POINT_SIZE + POINT_SIZE / 4,
0xff0000ff);
/* 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 (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");
}