2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
#include <clutter/clutter.h>
|
|
|
|
#include <cogl/cogl.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "test-conform-common.h"
|
|
|
|
|
|
|
|
static const ClutterColor stage_color = { 0x0, 0x0, 0x0, 0xff };
|
|
|
|
|
2008-11-28 12:45:54 -05:00
|
|
|
#ifdef CLUTTER_COGL_HAS_GL
|
|
|
|
|
2008-11-28 12:36:37 -05:00
|
|
|
/* Size the texture so that it is just off a power of two to enourage
|
|
|
|
it so use software tiling when NPOTs aren't available */
|
|
|
|
#define TEXTURE_SIZE 33
|
|
|
|
|
2008-11-28 12:45:54 -05:00
|
|
|
#else /* CLUTTER_COGL_HAS_GL */
|
|
|
|
|
|
|
|
/* We can't use the funny-sized texture on GL ES because it will break
|
|
|
|
cogl_texture_polygon. However there is only one code path for
|
|
|
|
rendering quads so there is no need */
|
|
|
|
#define TEXTURE_SIZE 32
|
|
|
|
|
|
|
|
#endif /* CLUTTER_COGL_HAS_GL */
|
|
|
|
|
2008-11-28 12:36:37 -05:00
|
|
|
/* Amount of pixels to skip off the top, bottom, left and right of the
|
|
|
|
texture when reading back the stage */
|
|
|
|
#define TEST_INSET 4
|
|
|
|
|
|
|
|
typedef struct _TestState
|
|
|
|
{
|
|
|
|
guint frame;
|
|
|
|
CoglHandle texture;
|
|
|
|
} TestState;
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
validate_part (int xnum, int ynum, gboolean shown)
|
|
|
|
{
|
|
|
|
guchar *pixels, *p;
|
|
|
|
ClutterActor *stage = clutter_stage_get_default ();
|
|
|
|
gboolean ret = TRUE;
|
|
|
|
|
|
|
|
/* Read the appropriate part but skip out a few pixels around the
|
|
|
|
edges */
|
|
|
|
pixels = clutter_stage_read_pixels (CLUTTER_STAGE (stage),
|
|
|
|
xnum * TEXTURE_SIZE + TEST_INSET,
|
|
|
|
ynum * TEXTURE_SIZE + TEST_INSET,
|
|
|
|
TEXTURE_SIZE - TEST_INSET * 2,
|
|
|
|
TEXTURE_SIZE - TEST_INSET * 2);
|
|
|
|
|
|
|
|
/* Make sure every pixels is the appropriate color */
|
|
|
|
for (p = pixels;
|
|
|
|
p < pixels + ((TEXTURE_SIZE - TEST_INSET * 2)
|
|
|
|
* (TEXTURE_SIZE - TEST_INSET * 2));
|
|
|
|
p += 4)
|
|
|
|
{
|
|
|
|
if (p[0] != (shown ? 255 : 0))
|
|
|
|
ret = FALSE;
|
|
|
|
if (p[1] != 0)
|
|
|
|
ret = FALSE;
|
|
|
|
if (p[2] != 0)
|
|
|
|
ret = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
g_free (pixels);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
validate_result (TestState *state)
|
|
|
|
{
|
|
|
|
/* Front-facing texture */
|
|
|
|
g_assert (validate_part (0, 0, TRUE));
|
|
|
|
/* Back-facing texture */
|
|
|
|
g_assert (validate_part (1, 0, FALSE));
|
|
|
|
/* Front-facing texture polygon */
|
|
|
|
g_assert (validate_part (2, 0, TRUE));
|
|
|
|
/* Back-facing texture polygon */
|
|
|
|
g_assert (validate_part (3, 0, FALSE));
|
|
|
|
/* Regular rectangle */
|
|
|
|
g_assert (validate_part (4, 0, TRUE));
|
|
|
|
|
|
|
|
/* Backface culling disabled - everything should be shown */
|
|
|
|
|
|
|
|
/* Front-facing texture */
|
|
|
|
g_assert (validate_part (0, 1, TRUE));
|
|
|
|
/* Back-facing texture */
|
|
|
|
g_assert (validate_part (1, 1, TRUE));
|
|
|
|
/* Front-facing texture polygon */
|
|
|
|
g_assert (validate_part (2, 1, TRUE));
|
|
|
|
/* Back-facing texture polygon */
|
|
|
|
g_assert (validate_part (3, 1, TRUE));
|
|
|
|
/* Regular rectangle */
|
|
|
|
g_assert (validate_part (4, 1, TRUE));
|
|
|
|
|
|
|
|
/* Comment this out if you want visual feedback of what this test
|
|
|
|
* paints.
|
|
|
|
*/
|
|
|
|
clutter_main_quit ();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
on_paint (ClutterActor *actor, TestState *state)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int frame_num;
|
|
|
|
|
|
|
|
cogl_enable_backface_culling (TRUE);
|
|
|
|
|
|
|
|
cogl_push_matrix ();
|
|
|
|
|
|
|
|
/* Render the scene twice - once with backface culling enabled and
|
|
|
|
once without. The second time is translated so that it is below
|
|
|
|
the first */
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
2009-01-20 11:20:54 -05:00
|
|
|
float x1 = 0, x2, y1 = 0, y2 = (float)(TEXTURE_SIZE);
|
2008-11-28 12:36:37 -05:00
|
|
|
CoglTextureVertex verts[4];
|
|
|
|
|
|
|
|
memset (verts, 0, sizeof (verts));
|
|
|
|
|
|
|
|
/* Set the color to white so that all the textures will be drawn
|
|
|
|
at their own color */
|
2009-01-20 11:20:54 -05:00
|
|
|
cogl_set_source_color4f (1.0, 1.0,
|
2009-01-20 11:20:54 -05:00
|
|
|
1.0, 1.0);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
2009-01-20 11:20:54 -05:00
|
|
|
x2 = x1 + (float)(TEXTURE_SIZE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
/* Draw a front-facing texture */
|
Fully integrates CoglMaterial throughout the rest of Cogl
This glues CoglMaterial in as the fundamental way that Cogl describes how to
fill in geometry.
It adds cogl_set_source (), which is used to set the material which will be
used by all subsequent drawing functions
It adds cogl_set_source_texture as a convenience for setting up a default
material with a single texture layer, and cogl_set_source_color is now also
a convenience for setting up a material with a solid fill.
"drawing functions" include, cogl_rectangle, cogl_texture_rectangle,
cogl_texture_multiple_rectangles, cogl_texture_polygon (though the
cogl_texture_* funcs have been renamed; see below for details),
cogl_path_fill/stroke and cogl_vertex_buffer_draw*.
cogl_texture_rectangle, cogl_texture_multiple_rectangles and
cogl_texture_polygon no longer take a texture handle; instead the current
source material is referenced. The functions have also been renamed to:
cogl_rectangle_with_texture_coords, cogl_rectangles_with_texture_coords
and cogl_polygon respectivly.
Most code that previously did:
cogl_texture_rectangle (tex_handle, x, y,...);
needs to be changed to now do:
cogl_set_source_texture (tex_handle);
cogl_rectangle_with_texture_coords (x, y,....);
In the less likely case where you were blending your source texture with a color
like:
cogl_set_source_color4ub (r,g,b,a); /* where r,g,b,a isn't just white */
cogl_texture_rectangle (tex_handle, x, y,...);
you will need your own material to do that:
mat = cogl_material_new ();
cogl_material_set_color4ub (r,g,b,a);
cogl_material_set_layer (mat, 0, tex_handle));
cogl_set_source_material (mat);
Code that uses the texture coordinates, 0, 0, 1, 1 don't need to use
cog_rectangle_with_texure_coords since these are the coordinates that
cogl_rectangle will use.
For cogl_texture_polygon; as well as dropping the texture handle, the
n_vertices and vertices arguments were transposed for consistency. So
code previously written as:
cogl_texture_polygon (tex_handle, 3, verts, TRUE);
need to be written as:
cogl_set_source_texture (tex_handle);
cogl_polygon (verts, 3, TRUE);
All of the unit tests have been updated to now use the material API and
test-cogl-material has been renamed to test-cogl-multitexture since any
textured quad is now technically a test of CoglMaterial but this test
specifically creates a material with multiple texture layers.
Note: The GLES backend has not been updated yet; that will be done in a
following commit.
2009-01-23 11:15:40 -05:00
|
|
|
cogl_set_source_texture (state->texture);
|
|
|
|
cogl_rectangle (x1, y1, x2, y2);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
x1 = x2;
|
2009-01-20 11:20:54 -05:00
|
|
|
x2 = x1 + (float)(TEXTURE_SIZE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
/* Draw a back-facing texture */
|
Fully integrates CoglMaterial throughout the rest of Cogl
This glues CoglMaterial in as the fundamental way that Cogl describes how to
fill in geometry.
It adds cogl_set_source (), which is used to set the material which will be
used by all subsequent drawing functions
It adds cogl_set_source_texture as a convenience for setting up a default
material with a single texture layer, and cogl_set_source_color is now also
a convenience for setting up a material with a solid fill.
"drawing functions" include, cogl_rectangle, cogl_texture_rectangle,
cogl_texture_multiple_rectangles, cogl_texture_polygon (though the
cogl_texture_* funcs have been renamed; see below for details),
cogl_path_fill/stroke and cogl_vertex_buffer_draw*.
cogl_texture_rectangle, cogl_texture_multiple_rectangles and
cogl_texture_polygon no longer take a texture handle; instead the current
source material is referenced. The functions have also been renamed to:
cogl_rectangle_with_texture_coords, cogl_rectangles_with_texture_coords
and cogl_polygon respectivly.
Most code that previously did:
cogl_texture_rectangle (tex_handle, x, y,...);
needs to be changed to now do:
cogl_set_source_texture (tex_handle);
cogl_rectangle_with_texture_coords (x, y,....);
In the less likely case where you were blending your source texture with a color
like:
cogl_set_source_color4ub (r,g,b,a); /* where r,g,b,a isn't just white */
cogl_texture_rectangle (tex_handle, x, y,...);
you will need your own material to do that:
mat = cogl_material_new ();
cogl_material_set_color4ub (r,g,b,a);
cogl_material_set_layer (mat, 0, tex_handle));
cogl_set_source_material (mat);
Code that uses the texture coordinates, 0, 0, 1, 1 don't need to use
cog_rectangle_with_texure_coords since these are the coordinates that
cogl_rectangle will use.
For cogl_texture_polygon; as well as dropping the texture handle, the
n_vertices and vertices arguments were transposed for consistency. So
code previously written as:
cogl_texture_polygon (tex_handle, 3, verts, TRUE);
need to be written as:
cogl_set_source_texture (tex_handle);
cogl_polygon (verts, 3, TRUE);
All of the unit tests have been updated to now use the material API and
test-cogl-material has been renamed to test-cogl-multitexture since any
textured quad is now technically a test of CoglMaterial but this test
specifically creates a material with multiple texture layers.
Note: The GLES backend has not been updated yet; that will be done in a
following commit.
2009-01-23 11:15:40 -05:00
|
|
|
cogl_set_source_texture (state->texture);
|
|
|
|
cogl_rectangle (x2, y1, x1, y2);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
x1 = x2;
|
2009-01-20 11:20:54 -05:00
|
|
|
x2 = x1 + (float)(TEXTURE_SIZE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
/* Draw a front-facing texture polygon */
|
Fully integrates CoglMaterial throughout the rest of Cogl
This glues CoglMaterial in as the fundamental way that Cogl describes how to
fill in geometry.
It adds cogl_set_source (), which is used to set the material which will be
used by all subsequent drawing functions
It adds cogl_set_source_texture as a convenience for setting up a default
material with a single texture layer, and cogl_set_source_color is now also
a convenience for setting up a material with a solid fill.
"drawing functions" include, cogl_rectangle, cogl_texture_rectangle,
cogl_texture_multiple_rectangles, cogl_texture_polygon (though the
cogl_texture_* funcs have been renamed; see below for details),
cogl_path_fill/stroke and cogl_vertex_buffer_draw*.
cogl_texture_rectangle, cogl_texture_multiple_rectangles and
cogl_texture_polygon no longer take a texture handle; instead the current
source material is referenced. The functions have also been renamed to:
cogl_rectangle_with_texture_coords, cogl_rectangles_with_texture_coords
and cogl_polygon respectivly.
Most code that previously did:
cogl_texture_rectangle (tex_handle, x, y,...);
needs to be changed to now do:
cogl_set_source_texture (tex_handle);
cogl_rectangle_with_texture_coords (x, y,....);
In the less likely case where you were blending your source texture with a color
like:
cogl_set_source_color4ub (r,g,b,a); /* where r,g,b,a isn't just white */
cogl_texture_rectangle (tex_handle, x, y,...);
you will need your own material to do that:
mat = cogl_material_new ();
cogl_material_set_color4ub (r,g,b,a);
cogl_material_set_layer (mat, 0, tex_handle));
cogl_set_source_material (mat);
Code that uses the texture coordinates, 0, 0, 1, 1 don't need to use
cog_rectangle_with_texure_coords since these are the coordinates that
cogl_rectangle will use.
For cogl_texture_polygon; as well as dropping the texture handle, the
n_vertices and vertices arguments were transposed for consistency. So
code previously written as:
cogl_texture_polygon (tex_handle, 3, verts, TRUE);
need to be written as:
cogl_set_source_texture (tex_handle);
cogl_polygon (verts, 3, TRUE);
All of the unit tests have been updated to now use the material API and
test-cogl-material has been renamed to test-cogl-multitexture since any
textured quad is now technically a test of CoglMaterial but this test
specifically creates a material with multiple texture layers.
Note: The GLES backend has not been updated yet; that will be done in a
following commit.
2009-01-23 11:15:40 -05:00
|
|
|
verts[0].x = x1; verts[0].y = y2;
|
|
|
|
verts[1].x = x2; verts[1].y = y2;
|
|
|
|
verts[2].x = x2; verts[2].y = y1;
|
|
|
|
verts[3].x = x1; verts[3].y = y1;
|
|
|
|
verts[0].tx = 0; verts[0].ty = 0;
|
2009-01-20 11:20:54 -05:00
|
|
|
verts[1].tx = 1.0; verts[1].ty = 0;
|
|
|
|
verts[2].tx = 1.0; verts[2].ty = 1.0;
|
Fully integrates CoglMaterial throughout the rest of Cogl
This glues CoglMaterial in as the fundamental way that Cogl describes how to
fill in geometry.
It adds cogl_set_source (), which is used to set the material which will be
used by all subsequent drawing functions
It adds cogl_set_source_texture as a convenience for setting up a default
material with a single texture layer, and cogl_set_source_color is now also
a convenience for setting up a material with a solid fill.
"drawing functions" include, cogl_rectangle, cogl_texture_rectangle,
cogl_texture_multiple_rectangles, cogl_texture_polygon (though the
cogl_texture_* funcs have been renamed; see below for details),
cogl_path_fill/stroke and cogl_vertex_buffer_draw*.
cogl_texture_rectangle, cogl_texture_multiple_rectangles and
cogl_texture_polygon no longer take a texture handle; instead the current
source material is referenced. The functions have also been renamed to:
cogl_rectangle_with_texture_coords, cogl_rectangles_with_texture_coords
and cogl_polygon respectivly.
Most code that previously did:
cogl_texture_rectangle (tex_handle, x, y,...);
needs to be changed to now do:
cogl_set_source_texture (tex_handle);
cogl_rectangle_with_texture_coords (x, y,....);
In the less likely case where you were blending your source texture with a color
like:
cogl_set_source_color4ub (r,g,b,a); /* where r,g,b,a isn't just white */
cogl_texture_rectangle (tex_handle, x, y,...);
you will need your own material to do that:
mat = cogl_material_new ();
cogl_material_set_color4ub (r,g,b,a);
cogl_material_set_layer (mat, 0, tex_handle));
cogl_set_source_material (mat);
Code that uses the texture coordinates, 0, 0, 1, 1 don't need to use
cog_rectangle_with_texure_coords since these are the coordinates that
cogl_rectangle will use.
For cogl_texture_polygon; as well as dropping the texture handle, the
n_vertices and vertices arguments were transposed for consistency. So
code previously written as:
cogl_texture_polygon (tex_handle, 3, verts, TRUE);
need to be written as:
cogl_set_source_texture (tex_handle);
cogl_polygon (verts, 3, TRUE);
All of the unit tests have been updated to now use the material API and
test-cogl-material has been renamed to test-cogl-multitexture since any
textured quad is now technically a test of CoglMaterial but this test
specifically creates a material with multiple texture layers.
Note: The GLES backend has not been updated yet; that will be done in a
following commit.
2009-01-23 11:15:40 -05:00
|
|
|
verts[3].tx = 0; verts[3].ty = 1.0;
|
|
|
|
cogl_set_source_texture (state->texture);
|
|
|
|
cogl_polygon (verts, 4, FALSE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
x1 = x2;
|
2009-01-20 11:20:54 -05:00
|
|
|
x2 = x1 + (float)(TEXTURE_SIZE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
/* Draw a back-facing texture polygon */
|
Fully integrates CoglMaterial throughout the rest of Cogl
This glues CoglMaterial in as the fundamental way that Cogl describes how to
fill in geometry.
It adds cogl_set_source (), which is used to set the material which will be
used by all subsequent drawing functions
It adds cogl_set_source_texture as a convenience for setting up a default
material with a single texture layer, and cogl_set_source_color is now also
a convenience for setting up a material with a solid fill.
"drawing functions" include, cogl_rectangle, cogl_texture_rectangle,
cogl_texture_multiple_rectangles, cogl_texture_polygon (though the
cogl_texture_* funcs have been renamed; see below for details),
cogl_path_fill/stroke and cogl_vertex_buffer_draw*.
cogl_texture_rectangle, cogl_texture_multiple_rectangles and
cogl_texture_polygon no longer take a texture handle; instead the current
source material is referenced. The functions have also been renamed to:
cogl_rectangle_with_texture_coords, cogl_rectangles_with_texture_coords
and cogl_polygon respectivly.
Most code that previously did:
cogl_texture_rectangle (tex_handle, x, y,...);
needs to be changed to now do:
cogl_set_source_texture (tex_handle);
cogl_rectangle_with_texture_coords (x, y,....);
In the less likely case where you were blending your source texture with a color
like:
cogl_set_source_color4ub (r,g,b,a); /* where r,g,b,a isn't just white */
cogl_texture_rectangle (tex_handle, x, y,...);
you will need your own material to do that:
mat = cogl_material_new ();
cogl_material_set_color4ub (r,g,b,a);
cogl_material_set_layer (mat, 0, tex_handle));
cogl_set_source_material (mat);
Code that uses the texture coordinates, 0, 0, 1, 1 don't need to use
cog_rectangle_with_texure_coords since these are the coordinates that
cogl_rectangle will use.
For cogl_texture_polygon; as well as dropping the texture handle, the
n_vertices and vertices arguments were transposed for consistency. So
code previously written as:
cogl_texture_polygon (tex_handle, 3, verts, TRUE);
need to be written as:
cogl_set_source_texture (tex_handle);
cogl_polygon (verts, 3, TRUE);
All of the unit tests have been updated to now use the material API and
test-cogl-material has been renamed to test-cogl-multitexture since any
textured quad is now technically a test of CoglMaterial but this test
specifically creates a material with multiple texture layers.
Note: The GLES backend has not been updated yet; that will be done in a
following commit.
2009-01-23 11:15:40 -05:00
|
|
|
verts[0].x = x1; verts[0].y = y1;
|
|
|
|
verts[1].x = x2; verts[1].y = y1;
|
|
|
|
verts[2].x = x2; verts[2].y = y2;
|
|
|
|
verts[3].x = x1; verts[3].y = y2;
|
|
|
|
verts[0].tx = 0; verts[0].ty = 0;
|
2009-01-20 11:20:54 -05:00
|
|
|
verts[1].tx = 1.0; verts[1].ty = 0;
|
|
|
|
verts[2].tx = 1.0; verts[2].ty = 1.0;
|
Fully integrates CoglMaterial throughout the rest of Cogl
This glues CoglMaterial in as the fundamental way that Cogl describes how to
fill in geometry.
It adds cogl_set_source (), which is used to set the material which will be
used by all subsequent drawing functions
It adds cogl_set_source_texture as a convenience for setting up a default
material with a single texture layer, and cogl_set_source_color is now also
a convenience for setting up a material with a solid fill.
"drawing functions" include, cogl_rectangle, cogl_texture_rectangle,
cogl_texture_multiple_rectangles, cogl_texture_polygon (though the
cogl_texture_* funcs have been renamed; see below for details),
cogl_path_fill/stroke and cogl_vertex_buffer_draw*.
cogl_texture_rectangle, cogl_texture_multiple_rectangles and
cogl_texture_polygon no longer take a texture handle; instead the current
source material is referenced. The functions have also been renamed to:
cogl_rectangle_with_texture_coords, cogl_rectangles_with_texture_coords
and cogl_polygon respectivly.
Most code that previously did:
cogl_texture_rectangle (tex_handle, x, y,...);
needs to be changed to now do:
cogl_set_source_texture (tex_handle);
cogl_rectangle_with_texture_coords (x, y,....);
In the less likely case where you were blending your source texture with a color
like:
cogl_set_source_color4ub (r,g,b,a); /* where r,g,b,a isn't just white */
cogl_texture_rectangle (tex_handle, x, y,...);
you will need your own material to do that:
mat = cogl_material_new ();
cogl_material_set_color4ub (r,g,b,a);
cogl_material_set_layer (mat, 0, tex_handle));
cogl_set_source_material (mat);
Code that uses the texture coordinates, 0, 0, 1, 1 don't need to use
cog_rectangle_with_texure_coords since these are the coordinates that
cogl_rectangle will use.
For cogl_texture_polygon; as well as dropping the texture handle, the
n_vertices and vertices arguments were transposed for consistency. So
code previously written as:
cogl_texture_polygon (tex_handle, 3, verts, TRUE);
need to be written as:
cogl_set_source_texture (tex_handle);
cogl_polygon (verts, 3, TRUE);
All of the unit tests have been updated to now use the material API and
test-cogl-material has been renamed to test-cogl-multitexture since any
textured quad is now technically a test of CoglMaterial but this test
specifically creates a material with multiple texture layers.
Note: The GLES backend has not been updated yet; that will be done in a
following commit.
2009-01-23 11:15:40 -05:00
|
|
|
verts[3].tx = 0; verts[3].ty = 1.0;
|
|
|
|
cogl_set_source_texture (state->texture);
|
|
|
|
cogl_polygon (verts, 4, FALSE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
x1 = x2;
|
2009-01-20 11:20:54 -05:00
|
|
|
x2 = x1 + (float)(TEXTURE_SIZE);
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
/* Draw a regular rectangle (this should always show) */
|
2009-01-20 11:20:54 -05:00
|
|
|
cogl_set_source_color4f (1.0, 0, 0, 1.0);
|
2009-01-20 11:20:54 -05:00
|
|
|
cogl_rectangle ( (x1), (y1),
|
|
|
|
(x2 - x1), (y2 - y1));
|
2008-11-28 12:36:37 -05:00
|
|
|
|
|
|
|
/* The second time round draw beneath the first with backface
|
|
|
|
culling disabled */
|
|
|
|
cogl_translate (0, TEXTURE_SIZE, 0);
|
|
|
|
cogl_enable_backface_culling (FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
cogl_pop_matrix ();
|
|
|
|
|
|
|
|
/* XXX: Experiments have shown that for some buggy drivers, when using
|
|
|
|
* glReadPixels there is some kind of race, so we delay our test for a
|
|
|
|
* few frames and a few seconds:
|
|
|
|
*/
|
|
|
|
/* Need to increment frame first because clutter_stage_read_pixels
|
|
|
|
fires a redraw */
|
|
|
|
frame_num = state->frame++;
|
|
|
|
if (frame_num == 2)
|
|
|
|
validate_result (state);
|
|
|
|
else if (frame_num < 2)
|
|
|
|
g_usleep (G_USEC_PER_SEC);
|
|
|
|
}
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
queue_redraw (gpointer stage)
|
|
|
|
{
|
|
|
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static CoglHandle
|
|
|
|
make_texture (void)
|
|
|
|
{
|
|
|
|
guchar *tex_data, *p;
|
|
|
|
CoglHandle tex;
|
|
|
|
|
|
|
|
tex_data = g_malloc (TEXTURE_SIZE * TEXTURE_SIZE * 4);
|
|
|
|
|
|
|
|
for (p = tex_data + TEXTURE_SIZE * TEXTURE_SIZE * 4; p > tex_data;)
|
|
|
|
{
|
|
|
|
*(--p) = 255;
|
|
|
|
*(--p) = 0;
|
|
|
|
*(--p) = 0;
|
|
|
|
*(--p) = 255;
|
|
|
|
}
|
|
|
|
|
|
|
|
tex = cogl_texture_new_from_data (TEXTURE_SIZE,
|
|
|
|
TEXTURE_SIZE,
|
|
|
|
8,
|
2009-01-22 11:54:49 -05:00
|
|
|
COGL_TEXTURE_NONE,
|
2008-11-28 12:36:37 -05:00
|
|
|
COGL_PIXEL_FORMAT_RGBA_8888,
|
|
|
|
COGL_PIXEL_FORMAT_ANY,
|
|
|
|
TEXTURE_SIZE * 4,
|
|
|
|
tex_data);
|
|
|
|
|
|
|
|
g_free (tex_data);
|
|
|
|
|
|
|
|
return tex;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
test_backface_culling (TestConformSimpleFixture *fixture,
|
|
|
|
gconstpointer data)
|
|
|
|
{
|
|
|
|
TestState state;
|
|
|
|
ClutterActor *stage;
|
|
|
|
ClutterActor *group;
|
|
|
|
guint idle_source;
|
|
|
|
|
|
|
|
state.frame = 0;
|
|
|
|
|
|
|
|
state.texture = make_texture ();
|
|
|
|
|
|
|
|
stage = clutter_stage_get_default ();
|
|
|
|
|
|
|
|
clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color);
|
|
|
|
|
|
|
|
group = clutter_group_new ();
|
|
|
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage), group);
|
|
|
|
|
|
|
|
/* We force continuous redrawing of the stage, since we need to skip
|
|
|
|
* the first few frames, and we wont be doing anything else that
|
|
|
|
* will trigger redrawing. */
|
|
|
|
idle_source = g_idle_add (queue_redraw, stage);
|
|
|
|
|
|
|
|
g_signal_connect (group, "paint", G_CALLBACK (on_paint), &state);
|
|
|
|
|
|
|
|
clutter_actor_show_all (stage);
|
|
|
|
|
|
|
|
clutter_main ();
|
|
|
|
|
|
|
|
g_source_remove (idle_source);
|
|
|
|
|
|
|
|
cogl_texture_unref (state.texture);
|
|
|
|
|
|
|
|
if (g_test_verbose ())
|
|
|
|
g_print ("OK\n");
|
|
|
|
}
|
|
|
|
|