Add a test to check interleaving primitives and the journal
This adds a conformance test which draws a rectangle using the journal in-between two rectangles drawn with primitives without changing any other state. Currently this is failing because the modelview matrix state is not correctly flushed. The journal also flushes in own clip state so the test additionally puts everything in a clip and verifies that that worked. This is not currently broken but we might as well test it. https://bugzilla.gnome.org/show_bug.cgi?id=693612 Reviewed-by: Robert Bragg <robert@linux.intel.com> (cherry picked from commit b703f9a1a98894a12021cbdd632e1d59214e612f)
This commit is contained in:
parent
217d13537c
commit
806a2e5813
@ -63,6 +63,7 @@ test_sources = \
|
|||||||
test-wrap-rectangle-textures.c \
|
test-wrap-rectangle-textures.c \
|
||||||
test-texture-get-set-data.c \
|
test-texture-get-set-data.c \
|
||||||
test-framebuffer-get-bits.c \
|
test-framebuffer-get-bits.c \
|
||||||
|
test-primitive-and-journal.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
test_conformance_SOURCES = $(common_sources) $(test_sources)
|
test_conformance_SOURCES = $(common_sources) $(test_sources)
|
||||||
|
@ -116,6 +116,8 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
ADD_TEST (test_map_buffer_range, TEST_REQUIREMENT_MAP_WRITE, 0);
|
ADD_TEST (test_map_buffer_range, TEST_REQUIREMENT_MAP_WRITE, 0);
|
||||||
|
|
||||||
|
ADD_TEST (test_primitive_and_journal, 0, TEST_KNOWN_FAILURE);
|
||||||
|
|
||||||
UNPORTED_TEST (test_viewport);
|
UNPORTED_TEST (test_viewport);
|
||||||
|
|
||||||
ADD_TEST (test_gles2_context, TEST_REQUIREMENT_GLES2_CONTEXT, 0);
|
ADD_TEST (test_gles2_context, TEST_REQUIREMENT_GLES2_CONTEXT, 0);
|
||||||
|
126
tests/conform/test-primitive-and-journal.c
Normal file
126
tests/conform/test-primitive-and-journal.c
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
#include <cogl/cogl.h>
|
||||||
|
|
||||||
|
#include "test-utils.h"
|
||||||
|
|
||||||
|
typedef CoglVertexP2C4 Vertex;
|
||||||
|
|
||||||
|
static void
|
||||||
|
setup_orthographic_modelview (void)
|
||||||
|
{
|
||||||
|
CoglMatrix matrix;
|
||||||
|
int fb_width = cogl_framebuffer_get_width (test_fb);
|
||||||
|
int fb_height = cogl_framebuffer_get_height (test_fb);
|
||||||
|
|
||||||
|
/* Set up a non-identity modelview matrix. When the journal is
|
||||||
|
* flushed it will usually flush the identity matrix. Using the
|
||||||
|
* non-default matrix ensures that we test that Cogl restores the
|
||||||
|
* matrix we asked for. The matrix sets up an orthographic transform
|
||||||
|
* in the modelview matrix */
|
||||||
|
|
||||||
|
cogl_matrix_init_identity (&matrix);
|
||||||
|
cogl_matrix_orthographic (&matrix,
|
||||||
|
0.0f, 0.0f, /* x_1 y_1 */
|
||||||
|
fb_width,
|
||||||
|
fb_height,
|
||||||
|
-1.0f, /* nearval */
|
||||||
|
1.0f /* farval */);
|
||||||
|
cogl_framebuffer_set_modelview_matrix (test_fb, &matrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
create_primitives (CoglPrimitive *primitives[2])
|
||||||
|
{
|
||||||
|
static const Vertex vertex_data[8] =
|
||||||
|
{
|
||||||
|
/* triangle strip 1 */
|
||||||
|
{ 0, 0, 255, 0, 0, 255 },
|
||||||
|
{ 0, 100, 255, 0, 0, 255 },
|
||||||
|
{ 100, 0, 255, 0, 0, 255 },
|
||||||
|
{ 100, 100, 255, 0, 0, 255 },
|
||||||
|
/* triangle strip 2 */
|
||||||
|
{ 200, 0, 0, 0, 255, 255 },
|
||||||
|
{ 200, 100, 0, 0, 255, 255 },
|
||||||
|
{ 300, 0, 0, 0, 255, 255 },
|
||||||
|
{ 300, 100, 0, 0, 255, 255 },
|
||||||
|
};
|
||||||
|
|
||||||
|
primitives[0] = cogl_primitive_new_p2c4 (test_ctx,
|
||||||
|
COGL_VERTICES_MODE_TRIANGLE_STRIP,
|
||||||
|
G_N_ELEMENTS (vertex_data),
|
||||||
|
vertex_data);
|
||||||
|
cogl_primitive_set_n_vertices (primitives[0], 4);
|
||||||
|
|
||||||
|
primitives[1] = cogl_primitive_copy (primitives[0]);
|
||||||
|
cogl_primitive_set_first_vertex (primitives[1], 4);
|
||||||
|
cogl_primitive_set_n_vertices (primitives[1], 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglPipeline *
|
||||||
|
create_pipeline (void)
|
||||||
|
{
|
||||||
|
CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
|
||||||
|
|
||||||
|
cogl_pipeline_set_color4ub (pipeline, 0, 255, 0, 255);
|
||||||
|
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
test_primitive_and_journal (void)
|
||||||
|
{
|
||||||
|
CoglPrimitive *primitives[2];
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
|
setup_orthographic_modelview ();
|
||||||
|
create_primitives (primitives);
|
||||||
|
pipeline = create_pipeline ();
|
||||||
|
|
||||||
|
/* Set a clip to clip all three rectangles to just the bottom half.
|
||||||
|
* The journal flushes its own clip state so this verifies that the
|
||||||
|
* clip state is correctly restored for the second primitive. */
|
||||||
|
cogl_framebuffer_push_rectangle_clip (test_fb,
|
||||||
|
0, 50, 300, 100);
|
||||||
|
|
||||||
|
cogl_framebuffer_draw_primitive (test_fb,
|
||||||
|
pipeline,
|
||||||
|
primitives[0]);
|
||||||
|
|
||||||
|
/* Draw a rectangle using the journal in-between the two primitives.
|
||||||
|
* This should test that the journal gets flushed correctly and that
|
||||||
|
* the modelview matrix is restored. Half of the rectangle should be
|
||||||
|
* overriden by the second primitive */
|
||||||
|
cogl_framebuffer_draw_rectangle (test_fb,
|
||||||
|
pipeline,
|
||||||
|
100, 0, /* x1/y1 */
|
||||||
|
300, 100 /* x2/y2 */);
|
||||||
|
|
||||||
|
cogl_framebuffer_draw_primitive (test_fb,
|
||||||
|
pipeline,
|
||||||
|
primitives[1]);
|
||||||
|
|
||||||
|
/* Check the three rectangles */
|
||||||
|
test_utils_check_region (test_fb,
|
||||||
|
1, 51,
|
||||||
|
98, 48,
|
||||||
|
0xff0000ff);
|
||||||
|
test_utils_check_region (test_fb,
|
||||||
|
101, 51,
|
||||||
|
98, 48,
|
||||||
|
0x00ff00ff);
|
||||||
|
test_utils_check_region (test_fb,
|
||||||
|
201, 51,
|
||||||
|
98, 48,
|
||||||
|
0x0000ffff);
|
||||||
|
|
||||||
|
/* Check that the top half of all of the rectangles was clipped */
|
||||||
|
test_utils_check_region (test_fb,
|
||||||
|
1, 1,
|
||||||
|
298, 48,
|
||||||
|
0x000000ff);
|
||||||
|
|
||||||
|
cogl_framebuffer_pop_clip (test_fb);
|
||||||
|
|
||||||
|
if (cogl_test_verbose ())
|
||||||
|
g_print ("OK\n");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user