Adds cogl_framebuffer_draw_[*_]rectangle functions
This adds experimental 2.0 api replacements for the cogl_rectangle[_*] functions that don't depend on having a current pipeline set on the context via cogl_{set,push}_source() or having a current framebuffer set on the context via cogl_push_framebuffer(). The aim for 2.0 is to switch away from having a statefull context that affects drawing to having framebuffer drawing apis that are explicitly passed a framebuffer and pipeline. To test this change several of the conformance tests were updated to use this api instead of cogl_rectangle and cogl_rectangle_with_texture_coords. Since it's quite laborious going through all of the conformance tests the opportunity was taken to make other clean ups in the conformance tests to replace other uses of 1.x api with experimental 2.0 api so long as that didn't affect what was being tested.
This commit is contained in:
parent
596b508653
commit
3881fd3259
@ -46,6 +46,7 @@
|
|||||||
#include "cogl-offscreen.h"
|
#include "cogl-offscreen.h"
|
||||||
#include "cogl1-context.h"
|
#include "cogl1-context.h"
|
||||||
#include "cogl-private.h"
|
#include "cogl-private.h"
|
||||||
|
#include "cogl-primitives-private.h"
|
||||||
|
|
||||||
#ifndef GL_FRAMEBUFFER
|
#ifndef GL_FRAMEBUFFER
|
||||||
#define GL_FRAMEBUFFER 0x8D40
|
#define GL_FRAMEBUFFER 0x8D40
|
||||||
@ -3244,3 +3245,151 @@ cogl_framebuffer_draw_primitive (CoglFramebuffer *framebuffer,
|
|||||||
_cogl_framebuffer_draw_primitive (framebuffer, pipeline, primitive,
|
_cogl_framebuffer_draw_primitive (framebuffer, pipeline, primitive,
|
||||||
COGL_DRAW_SKIP_LEGACY_STATE);
|
COGL_DRAW_SKIP_LEGACY_STATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_rectangle (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
float x_1,
|
||||||
|
float y_1,
|
||||||
|
float x_2,
|
||||||
|
float y_2)
|
||||||
|
{
|
||||||
|
const float position[4] = {x_1, y_1, x_2, y_2};
|
||||||
|
CoglMultiTexturedRect rect;
|
||||||
|
|
||||||
|
/* XXX: All the _*_rectangle* APIs normalize their input into an array of
|
||||||
|
* _CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
|
* _cogl_framebuffer_draw_multitextured_rectangles.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rect.position = position;
|
||||||
|
rect.tex_coords = NULL;
|
||||||
|
rect.tex_coords_len = 0;
|
||||||
|
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (framebuffer,
|
||||||
|
pipeline,
|
||||||
|
&rect,
|
||||||
|
1,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_textured_rectangle (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
float x_1,
|
||||||
|
float y_1,
|
||||||
|
float x_2,
|
||||||
|
float y_2,
|
||||||
|
float s_1,
|
||||||
|
float t_1,
|
||||||
|
float s_2,
|
||||||
|
float t_2)
|
||||||
|
{
|
||||||
|
const float position[4] = {x_1, y_1, x_2, y_2};
|
||||||
|
const float tex_coords[4] = {s_1, t_1, s_2, t_2};
|
||||||
|
CoglMultiTexturedRect rect;
|
||||||
|
|
||||||
|
/* XXX: All the _*_rectangle* APIs normalize their input into an array of
|
||||||
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
|
* _cogl_framebuffer_draw_multitextured_rectangles.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rect.position = position;
|
||||||
|
rect.tex_coords = tex_coords;
|
||||||
|
rect.tex_coords_len = 4;
|
||||||
|
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (framebuffer,
|
||||||
|
pipeline,
|
||||||
|
&rect,
|
||||||
|
1,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_multitextured_rectangle (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
float x_1,
|
||||||
|
float y_1,
|
||||||
|
float x_2,
|
||||||
|
float y_2,
|
||||||
|
const float *tex_coords,
|
||||||
|
int tex_coords_len)
|
||||||
|
{
|
||||||
|
const float position[4] = {x_1, y_1, x_2, y_2};
|
||||||
|
CoglMultiTexturedRect rect;
|
||||||
|
|
||||||
|
/* XXX: All the _*_rectangle* APIs normalize their input into an array of
|
||||||
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
|
* _cogl_framebuffer_draw_multitextured_rectangles.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rect.position = position;
|
||||||
|
rect.tex_coords = tex_coords;
|
||||||
|
rect.tex_coords_len = tex_coords_len;
|
||||||
|
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (framebuffer,
|
||||||
|
pipeline,
|
||||||
|
&rect,
|
||||||
|
1,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_rectangles (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
const float *coordinates,
|
||||||
|
unsigned int n_rectangles)
|
||||||
|
{
|
||||||
|
CoglMultiTexturedRect *rects;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* XXX: All the _*_rectangle* APIs normalize their input into an array of
|
||||||
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
|
* _cogl_framebuffer_draw_multitextured_rectangles.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rects = g_alloca (n_rectangles * sizeof (CoglMultiTexturedRect));
|
||||||
|
|
||||||
|
for (i = 0; i < n_rectangles; i++)
|
||||||
|
{
|
||||||
|
rects[i].position = &coordinates[i * 4];
|
||||||
|
rects[i].tex_coords = NULL;
|
||||||
|
rects[i].tex_coords_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (framebuffer,
|
||||||
|
pipeline,
|
||||||
|
rects,
|
||||||
|
n_rectangles,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_textured_rectangles (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
const float *coordinates,
|
||||||
|
unsigned int n_rectangles)
|
||||||
|
{
|
||||||
|
CoglMultiTexturedRect *rects;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* XXX: All the _*_rectangle* APIs normalize their input into an array of
|
||||||
|
* _CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
|
* _cogl_framebuffer_draw_multitextured_rectangles.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rects = g_alloca (n_rectangles * sizeof (CoglMultiTexturedRect));
|
||||||
|
|
||||||
|
for (i = 0; i < n_rectangles; i++)
|
||||||
|
{
|
||||||
|
rects[i].position = &coordinates[i * 8];
|
||||||
|
rects[i].tex_coords = &coordinates[i * 8 + 4];
|
||||||
|
rects[i].tex_coords_len = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (framebuffer,
|
||||||
|
pipeline,
|
||||||
|
rects,
|
||||||
|
n_rectangles,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
@ -990,7 +990,13 @@ cogl_framebuffer_clear4f (CoglFramebuffer *framebuffer,
|
|||||||
* @primitive: A #CoglPrimitive geometry object
|
* @primitive: A #CoglPrimitive geometry object
|
||||||
*
|
*
|
||||||
* Draws the given @primitive geometry to the specified destination
|
* Draws the given @primitive geometry to the specified destination
|
||||||
* @framebuffer using the graphics processing pipeline described by @pipeline.
|
* @framebuffer using the graphics processing state described by @pipeline.
|
||||||
|
*
|
||||||
|
* This drawing api doesn't support high-level meta texture types such
|
||||||
|
* as #CoglTexture2DSliced so it is the user's responsibility to
|
||||||
|
* ensure that only low-level textures that can be directly sampled by
|
||||||
|
* a GPU such as #CoglTexture2D, #CoglTextureRectangle or #CoglTexture3D
|
||||||
|
* are associated with layers of the given @pipeline.
|
||||||
*
|
*
|
||||||
* <note>This api doesn't support any of the legacy global state options such
|
* <note>This api doesn't support any of the legacy global state options such
|
||||||
* as cogl_set_depth_test_enabled(), cogl_set_backface_culling_enabled() or
|
* as cogl_set_depth_test_enabled(), cogl_set_backface_culling_enabled() or
|
||||||
@ -1025,6 +1031,12 @@ cogl_framebuffer_draw_primitive (CoglFramebuffer *framebuffer,
|
|||||||
* be drawn, such as positions, colors and normals and should be %NULL
|
* be drawn, such as positions, colors and normals and should be %NULL
|
||||||
* terminated.
|
* terminated.
|
||||||
*
|
*
|
||||||
|
* This drawing api doesn't support high-level meta texture types such
|
||||||
|
* as #CoglTexture2DSliced so it is the user's responsibility to
|
||||||
|
* ensure that only low-level textures that can be directly sampled by
|
||||||
|
* a GPU such as #CoglTexture2D, #CoglTextureRectangle or #CoglTexture3D
|
||||||
|
* are associated with layers of the given @pipeline.
|
||||||
|
*
|
||||||
* Stability: unstable
|
* Stability: unstable
|
||||||
* Since: 1.10
|
* Since: 1.10
|
||||||
*/
|
*/
|
||||||
@ -1059,6 +1071,12 @@ cogl_framebuffer_vdraw_attributes (CoglFramebuffer *framebuffer,
|
|||||||
* be drawn, such as positions, colors and normals and the number of attributes
|
* be drawn, such as positions, colors and normals and the number of attributes
|
||||||
* is given as @n_attributes.
|
* is given as @n_attributes.
|
||||||
*
|
*
|
||||||
|
* This drawing api doesn't support high-level meta texture types such
|
||||||
|
* as #CoglTexture2DSliced so it is the user's responsibility to
|
||||||
|
* ensure that only low-level textures that can be directly sampled by
|
||||||
|
* a GPU such as #CoglTexture2D, #CoglTextureRectangle or #CoglTexture3D
|
||||||
|
* are associated with layers of the given @pipeline.
|
||||||
|
*
|
||||||
* <note>This api doesn't support any of the legacy global state options such
|
* <note>This api doesn't support any of the legacy global state options such
|
||||||
* as cogl_set_depth_test_enabled(), cogl_set_backface_culling_enabled() or
|
* as cogl_set_depth_test_enabled(), cogl_set_backface_culling_enabled() or
|
||||||
* cogl_program_use()</note>
|
* cogl_program_use()</note>
|
||||||
@ -1107,8 +1125,8 @@ cogl_framebuffer_draw_attributes (CoglFramebuffer *framebuffer,
|
|||||||
* multiple entries in the index array can refer back to a single
|
* multiple entries in the index array can refer back to a single
|
||||||
* shared vertex.
|
* shared vertex.
|
||||||
*
|
*
|
||||||
* <note>The @indices array must at least be as long @first_vertex +
|
* <note>The @indices array must be at least as long as @first_vertex
|
||||||
* @n_vertices otherwise the GPU will overrun the indices array when
|
* + @n_vertices otherwise the GPU will overrun the indices array when
|
||||||
* looking up vertex data.</note>
|
* looking up vertex data.</note>
|
||||||
*
|
*
|
||||||
* Since it's very common to want to draw a run of rectangles using
|
* Since it's very common to want to draw a run of rectangles using
|
||||||
@ -1116,6 +1134,12 @@ cogl_framebuffer_draw_attributes (CoglFramebuffer *framebuffer,
|
|||||||
* cogl_get_rectangle_indices() to get a set of indices that can be
|
* cogl_get_rectangle_indices() to get a set of indices that can be
|
||||||
* shared.
|
* shared.
|
||||||
*
|
*
|
||||||
|
* This drawing api doesn't support high-level meta texture types such
|
||||||
|
* as #CoglTexture2DSliced so it is the user's responsibility to
|
||||||
|
* ensure that only low-level textures that can be directly sampled by
|
||||||
|
* a GPU such as #CoglTexture2D, #CoglTextureRectangle or
|
||||||
|
* #CoglTexture3D are associated with layers of the given @pipeline.
|
||||||
|
*
|
||||||
* <note>This api doesn't support any of the legacy global state
|
* <note>This api doesn't support any of the legacy global state
|
||||||
* options such as cogl_set_depth_test_enabled(),
|
* options such as cogl_set_depth_test_enabled(),
|
||||||
* cogl_set_backface_culling_enabled() or cogl_program_use()</note>
|
* cogl_set_backface_culling_enabled() or cogl_program_use()</note>
|
||||||
@ -1166,8 +1190,8 @@ cogl_framebuffer_vdraw_indexed_attributes (CoglFramebuffer *framebuffer,
|
|||||||
* multiple entries in the index array can refer back to a single
|
* multiple entries in the index array can refer back to a single
|
||||||
* shared vertex.
|
* shared vertex.
|
||||||
*
|
*
|
||||||
* <note>The @indices array must at least be as long @first_vertex +
|
* <note>The @indices array must be at least as long as @first_vertex
|
||||||
* @n_vertices otherwise the GPU will overrun the indices array when
|
* + @n_vertices otherwise the GPU will overrun the indices array when
|
||||||
* looking up vertex data.</note>
|
* looking up vertex data.</note>
|
||||||
*
|
*
|
||||||
* Since it's very common to want to draw a run of rectangles using
|
* Since it's very common to want to draw a run of rectangles using
|
||||||
@ -1175,6 +1199,12 @@ cogl_framebuffer_vdraw_indexed_attributes (CoglFramebuffer *framebuffer,
|
|||||||
* cogl_get_rectangle_indices() to get a set of indices that can be
|
* cogl_get_rectangle_indices() to get a set of indices that can be
|
||||||
* shared.
|
* shared.
|
||||||
*
|
*
|
||||||
|
* This drawing api doesn't support high-level meta texture types such
|
||||||
|
* as #CoglTexture2DSliced so it is the user's responsibility to
|
||||||
|
* ensure that only low-level textures that can be directly sampled by
|
||||||
|
* a GPU such as #CoglTexture2D, #CoglTextureRectangle or
|
||||||
|
* #CoglTexture3D are associated with layers of the given @pipeline.
|
||||||
|
*
|
||||||
* <note>This api doesn't support any of the legacy global state
|
* <note>This api doesn't support any of the legacy global state
|
||||||
* options such as cogl_set_depth_test_enabled(),
|
* options such as cogl_set_depth_test_enabled(),
|
||||||
* cogl_set_backface_culling_enabled() or cogl_program_use()</note>
|
* cogl_set_backface_culling_enabled() or cogl_program_use()</note>
|
||||||
@ -1192,6 +1222,278 @@ cogl_framebuffer_draw_indexed_attributes (CoglFramebuffer *framebuffer,
|
|||||||
CoglAttribute **attributes,
|
CoglAttribute **attributes,
|
||||||
int n_attributes);
|
int n_attributes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_draw_rectangle:
|
||||||
|
* @framebuffer: A destination #CoglFramebuffer
|
||||||
|
* @pipeline: A #CoglPipeline state object
|
||||||
|
* @x_1: X coordinate of the top-left corner
|
||||||
|
* @y_1: Y coordinate of the top-left corner
|
||||||
|
* @x_2: X coordinate of the bottom-right corner
|
||||||
|
* @y_2: Y coordinate of the bottom-right corner
|
||||||
|
*
|
||||||
|
* Draws a rectangle to @framebuffer with the given @pipeline state
|
||||||
|
* and with the top left corner positioned at (@x_1, @y_1) and the
|
||||||
|
* bottom right corner positioned at (@x_2, @y_2).
|
||||||
|
*
|
||||||
|
* <note>The position is the position before the rectangle has been
|
||||||
|
* transformed by the model-view matrix and the projection
|
||||||
|
* matrix.</note>
|
||||||
|
*
|
||||||
|
* <note>If you want to describe a rectangle with a texture mapped on
|
||||||
|
* it then you can use
|
||||||
|
* cogl_framebuffer_draw_textured_rectangle().<note>
|
||||||
|
*
|
||||||
|
* Since: 1.10
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_rectangle (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
float x_1,
|
||||||
|
float y_1,
|
||||||
|
float x_2,
|
||||||
|
float y_2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_draw_textured_rectangle:
|
||||||
|
* @framebuffer: A destination #CoglFramebuffer
|
||||||
|
* @pipeline: A #CoglPipeline state object
|
||||||
|
* @x_1: x coordinate upper left on screen.
|
||||||
|
* @y_1: y coordinate upper left on screen.
|
||||||
|
* @x_2: x coordinate lower right on screen.
|
||||||
|
* @y_2: y coordinate lower right on screen.
|
||||||
|
* @s_1: S texture coordinate of the top-left coorner
|
||||||
|
* @t_1: T texture coordinate of the top-left coorner
|
||||||
|
* @s_2: S texture coordinate of the bottom-right coorner
|
||||||
|
* @t_2: T texture coordinate of the bottom-right coorner
|
||||||
|
*
|
||||||
|
* Draws a textured rectangle to @framebuffer using the given
|
||||||
|
* @pipeline state with the top left corner positioned at (@x_1, @y_1)
|
||||||
|
* and the bottom right corner positioned at (@x_2, @y_2). The top
|
||||||
|
* left corner will have texture coordinates of (@s_1, @t_1) and the
|
||||||
|
* bottom right corner will have texture coordinates of (@s_2, @t_2).
|
||||||
|
*
|
||||||
|
* <note>The position is the position before the rectangle has been
|
||||||
|
* transformed by the model-view matrix and the projection
|
||||||
|
* matrix.</note>
|
||||||
|
*
|
||||||
|
* This is a high level drawing api that can handle any kind of
|
||||||
|
* #CoglMetaTexture texture such as #CoglTexture2DSliced textures
|
||||||
|
* which may internally be comprised of multiple low-level textures.
|
||||||
|
* This is unlike low-level drawing apis such as
|
||||||
|
* cogl_framebuffer_draw_primitive() or
|
||||||
|
* cogl_framebuffer_draw_attributes() which only support low level
|
||||||
|
* texture types that are directly supported by GPUs such as
|
||||||
|
* #CoglTexture2D.
|
||||||
|
*
|
||||||
|
* <note>The given texture coordinates will only be used for the first
|
||||||
|
* texture layer of the pipeline and if your pipeline has more than
|
||||||
|
* one layer then all other layers will have default texture
|
||||||
|
* coordinates of @s_1=0.0 @t_1=0.0 @s_2=1.0 @t_2=1.0 </note>
|
||||||
|
*
|
||||||
|
* The given texture coordinates should always be normalized such that
|
||||||
|
* (0, 0) corresponds to the top left and (1, 1) corresponds to the
|
||||||
|
* bottom right. To map an entire texture across the rectangle pass
|
||||||
|
* in @s_1=%0, @t_1=%0, @s_2=%1, @t_2=%1.
|
||||||
|
*
|
||||||
|
* <note>Even if you have associated a #CoglTextureRectangle texture
|
||||||
|
* with one of your @pipeline layers which normally implies working
|
||||||
|
* with non-normalized texture coordinates this api should still be
|
||||||
|
* passed normalized texture coordinates.</note>
|
||||||
|
*
|
||||||
|
* Since: 1.10
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_textured_rectangle (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
float x_1,
|
||||||
|
float y_1,
|
||||||
|
float x_2,
|
||||||
|
float y_2,
|
||||||
|
float s_1,
|
||||||
|
float t_1,
|
||||||
|
float s_2,
|
||||||
|
float t_2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_draw_multitextured_rectangle:
|
||||||
|
* @framebuffer: A destination #CoglFramebuffer
|
||||||
|
* @pipeline: A #CoglPipeline state object
|
||||||
|
* @x_1: x coordinate upper left on screen.
|
||||||
|
* @y_1: y coordinate upper left on screen.
|
||||||
|
* @x_2: x coordinate lower right on screen.
|
||||||
|
* @y_2: y coordinate lower right on screen.
|
||||||
|
* @tex_coords: (in) (array) (transfer none): An array containing groups of
|
||||||
|
* 4 float values: [s_1, t_1, s_2, t_2] that are interpreted as two texture
|
||||||
|
* coordinates; one for the top left texel, and one for the bottom right
|
||||||
|
* texel. Each value should be between 0.0 and 1.0, where the coordinate
|
||||||
|
* (0.0, 0.0) represents the top left of the texture, and (1.0, 1.0) the
|
||||||
|
* bottom right.
|
||||||
|
* @tex_coords_len: The length of the @tex_coords array. (For one layer
|
||||||
|
* and one group of texture coordinates, this would be 4)
|
||||||
|
*
|
||||||
|
* Draws a textured rectangle to @framebuffer with the given @pipeline
|
||||||
|
* state with the top left corner positioned at (@x_1, @y_1) and the
|
||||||
|
* bottom right corner positioned at (@x_2, @y_2). As a pipeline may
|
||||||
|
* contain multiple texture layers this interface lets you supply
|
||||||
|
* texture coordinates for each layer of the pipeline.
|
||||||
|
*
|
||||||
|
* <note>The position is the position before the rectangle has been
|
||||||
|
* transformed by the model-view matrix and the projection
|
||||||
|
* matrix.</note>
|
||||||
|
*
|
||||||
|
* This is a high level drawing api that can handle any kind of
|
||||||
|
* #CoglMetaTexture texture for the first layer such as
|
||||||
|
* #CoglTexture2DSliced textures which may internally be comprised of
|
||||||
|
* multiple low-level textures. This is unlike low-level drawing apis
|
||||||
|
* such as cogl_framebuffer_draw_primitive() or
|
||||||
|
* cogl_framebuffer_draw_attributes() which only support low level
|
||||||
|
* texture types that are directly supported by GPUs such as
|
||||||
|
* #CoglTexture2D.
|
||||||
|
*
|
||||||
|
* <note>This api can not currently handle multiple high-level meta
|
||||||
|
* texture layers. The first layer may be a high level meta texture
|
||||||
|
* such as #CoglTexture2DSliced but all other layers much be low
|
||||||
|
* level textures such as #CoglTexture2D and additionally they
|
||||||
|
* should be textures that can be sampled using normalized coordinates
|
||||||
|
* (so not #CoglTextureRectangle textures).</note>
|
||||||
|
*
|
||||||
|
* The top left texture coordinate for layer 0 of any pipeline will be
|
||||||
|
* (tex_coords[0], tex_coords[1]) and the bottom right coordinate will
|
||||||
|
* be (tex_coords[2], tex_coords[3]). The coordinates for layer 1
|
||||||
|
* would be (tex_coords[4], tex_coords[5]) (tex_coords[6],
|
||||||
|
* tex_coords[7]) and so on...
|
||||||
|
*
|
||||||
|
* The given texture coordinates should always be normalized such that
|
||||||
|
* (0, 0) corresponds to the top left and (1, 1) corresponds to the
|
||||||
|
* bottom right. To map an entire texture across the rectangle pass
|
||||||
|
* in tex_coords[0]=%0, tex_coords[1]=%0, tex_coords[2]=%1,
|
||||||
|
* tex_coords[3]=%1.
|
||||||
|
*
|
||||||
|
* <note>Even if you have associated a #CoglTextureRectangle texture
|
||||||
|
* which normally implies working with non-normalized texture
|
||||||
|
* coordinates this api should still be passed normalized texture
|
||||||
|
* coordinates.</note>
|
||||||
|
*
|
||||||
|
* The first pair of coordinates are for the first layer (with the
|
||||||
|
* smallest layer index) and if you supply less texture coordinates
|
||||||
|
* than there are layers in the current source material then default
|
||||||
|
* texture coordinates (0.0, 0.0, 1.0, 1.0) are generated.
|
||||||
|
*
|
||||||
|
* Since: 1.10
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_multitextured_rectangle (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
float x_1,
|
||||||
|
float y_1,
|
||||||
|
float x_2,
|
||||||
|
float y_2,
|
||||||
|
const float *tex_coords,
|
||||||
|
int tex_coords_len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_draw_rectangles:
|
||||||
|
* @framebuffer: A destination #CoglFramebuffer
|
||||||
|
* @pipeline: A #CoglPipeline state object
|
||||||
|
* @coordinates: (in) (array) (transfer none): an array of coordinates
|
||||||
|
* containing groups of 4 float values: [x_1, y_1, x_2, y_2] that are
|
||||||
|
* interpreted as two position coordinates; one for the top left of
|
||||||
|
* the rectangle (x1, y1), and one for the bottom right of the
|
||||||
|
* rectangle (x2, y2).
|
||||||
|
* @n_rectangles: number of rectangles defined in @coordinates.
|
||||||
|
*
|
||||||
|
* Draws a series of rectangles to @framebuffer with the given
|
||||||
|
* @pipeline state in the same way that
|
||||||
|
* cogl_framebuffer_draw_rectangle() does.
|
||||||
|
*
|
||||||
|
* The top left corner of the first rectangle is positioned at
|
||||||
|
* (coordinates[0], coordinates[1]) and the bottom right corner is
|
||||||
|
* positioned at (coordinates[2], coordinates[3]). The positions for
|
||||||
|
* the second rectangle are (coordinates[4], coordinates[5]) and
|
||||||
|
* (coordinates[6], coordinates[7]) and so on...
|
||||||
|
*
|
||||||
|
* <note>The position is the position before the rectangle has been
|
||||||
|
* transformed by the model-view matrix and the projection
|
||||||
|
* matrix.</note>
|
||||||
|
*
|
||||||
|
* As a general rule for better performance its recommended to use
|
||||||
|
* this this API instead of calling
|
||||||
|
* cogl_framebuffer_draw_textured_rectangle() separately for multiple
|
||||||
|
* rectangles if all of the rectangles will be drawn together with the
|
||||||
|
* same @pipeline state.
|
||||||
|
*
|
||||||
|
* Since: 1.10
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_rectangles (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
const float *verts,
|
||||||
|
unsigned int n_rects);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cogl_framebuffer_draw_textured_rectangles:
|
||||||
|
* @framebuffer: A destination #CoglFramebuffer
|
||||||
|
* @pipeline: A #CoglPipeline state object
|
||||||
|
* @coordinates: (in) (array) (transfer none): an array containing
|
||||||
|
* groups of 8 float values: [x_1, y_1, x_2, y_2, s_1, t_1, s_2, t_2]
|
||||||
|
* that have the same meaning as the arguments for
|
||||||
|
* cogl_framebuffer_draw_textured_rectangle().
|
||||||
|
* @n_rectangles: number of rectangles to @coordinates to draw
|
||||||
|
*
|
||||||
|
* Draws a series of rectangles to @framebuffer with the given
|
||||||
|
* @pipeline state in the same way that
|
||||||
|
* cogl_framebuffer_draw_textured_rectangle() does.
|
||||||
|
*
|
||||||
|
* <note>The position is the position before the rectangle has been
|
||||||
|
* transformed by the model-view matrix and the projection
|
||||||
|
* matrix.</note>
|
||||||
|
*
|
||||||
|
* This is a high level drawing api that can handle any kind of
|
||||||
|
* #CoglMetaTexture texture such as #CoglTexture2DSliced textures
|
||||||
|
* which may internally be comprised of multiple low-level textures.
|
||||||
|
* This is unlike low-level drawing apis such as
|
||||||
|
* cogl_framebuffer_draw_primitive() or
|
||||||
|
* cogl_framebuffer_draw_attributes() which only support low level
|
||||||
|
* texture types that are directly supported by GPUs such as
|
||||||
|
* #CoglTexture2D.
|
||||||
|
*
|
||||||
|
* The top left corner of the first rectangle is positioned at
|
||||||
|
* (coordinates[0], coordinates[1]) and the bottom right corner is
|
||||||
|
* positioned at (coordinates[2], coordinates[3]). The top left
|
||||||
|
* texture coordinate is (coordinates[4], coordinates[5]) and the
|
||||||
|
* bottom right texture coordinate is (coordinates[6],
|
||||||
|
* coordinates[7]). The coordinates for subsequent rectangles
|
||||||
|
* are defined similarly by the subsequent coordinates.
|
||||||
|
*
|
||||||
|
* As a general rule for better performance its recommended to use
|
||||||
|
* this this API instead of calling
|
||||||
|
* cogl_framebuffer_draw_textured_rectangle() separately for multiple
|
||||||
|
* rectangles if all of the rectangles will be drawn together with the
|
||||||
|
* same @pipeline state.
|
||||||
|
*
|
||||||
|
* The given texture coordinates should always be normalized such that
|
||||||
|
* (0, 0) corresponds to the top left and (1, 1) corresponds to the
|
||||||
|
* bottom right. To map an entire texture across the rectangle pass
|
||||||
|
* in tex_coords[0]=%0, tex_coords[1]=%0, tex_coords[2]=%1,
|
||||||
|
* tex_coords[3]=%1.
|
||||||
|
*
|
||||||
|
* <note>Even if you have associated a #CoglTextureRectangle texture
|
||||||
|
* which normally implies working with non-normalized texture
|
||||||
|
* coordinates this api should still be passed normalized texture
|
||||||
|
* coordinates.</note>
|
||||||
|
*
|
||||||
|
* Since: 1.10
|
||||||
|
* Stability: unstable
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
cogl_framebuffer_draw_textured_rectangles (CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
const float *coordinates,
|
||||||
|
unsigned int n_rectangles);
|
||||||
|
|
||||||
/* XXX: Should we take an n_buffers + buffer id array instead of using
|
/* XXX: Should we take an n_buffers + buffer id array instead of using
|
||||||
* the CoglBufferBits type which doesn't seem future proof? */
|
* the CoglBufferBits type which doesn't seem future proof? */
|
||||||
|
@ -1491,15 +1491,16 @@ _cogl_journal_log_quad (CoglJournal *journal,
|
|||||||
const float *tex_coords,
|
const float *tex_coords,
|
||||||
unsigned int tex_coords_len)
|
unsigned int tex_coords_len)
|
||||||
{
|
{
|
||||||
gsize stride;
|
CoglFramebuffer *framebuffer = journal->framebuffer;
|
||||||
int next_vert;
|
gsize stride;
|
||||||
float *v;
|
int next_vert;
|
||||||
int i;
|
float *v;
|
||||||
int next_entry;
|
int i;
|
||||||
guint32 disable_layers;
|
int next_entry;
|
||||||
|
guint32 disable_layers;
|
||||||
CoglJournalEntry *entry;
|
CoglJournalEntry *entry;
|
||||||
CoglPipeline *final_pipeline;
|
CoglPipeline *final_pipeline;
|
||||||
CoglClipStack *clip_stack;
|
CoglClipStack *clip_stack;
|
||||||
CoglPipelineFlushOptions flush_options;
|
CoglPipelineFlushOptions flush_options;
|
||||||
COGL_STATIC_TIMER (log_timer,
|
COGL_STATIC_TIMER (log_timer,
|
||||||
"Mainloop", /* parent */
|
"Mainloop", /* parent */
|
||||||
@ -1507,15 +1508,13 @@ _cogl_journal_log_quad (CoglJournal *journal,
|
|||||||
"The time spent logging in the Cogl journal",
|
"The time spent logging in the Cogl journal",
|
||||||
0 /* no application private data */);
|
0 /* no application private data */);
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
|
||||||
|
|
||||||
COGL_TIMER_START (_cogl_uprof_context, log_timer);
|
COGL_TIMER_START (_cogl_uprof_context, log_timer);
|
||||||
|
|
||||||
/* If the framebuffer was previously empty then we'll take a
|
/* If the framebuffer was previously empty then we'll take a
|
||||||
reference to the current framebuffer. This reference will be
|
reference to the current framebuffer. This reference will be
|
||||||
removed when the journal is flushed */
|
removed when the journal is flushed */
|
||||||
if (journal->vertices->len == 0)
|
if (journal->vertices->len == 0)
|
||||||
cogl_object_ref (journal->framebuffer);
|
cogl_object_ref (framebuffer);
|
||||||
|
|
||||||
/* The vertex data is logged into a separate array. The data needs
|
/* The vertex data is logged into a separate array. The data needs
|
||||||
to be copied into a vertex array before it's given to GL so we
|
to be copied into a vertex array before it's given to GL so we
|
||||||
@ -1594,17 +1593,18 @@ _cogl_journal_log_quad (CoglJournal *journal,
|
|||||||
|
|
||||||
entry->pipeline = _cogl_pipeline_journal_ref (final_pipeline);
|
entry->pipeline = _cogl_pipeline_journal_ref (final_pipeline);
|
||||||
|
|
||||||
clip_stack = _cogl_framebuffer_get_clip_stack (journal->framebuffer);
|
clip_stack = _cogl_framebuffer_get_clip_stack (framebuffer);
|
||||||
entry->clip_stack = _cogl_clip_stack_ref (clip_stack);
|
entry->clip_stack = _cogl_clip_stack_ref (clip_stack);
|
||||||
|
|
||||||
if (G_UNLIKELY (final_pipeline != pipeline))
|
if (G_UNLIKELY (final_pipeline != pipeline))
|
||||||
cogl_handle_unref (final_pipeline);
|
cogl_handle_unref (final_pipeline);
|
||||||
|
|
||||||
cogl_get_modelview_matrix (&entry->model_view);
|
cogl_framebuffer_get_modelview_matrix (framebuffer,
|
||||||
|
&entry->model_view);
|
||||||
|
|
||||||
_cogl_pipeline_foreach_layer_internal (pipeline,
|
_cogl_pipeline_foreach_layer_internal (pipeline,
|
||||||
add_framebuffer_deps_cb,
|
add_framebuffer_deps_cb,
|
||||||
journal->framebuffer);
|
framebuffer);
|
||||||
|
|
||||||
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_BATCHING)))
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_BATCHING)))
|
||||||
_cogl_journal_flush (journal);
|
_cogl_journal_flush (journal);
|
||||||
|
@ -40,6 +40,21 @@ _cogl_rectangle_immediate (CoglFramebuffer *framebuffer,
|
|||||||
float x_2,
|
float x_2,
|
||||||
float y_2);
|
float y_2);
|
||||||
|
|
||||||
|
typedef struct _CoglMultiTexturedRect
|
||||||
|
{
|
||||||
|
const float *position; /* x0,y0,x1,y1 */
|
||||||
|
const float *tex_coords; /* (tx0,ty0,tx1,ty1)(tx0,ty0,tx1,ty1)(... */
|
||||||
|
int tex_coords_len; /* number of floats in tex_coords? */
|
||||||
|
} CoglMultiTexturedRect;
|
||||||
|
|
||||||
|
void
|
||||||
|
_cogl_framebuffer_draw_multitextued_rectangles (
|
||||||
|
CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
CoglMultiTexturedRect *rects,
|
||||||
|
int n_rects,
|
||||||
|
gboolean disable_legacy_state);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __COGL_PRIMITIVES_PRIVATE_H */
|
#endif /* __COGL_PRIMITIVES_PRIVATE_H */
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
|
|
||||||
typedef struct _TextureSlicedQuadState
|
typedef struct _TextureSlicedQuadState
|
||||||
{
|
{
|
||||||
|
CoglFramebuffer *framebuffer;
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
CoglTexture *main_texture;
|
CoglTexture *main_texture;
|
||||||
float tex_virtual_origin_x;
|
float tex_virtual_origin_x;
|
||||||
@ -77,7 +78,7 @@ log_quad_sub_textures_cb (CoglTexture *texture,
|
|||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
TextureSlicedQuadState *state = user_data;
|
TextureSlicedQuadState *state = user_data;
|
||||||
CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
|
CoglFramebuffer *framebuffer = state->framebuffer;
|
||||||
CoglTexture *texture_override;
|
CoglTexture *texture_override;
|
||||||
float quad_coords[4];
|
float quad_coords[4];
|
||||||
|
|
||||||
@ -189,8 +190,9 @@ validate_first_layer_cb (CoglPipeline *pipeline,
|
|||||||
*/
|
*/
|
||||||
/* TODO: support multitexturing */
|
/* TODO: support multitexturing */
|
||||||
static void
|
static void
|
||||||
_cogl_texture_quad_multiple_primitives (CoglTexture *texture,
|
_cogl_texture_quad_multiple_primitives (CoglFramebuffer *framebuffer,
|
||||||
CoglPipeline *pipeline,
|
CoglPipeline *pipeline,
|
||||||
|
CoglTexture *texture,
|
||||||
int layer_index,
|
int layer_index,
|
||||||
const float *position,
|
const float *position,
|
||||||
float tx_1,
|
float tx_1,
|
||||||
@ -206,8 +208,6 @@ _cogl_texture_quad_multiple_primitives (CoglTexture *texture,
|
|||||||
ValidateFirstLayerState validate_first_layer_state;
|
ValidateFirstLayerState validate_first_layer_state;
|
||||||
CoglPipelineWrapMode wrap_s, wrap_t;
|
CoglPipelineWrapMode wrap_s, wrap_t;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
|
||||||
|
|
||||||
wrap_s = cogl_pipeline_get_layer_wrap_mode_s (pipeline, layer_index);
|
wrap_s = cogl_pipeline_get_layer_wrap_mode_s (pipeline, layer_index);
|
||||||
wrap_t = cogl_pipeline_get_layer_wrap_mode_t (pipeline, layer_index);
|
wrap_t = cogl_pipeline_get_layer_wrap_mode_t (pipeline, layer_index);
|
||||||
|
|
||||||
@ -216,6 +216,7 @@ _cogl_texture_quad_multiple_primitives (CoglTexture *texture,
|
|||||||
validate_first_layer_cb,
|
validate_first_layer_cb,
|
||||||
&validate_first_layer_state);
|
&validate_first_layer_state);
|
||||||
|
|
||||||
|
state.framebuffer = framebuffer;
|
||||||
state.main_texture = texture;
|
state.main_texture = texture;
|
||||||
|
|
||||||
if (validate_first_layer_state.override_pipeline)
|
if (validate_first_layer_state.override_pipeline)
|
||||||
@ -431,17 +432,15 @@ validate_tex_coords_cb (CoglPipeline *pipeline,
|
|||||||
* require repeating.
|
* require repeating.
|
||||||
*/
|
*/
|
||||||
static gboolean
|
static gboolean
|
||||||
_cogl_multitexture_quad_single_primitive (const float *position,
|
_cogl_multitexture_quad_single_primitive (CoglFramebuffer *framebuffer,
|
||||||
CoglPipeline *pipeline,
|
CoglPipeline *pipeline,
|
||||||
|
const float *position,
|
||||||
const float *user_tex_coords,
|
const float *user_tex_coords,
|
||||||
int user_tex_coords_len)
|
int user_tex_coords_len)
|
||||||
{
|
{
|
||||||
int n_layers = cogl_pipeline_get_n_layers (pipeline);
|
int n_layers = cogl_pipeline_get_n_layers (pipeline);
|
||||||
ValidateTexCoordsState state;
|
ValidateTexCoordsState state;
|
||||||
float *final_tex_coords = alloca (sizeof (float) * 4 * n_layers);
|
float *final_tex_coords = alloca (sizeof (float) * 4 * n_layers);
|
||||||
CoglFramebuffer *framebuffer;
|
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, FALSE);
|
|
||||||
|
|
||||||
state.i = -1;
|
state.i = -1;
|
||||||
state.n_layers = n_layers;
|
state.n_layers = n_layers;
|
||||||
@ -461,7 +460,6 @@ _cogl_multitexture_quad_single_primitive (const float *position,
|
|||||||
if (state.override_pipeline)
|
if (state.override_pipeline)
|
||||||
pipeline = state.override_pipeline;
|
pipeline = state.override_pipeline;
|
||||||
|
|
||||||
framebuffer = cogl_get_draw_framebuffer ();
|
|
||||||
_cogl_journal_log_quad (framebuffer->journal,
|
_cogl_journal_log_quad (framebuffer->journal,
|
||||||
position,
|
position,
|
||||||
pipeline,
|
pipeline,
|
||||||
@ -478,6 +476,7 @@ _cogl_multitexture_quad_single_primitive (const float *position,
|
|||||||
|
|
||||||
typedef struct _ValidateLayerState
|
typedef struct _ValidateLayerState
|
||||||
{
|
{
|
||||||
|
CoglContext *ctx;
|
||||||
int i;
|
int i;
|
||||||
int first_layer;
|
int first_layer;
|
||||||
CoglPipeline *override_source;
|
CoglPipeline *override_source;
|
||||||
@ -585,8 +584,6 @@ _cogl_rectangles_validate_layer_cb (CoglPipeline *pipeline,
|
|||||||
static gboolean warning_seen = FALSE;
|
static gboolean warning_seen = FALSE;
|
||||||
CoglTexture2D *tex_2d;
|
CoglTexture2D *tex_2d;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, FALSE);
|
|
||||||
|
|
||||||
if (!warning_seen)
|
if (!warning_seen)
|
||||||
g_warning ("Skipping layer %d of your pipeline consisting of "
|
g_warning ("Skipping layer %d of your pipeline consisting of "
|
||||||
"a sliced texture (unsuported for multi texturing)",
|
"a sliced texture (unsuported for multi texturing)",
|
||||||
@ -594,7 +591,7 @@ _cogl_rectangles_validate_layer_cb (CoglPipeline *pipeline,
|
|||||||
warning_seen = TRUE;
|
warning_seen = TRUE;
|
||||||
|
|
||||||
/* Note: currently only 2D textures can be sliced. */
|
/* Note: currently only 2D textures can be sliced. */
|
||||||
tex_2d = ctx->default_gl_texture_2d_tex;
|
tex_2d = state->ctx->default_gl_texture_2d_tex;
|
||||||
cogl_pipeline_set_layer_texture (pipeline, layer_index,
|
cogl_pipeline_set_layer_texture (pipeline, layer_index,
|
||||||
COGL_TEXTURE (tex_2d));
|
COGL_TEXTURE (tex_2d));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -629,29 +626,25 @@ _cogl_rectangles_validate_layer_cb (CoglPipeline *pipeline,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _CoglMutiTexturedRect
|
void
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (
|
||||||
|
CoglFramebuffer *framebuffer,
|
||||||
|
CoglPipeline *pipeline,
|
||||||
|
CoglMultiTexturedRect *rects,
|
||||||
|
int n_rects,
|
||||||
|
gboolean disable_legacy_state)
|
||||||
{
|
{
|
||||||
const float *position; /* x0,y0,x1,y1 */
|
CoglContext *ctx = framebuffer->context;
|
||||||
const float *tex_coords; /* (tx0,ty0,tx1,ty1)(tx0,ty0,tx1,ty1)(... */
|
CoglPipeline *original_pipeline;
|
||||||
int tex_coords_len; /* number of floats in tex_coords? */
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
_cogl_rectangles_with_multitexture_coords (
|
|
||||||
struct _CoglMutiTexturedRect *rects,
|
|
||||||
int n_rects)
|
|
||||||
{
|
|
||||||
CoglPipeline *original_pipeline, *pipeline;
|
|
||||||
ValidateLayerState state;
|
ValidateLayerState state;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
original_pipeline = pipeline;
|
||||||
|
|
||||||
pipeline = original_pipeline = cogl_get_source ();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate all the layers of the current source pipeline...
|
* Validate all the layers of the current source pipeline...
|
||||||
*/
|
*/
|
||||||
|
state.ctx = ctx;
|
||||||
state.i = -1;
|
state.i = -1;
|
||||||
state.first_layer = 0;
|
state.first_layer = 0;
|
||||||
state.override_source = NULL;
|
state.override_source = NULL;
|
||||||
@ -663,13 +656,16 @@ _cogl_rectangles_with_multitexture_coords (
|
|||||||
if (state.override_source)
|
if (state.override_source)
|
||||||
pipeline = state.override_source;
|
pipeline = state.override_source;
|
||||||
|
|
||||||
if (G_UNLIKELY (ctx->legacy_state_set) &&
|
if (!disable_legacy_state)
|
||||||
_cogl_get_enable_legacy_state ())
|
|
||||||
{
|
{
|
||||||
/* If we haven't already made a pipeline copy */
|
if (G_UNLIKELY (ctx->legacy_state_set) &&
|
||||||
if (pipeline == original_pipeline)
|
_cogl_get_enable_legacy_state ())
|
||||||
pipeline = cogl_pipeline_copy (pipeline);
|
{
|
||||||
_cogl_pipeline_apply_legacy_state (pipeline);
|
/* If we haven't already made a pipeline copy */
|
||||||
|
if (pipeline == original_pipeline)
|
||||||
|
pipeline = cogl_pipeline_copy (pipeline);
|
||||||
|
_cogl_pipeline_apply_legacy_state (pipeline);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -685,8 +681,9 @@ _cogl_rectangles_with_multitexture_coords (
|
|||||||
if (!state.all_use_sliced_quad_fallback)
|
if (!state.all_use_sliced_quad_fallback)
|
||||||
{
|
{
|
||||||
gboolean success =
|
gboolean success =
|
||||||
_cogl_multitexture_quad_single_primitive (rects[i].position,
|
_cogl_multitexture_quad_single_primitive (framebuffer,
|
||||||
pipeline,
|
pipeline,
|
||||||
|
rects[i].position,
|
||||||
rects[i].tex_coords,
|
rects[i].tex_coords,
|
||||||
rects[i].tex_coords_len);
|
rects[i].tex_coords_len);
|
||||||
|
|
||||||
@ -710,8 +707,9 @@ _cogl_rectangles_with_multitexture_coords (
|
|||||||
|
|
||||||
COGL_NOTE (DRAW, "Drawing Tex Quad (Multi-Prim Mode)");
|
COGL_NOTE (DRAW, "Drawing Tex Quad (Multi-Prim Mode)");
|
||||||
|
|
||||||
_cogl_texture_quad_multiple_primitives (texture,
|
_cogl_texture_quad_multiple_primitives (framebuffer,
|
||||||
pipeline,
|
pipeline,
|
||||||
|
texture,
|
||||||
state.first_layer,
|
state.first_layer,
|
||||||
rects[i].position,
|
rects[i].position,
|
||||||
tex_coords[0],
|
tex_coords[0],
|
||||||
@ -724,19 +722,31 @@ _cogl_rectangles_with_multitexture_coords (
|
|||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_rectangles_with_multitexture_coords (
|
||||||
|
CoglMultiTexturedRect *rects,
|
||||||
|
int n_rects)
|
||||||
|
{
|
||||||
|
_cogl_framebuffer_draw_multitextured_rectangles (cogl_get_draw_framebuffer (),
|
||||||
|
cogl_get_source (),
|
||||||
|
rects,
|
||||||
|
n_rects,
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cogl_rectangles (const float *verts,
|
cogl_rectangles (const float *verts,
|
||||||
unsigned int n_rects)
|
unsigned int n_rects)
|
||||||
{
|
{
|
||||||
struct _CoglMutiTexturedRect *rects;
|
CoglMultiTexturedRect *rects;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
||||||
* _CoglMutiTexturedRect rectangles and pass these on to our work horse;
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
* _cogl_rectangles_with_multitexture_coords.
|
* _cogl_rectangles_with_multitexture_coords.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rects = g_alloca (n_rects * sizeof (struct _CoglMutiTexturedRect));
|
rects = g_alloca (n_rects * sizeof (CoglMultiTexturedRect));
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
for (i = 0; i < n_rects; i++)
|
||||||
{
|
{
|
||||||
@ -752,15 +762,15 @@ void
|
|||||||
cogl_rectangles_with_texture_coords (const float *verts,
|
cogl_rectangles_with_texture_coords (const float *verts,
|
||||||
unsigned int n_rects)
|
unsigned int n_rects)
|
||||||
{
|
{
|
||||||
struct _CoglMutiTexturedRect *rects;
|
CoglMultiTexturedRect *rects;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
||||||
* _CoglMutiTexturedRect rectangles and pass these on to our work horse;
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
* _cogl_rectangles_with_multitexture_coords.
|
* _cogl_rectangles_with_multitexture_coords.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
rects = g_alloca (n_rects * sizeof (struct _CoglMutiTexturedRect));
|
rects = g_alloca (n_rects * sizeof (CoglMultiTexturedRect));
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
for (i = 0; i < n_rects; i++)
|
||||||
{
|
{
|
||||||
@ -784,10 +794,10 @@ cogl_rectangle_with_texture_coords (float x_1,
|
|||||||
{
|
{
|
||||||
const float position[4] = {x_1, y_1, x_2, y_2};
|
const float position[4] = {x_1, y_1, x_2, y_2};
|
||||||
const float tex_coords[4] = {tx_1, ty_1, tx_2, ty_2};
|
const float tex_coords[4] = {tx_1, ty_1, tx_2, ty_2};
|
||||||
struct _CoglMutiTexturedRect rect;
|
CoglMultiTexturedRect rect;
|
||||||
|
|
||||||
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
||||||
* _CoglMutiTexturedRect rectangles and pass these on to our work horse;
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
* _cogl_rectangles_with_multitexture_coords.
|
* _cogl_rectangles_with_multitexture_coords.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -807,10 +817,10 @@ cogl_rectangle_with_multitexture_coords (float x_1,
|
|||||||
int user_tex_coords_len)
|
int user_tex_coords_len)
|
||||||
{
|
{
|
||||||
const float position[4] = {x_1, y_1, x_2, y_2};
|
const float position[4] = {x_1, y_1, x_2, y_2};
|
||||||
struct _CoglMutiTexturedRect rect;
|
CoglMultiTexturedRect rect;
|
||||||
|
|
||||||
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
||||||
* _CoglMutiTexturedRect rectangles and pass these on to our work horse;
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
* _cogl_rectangles_with_multitexture_coords.
|
* _cogl_rectangles_with_multitexture_coords.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -828,10 +838,10 @@ cogl_rectangle (float x_1,
|
|||||||
float y_2)
|
float y_2)
|
||||||
{
|
{
|
||||||
const float position[4] = {x_1, y_1, x_2, y_2};
|
const float position[4] = {x_1, y_1, x_2, y_2};
|
||||||
struct _CoglMutiTexturedRect rect;
|
CoglMultiTexturedRect rect;
|
||||||
|
|
||||||
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
/* XXX: All the cogl_rectangle* APIs normalize their input into an array of
|
||||||
* _CoglMutiTexturedRect rectangles and pass these on to our work horse;
|
* CoglMultiTexturedRect rectangles and pass these on to our work horse;
|
||||||
* _cogl_rectangles_with_multitexture_coords.
|
* _cogl_rectangles_with_multitexture_coords.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -854,6 +864,7 @@ _cogl_rectangle_immediate (CoglFramebuffer *framebuffer,
|
|||||||
through the journal. This should only be used in cases where the
|
through the journal. This should only be used in cases where the
|
||||||
code might be called while the journal is already being flushed
|
code might be called while the journal is already being flushed
|
||||||
such as when flushing the clip state */
|
such as when flushing the clip state */
|
||||||
|
CoglContext *ctx = framebuffer->context;
|
||||||
float vertices[8] =
|
float vertices[8] =
|
||||||
{
|
{
|
||||||
x_1, y_1,
|
x_1, y_1,
|
||||||
@ -864,8 +875,6 @@ _cogl_rectangle_immediate (CoglFramebuffer *framebuffer,
|
|||||||
CoglAttributeBuffer *attribute_buffer;
|
CoglAttributeBuffer *attribute_buffer;
|
||||||
CoglAttribute *attributes[1];
|
CoglAttribute *attributes[1];
|
||||||
|
|
||||||
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
|
||||||
|
|
||||||
attribute_buffer =
|
attribute_buffer =
|
||||||
cogl_attribute_buffer_new (ctx, sizeof (vertices), vertices);
|
cogl_attribute_buffer_new (ctx, sizeof (vertices), vertices);
|
||||||
attributes[0] = cogl_attribute_new (attribute_buffer,
|
attributes[0] = cogl_attribute_new (attribute_buffer,
|
||||||
|
@ -402,6 +402,11 @@ cogl_framebuffer_read_pixels
|
|||||||
cogl_framebuffer_draw_primitive
|
cogl_framebuffer_draw_primitive
|
||||||
cogl_framebuffer_draw_attributes
|
cogl_framebuffer_draw_attributes
|
||||||
cogl_framebuffer_draw_indexed_attributes
|
cogl_framebuffer_draw_indexed_attributes
|
||||||
|
cogl_framebuffer_draw_rectangle
|
||||||
|
cogl_framebuffer_draw_textured_rectangle
|
||||||
|
cogl_framebuffer_draw_multitextured_rectangle
|
||||||
|
cogl_framebuffer_draw_rectangles
|
||||||
|
cogl_framebuffer_draw_textured_rectangles
|
||||||
|
|
||||||
<SUBSECTION>
|
<SUBSECTION>
|
||||||
cogl_framebuffer_swap_buffers
|
cogl_framebuffer_swap_buffers
|
||||||
|
@ -99,7 +99,7 @@ verify_texture (CoglHandle texture, int size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_atlas_migration (TestUtilsGTestFixture *fixture,
|
test_atlas_migration (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
CoglHandle textures[N_TEXTURES];
|
CoglHandle textures[N_TEXTURES];
|
||||||
|
@ -17,18 +17,18 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
CoglTexture *texture;
|
||||||
CoglFramebuffer *fb;
|
|
||||||
CoglHandle texture;
|
|
||||||
CoglFramebuffer *offscreen;
|
CoglFramebuffer *offscreen;
|
||||||
CoglHandle offscreen_tex;
|
CoglTexture *offscreen_tex;
|
||||||
int width, height;
|
int width, height;
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
validate_part (int xnum, int ynum, gboolean shown)
|
validate_part (CoglFramebuffer *framebuffer,
|
||||||
|
int xnum, int ynum, gboolean shown)
|
||||||
{
|
{
|
||||||
test_utils_check_region (xnum * TEXTURE_RENDER_SIZE + TEST_INSET,
|
test_utils_check_region (framebuffer,
|
||||||
|
xnum * TEXTURE_RENDER_SIZE + TEST_INSET,
|
||||||
ynum * TEXTURE_RENDER_SIZE + TEST_INSET,
|
ynum * TEXTURE_RENDER_SIZE + TEST_INSET,
|
||||||
TEXTURE_RENDER_SIZE - TEST_INSET * 2,
|
TEXTURE_RENDER_SIZE - TEST_INSET * 2,
|
||||||
TEXTURE_RENDER_SIZE - TEST_INSET * 2,
|
TEXTURE_RENDER_SIZE - TEST_INSET * 2,
|
||||||
@ -44,18 +44,22 @@ validate_part (int xnum, int ynum, gboolean shown)
|
|||||||
#define CULL_FACE_MODE(draw_num) (((draw_num) & 0x0c) >> 2)
|
#define CULL_FACE_MODE(draw_num) (((draw_num) & 0x0c) >> 2)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paint_test_backface_culling (TestState *state)
|
paint_test_backface_culling (TestState *state,
|
||||||
|
CoglFramebuffer *framebuffer)
|
||||||
{
|
{
|
||||||
int draw_num;
|
int draw_num;
|
||||||
CoglPipeline *base_pipeline = cogl_pipeline_new (state->ctx);
|
CoglPipeline *base_pipeline = cogl_pipeline_new (ctx);
|
||||||
CoglColor clear_color;
|
|
||||||
|
|
||||||
cogl_ortho (0, state->width, /* left, right */
|
cogl_framebuffer_orthographic (framebuffer,
|
||||||
state->height, 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
state->width,
|
||||||
|
state->height,
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&clear_color, 0x00, 0x00, 0x00, 0xff);
|
cogl_framebuffer_clear4f (framebuffer,
|
||||||
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_STENCIL);
|
COGL_BUFFER_BIT_COLOR | COGL_BUFFER_BIT_STENCIL,
|
||||||
|
0, 0, 0, 1);
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (base_pipeline, 0, state->texture);
|
cogl_pipeline_set_layer_texture (base_pipeline, 0, state->texture);
|
||||||
|
|
||||||
@ -63,6 +67,8 @@ paint_test_backface_culling (TestState *state)
|
|||||||
COGL_PIPELINE_FILTER_NEAREST,
|
COGL_PIPELINE_FILTER_NEAREST,
|
||||||
COGL_PIPELINE_FILTER_NEAREST);
|
COGL_PIPELINE_FILTER_NEAREST);
|
||||||
|
|
||||||
|
cogl_push_framebuffer (framebuffer);
|
||||||
|
|
||||||
/* Render the scene sixteen times to test all of the combinations of
|
/* Render the scene sixteen times to test all of the combinations of
|
||||||
cull face mode, legacy state and winding orders */
|
cull face mode, legacy state and winding orders */
|
||||||
for (draw_num = 0; draw_num < 16; draw_num++)
|
for (draw_num = 0; draw_num < 16; draw_num++)
|
||||||
@ -144,11 +150,13 @@ paint_test_backface_culling (TestState *state)
|
|||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
cogl_object_unref (base_pipeline);
|
cogl_object_unref (base_pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
validate_result (int y_offset)
|
validate_result (CoglFramebuffer *framebuffer, int y_offset)
|
||||||
{
|
{
|
||||||
int draw_num;
|
int draw_num;
|
||||||
|
|
||||||
@ -193,26 +201,29 @@ validate_result (int y_offset)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Front-facing texture */
|
/* Front-facing texture */
|
||||||
validate_part (0, y_offset + draw_num, !cull_front);
|
validate_part (framebuffer,
|
||||||
|
0, y_offset + draw_num, !cull_front);
|
||||||
/* Front-facing texture with flipped tex coords */
|
/* Front-facing texture with flipped tex coords */
|
||||||
validate_part (1, y_offset + draw_num, !cull_front);
|
validate_part (framebuffer,
|
||||||
|
1, y_offset + draw_num, !cull_front);
|
||||||
/* Back-facing texture */
|
/* Back-facing texture */
|
||||||
validate_part (2, y_offset + draw_num, !cull_back);
|
validate_part (framebuffer,
|
||||||
|
2, y_offset + draw_num, !cull_back);
|
||||||
/* Front-facing texture polygon */
|
/* Front-facing texture polygon */
|
||||||
validate_part (3, y_offset + draw_num, !cull_front);
|
validate_part (framebuffer,
|
||||||
|
3, y_offset + draw_num, !cull_front);
|
||||||
/* Back-facing texture polygon */
|
/* Back-facing texture polygon */
|
||||||
validate_part (4, y_offset + draw_num, !cull_back);
|
validate_part (framebuffer,
|
||||||
|
4, y_offset + draw_num, !cull_back);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paint (TestState *state)
|
paint (TestState *state)
|
||||||
{
|
{
|
||||||
float stage_viewport[4];
|
CoglPipeline *pipeline;
|
||||||
CoglMatrix stage_projection;
|
|
||||||
CoglMatrix stage_modelview;
|
|
||||||
|
|
||||||
paint_test_backface_culling (state);
|
paint_test_backface_culling (state, fb);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now repeat the test but rendered to an offscreen
|
* Now repeat the test but rendered to an offscreen
|
||||||
@ -220,40 +231,28 @@ paint (TestState *state)
|
|||||||
* always run to an offscreen buffer but we might as well have this
|
* always run to an offscreen buffer but we might as well have this
|
||||||
* check anyway in case it is being run with COGL_TEST_ONSCREEN=1
|
* check anyway in case it is being run with COGL_TEST_ONSCREEN=1
|
||||||
*/
|
*/
|
||||||
|
paint_test_backface_culling (state, state->offscreen);
|
||||||
|
|
||||||
cogl_get_viewport (stage_viewport);
|
/* Copy the result of the offscreen rendering for validation and
|
||||||
cogl_get_projection_matrix (&stage_projection);
|
* also so we can have visual feedback. */
|
||||||
cogl_get_modelview_matrix (&stage_modelview);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
cogl_pipeline_set_layer_texture (pipeline, 0, state->offscreen_tex);
|
||||||
|
cogl_framebuffer_draw_rectangle (fb,
|
||||||
|
pipeline,
|
||||||
|
0, TEXTURE_RENDER_SIZE * 16,
|
||||||
|
state->width,
|
||||||
|
state->height + TEXTURE_RENDER_SIZE * 16);
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
cogl_push_framebuffer (state->offscreen);
|
validate_result (fb, 0);
|
||||||
|
validate_result (fb, 16);
|
||||||
cogl_set_viewport (stage_viewport[0],
|
|
||||||
stage_viewport[1],
|
|
||||||
stage_viewport[2],
|
|
||||||
stage_viewport[3]);
|
|
||||||
cogl_set_projection_matrix (&stage_projection);
|
|
||||||
cogl_set_modelview_matrix (&stage_modelview);
|
|
||||||
|
|
||||||
paint_test_backface_culling (state);
|
|
||||||
|
|
||||||
cogl_pop_framebuffer ();
|
|
||||||
|
|
||||||
/* Incase we want feedback of what was drawn offscreen we draw it
|
|
||||||
* to the stage... */
|
|
||||||
cogl_set_source_texture (state->offscreen_tex);
|
|
||||||
cogl_rectangle (0, TEXTURE_RENDER_SIZE * 16,
|
|
||||||
stage_viewport[2],
|
|
||||||
stage_viewport[3] + TEXTURE_RENDER_SIZE * 16);
|
|
||||||
|
|
||||||
validate_result (0);
|
|
||||||
validate_result (16);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static CoglHandle
|
static CoglTexture *
|
||||||
make_texture (void)
|
make_texture (void)
|
||||||
{
|
{
|
||||||
guchar *tex_data, *p;
|
guchar *tex_data, *p;
|
||||||
CoglHandle tex;
|
CoglTexture *tex;
|
||||||
|
|
||||||
tex_data = g_malloc (TEXTURE_SIZE * TEXTURE_SIZE * 4);
|
tex_data = g_malloc (TEXTURE_SIZE * TEXTURE_SIZE * 4);
|
||||||
|
|
||||||
@ -279,19 +278,15 @@ make_texture (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_backface_culling (TestUtilsGTestFixture *fixture,
|
test_backface_culling (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
CoglHandle tex;
|
CoglTexture *tex;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
state.width = cogl_framebuffer_get_width (fb);
|
||||||
state.fb = shared_state->fb;
|
state.height = cogl_framebuffer_get_height (fb);
|
||||||
state.width = cogl_framebuffer_get_width (shared_state->fb);
|
|
||||||
state.height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
|
|
||||||
state.offscreen = COGL_INVALID_HANDLE;
|
state.offscreen = NULL;
|
||||||
|
|
||||||
state.texture = make_texture ();
|
state.texture = make_texture ();
|
||||||
|
|
||||||
@ -304,8 +299,8 @@ test_cogl_backface_culling (TestUtilsGTestFixture *fixture,
|
|||||||
paint (&state);
|
paint (&state);
|
||||||
|
|
||||||
cogl_object_unref (state.offscreen);
|
cogl_object_unref (state.offscreen);
|
||||||
cogl_handle_unref (state.offscreen_tex);
|
cogl_object_unref (state.offscreen_tex);
|
||||||
cogl_handle_unref (state.texture);
|
cogl_object_unref (state.texture);
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
g_print ("OK\n");
|
g_print ("OK\n");
|
||||||
|
@ -91,8 +91,7 @@ verify_bits (const CoglBitmask *bitmask,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_bitmask (TestUtilsGTestFixture *fixture,
|
test_bitmask (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
CoglBitmask bitmask;
|
CoglBitmask bitmask;
|
||||||
CoglBitmask other_bitmask;
|
CoglBitmask other_bitmask;
|
||||||
|
@ -60,7 +60,7 @@ test_blend (TestState *state,
|
|||||||
int x_off;
|
int x_off;
|
||||||
|
|
||||||
/* First write out the destination color without any blending... */
|
/* First write out the destination color without any blending... */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_set_color4ub (pipeline, Dr, Dg, Db, Da);
|
cogl_pipeline_set_color4ub (pipeline, Dr, Dg, Db, Da);
|
||||||
cogl_pipeline_set_blend (pipeline, "RGBA = ADD (SRC_COLOR, 0)", NULL);
|
cogl_pipeline_set_blend (pipeline, "RGBA = ADD (SRC_COLOR, 0)", NULL);
|
||||||
cogl_set_source (pipeline);
|
cogl_set_source (pipeline);
|
||||||
@ -74,7 +74,7 @@ test_blend (TestState *state,
|
|||||||
* Now blend a rectangle over our well defined destination:
|
* Now blend a rectangle over our well defined destination:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_set_color4ub (pipeline, Sr, Sg, Sb, Sa);
|
cogl_pipeline_set_color4ub (pipeline, Sr, Sg, Sb, Sa);
|
||||||
|
|
||||||
status = cogl_pipeline_set_blend (pipeline, blend_string, &error);
|
status = cogl_pipeline_set_blend (pipeline, blend_string, &error);
|
||||||
@ -118,7 +118,7 @@ test_blend (TestState *state,
|
|||||||
g_print (" blend constant = UNUSED\n");
|
g_print (" blend constant = UNUSED\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
test_utils_check_pixel (x_off, y_off, expected_result);
|
test_utils_check_pixel (fb, x_off, y_off, expected_result);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -171,10 +171,10 @@ test_blend (TestState *state,
|
|||||||
|
|
||||||
/* See what we got... */
|
/* See what we got... */
|
||||||
|
|
||||||
test_utils_check_pixel (x_off, y_off, expected_result);
|
test_utils_check_pixel (fb, x_off, y_off, expected_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CoglHandle
|
static CoglTexture *
|
||||||
make_texture (guint32 color)
|
make_texture (guint32 color)
|
||||||
{
|
{
|
||||||
guchar *tex_data, *p;
|
guchar *tex_data, *p;
|
||||||
@ -182,7 +182,7 @@ make_texture (guint32 color)
|
|||||||
guint8 g = MASK_GREEN (color);
|
guint8 g = MASK_GREEN (color);
|
||||||
guint8 b = MASK_BLUE (color);
|
guint8 b = MASK_BLUE (color);
|
||||||
guint8 a = MASK_ALPHA (color);
|
guint8 a = MASK_ALPHA (color);
|
||||||
CoglHandle tex;
|
CoglTexture *tex;
|
||||||
|
|
||||||
tex_data = g_malloc (QUAD_WIDTH * QUAD_WIDTH * 4);
|
tex_data = g_malloc (QUAD_WIDTH * QUAD_WIDTH * 4);
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ test_tex_combine (TestState *state,
|
|||||||
const char *combine_string,
|
const char *combine_string,
|
||||||
guint32 expected_result)
|
guint32 expected_result)
|
||||||
{
|
{
|
||||||
CoglHandle tex0, tex1;
|
CoglTexture *tex0, *tex1;
|
||||||
|
|
||||||
/* combine constant - when applicable */
|
/* combine constant - when applicable */
|
||||||
guint8 Cr = MASK_RED (combine_constant);
|
guint8 Cr = MASK_RED (combine_constant);
|
||||||
@ -268,8 +268,8 @@ test_tex_combine (TestState *state,
|
|||||||
y * QUAD_WIDTH + QUAD_WIDTH);
|
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||||
|
|
||||||
cogl_handle_unref (material);
|
cogl_handle_unref (material);
|
||||||
cogl_handle_unref (tex0);
|
cogl_object_unref (tex0);
|
||||||
cogl_handle_unref (tex1);
|
cogl_object_unref (tex1);
|
||||||
|
|
||||||
/* See what we got... */
|
/* See what we got... */
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ test_tex_combine (TestState *state,
|
|||||||
g_print (" combine constant = UNUSED\n");
|
g_print (" combine constant = UNUSED\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
test_utils_check_pixel (x_off, y_off, expected_result);
|
test_utils_check_pixel (fb, x_off, y_off, expected_result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -408,19 +408,21 @@ paint (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_blend_strings (TestUtilsGTestFixture *fixture,
|
test_blend_strings (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
cogl_framebuffer_orthographic (fb, 0, 0,
|
||||||
|
cogl_framebuffer_get_width (fb),
|
||||||
cogl_ortho (0, cogl_framebuffer_get_width (shared_state->fb), /* left, right */
|
cogl_framebuffer_get_height (fb),
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0, /* bottom, top */
|
-1,
|
||||||
-1, 100 /* z near, far */);
|
100);
|
||||||
|
|
||||||
|
/* XXX: we have to push/pop a framebuffer since this test currently
|
||||||
|
* uses the legacy cogl_rectangle() api. */
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
paint (&state);
|
paint (&state);
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
g_print ("OK\n");
|
g_print ("OK\n");
|
||||||
|
@ -11,7 +11,7 @@ typedef struct _TestState
|
|||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
|
|
||||||
CoglHandle tex[NUM_FBOS];
|
CoglTexture *tex[NUM_FBOS];
|
||||||
CoglFramebuffer *fbo[NUM_FBOS];
|
CoglFramebuffer *fbo[NUM_FBOS];
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
@ -45,9 +45,12 @@ paint (TestState *state)
|
|||||||
/* Render all of the textures to the screen */
|
/* Render all of the textures to the screen */
|
||||||
for (i = 0; i < NUM_FBOS; i++)
|
for (i = 0; i < NUM_FBOS; i++)
|
||||||
{
|
{
|
||||||
cogl_set_source_texture (state->tex[i]);
|
CoglPipeline *pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_rectangle (2.0f / NUM_FBOS * i - 1.0f, -1.0f,
|
cogl_pipeline_set_layer_texture (pipeline, 0, state->tex[i]);
|
||||||
2.0f / NUM_FBOS * (i + 1) - 1.0f, 1.0f);
|
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||||
|
2.0f / NUM_FBOS * i - 1.0f, -1.0f,
|
||||||
|
2.0f / NUM_FBOS * (i + 1) - 1.0f, 1.0f);
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Verify all of the fbos drew the right color */
|
/* Verify all of the fbos drew the right color */
|
||||||
@ -58,7 +61,8 @@ paint (TestState *state)
|
|||||||
{ 0x00, 0xff, 0x00, 0xff },
|
{ 0x00, 0xff, 0x00, 0xff },
|
||||||
{ 0x00, 0x00, 0xff, 0xff } };
|
{ 0x00, 0x00, 0xff, 0xff } };
|
||||||
|
|
||||||
test_utils_check_pixel_rgb (state->width * (i + 0.5f) / NUM_FBOS,
|
test_utils_check_pixel_rgb (fb,
|
||||||
|
state->width * (i + 0.5f) / NUM_FBOS,
|
||||||
state->height / 2,
|
state->height / 2,
|
||||||
expected_colors[i][0],
|
expected_colors[i][0],
|
||||||
expected_colors[i][1],
|
expected_colors[i][1],
|
||||||
@ -67,18 +71,13 @@ paint (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_color_mask (TestUtilsGTestFixture *fixture,
|
test_color_mask (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
CoglColor bg;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
state.width = cogl_framebuffer_get_width (shared_state->fb);
|
state.width = cogl_framebuffer_get_width (fb);
|
||||||
state.height = cogl_framebuffer_get_height (shared_state->fb);
|
state.height = cogl_framebuffer_get_height (fb);
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&bg, 0, 0, 0, 255);
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_FBOS; i++)
|
for (i = 0; i < NUM_FBOS; i++)
|
||||||
{
|
{
|
||||||
@ -91,9 +90,8 @@ test_cogl_color_mask (TestUtilsGTestFixture *fixture,
|
|||||||
cogl_offscreen_new_to_texture (state.tex[i]));
|
cogl_offscreen_new_to_texture (state.tex[i]));
|
||||||
|
|
||||||
/* Clear the texture color bits */
|
/* Clear the texture color bits */
|
||||||
cogl_push_framebuffer (state.fbo[i]);
|
cogl_framebuffer_clear4f (state.fbo[i],
|
||||||
cogl_clear (&bg, COGL_BUFFER_BIT_COLOR);
|
COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
||||||
cogl_pop_framebuffer ();
|
|
||||||
|
|
||||||
cogl_framebuffer_set_color_mask (state.fbo[i],
|
cogl_framebuffer_set_color_mask (state.fbo[i],
|
||||||
i == 0 ? COGL_COLOR_MASK_RED :
|
i == 0 ? COGL_COLOR_MASK_RED :
|
||||||
@ -101,7 +99,11 @@ test_cogl_color_mask (TestUtilsGTestFixture *fixture,
|
|||||||
COGL_COLOR_MASK_BLUE);
|
COGL_COLOR_MASK_BLUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* XXX: we have to push/pop a framebuffer since this test currently
|
||||||
|
* uses the legacy cogl_rectangle() api. */
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
paint (&state);
|
paint (&state);
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
g_print ("OK\n");
|
g_print ("OK\n");
|
||||||
|
@ -9,16 +9,14 @@
|
|||||||
|
|
||||||
#include "test-utils.h"
|
#include "test-utils.h"
|
||||||
|
|
||||||
static TestUtilsSharedState *shared_state = NULL;
|
|
||||||
|
|
||||||
/* A bit of sugar for adding new conformance tests */
|
/* A bit of sugar for adding new conformance tests */
|
||||||
#define ADD_TEST(FUNC, REQUIREMENTS) G_STMT_START { \
|
#define ADD_TEST(FUNC, REQUIREMENTS) G_STMT_START { \
|
||||||
extern void FUNC (TestUtilsGTestFixture *, void *); \
|
extern void FUNC (void); \
|
||||||
if (strcmp (#FUNC, argv[1]) == 0) \
|
if (strcmp (#FUNC, argv[1]) == 0) \
|
||||||
{ \
|
{ \
|
||||||
test_utils_init (shared_state, REQUIREMENTS); \
|
test_utils_init (REQUIREMENTS); \
|
||||||
FUNC (NULL, shared_state); \
|
FUNC (); \
|
||||||
test_utils_fini (shared_state); \
|
test_utils_fini (); \
|
||||||
exit (0); \
|
exit (0); \
|
||||||
} \
|
} \
|
||||||
} G_STMT_END
|
} G_STMT_END
|
||||||
@ -45,65 +43,59 @@ main (int argc, char **argv)
|
|||||||
argv[1][i] = '_';
|
argv[1][i] = '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialise the state you need to share with everything.
|
|
||||||
*/
|
|
||||||
shared_state = g_new0 (TestUtilsSharedState, 1);
|
|
||||||
shared_state->argc_addr = &argc;
|
|
||||||
shared_state->argv_addr = &argv;
|
|
||||||
|
|
||||||
/* This file is run through a sed script during the make step so the
|
/* This file is run through a sed script during the make step so the
|
||||||
* lines containing the tests need to be formatted on a single line
|
* lines containing the tests need to be formatted on a single line
|
||||||
* each.
|
* each.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
UNPORTED_TEST (test_cogl_object);
|
UNPORTED_TEST (test_object);
|
||||||
UNPORTED_TEST (test_cogl_fixed);
|
UNPORTED_TEST (test_fixed);
|
||||||
UNPORTED_TEST (test_cogl_materials);
|
UNPORTED_TEST (test_materials);
|
||||||
ADD_TEST (test_cogl_pipeline_user_matrix, 0);
|
ADD_TEST (test_pipeline_user_matrix, 0);
|
||||||
ADD_TEST (test_cogl_blend_strings, 0);
|
ADD_TEST (test_blend_strings, 0);
|
||||||
UNPORTED_TEST (test_cogl_premult);
|
UNPORTED_TEST (test_premult);
|
||||||
UNPORTED_TEST (test_cogl_readpixels);
|
UNPORTED_TEST (test_readpixels);
|
||||||
ADD_TEST (test_cogl_path, 0);
|
ADD_TEST (test_path, 0);
|
||||||
ADD_TEST (test_cogl_depth_test, 0);
|
ADD_TEST (test_depth_test, 0);
|
||||||
ADD_TEST (test_cogl_color_mask, 0);
|
ADD_TEST (test_color_mask, 0);
|
||||||
ADD_TEST (test_cogl_backface_culling, TEST_REQUIREMENT_NPOT);
|
ADD_TEST (test_backface_culling, TEST_REQUIREMENT_NPOT);
|
||||||
|
|
||||||
ADD_TEST (test_cogl_sparse_pipeline, 0);
|
ADD_TEST (test_sparse_pipeline, 0);
|
||||||
|
|
||||||
UNPORTED_TEST (test_cogl_npot_texture);
|
UNPORTED_TEST (test_npot_texture);
|
||||||
UNPORTED_TEST (test_cogl_multitexture);
|
UNPORTED_TEST (test_multitexture);
|
||||||
UNPORTED_TEST (test_cogl_texture_mipmaps);
|
UNPORTED_TEST (test_texture_mipmaps);
|
||||||
ADD_TEST (test_cogl_sub_texture, 0);
|
ADD_TEST (test_sub_texture, 0);
|
||||||
ADD_TEST (test_cogl_pixel_buffer, 0);
|
ADD_TEST (test_pixel_buffer, 0);
|
||||||
UNPORTED_TEST (test_cogl_texture_rectangle);
|
UNPORTED_TEST (test_texture_rectangle);
|
||||||
ADD_TEST (test_cogl_texture_3d, 0);
|
ADD_TEST (test_texture_3d, 0);
|
||||||
ADD_TEST (test_cogl_wrap_modes, 0);
|
ADD_TEST (test_wrap_modes, 0);
|
||||||
UNPORTED_TEST (test_cogl_texture_pixmap_x11);
|
UNPORTED_TEST (test_texture_pixmap_x11);
|
||||||
UNPORTED_TEST (test_cogl_texture_get_set_data);
|
UNPORTED_TEST (test_texture_get_set_data);
|
||||||
UNPORTED_TEST (test_cogl_atlas_migration);
|
UNPORTED_TEST (test_atlas_migration);
|
||||||
ADD_TEST (test_cogl_read_texture_formats, 0);
|
ADD_TEST (test_read_texture_formats, 0);
|
||||||
ADD_TEST (test_cogl_write_texture_formats, 0);
|
ADD_TEST (test_write_texture_formats, 0);
|
||||||
|
|
||||||
UNPORTED_TEST (test_cogl_vertex_buffer_contiguous);
|
UNPORTED_TEST (test_vertex_buffer_contiguous);
|
||||||
UNPORTED_TEST (test_cogl_vertex_buffer_interleved);
|
UNPORTED_TEST (test_vertex_buffer_interleved);
|
||||||
UNPORTED_TEST (test_cogl_vertex_buffer_mutability);
|
UNPORTED_TEST (test_vertex_buffer_mutability);
|
||||||
|
|
||||||
ADD_TEST (test_cogl_primitive, 0);
|
ADD_TEST (test_primitive, 0);
|
||||||
|
|
||||||
ADD_TEST (test_cogl_just_vertex_shader, 0);
|
ADD_TEST (test_just_vertex_shader, 0);
|
||||||
ADD_TEST (test_cogl_pipeline_uniforms, 0);
|
ADD_TEST (test_pipeline_uniforms, 0);
|
||||||
ADD_TEST (test_cogl_snippets, 0);
|
ADD_TEST (test_snippets, 0);
|
||||||
ADD_TEST (test_cogl_custom_attributes, 0);
|
ADD_TEST (test_custom_attributes, 0);
|
||||||
|
|
||||||
ADD_TEST (test_cogl_bitmask, 0);
|
ADD_TEST (test_bitmask, 0);
|
||||||
|
|
||||||
ADD_TEST (test_cogl_offscreen, 0);
|
ADD_TEST (test_offscreen, 0);
|
||||||
|
|
||||||
ADD_TEST (test_cogl_point_size, 0);
|
ADD_TEST (test_point_size, 0);
|
||||||
ADD_TEST (test_cogl_point_sprite,
|
ADD_TEST (test_point_sprite,
|
||||||
TEST_KNOWN_FAILURE | TEST_REQUIREMENT_POINT_SPRITE);
|
TEST_KNOWN_FAILURE | TEST_REQUIREMENT_POINT_SPRITE);
|
||||||
|
|
||||||
UNPORTED_TEST (test_cogl_viewport);
|
UNPORTED_TEST (test_viewport);
|
||||||
|
|
||||||
g_printerr ("Unknown test name \"%s\"\n", argv[1]);
|
g_printerr ("Unknown test name \"%s\"\n", argv[1]);
|
||||||
|
|
||||||
|
@ -6,8 +6,6 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
CoglFramebuffer *fb;
|
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
@ -45,7 +43,7 @@ test_float_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
{ 15, 0, /**/ 0, 1, 0, 1 }
|
{ 15, 0, /**/ 0, 1, 0, 1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
buffer = cogl_attribute_buffer_new (state->ctx,
|
buffer = cogl_attribute_buffer_new (ctx,
|
||||||
sizeof (float_verts), float_verts);
|
sizeof (float_verts), float_verts);
|
||||||
attributes[0] = cogl_attribute_new (buffer,
|
attributes[0] = cogl_attribute_new (buffer,
|
||||||
"cogl_position_in",
|
"cogl_position_in",
|
||||||
@ -60,10 +58,10 @@ test_float_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
4, /* n_components */
|
4, /* n_components */
|
||||||
COGL_ATTRIBUTE_TYPE_FLOAT);
|
COGL_ATTRIBUTE_TYPE_FLOAT);
|
||||||
|
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_translate (offset_x, offset_y, 0.0f);
|
cogl_framebuffer_translate (fb, offset_x, offset_y, 0.0f);
|
||||||
|
|
||||||
cogl_framebuffer_draw_attributes (state->fb,
|
cogl_framebuffer_draw_attributes (fb,
|
||||||
state->pipeline,
|
state->pipeline,
|
||||||
COGL_VERTICES_MODE_TRIANGLES,
|
COGL_VERTICES_MODE_TRIANGLES,
|
||||||
0, /* first_vertex */
|
0, /* first_vertex */
|
||||||
@ -71,14 +69,14 @@ test_float_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
attributes,
|
attributes,
|
||||||
2 /* n_attributes */);
|
2 /* n_attributes */);
|
||||||
|
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
|
||||||
cogl_object_unref (attributes[1]);
|
cogl_object_unref (attributes[1]);
|
||||||
cogl_object_unref (attributes[0]);
|
cogl_object_unref (attributes[0]);
|
||||||
cogl_object_unref (buffer);
|
cogl_object_unref (buffer);
|
||||||
|
|
||||||
test_utils_check_pixel (offset_x + 5, offset_y + 5, 0xff0000ff);
|
test_utils_check_pixel (fb, offset_x + 5, offset_y + 5, 0xff0000ff);
|
||||||
test_utils_check_pixel (offset_x + 15, offset_y + 5, 0x00ff00ff);
|
test_utils_check_pixel (fb, offset_x + 15, offset_y + 5, 0x00ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -105,7 +103,7 @@ test_byte_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
{ 0, 0, /**/ 0, 0, 1, 1 },
|
{ 0, 0, /**/ 0, 0, 1, 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
buffer = cogl_attribute_buffer_new (state->ctx,
|
buffer = cogl_attribute_buffer_new (ctx,
|
||||||
sizeof (norm_verts), norm_verts);
|
sizeof (norm_verts), norm_verts);
|
||||||
attributes[0] = cogl_attribute_new (buffer,
|
attributes[0] = cogl_attribute_new (buffer,
|
||||||
"cogl_position_in",
|
"cogl_position_in",
|
||||||
@ -121,10 +119,10 @@ test_byte_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
COGL_ATTRIBUTE_TYPE_UNSIGNED_BYTE);
|
COGL_ATTRIBUTE_TYPE_UNSIGNED_BYTE);
|
||||||
cogl_attribute_set_normalized (attributes[1], TRUE);
|
cogl_attribute_set_normalized (attributes[1], TRUE);
|
||||||
|
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_translate (offset_x, offset_y, 0.0f);
|
cogl_framebuffer_translate (fb, offset_x, offset_y, 0.0f);
|
||||||
|
|
||||||
cogl_framebuffer_draw_attributes (state->fb,
|
cogl_framebuffer_draw_attributes (fb,
|
||||||
state->pipeline,
|
state->pipeline,
|
||||||
COGL_VERTICES_MODE_TRIANGLES,
|
COGL_VERTICES_MODE_TRIANGLES,
|
||||||
0, /* first_vertex */
|
0, /* first_vertex */
|
||||||
@ -135,7 +133,7 @@ test_byte_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
cogl_object_unref (attributes[1]);
|
cogl_object_unref (attributes[1]);
|
||||||
|
|
||||||
/* Test again with unnormalized attributes */
|
/* Test again with unnormalized attributes */
|
||||||
unnorm_buffer = cogl_attribute_buffer_new (state->ctx,
|
unnorm_buffer = cogl_attribute_buffer_new (ctx,
|
||||||
sizeof (unnorm_verts),
|
sizeof (unnorm_verts),
|
||||||
unnorm_verts);
|
unnorm_verts);
|
||||||
attributes[1] = cogl_attribute_new (unnorm_buffer,
|
attributes[1] = cogl_attribute_new (unnorm_buffer,
|
||||||
@ -145,9 +143,9 @@ test_byte_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
4, /* n_components */
|
4, /* n_components */
|
||||||
COGL_ATTRIBUTE_TYPE_BYTE);
|
COGL_ATTRIBUTE_TYPE_BYTE);
|
||||||
|
|
||||||
cogl_translate (20, 0, 0);
|
cogl_framebuffer_translate (fb, 20, 0, 0);
|
||||||
|
|
||||||
cogl_framebuffer_draw_attributes (state->fb,
|
cogl_framebuffer_draw_attributes (fb,
|
||||||
state->pipeline,
|
state->pipeline,
|
||||||
COGL_VERTICES_MODE_TRIANGLES,
|
COGL_VERTICES_MODE_TRIANGLES,
|
||||||
0, /* first_vertex */
|
0, /* first_vertex */
|
||||||
@ -155,16 +153,16 @@ test_byte_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
attributes,
|
attributes,
|
||||||
2 /* n_attributes */);
|
2 /* n_attributes */);
|
||||||
|
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
|
||||||
cogl_object_unref (attributes[0]);
|
cogl_object_unref (attributes[0]);
|
||||||
cogl_object_unref (attributes[1]);
|
cogl_object_unref (attributes[1]);
|
||||||
cogl_object_unref (buffer);
|
cogl_object_unref (buffer);
|
||||||
cogl_object_unref (unnorm_buffer);
|
cogl_object_unref (unnorm_buffer);
|
||||||
|
|
||||||
test_utils_check_pixel (offset_x + 5, offset_y + 5, 0xff0000ff);
|
test_utils_check_pixel (fb, offset_x + 5, offset_y + 5, 0xff0000ff);
|
||||||
test_utils_check_pixel (offset_x + 15, offset_y + 5, 0x00ff00ff);
|
test_utils_check_pixel (fb, offset_x + 15, offset_y + 5, 0x00ff00ff);
|
||||||
test_utils_check_pixel (offset_x + 25, offset_y + 5, 0x0000ffff);
|
test_utils_check_pixel (fb, offset_x + 25, offset_y + 5, 0x0000ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -182,7 +180,7 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
{ -5, -1 }
|
{ -5, -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_VERTEX_TRANSFORM,
|
snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_VERTEX_TRANSFORM,
|
||||||
"attribute vec2 pos;",
|
"attribute vec2 pos;",
|
||||||
NULL);
|
NULL);
|
||||||
@ -195,7 +193,7 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 255, 0, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline, 255, 0, 0, 255);
|
||||||
|
|
||||||
buffer = cogl_attribute_buffer_new (state->ctx,
|
buffer = cogl_attribute_buffer_new (ctx,
|
||||||
sizeof (short_verts), short_verts);
|
sizeof (short_verts), short_verts);
|
||||||
attributes[0] = cogl_attribute_new (buffer,
|
attributes[0] = cogl_attribute_new (buffer,
|
||||||
"pos",
|
"pos",
|
||||||
@ -204,10 +202,13 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
2, /* n_components */
|
2, /* n_components */
|
||||||
COGL_ATTRIBUTE_TYPE_SHORT);
|
COGL_ATTRIBUTE_TYPE_SHORT);
|
||||||
|
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_translate (offset_x + 10.0f, offset_y + 10.0f, 0.0f);
|
cogl_framebuffer_translate (fb,
|
||||||
|
offset_x + 10.0f,
|
||||||
|
offset_y + 10.0f,
|
||||||
|
0.0f);
|
||||||
|
|
||||||
cogl_framebuffer_draw_attributes (state->fb,
|
cogl_framebuffer_draw_attributes (fb,
|
||||||
pipeline,
|
pipeline,
|
||||||
COGL_VERTICES_MODE_TRIANGLES,
|
COGL_VERTICES_MODE_TRIANGLES,
|
||||||
0, /* first_vertex */
|
0, /* first_vertex */
|
||||||
@ -215,7 +216,7 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
attributes,
|
attributes,
|
||||||
1 /* n_attributes */);
|
1 /* n_attributes */);
|
||||||
|
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
|
||||||
cogl_object_unref (attributes[0]);
|
cogl_object_unref (attributes[0]);
|
||||||
|
|
||||||
@ -230,10 +231,13 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
pipeline2 = cogl_pipeline_copy (pipeline);
|
pipeline2 = cogl_pipeline_copy (pipeline);
|
||||||
cogl_pipeline_set_color4ub (pipeline2, 0, 255, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline2, 0, 255, 0, 255);
|
||||||
|
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_translate (offset_x + 10.0f - 65525.0f, offset_y - 65525, 0.0f);
|
cogl_framebuffer_translate (fb,
|
||||||
|
offset_x + 10.0f - 65525.0f,
|
||||||
|
offset_y - 65525,
|
||||||
|
0.0f);
|
||||||
|
|
||||||
cogl_framebuffer_draw_attributes (state->fb,
|
cogl_framebuffer_draw_attributes (fb,
|
||||||
pipeline2,
|
pipeline2,
|
||||||
COGL_VERTICES_MODE_TRIANGLES,
|
COGL_VERTICES_MODE_TRIANGLES,
|
||||||
0, /* first_vertex */
|
0, /* first_vertex */
|
||||||
@ -241,7 +245,7 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
attributes,
|
attributes,
|
||||||
1 /* n_attributes */);
|
1 /* n_attributes */);
|
||||||
|
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
|
||||||
cogl_object_unref (attributes[0]);
|
cogl_object_unref (attributes[0]);
|
||||||
|
|
||||||
@ -249,17 +253,14 @@ test_short_verts (TestState *state, int offset_x, int offset_y)
|
|||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
cogl_object_unref (buffer);
|
cogl_object_unref (buffer);
|
||||||
|
|
||||||
test_utils_check_pixel (offset_x + 5, offset_y + 5, 0xff0000ff);
|
test_utils_check_pixel (fb, offset_x + 5, offset_y + 5, 0xff0000ff);
|
||||||
test_utils_check_pixel (offset_x + 15, offset_y + 5, 0x00ff00ff);
|
test_utils_check_pixel (fb, offset_x + 15, offset_y + 5, 0x00ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
paint (TestState *state)
|
paint (TestState *state)
|
||||||
{
|
{
|
||||||
CoglColor color;
|
cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&color, 0, 0, 0, 255);
|
|
||||||
cogl_clear (&color, COGL_BUFFER_BIT_COLOR);
|
|
||||||
|
|
||||||
test_float_verts (state, 0, 0);
|
test_float_verts (state, 0, 0);
|
||||||
test_byte_verts (state, 0, 10);
|
test_byte_verts (state, 0, 10);
|
||||||
@ -267,28 +268,22 @@ paint (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_custom_attributes (TestUtilsGTestFixture *fixture,
|
test_custom_attributes (void)
|
||||||
void *user_data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = user_data;
|
|
||||||
|
|
||||||
/* If shaders aren't supported then we can't run the test */
|
/* If shaders aren't supported then we can't run the test */
|
||||||
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
||||||
{
|
{
|
||||||
CoglSnippet *snippet;
|
CoglSnippet *snippet;
|
||||||
TestState state;
|
TestState state;
|
||||||
state.fb = shared_state->fb;
|
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
cogl_framebuffer_orthographic (fb,
|
||||||
|
0, 0,
|
||||||
|
cogl_framebuffer_get_width (fb),
|
||||||
|
cogl_framebuffer_get_height (fb),
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
cogl_ortho (/* left, right */
|
state.pipeline = cogl_pipeline_new (ctx);
|
||||||
0, cogl_framebuffer_get_width (shared_state->fb),
|
|
||||||
/* bottom, top */
|
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0,
|
|
||||||
/* z near, far */
|
|
||||||
-1, 100);
|
|
||||||
|
|
||||||
state.pipeline = cogl_pipeline_new (state.ctx);
|
|
||||||
snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_VERTEX,
|
snippet = cogl_snippet_new (COGL_SNIPPET_HOOK_VERTEX,
|
||||||
"attribute vec4 color;",
|
"attribute vec4 color;",
|
||||||
"cogl_color_out = color;");
|
"cogl_color_out = color;");
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
int padding;
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -36,13 +36,14 @@ static gboolean
|
|||||||
draw_rectangle (TestState *state,
|
draw_rectangle (TestState *state,
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y,
|
||||||
TestDepthState *rect_state)
|
TestDepthState *rect_state,
|
||||||
|
gboolean legacy_mode)
|
||||||
{
|
{
|
||||||
guint8 Cr = MASK_RED (rect_state->color);
|
guint8 Cr = MASK_RED (rect_state->color);
|
||||||
guint8 Cg = MASK_GREEN (rect_state->color);
|
guint8 Cg = MASK_GREEN (rect_state->color);
|
||||||
guint8 Cb = MASK_BLUE (rect_state->color);
|
guint8 Cb = MASK_BLUE (rect_state->color);
|
||||||
guint8 Ca = MASK_ALPHA (rect_state->color);
|
guint8 Ca = MASK_ALPHA (rect_state->color);
|
||||||
CoglHandle pipeline;
|
CoglPipeline *pipeline;
|
||||||
CoglDepthState depth_state;
|
CoglDepthState depth_state;
|
||||||
|
|
||||||
cogl_depth_state_init (&depth_state);
|
cogl_depth_state_init (&depth_state);
|
||||||
@ -53,24 +54,40 @@ draw_rectangle (TestState *state,
|
|||||||
rect_state->range_near,
|
rect_state->range_near,
|
||||||
rect_state->range_far);
|
rect_state->range_far);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
if (!cogl_pipeline_set_depth_state (pipeline, &depth_state, NULL))
|
if (!cogl_pipeline_set_depth_state (pipeline, &depth_state, NULL))
|
||||||
{
|
{
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, Cr, Cg, Cb, Ca);
|
if (!legacy_mode)
|
||||||
|
{
|
||||||
|
cogl_pipeline_set_color4ub (pipeline, Cr, Cg, Cb, Ca);
|
||||||
|
|
||||||
cogl_set_source (pipeline);
|
cogl_framebuffer_push_matrix (fb);
|
||||||
|
cogl_framebuffer_translate (fb, 0, 0, rect_state->depth);
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_draw_rectangle (fb,
|
||||||
cogl_translate (0, 0, rect_state->depth);
|
pipeline,
|
||||||
cogl_rectangle (x * QUAD_WIDTH,
|
x * QUAD_WIDTH,
|
||||||
y * QUAD_WIDTH,
|
y * QUAD_WIDTH,
|
||||||
x * QUAD_WIDTH + QUAD_WIDTH,
|
x * QUAD_WIDTH + QUAD_WIDTH,
|
||||||
y * QUAD_WIDTH + QUAD_WIDTH);
|
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
|
cogl_push_matrix ();
|
||||||
|
cogl_set_source_color4ub (Cr, Cg, Cb, Ca);
|
||||||
|
cogl_translate (0, 0, rect_state->depth);
|
||||||
|
cogl_rectangle (x * QUAD_WIDTH,
|
||||||
|
y * QUAD_WIDTH,
|
||||||
|
x * QUAD_WIDTH + QUAD_WIDTH,
|
||||||
|
y * QUAD_WIDTH + QUAD_WIDTH);
|
||||||
|
cogl_pop_matrix ();
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
}
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
@ -84,23 +101,25 @@ test_depth (TestState *state,
|
|||||||
TestDepthState *rect0_state,
|
TestDepthState *rect0_state,
|
||||||
TestDepthState *rect1_state,
|
TestDepthState *rect1_state,
|
||||||
TestDepthState *rect2_state,
|
TestDepthState *rect2_state,
|
||||||
|
gboolean legacy_mode,
|
||||||
guint32 expected_result)
|
guint32 expected_result)
|
||||||
{
|
{
|
||||||
gboolean missing_feature = FALSE;
|
gboolean missing_feature = FALSE;
|
||||||
|
|
||||||
if (rect0_state)
|
if (rect0_state)
|
||||||
missing_feature |= !draw_rectangle (state, x, y, rect0_state);
|
missing_feature |= !draw_rectangle (state, x, y, rect0_state, legacy_mode);
|
||||||
if (rect1_state)
|
if (rect1_state)
|
||||||
missing_feature |= !draw_rectangle (state, x, y, rect1_state);
|
missing_feature |= !draw_rectangle (state, x, y, rect1_state, legacy_mode);
|
||||||
if (rect2_state)
|
if (rect2_state)
|
||||||
missing_feature |= !draw_rectangle (state, x, y, rect2_state);
|
missing_feature |= !draw_rectangle (state, x, y, rect2_state, legacy_mode);
|
||||||
|
|
||||||
/* We don't consider it an error that we can't test something
|
/* We don't consider it an error that we can't test something
|
||||||
* the driver doesn't support. */
|
* the driver doesn't support. */
|
||||||
if (missing_feature)
|
if (missing_feature)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
test_utils_check_pixel (x * QUAD_WIDTH + (QUAD_WIDTH / 2),
|
test_utils_check_pixel (fb,
|
||||||
|
x * QUAD_WIDTH + (QUAD_WIDTH / 2),
|
||||||
y * QUAD_WIDTH + (QUAD_WIDTH / 2),
|
y * QUAD_WIDTH + (QUAD_WIDTH / 2),
|
||||||
expected_result);
|
expected_result);
|
||||||
}
|
}
|
||||||
@ -142,27 +161,32 @@ paint (TestState *state)
|
|||||||
|
|
||||||
test_depth (state, 0, 0, /* position */
|
test_depth (state, 0, 0, /* position */
|
||||||
&rect0_state, &rect1_state, &rect2_state,
|
&rect0_state, &rect1_state, &rect2_state,
|
||||||
|
FALSE, /* legacy mode */
|
||||||
0x00ff00ff); /* expected */
|
0x00ff00ff); /* expected */
|
||||||
|
|
||||||
rect2_state.test_function = COGL_DEPTH_TEST_FUNCTION_ALWAYS;
|
rect2_state.test_function = COGL_DEPTH_TEST_FUNCTION_ALWAYS;
|
||||||
test_depth (state, 1, 0, /* position */
|
test_depth (state, 1, 0, /* position */
|
||||||
&rect0_state, &rect1_state, &rect2_state,
|
&rect0_state, &rect1_state, &rect2_state,
|
||||||
|
FALSE, /* legacy mode */
|
||||||
0x0000ffff); /* expected */
|
0x0000ffff); /* expected */
|
||||||
|
|
||||||
rect2_state.test_function = COGL_DEPTH_TEST_FUNCTION_LESS;
|
rect2_state.test_function = COGL_DEPTH_TEST_FUNCTION_LESS;
|
||||||
test_depth (state, 2, 0, /* position */
|
test_depth (state, 2, 0, /* position */
|
||||||
&rect0_state, &rect1_state, &rect2_state,
|
&rect0_state, &rect1_state, &rect2_state,
|
||||||
|
FALSE, /* legacy mode */
|
||||||
0x0000ffff); /* expected */
|
0x0000ffff); /* expected */
|
||||||
|
|
||||||
rect2_state.test_function = COGL_DEPTH_TEST_FUNCTION_GREATER;
|
rect2_state.test_function = COGL_DEPTH_TEST_FUNCTION_GREATER;
|
||||||
test_depth (state, 3, 0, /* position */
|
test_depth (state, 3, 0, /* position */
|
||||||
&rect0_state, &rect1_state, &rect2_state,
|
&rect0_state, &rect1_state, &rect2_state,
|
||||||
|
FALSE, /* legacy mode */
|
||||||
0x00ff00ff); /* expected */
|
0x00ff00ff); /* expected */
|
||||||
|
|
||||||
rect0_state.test_enable = TRUE;
|
rect0_state.test_enable = TRUE;
|
||||||
rect1_state.write_enable = FALSE;
|
rect1_state.write_enable = FALSE;
|
||||||
test_depth (state, 4, 0, /* position */
|
test_depth (state, 4, 0, /* position */
|
||||||
&rect0_state, &rect1_state, &rect2_state,
|
&rect0_state, &rect1_state, &rect2_state,
|
||||||
|
FALSE, /* legacy mode */
|
||||||
0x0000ffff); /* expected */
|
0x0000ffff); /* expected */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,6 +215,7 @@ paint (TestState *state)
|
|||||||
|
|
||||||
test_depth (state, 0, 1, /* position */
|
test_depth (state, 0, 1, /* position */
|
||||||
&rect0_state, &rect1_state, NULL,
|
&rect0_state, &rect1_state, NULL,
|
||||||
|
FALSE, /* legacy mode */
|
||||||
0xff0000ff); /* expected */
|
0xff0000ff); /* expected */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,26 +245,26 @@ paint (TestState *state)
|
|||||||
cogl_set_depth_test_enabled (TRUE);
|
cogl_set_depth_test_enabled (TRUE);
|
||||||
test_depth (state, 0, 2, /* position */
|
test_depth (state, 0, 2, /* position */
|
||||||
&rect0_state, &rect1_state, NULL,
|
&rect0_state, &rect1_state, NULL,
|
||||||
|
TRUE, /* legacy mode */
|
||||||
0xff0000ff); /* expected */
|
0xff0000ff); /* expected */
|
||||||
cogl_set_depth_test_enabled (FALSE);
|
cogl_set_depth_test_enabled (FALSE);
|
||||||
test_depth (state, 1, 2, /* position */
|
test_depth (state, 1, 2, /* position */
|
||||||
&rect0_state, &rect1_state, NULL,
|
&rect0_state, &rect1_state, NULL,
|
||||||
|
TRUE, /* legacy mode */
|
||||||
0x00ff00ff); /* expected */
|
0x00ff00ff); /* expected */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_depth_test (TestUtilsGTestFixture *fixture,
|
test_depth_test (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
cogl_framebuffer_orthographic (fb, 0, 0,
|
||||||
|
cogl_framebuffer_get_width (fb),
|
||||||
cogl_ortho (0, cogl_framebuffer_get_width (shared_state->fb), /* left, right */
|
cogl_framebuffer_get_height (fb),
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0, /* bottom, top */
|
-1,
|
||||||
-1, 100 /* z near, far */);
|
100);
|
||||||
|
|
||||||
paint (&state);
|
paint (&state);
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "test-conform-common.h"
|
#include "test-conform-common.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_fixed (TestUtilsGTestFixture *fixture,
|
test_fixed (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
g_assert_cmpint (COGL_FIXED_1, ==, COGL_FIXED_FROM_FLOAT (1.0));
|
g_assert_cmpint (COGL_FIXED_1, ==, COGL_FIXED_FROM_FLOAT (1.0));
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_simple_rig (void)
|
test_simple_rig (void)
|
||||||
{
|
{
|
||||||
ClutterColor stage_color = { 0x0, 0x0, 0x0, 0xff };
|
ClutterColor stage_color = { 0x0, 0x0, 0x0, 0xff };
|
||||||
stage = clutter_stage_get_default ();
|
stage = clutter_stage_get_default ();
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
int paddiing;
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
static CoglHandle
|
static CoglTexture *
|
||||||
create_dummy_texture (void)
|
create_dummy_texture (void)
|
||||||
{
|
{
|
||||||
/* Create a dummy 1x1 green texture to replace the color from the
|
/* Create a dummy 1x1 green texture to replace the color from the
|
||||||
@ -28,7 +28,7 @@ static void
|
|||||||
paint_legacy (TestState *state)
|
paint_legacy (TestState *state)
|
||||||
{
|
{
|
||||||
CoglHandle material = cogl_material_new ();
|
CoglHandle material = cogl_material_new ();
|
||||||
CoglHandle tex;
|
CoglTexture *tex;
|
||||||
CoglColor color;
|
CoglColor color;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
CoglHandle shader, program;
|
CoglHandle shader, program;
|
||||||
@ -44,7 +44,7 @@ paint_legacy (TestState *state)
|
|||||||
constant green color provided by a texture */
|
constant green color provided by a texture */
|
||||||
tex = create_dummy_texture ();
|
tex = create_dummy_texture ();
|
||||||
cogl_material_set_layer (material, 0, tex);
|
cogl_material_set_layer (material, 0, tex);
|
||||||
cogl_handle_unref (tex);
|
cogl_object_unref (tex);
|
||||||
if (!cogl_material_set_layer_combine (material, 0,
|
if (!cogl_material_set_layer_combine (material, 0,
|
||||||
"RGBA=REPLACE(TEXTURE)",
|
"RGBA=REPLACE(TEXTURE)",
|
||||||
&error))
|
&error))
|
||||||
@ -97,8 +97,8 @@ paint_legacy (TestState *state)
|
|||||||
static void
|
static void
|
||||||
paint (TestState *state)
|
paint (TestState *state)
|
||||||
{
|
{
|
||||||
CoglPipeline *pipeline = cogl_pipeline_new (state->ctx);
|
CoglPipeline *pipeline = cogl_pipeline_new (ctx);
|
||||||
CoglHandle tex;
|
CoglTexture *tex;
|
||||||
CoglColor color;
|
CoglColor color;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
CoglHandle shader, program;
|
CoglHandle shader, program;
|
||||||
@ -114,7 +114,7 @@ paint (TestState *state)
|
|||||||
constant green color provided by a texture */
|
constant green color provided by a texture */
|
||||||
tex = create_dummy_texture ();
|
tex = create_dummy_texture ();
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, tex);
|
cogl_pipeline_set_layer_texture (pipeline, 0, tex);
|
||||||
cogl_handle_unref (tex);
|
cogl_object_unref (tex);
|
||||||
if (!cogl_pipeline_set_layer_combine (pipeline, 0,
|
if (!cogl_pipeline_set_layer_combine (pipeline, 0,
|
||||||
"RGBA=REPLACE(TEXTURE)",
|
"RGBA=REPLACE(TEXTURE)",
|
||||||
&error))
|
&error))
|
||||||
@ -166,35 +166,40 @@ paint (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
validate_result (void)
|
validate_result (CoglFramebuffer *framebuffer)
|
||||||
{
|
{
|
||||||
/* Non-shader version */
|
/* Non-shader version */
|
||||||
test_utils_check_pixel (25, 25, 0x00ff0000);
|
test_utils_check_pixel (framebuffer, 25, 25, 0x00ff0000);
|
||||||
/* Shader version */
|
/* Shader version */
|
||||||
test_utils_check_pixel (75, 25, 0x00ff0000);
|
test_utils_check_pixel (framebuffer, 75, 25, 0x00ff0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_just_vertex_shader (TestUtilsGTestFixture *fixture,
|
test_just_vertex_shader (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
cogl_framebuffer_orthographic (fb,
|
||||||
|
0, 0,
|
||||||
cogl_ortho (0, cogl_framebuffer_get_width (shared_state->fb), /* left, right */
|
cogl_framebuffer_get_width (fb),
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0, /* bottom, top */
|
cogl_framebuffer_get_height (fb),
|
||||||
-1, 100 /* z near, far */);
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
/* If shaders aren't supported then we can't run the test */
|
/* If shaders aren't supported then we can't run the test */
|
||||||
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
||||||
{
|
{
|
||||||
|
/* XXX: we have to push/pop a framebuffer since this test currently
|
||||||
|
* uses the legacy cogl_rectangle() api. */
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
|
|
||||||
paint_legacy (&state);
|
paint_legacy (&state);
|
||||||
validate_result ();
|
validate_result (fb);
|
||||||
|
|
||||||
paint (&state);
|
paint (&state);
|
||||||
validate_result ();
|
validate_result (fb);
|
||||||
|
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
g_print ("OK\n");
|
g_print ("OK\n");
|
||||||
|
@ -218,7 +218,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_materials (TestUtilsGTestFixture *fixture,
|
test_materials (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -173,7 +173,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_multitexture (TestUtilsGTestFixture *fixture,
|
test_multitexture (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -188,7 +188,7 @@ make_texture (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_npot_texture (TestUtilsGTestFixture *fixture,
|
test_npot_texture (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -39,7 +39,7 @@ destroy2_cb (void *user_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_object (TestUtilsGTestFixture *fixture,
|
test_object (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
CoglPath *path;
|
CoglPath *path;
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *context;
|
|
||||||
int fb_width;
|
int fb_width;
|
||||||
int fb_height;
|
int fb_height;
|
||||||
} TestState;
|
} TestState;
|
||||||
@ -33,7 +32,7 @@ check_quadrant (TestState *state,
|
|||||||
width -= 4;
|
width -= 4;
|
||||||
height -= 4;
|
height -= 4;
|
||||||
|
|
||||||
test_utils_check_region (x, y, width, height, expected_rgba);
|
test_utils_check_region (fb, x, y, width, height, expected_rgba);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -41,9 +40,9 @@ test_paint (TestState *state)
|
|||||||
{
|
{
|
||||||
CoglTexture2D *tex_2d;
|
CoglTexture2D *tex_2d;
|
||||||
CoglTexture *tex;
|
CoglTexture *tex;
|
||||||
CoglHandle offscreen;
|
CoglOffscreen *offscreen;
|
||||||
|
|
||||||
tex_2d = cogl_texture_2d_new_with_size (state->context,
|
tex_2d = cogl_texture_2d_new_with_size (ctx,
|
||||||
state->fb_width,
|
state->fb_width,
|
||||||
state->fb_height,
|
state->fb_height,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
@ -66,11 +65,11 @@ test_paint (TestState *state)
|
|||||||
cogl_translate (0.5, 0.5, 0);
|
cogl_translate (0.5, 0.5, 0);
|
||||||
cogl_scale (-0.5, 0.5, 1);
|
cogl_scale (-0.5, 0.5, 1);
|
||||||
|
|
||||||
cogl_push_framebuffer (offscreen);
|
cogl_push_framebuffer (COGL_FRAMEBUFFER (offscreen));
|
||||||
|
|
||||||
/* Cogl should release the last reference when we call cogl_pop_framebuffer()
|
/* Cogl should release the last reference when we call cogl_pop_framebuffer()
|
||||||
*/
|
*/
|
||||||
cogl_handle_unref (offscreen);
|
cogl_object_unref (offscreen);
|
||||||
|
|
||||||
/* Setup something other than the identity matrix for the modelview so we can
|
/* Setup something other than the identity matrix for the modelview so we can
|
||||||
* verify it gets restored when we call cogl_pop_framebuffer () */
|
* verify it gets restored when we call cogl_pop_framebuffer () */
|
||||||
@ -116,7 +115,7 @@ test_flush (TestState *state)
|
|||||||
{
|
{
|
||||||
CoglTexture2D *tex_2d;
|
CoglTexture2D *tex_2d;
|
||||||
CoglTexture *tex;
|
CoglTexture *tex;
|
||||||
CoglHandle offscreen;
|
CoglOffscreen *offscreen;
|
||||||
CoglColor clear_color;
|
CoglColor clear_color;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -126,7 +125,7 @@ test_flush (TestState *state)
|
|||||||
the contents of the texture will automatically flush the
|
the contents of the texture will automatically flush the
|
||||||
journal */
|
journal */
|
||||||
|
|
||||||
tex_2d = cogl_texture_2d_new_with_size (state->context,
|
tex_2d = cogl_texture_2d_new_with_size (ctx,
|
||||||
16, 16, /* width/height */
|
16, 16, /* width/height */
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
NULL);
|
NULL);
|
||||||
@ -134,7 +133,7 @@ test_flush (TestState *state)
|
|||||||
|
|
||||||
offscreen = cogl_offscreen_new_to_texture (tex);
|
offscreen = cogl_offscreen_new_to_texture (tex);
|
||||||
|
|
||||||
cogl_push_framebuffer (offscreen);
|
cogl_push_framebuffer (COGL_FRAMEBUFFER (offscreen));
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 255);
|
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 255);
|
||||||
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
|
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
|
||||||
@ -144,7 +143,8 @@ test_flush (TestState *state)
|
|||||||
|
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
/* First time check using read pixels on the offscreen */
|
/* First time check using read pixels on the offscreen */
|
||||||
test_utils_check_region (1, 1, 15, 15, 0xff0000ff);
|
test_utils_check_region (COGL_FRAMEBUFFER (offscreen),
|
||||||
|
1, 1, 15, 15, 0xff0000ff);
|
||||||
else if (i == 1)
|
else if (i == 1)
|
||||||
{
|
{
|
||||||
guint8 data[16 * 4 * 16];
|
guint8 data[16 * 4 * 16];
|
||||||
@ -169,30 +169,32 @@ test_flush (TestState *state)
|
|||||||
/* Third time try drawing the texture to the screen */
|
/* Third time try drawing the texture to the screen */
|
||||||
cogl_set_source_texture (tex);
|
cogl_set_source_texture (tex);
|
||||||
cogl_rectangle (-1, -1, 1, 1);
|
cogl_rectangle (-1, -1, 1, 1);
|
||||||
test_utils_check_region (2, 2, /* x/y */
|
test_utils_check_region (fb,
|
||||||
|
2, 2, /* x/y */
|
||||||
state->fb_width - 4,
|
state->fb_width - 4,
|
||||||
state->fb_height - 4,
|
state->fb_height - 4,
|
||||||
0xff0000ff);
|
0xff0000ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_object_unref (tex_2d);
|
cogl_object_unref (tex_2d);
|
||||||
cogl_handle_unref (offscreen);
|
cogl_object_unref (offscreen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_offscreen (TestUtilsGTestFixture *fixture,
|
test_offscreen (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.context = shared_state->ctx;
|
state.fb_width = cogl_framebuffer_get_width (fb);
|
||||||
state.fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
state.fb_height = cogl_framebuffer_get_height (fb);
|
||||||
state.fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
|
|
||||||
|
/* XXX: we have to push/pop a framebuffer since this test currently
|
||||||
|
* uses the legacy cogl_rectangle() api. */
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
test_paint (&state);
|
test_paint (&state);
|
||||||
test_flush (&state);
|
test_flush (&state);
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
g_print ("OK\n");
|
g_print ("OK\n");
|
||||||
|
@ -17,10 +17,10 @@ typedef struct _TestState
|
|||||||
static void
|
static void
|
||||||
draw_path_at (int x, int y)
|
draw_path_at (int x, int y)
|
||||||
{
|
{
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_translate (x * BLOCK_SIZE, y * BLOCK_SIZE, 0.0f);
|
cogl_framebuffer_translate (fb, x * BLOCK_SIZE, y * BLOCK_SIZE, 0.0f);
|
||||||
cogl_path_fill ();
|
cogl_path_fill ();
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -33,12 +33,12 @@ check_block (int block_x, int block_y, int block_mask)
|
|||||||
filled. The bits from 0->3 represent the top left, top right,
|
filled. The bits from 0->3 represent the top left, top right,
|
||||||
bottom left and bottom right respectively */
|
bottom left and bottom right respectively */
|
||||||
|
|
||||||
cogl_read_pixels (block_x * BLOCK_SIZE,
|
cogl_framebuffer_read_pixels (fb,
|
||||||
block_y * BLOCK_SIZE,
|
block_x * BLOCK_SIZE,
|
||||||
BLOCK_SIZE, BLOCK_SIZE,
|
block_y * BLOCK_SIZE,
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
BLOCK_SIZE, BLOCK_SIZE,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
(guint8 *)data);
|
(guint8 *)data);
|
||||||
|
|
||||||
for (qy = 0; qy < 2; qy++)
|
for (qy = 0; qy < 2; qy++)
|
||||||
for (qx = 0; qx < 2; qx++)
|
for (qx = 0; qx < 2; qx++)
|
||||||
@ -188,17 +188,22 @@ validate_result ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_path (TestUtilsGTestFixture *fixture,
|
test_path (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
cogl_ortho (0, cogl_framebuffer_get_width (shared_state->fb), /* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
cogl_framebuffer_get_width (fb),
|
||||||
|
cogl_framebuffer_get_height (fb),
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
|
/* XXX: we have to push/pop a framebuffer since this test currently
|
||||||
|
* uses the legacy cogl_rectangle() api. */
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
paint (&state);
|
paint (&state);
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
validate_result ();
|
validate_result ();
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
|
@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
|
|
||||||
CoglPipeline *pipeline_red;
|
CoglPipeline *pipeline_red;
|
||||||
CoglPipeline *pipeline_green;
|
CoglPipeline *pipeline_green;
|
||||||
CoglPipeline *pipeline_blue;
|
CoglPipeline *pipeline_blue;
|
||||||
@ -92,7 +90,7 @@ create_pipeline_for_shader (TestState *state, const char *shader_source)
|
|||||||
CoglHandle shader;
|
CoglHandle shader;
|
||||||
CoglHandle program;
|
CoglHandle program;
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
|
shader = cogl_create_shader (COGL_SHADER_TYPE_FRAGMENT);
|
||||||
cogl_shader_source (shader, shader_source);
|
cogl_shader_source (shader, shader_source);
|
||||||
@ -179,9 +177,8 @@ destroy_state (TestState *state)
|
|||||||
static void
|
static void
|
||||||
paint_pipeline (CoglPipeline *pipeline, int pos)
|
paint_pipeline (CoglPipeline *pipeline, int pos)
|
||||||
{
|
{
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||||
cogl_rectangle (pos * 10, 0, pos * 10 + 10, 10);
|
pos * 10, 0, pos * 10 + 10, 10);
|
||||||
cogl_pop_source ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -343,10 +340,7 @@ paint_long_pipeline (TestState *state)
|
|||||||
static void
|
static void
|
||||||
paint (TestState *state)
|
paint (TestState *state)
|
||||||
{
|
{
|
||||||
CoglColor color;
|
cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&color, 0, 0, 0, 255);
|
|
||||||
cogl_clear (&color, COGL_BUFFER_BIT_COLOR);
|
|
||||||
|
|
||||||
paint_color_pipelines (state);
|
paint_color_pipelines (state);
|
||||||
paint_matrix_pipeline (state->matrix_pipeline);
|
paint_matrix_pipeline (state->matrix_pipeline);
|
||||||
@ -357,7 +351,7 @@ paint (TestState *state)
|
|||||||
static void
|
static void
|
||||||
check_pos (int pos, guint32 color)
|
check_pos (int pos, guint32 color)
|
||||||
{
|
{
|
||||||
test_utils_check_pixel (pos * 10 + 5, 5, color);
|
test_utils_check_pixel (fb, pos * 10 + 5, 5, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -387,26 +381,21 @@ validate_long_pipeline_result (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_pipeline_uniforms (TestUtilsGTestFixture *fixture,
|
test_pipeline_uniforms (void)
|
||||||
void *user_data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = user_data;
|
|
||||||
|
|
||||||
/* If shaders aren't supported then we can't run the test */
|
/* If shaders aren't supported then we can't run the test */
|
||||||
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
|
||||||
|
|
||||||
init_state (&state);
|
init_state (&state);
|
||||||
|
|
||||||
cogl_ortho (/* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
0, cogl_framebuffer_get_width (shared_state->fb),
|
0, 0,
|
||||||
/* bottom, top */
|
cogl_framebuffer_get_width (fb),
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0,
|
cogl_framebuffer_get_height (fb),
|
||||||
/* z near, far */
|
-1,
|
||||||
-1, 100);
|
100);
|
||||||
|
|
||||||
paint (&state);
|
paint (&state);
|
||||||
validate_result ();
|
validate_result ();
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
} TestState;
|
} TestState;
|
||||||
@ -23,10 +22,9 @@ validate_result (TestState *state)
|
|||||||
verify this by reading back the entire stage */
|
verify this by reading back the entire stage */
|
||||||
pixels = g_malloc (state->width * state->height * 4);
|
pixels = g_malloc (state->width * state->height * 4);
|
||||||
|
|
||||||
cogl_read_pixels (0, 0, state->width, state->height,
|
cogl_framebuffer_read_pixels (fb, 0, 0, state->width, state->height,
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
(guint8 *)pixels);
|
||||||
(guint8 *)pixels);
|
|
||||||
|
|
||||||
for (p = pixels; p < pixels + state->width * state->height; p++)
|
for (p = pixels; p < pixels + state->width * state->height; p++)
|
||||||
{
|
{
|
||||||
@ -53,21 +51,22 @@ paint (TestState *state)
|
|||||||
0xff, 0x00, 0xff, /* magenta -> becomes bottom right */
|
0xff, 0x00, 0xff, /* magenta -> becomes bottom right */
|
||||||
0x00, 0xff, 0xff /* cyan -> becomes bottom left */
|
0x00, 0xff, 0xff /* cyan -> becomes bottom left */
|
||||||
};
|
};
|
||||||
CoglColor bg;
|
CoglTexture *tex0, *tex1;
|
||||||
CoglHandle tex0, tex1;
|
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
CoglMatrix matrix;
|
CoglMatrix matrix;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
cogl_ortho (0, state->width, /* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
state->height, 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
state->width,
|
||||||
|
state->height,
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&bg, 0, 0, 0, 255);
|
cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
||||||
cogl_clear (&bg, COGL_BUFFER_BIT_COLOR);
|
|
||||||
|
|
||||||
cogl_matrix_init_identity (&matrix);
|
cogl_matrix_init_identity (&matrix);
|
||||||
cogl_set_modelview_matrix (&matrix);
|
cogl_framebuffer_set_modelview_matrix (fb, &matrix);
|
||||||
|
|
||||||
tex0 = cogl_texture_new_from_data (2, 2,
|
tex0 = cogl_texture_new_from_data (2, 2,
|
||||||
COGL_TEXTURE_NO_ATLAS,
|
COGL_TEXTURE_NO_ATLAS,
|
||||||
@ -82,7 +81,7 @@ paint (TestState *state)
|
|||||||
6,
|
6,
|
||||||
data1);
|
data1);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
/* Set the two textures as layers */
|
/* Set the two textures as layers */
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, tex0);
|
cogl_pipeline_set_layer_texture (pipeline, 0, tex0);
|
||||||
@ -115,25 +114,23 @@ paint (TestState *state)
|
|||||||
cogl_matrix_scale (&matrix, -1.0f, 1.0f, 1.0f);
|
cogl_matrix_scale (&matrix, -1.0f, 1.0f, 1.0f);
|
||||||
cogl_pipeline_set_layer_matrix (pipeline, 1, &matrix);
|
cogl_pipeline_set_layer_matrix (pipeline, 1, &matrix);
|
||||||
|
|
||||||
cogl_set_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb,
|
||||||
cogl_rectangle (0, 0, state->width, state->height);
|
pipeline,
|
||||||
|
0, 0,
|
||||||
|
state->width, state->height);
|
||||||
|
|
||||||
cogl_handle_unref (tex1);
|
cogl_object_unref (tex1);
|
||||||
cogl_handle_unref (tex0);
|
cogl_object_unref (tex0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_pipeline_user_matrix (TestUtilsGTestFixture *fixture,
|
test_pipeline_user_matrix (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
state.width = cogl_framebuffer_get_width (fb);
|
||||||
|
state.height = cogl_framebuffer_get_height (fb);
|
||||||
state.width = cogl_framebuffer_get_width (shared_state->fb);
|
|
||||||
state.height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
|
|
||||||
paint (&state);
|
paint (&state);
|
||||||
validate_result (&state);
|
validate_result (&state);
|
||||||
|
@ -188,11 +188,15 @@ draw_frame (TestState *state)
|
|||||||
/* Paint the textures */
|
/* Paint the textures */
|
||||||
for (i = 0; i < NB_TILES; i++)
|
for (i = 0; i < NB_TILES; i++)
|
||||||
{
|
{
|
||||||
cogl_set_source_texture (state->tiles[i].texture);
|
CoglPipeline *pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_rectangle (state->tiles[i].x,
|
cogl_pipeline_set_layer_texture (pipeline, 0, state->tiles[i].texture);
|
||||||
state->tiles[i].y,
|
cogl_framebuffer_draw_rectangle (fb,
|
||||||
state->tiles[i].x + TILE_SIZE,
|
pipeline,
|
||||||
state->tiles[i].y + TILE_SIZE);
|
state->tiles[i].x,
|
||||||
|
state->tiles[i].y,
|
||||||
|
state->tiles[i].x + TILE_SIZE,
|
||||||
|
state->tiles[i].y + TILE_SIZE);
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -201,7 +205,8 @@ static void
|
|||||||
validate_tile (TestState *state,
|
validate_tile (TestState *state,
|
||||||
TestTile *tile)
|
TestTile *tile)
|
||||||
{
|
{
|
||||||
test_utils_check_region (tile->x, tile->y,
|
test_utils_check_region (fb,
|
||||||
|
tile->x, tile->y,
|
||||||
TILE_SIZE, TILE_SIZE,
|
TILE_SIZE, TILE_SIZE,
|
||||||
(tile->color[0] << 24) |
|
(tile->color[0] << 24) |
|
||||||
(tile->color[1] << 16) |
|
(tile->color[1] << 16) |
|
||||||
@ -219,10 +224,8 @@ validate_result (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_pixel_buffer (TestUtilsGTestFixture *fixture,
|
test_pixel_buffer (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
int i;
|
int i;
|
||||||
static TestTile tiles[NB_TILES] =
|
static TestTile tiles[NB_TILES] =
|
||||||
@ -239,17 +242,20 @@ test_cogl_pixel_buffer (TestUtilsGTestFixture *fixture,
|
|||||||
{ { 0x7e, 0xff, 0x7e, 0xff }, 0.0f, TILE_SIZE, NULL, NULL }
|
{ { 0x7e, 0xff, 0x7e, 0xff }, 0.0f, TILE_SIZE, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
state.width = cogl_framebuffer_get_width (shared_state->fb);
|
state.width = cogl_framebuffer_get_width (fb);
|
||||||
state.height = cogl_framebuffer_get_height (shared_state->fb);
|
state.height = cogl_framebuffer_get_height (fb);
|
||||||
cogl_ortho (0, state.width, /* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
state.height, 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
state.width,
|
||||||
|
state.height,
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
create_map_tile (shared_state->ctx, &tiles[TILE_MAP]);
|
create_map_tile (ctx, &tiles[TILE_MAP]);
|
||||||
#if 0
|
#if 0
|
||||||
create_set_region_tile (shared_state->ctx, &tiles[TILE_SET_REGION]);
|
create_set_region_tile (shared_state->ctx, &tiles[TILE_SET_REGION]);
|
||||||
#endif
|
#endif
|
||||||
create_set_data_tile (shared_state->ctx, &tiles[TILE_SET_DATA]);
|
create_set_data_tile (ctx, &tiles[TILE_SET_DATA]);
|
||||||
|
|
||||||
state.tiles = tiles;
|
state.tiles = tiles;
|
||||||
|
|
||||||
|
@ -37,30 +37,28 @@ verify_point_size (CoglFramebuffer *fb,
|
|||||||
gboolean in_point = x >= 1 && x <= 2 && y >= 1 && y <= 2;
|
gboolean in_point = x >= 1 && x <= 2 && y >= 1 && y <= 2;
|
||||||
guint32 expected_pixel = in_point ? 0x00ff00ff : 0xff0000ff;
|
guint32 expected_pixel = in_point ? 0x00ff00ff : 0xff0000ff;
|
||||||
|
|
||||||
test_utils_check_pixel (calc_coord_offset (x_pos, x, point_size),
|
test_utils_check_pixel (fb,
|
||||||
|
calc_coord_offset (x_pos, x, point_size),
|
||||||
calc_coord_offset (y_pos, y, point_size),
|
calc_coord_offset (y_pos, y, point_size),
|
||||||
expected_pixel);
|
expected_pixel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_point_size (TestUtilsGTestFixture *fixture,
|
test_point_size (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
int fb_width = cogl_framebuffer_get_width (fb);
|
||||||
CoglContext *ctx = shared_state->ctx;
|
int fb_height = cogl_framebuffer_get_height (fb);
|
||||||
int fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
|
||||||
int fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
int point_size;
|
int point_size;
|
||||||
int x_pos;
|
int x_pos;
|
||||||
|
|
||||||
cogl_framebuffer_orthographic (shared_state->fb,
|
cogl_framebuffer_orthographic (fb,
|
||||||
0, 0, /* x_1, y_1 */
|
0, 0, /* x_1, y_1 */
|
||||||
fb_width, /* x_2 */
|
fb_width, /* x_2 */
|
||||||
fb_height /* y_2 */,
|
fb_height /* y_2 */,
|
||||||
-1, 100 /* near/far */);
|
-1, 100 /* near/far */);
|
||||||
|
|
||||||
cogl_framebuffer_clear4f (shared_state->fb,
|
cogl_framebuffer_clear4f (fb,
|
||||||
COGL_BUFFER_BIT_COLOR,
|
COGL_BUFFER_BIT_COLOR,
|
||||||
1.0f, 0.0f, 0.0f, 1.0f);
|
1.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|
||||||
@ -81,7 +79,7 @@ test_cogl_point_size (TestUtilsGTestFixture *fixture,
|
|||||||
|
|
||||||
cogl_pipeline_set_point_size (pipeline, point_size);
|
cogl_pipeline_set_point_size (pipeline, point_size);
|
||||||
cogl_pipeline_set_color4ub (pipeline, 0, 255, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline, 0, 255, 0, 255);
|
||||||
cogl_framebuffer_draw_primitive (shared_state->fb,
|
cogl_framebuffer_draw_primitive (fb,
|
||||||
pipeline,
|
pipeline,
|
||||||
prim);
|
prim);
|
||||||
|
|
||||||
@ -93,7 +91,7 @@ test_cogl_point_size (TestUtilsGTestFixture *fixture,
|
|||||||
for (x_pos = 0, point_size = MAX_POINT_SIZE;
|
for (x_pos = 0, point_size = MAX_POINT_SIZE;
|
||||||
point_size >= 4;
|
point_size >= 4;
|
||||||
x_pos += POINT_BOX_SIZE, point_size /= 2)
|
x_pos += POINT_BOX_SIZE, point_size /= 2)
|
||||||
verify_point_size (shared_state->fb,
|
verify_point_size (fb,
|
||||||
x_pos + POINT_BOX_SIZE / 2,
|
x_pos + POINT_BOX_SIZE / 2,
|
||||||
POINT_BOX_SIZE / 2,
|
POINT_BOX_SIZE / 2,
|
||||||
point_size);
|
point_size);
|
||||||
|
@ -19,26 +19,23 @@ tex_data[3 * 2 * 2] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_point_sprite (TestUtilsGTestFixture *fixture,
|
test_point_sprite (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
int fb_width = cogl_framebuffer_get_width (fb);
|
||||||
CoglContext *ctx = shared_state->ctx;
|
int fb_height = cogl_framebuffer_get_height (fb);
|
||||||
int fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
|
||||||
int fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
CoglPrimitive *prim;
|
CoglPrimitive *prim;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
CoglTexture2D *tex_2d;
|
CoglTexture2D *tex_2d;
|
||||||
CoglPipeline *pipeline, *solid_pipeline;
|
CoglPipeline *pipeline, *solid_pipeline;
|
||||||
gboolean res;
|
gboolean res;
|
||||||
|
|
||||||
cogl_framebuffer_orthographic (shared_state->fb,
|
cogl_framebuffer_orthographic (fb,
|
||||||
0, 0, /* x_1, y_1 */
|
0, 0, /* x_1, y_1 */
|
||||||
fb_width, /* x_2 */
|
fb_width, /* x_2 */
|
||||||
fb_height /* y_2 */,
|
fb_height /* y_2 */,
|
||||||
-1, 100 /* near/far */);
|
-1, 100 /* near/far */);
|
||||||
|
|
||||||
cogl_framebuffer_clear4f (shared_state->fb,
|
cogl_framebuffer_clear4f (fb,
|
||||||
COGL_BUFFER_BIT_COLOR,
|
COGL_BUFFER_BIT_COLOR,
|
||||||
1.0f, 1.0f, 1.0f, 1.0f);
|
1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
|
|
||||||
@ -75,7 +72,7 @@ test_cogl_point_sprite (TestUtilsGTestFixture *fixture,
|
|||||||
1, /* n_vertices */
|
1, /* n_vertices */
|
||||||
&point);
|
&point);
|
||||||
|
|
||||||
cogl_framebuffer_draw_primitive (shared_state->fb,
|
cogl_framebuffer_draw_primitive (fb,
|
||||||
pipeline,
|
pipeline,
|
||||||
prim);
|
prim);
|
||||||
|
|
||||||
@ -88,38 +85,43 @@ test_cogl_point_sprite (TestUtilsGTestFixture *fixture,
|
|||||||
/* enable */
|
/* enable */
|
||||||
FALSE,
|
FALSE,
|
||||||
&error);
|
&error);
|
||||||
cogl_framebuffer_push_matrix (shared_state->fb);
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_framebuffer_translate (shared_state->fb,
|
cogl_framebuffer_translate (fb,
|
||||||
POINT_SIZE * 2, /* x */
|
POINT_SIZE * 2, /* x */
|
||||||
0.0f, /* y */
|
0.0f, /* y */
|
||||||
0.0f /* z */);
|
0.0f /* z */);
|
||||||
cogl_framebuffer_draw_primitive (shared_state->fb,
|
cogl_framebuffer_draw_primitive (fb,
|
||||||
solid_pipeline,
|
solid_pipeline,
|
||||||
prim);
|
prim);
|
||||||
cogl_framebuffer_pop_matrix (shared_state->fb);
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
|
||||||
cogl_object_unref (prim);
|
cogl_object_unref (prim);
|
||||||
cogl_object_unref (solid_pipeline);
|
cogl_object_unref (solid_pipeline);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
cogl_object_unref (tex_2d);
|
cogl_object_unref (tex_2d);
|
||||||
|
|
||||||
test_utils_check_pixel (POINT_SIZE - POINT_SIZE / 4,
|
test_utils_check_pixel (fb,
|
||||||
|
POINT_SIZE - POINT_SIZE / 4,
|
||||||
POINT_SIZE - POINT_SIZE / 4,
|
POINT_SIZE - POINT_SIZE / 4,
|
||||||
0x0000ffff);
|
0x0000ffff);
|
||||||
test_utils_check_pixel (POINT_SIZE + POINT_SIZE / 4,
|
test_utils_check_pixel (fb,
|
||||||
|
POINT_SIZE + POINT_SIZE / 4,
|
||||||
POINT_SIZE - POINT_SIZE / 4,
|
POINT_SIZE - POINT_SIZE / 4,
|
||||||
0x00ff00ff);
|
0x00ff00ff);
|
||||||
test_utils_check_pixel (POINT_SIZE - POINT_SIZE / 4,
|
test_utils_check_pixel (fb,
|
||||||
|
POINT_SIZE - POINT_SIZE / 4,
|
||||||
POINT_SIZE + POINT_SIZE / 4,
|
POINT_SIZE + POINT_SIZE / 4,
|
||||||
0x00ffffff);
|
0x00ffffff);
|
||||||
test_utils_check_pixel (POINT_SIZE + POINT_SIZE / 4,
|
test_utils_check_pixel (fb,
|
||||||
|
POINT_SIZE + POINT_SIZE / 4,
|
||||||
POINT_SIZE + POINT_SIZE / 4,
|
POINT_SIZE + POINT_SIZE / 4,
|
||||||
0xff0000ff);
|
0xff0000ff);
|
||||||
|
|
||||||
/* When rendering without the point sprites all of the texture
|
/* When rendering without the point sprites all of the texture
|
||||||
coordinates should be 0,0 so it should get the top-left texel
|
coordinates should be 0,0 so it should get the top-left texel
|
||||||
which is blue */
|
which is blue */
|
||||||
test_utils_check_region (POINT_SIZE * 3 - POINT_SIZE / 2 + 1,
|
test_utils_check_region (fb,
|
||||||
|
POINT_SIZE * 3 - POINT_SIZE / 2 + 1,
|
||||||
POINT_SIZE - POINT_SIZE / 2 + 1,
|
POINT_SIZE - POINT_SIZE / 2 + 1,
|
||||||
POINT_SIZE - 2, POINT_SIZE - 2,
|
POINT_SIZE - 2, POINT_SIZE - 2,
|
||||||
0x0000ffff);
|
0x0000ffff);
|
||||||
|
@ -287,7 +287,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_premult (TestUtilsGTestFixture *fixture,
|
test_premult (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -6,10 +6,8 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
int fb_width;
|
int fb_width;
|
||||||
int fb_height;
|
int fb_height;
|
||||||
CoglFramebuffer *fb;
|
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
#define PRIM_COLOR 0xff00ffff
|
#define PRIM_COLOR 0xff00ffff
|
||||||
@ -178,7 +176,7 @@ test_paint (TestState *state)
|
|||||||
COGL_PIXEL_FORMAT_ANY,
|
COGL_PIXEL_FORMAT_ANY,
|
||||||
6, /* rowstride */
|
6, /* rowstride */
|
||||||
tex_data);
|
tex_data);
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_set_color4ub (pipeline,
|
cogl_pipeline_set_color4ub (pipeline,
|
||||||
(PRIM_COLOR >> 24) & 0xff,
|
(PRIM_COLOR >> 24) & 0xff,
|
||||||
(PRIM_COLOR >> 16) & 0xff,
|
(PRIM_COLOR >> 16) & 0xff,
|
||||||
@ -192,14 +190,14 @@ test_paint (TestState *state)
|
|||||||
CoglPrimitive *prim;
|
CoglPrimitive *prim;
|
||||||
guint32 expected_color = PRIM_COLOR;
|
guint32 expected_color = PRIM_COLOR;
|
||||||
|
|
||||||
prim = test_prim_funcs[i] (state->ctx, &expected_color);
|
prim = test_prim_funcs[i] (ctx, &expected_color);
|
||||||
|
|
||||||
cogl_push_matrix ();
|
cogl_framebuffer_push_matrix (fb);
|
||||||
cogl_translate (i * 10, 0, 0);
|
cogl_framebuffer_translate (fb, i * 10, 0, 0);
|
||||||
cogl_framebuffer_draw_primitive (state->fb, pipeline, prim);
|
cogl_framebuffer_draw_primitive (fb, pipeline, prim);
|
||||||
cogl_pop_matrix ();
|
cogl_framebuffer_pop_matrix (fb);
|
||||||
|
|
||||||
test_utils_check_pixel (i * 10 + 2, 2, expected_color);
|
test_utils_check_pixel (fb, i * 10 + 2, 2, expected_color);
|
||||||
|
|
||||||
cogl_object_unref (prim);
|
cogl_object_unref (prim);
|
||||||
}
|
}
|
||||||
@ -236,7 +234,7 @@ test_copy (TestState *state)
|
|||||||
{
|
{
|
||||||
static const guint16 indices_data[2] = { 1, 2 };
|
static const guint16 indices_data[2] = { 1, 2 };
|
||||||
CoglAttributeBuffer *buffer =
|
CoglAttributeBuffer *buffer =
|
||||||
cogl_attribute_buffer_new (state->ctx, 100, NULL);
|
cogl_attribute_buffer_new (ctx, 100, NULL);
|
||||||
CoglAttribute *attributes[N_ATTRIBS];
|
CoglAttribute *attributes[N_ATTRIBS];
|
||||||
CoglAttribute *attributes_a[N_ATTRIBS], *attributes_b[N_ATTRIBS];
|
CoglAttribute *attributes_a[N_ATTRIBS], *attributes_b[N_ATTRIBS];
|
||||||
CoglAttribute **p;
|
CoglAttribute **p;
|
||||||
@ -261,7 +259,7 @@ test_copy (TestState *state)
|
|||||||
attributes,
|
attributes,
|
||||||
N_ATTRIBS);
|
N_ATTRIBS);
|
||||||
|
|
||||||
indices = cogl_indices_new (state->ctx,
|
indices = cogl_indices_new (ctx,
|
||||||
COGL_INDICES_TYPE_UNSIGNED_SHORT,
|
COGL_INDICES_TYPE_UNSIGNED_SHORT,
|
||||||
indices_data,
|
indices_data,
|
||||||
2 /* n_indices */);
|
2 /* n_indices */);
|
||||||
@ -314,20 +312,19 @@ test_copy (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_primitive (TestUtilsGTestFixture *fixture,
|
test_primitive (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
state.fb_width = cogl_framebuffer_get_width (fb);
|
||||||
state.fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
state.fb_height = cogl_framebuffer_get_height (fb);
|
||||||
state.fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
state.fb = shared_state->fb;
|
|
||||||
|
|
||||||
cogl_ortho (0, state.fb_width, /* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
state.fb_height, 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
state.fb_width,
|
||||||
|
state.fb_height,
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
test_paint (&state);
|
test_paint (&state);
|
||||||
test_copy (&state);
|
test_copy (&state);
|
||||||
|
@ -142,13 +142,11 @@ test_read_int (CoglTexture2D *tex_2d,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_read_texture_formats (TestUtilsGTestFixture *fixture,
|
test_read_texture_formats (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
CoglTexture2D *tex_2d;
|
CoglTexture2D *tex_2d;
|
||||||
|
|
||||||
tex_2d = cogl_texture_2d_new_from_data (shared_state->ctx,
|
tex_2d = cogl_texture_2d_new_from_data (ctx,
|
||||||
1, 1, /* width / height */
|
1, 1, /* width / height */
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
|
@ -147,7 +147,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_readpixels (TestUtilsGTestFixture *fixture,
|
test_readpixels (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
unsigned int idle_source;
|
unsigned int idle_source;
|
||||||
|
@ -6,8 +6,7 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
int padding;
|
||||||
CoglFramebuffer *fb;
|
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
typedef void (* SnippetTestFunc) (TestState *state);
|
typedef void (* SnippetTestFunc) (TestState *state);
|
||||||
@ -16,7 +15,7 @@ static CoglPipeline *
|
|||||||
create_texture_pipeline (TestState *state)
|
create_texture_pipeline (TestState *state)
|
||||||
{
|
{
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
CoglHandle tex;
|
CoglTexture *tex;
|
||||||
static const guint8 tex_data[] =
|
static const guint8 tex_data[] =
|
||||||
{
|
{
|
||||||
0xff, 0x00, 0x00, 0xff, /* red */ 0x00, 0xff, 0x00, 0xff, /* green */
|
0xff, 0x00, 0x00, 0xff, /* red */ 0x00, 0xff, 0x00, 0xff, /* green */
|
||||||
@ -30,7 +29,7 @@ create_texture_pipeline (TestState *state)
|
|||||||
8, /* rowstride */
|
8, /* rowstride */
|
||||||
tex_data);
|
tex_data);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, tex);
|
cogl_pipeline_set_layer_texture (pipeline, 0, tex);
|
||||||
|
|
||||||
@ -38,7 +37,7 @@ create_texture_pipeline (TestState *state)
|
|||||||
COGL_PIPELINE_FILTER_NEAREST,
|
COGL_PIPELINE_FILTER_NEAREST,
|
||||||
COGL_PIPELINE_FILTER_NEAREST);
|
COGL_PIPELINE_FILTER_NEAREST);
|
||||||
|
|
||||||
cogl_handle_unref (tex);
|
cogl_object_unref (tex);
|
||||||
|
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}
|
}
|
||||||
@ -50,7 +49,7 @@ simple_fragment_snippet (TestState *state)
|
|||||||
CoglSnippet *snippet;
|
CoglSnippet *snippet;
|
||||||
|
|
||||||
/* Simple fragment snippet */
|
/* Simple fragment snippet */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 255, 0, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline, 255, 0, 0, 255);
|
||||||
|
|
||||||
@ -60,13 +59,11 @@ simple_fragment_snippet (TestState *state)
|
|||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 0, 0, 10, 10);
|
||||||
cogl_rectangle (0, 0, 10, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (5, 5, 0xffff00ff);
|
test_utils_check_pixel (fb, 5, 5, 0xffff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -76,7 +73,7 @@ simple_vertex_snippet (TestState *state)
|
|||||||
CoglSnippet *snippet;
|
CoglSnippet *snippet;
|
||||||
|
|
||||||
/* Simple vertex snippet */
|
/* Simple vertex snippet */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 255, 0, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline, 255, 0, 0, 255);
|
||||||
|
|
||||||
@ -86,13 +83,11 @@ simple_vertex_snippet (TestState *state)
|
|||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 10, 0, 20, 10);
|
||||||
cogl_rectangle (10, 0, 20, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (15, 5, 0xff00ffff);
|
test_utils_check_pixel (fb, 15, 5, 0xff00ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -104,7 +99,7 @@ shared_uniform (TestState *state)
|
|||||||
|
|
||||||
/* Snippets sharing a uniform across the vertex and fragment
|
/* Snippets sharing a uniform across the vertex and fragment
|
||||||
hooks */
|
hooks */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
location = cogl_pipeline_get_uniform_location (pipeline, "a_value");
|
location = cogl_pipeline_get_uniform_location (pipeline, "a_value");
|
||||||
cogl_pipeline_set_uniform_1f (pipeline, location, 0.25f);
|
cogl_pipeline_set_uniform_1f (pipeline, location, 0.25f);
|
||||||
@ -122,13 +117,13 @@ shared_uniform (TestState *state)
|
|||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb,
|
||||||
cogl_rectangle (20, 0, 30, 10);
|
pipeline,
|
||||||
cogl_pop_source ();
|
20, 0, 30, 10);
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (25, 5, 0xff0080ff);
|
test_utils_check_pixel (fb, 25, 5, 0xff0080ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -140,7 +135,7 @@ lots_snippets (TestState *state)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Lots of snippets on one pipeline */
|
/* Lots of snippets on one pipeline */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 0, 0, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline, 0, 0, 0, 255);
|
||||||
|
|
||||||
@ -168,13 +163,11 @@ lots_snippets (TestState *state)
|
|||||||
g_free (declarations);
|
g_free (declarations);
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 30, 0, 40, 10);
|
||||||
cogl_rectangle (30, 0, 40, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (35, 5, 0x19334cff);
|
test_utils_check_pixel (fb, 35, 5, 0x19334cff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -185,7 +178,7 @@ shared_variable_pre_post (TestState *state)
|
|||||||
|
|
||||||
/* Test that the pre string can declare variables used by the post
|
/* Test that the pre string can declare variables used by the post
|
||||||
string */
|
string */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 255, 255, 255, 255);
|
cogl_pipeline_set_color4ub (pipeline, 255, 255, 255, 255);
|
||||||
|
|
||||||
@ -196,13 +189,11 @@ shared_variable_pre_post (TestState *state)
|
|||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 40, 0, 50, 10);
|
||||||
cogl_rectangle (40, 0, 50, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (45, 5, 0xff0000ff);
|
test_utils_check_pixel (fb, 45, 5, 0xff0000ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -223,24 +214,20 @@ test_pipeline_caching (TestState *state)
|
|||||||
" unrelated pipelines */",
|
" unrelated pipelines */",
|
||||||
"cogl_color_out = vec4 (0.0, 1.0, 0.0, 1.0);\n");
|
"cogl_color_out = vec4 (0.0, 1.0, 0.0, 1.0);\n");
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 50, 0, 60, 10);
|
||||||
cogl_rectangle (50, 0, 60, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 60, 0, 70, 10);
|
||||||
cogl_rectangle (60, 0, 70, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
test_utils_check_pixel (55, 5, 0x00ff00ff);
|
test_utils_check_pixel (fb, 55, 5, 0x00ff00ff);
|
||||||
test_utils_check_pixel (65, 5, 0x00ff00ff);
|
test_utils_check_pixel (fb, 65, 5, 0x00ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -260,16 +247,14 @@ test_replace_string (TestState *state)
|
|||||||
cogl_snippet_set_post (snippet,
|
cogl_snippet_set_post (snippet,
|
||||||
"cogl_color_out += vec4 (0.5, 0.0, 0.0, 1.0);");
|
"cogl_color_out += vec4 (0.5, 0.0, 0.0, 1.0);");
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 70, 0, 80, 10);
|
||||||
cogl_rectangle (70, 0, 80, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
test_utils_check_pixel (75, 5, 0x808000ff);
|
test_utils_check_pixel (fb, 75, 5, 0x808000ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -288,15 +273,15 @@ test_texture_lookup_hook (TestState *state)
|
|||||||
|
|
||||||
pipeline = create_texture_pipeline (state);
|
pipeline = create_texture_pipeline (state);
|
||||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (80, 0, 90, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
80, 0, 90, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
test_utils_check_pixel (85, 5, 0x00ffffff);
|
test_utils_check_pixel (fb, 85, 5, 0x00ffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -317,14 +302,12 @@ test_multiple_samples (TestState *state)
|
|||||||
|
|
||||||
pipeline = create_texture_pipeline (state);
|
pipeline = create_texture_pipeline (state);
|
||||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 0, 0, 10, 10);
|
||||||
cogl_rectangle (0, 0, 10, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
test_utils_check_pixel (5, 5, 0xffff00ff);
|
test_utils_check_pixel (fb, 5, 5, 0xffff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -339,15 +322,15 @@ test_replace_lookup_hook (TestState *state)
|
|||||||
|
|
||||||
pipeline = create_texture_pipeline (state);
|
pipeline = create_texture_pipeline (state);
|
||||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (90, 0, 100, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
90, 0, 100, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
test_utils_check_pixel (95, 5, 0x0000ffff);
|
test_utils_check_pixel (fb, 95, 5, 0x0000ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -372,13 +355,13 @@ test_replace_snippet (TestState *state)
|
|||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (100, 0, 110, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
100, 0, 110, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (105, 5, 0xff0000ff);
|
test_utils_check_pixel (fb, 105, 5, 0xff0000ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -404,13 +387,13 @@ test_replace_fragment_layer (TestState *state)
|
|||||||
"A = REPLACE(PREVIOUS)",
|
"A = REPLACE(PREVIOUS)",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (110, 0, 120, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
110, 0, 120, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (115, 5, 0xff00ffff);
|
test_utils_check_pixel (fb, 115, 5, 0xff00ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -420,7 +403,7 @@ test_modify_fragment_layer (TestState *state)
|
|||||||
CoglSnippet *snippet;
|
CoglSnippet *snippet;
|
||||||
|
|
||||||
/* Test modifying the fragment layer code */
|
/* Test modifying the fragment layer code */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_uniform_1f (pipeline,
|
cogl_pipeline_set_uniform_1f (pipeline,
|
||||||
cogl_pipeline_get_uniform_location (pipeline,
|
cogl_pipeline_get_uniform_location (pipeline,
|
||||||
@ -433,13 +416,13 @@ test_modify_fragment_layer (TestState *state)
|
|||||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (120, 0, 130, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
120, 0, 130, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (125, 5, 0xff80ffff);
|
test_utils_check_pixel (fb, 125, 5, 0xff80ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -462,13 +445,13 @@ test_modify_vertex_layer (TestState *state)
|
|||||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (130, 0, 140, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
130, 0, 140, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (135, 5, 0xffff00ff);
|
test_utils_check_pixel (fb, 135, 5, 0xffff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -492,13 +475,13 @@ test_replace_vertex_layer (TestState *state)
|
|||||||
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
cogl_pipeline_add_layer_snippet (pipeline, 0, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
cogl_rectangle_with_texture_coords (140, 0, 150, 10,
|
pipeline,
|
||||||
0, 0, 0, 0);
|
140, 0, 150, 10,
|
||||||
cogl_pop_source ();
|
0, 0, 0, 0);
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (145, 5, 0x00ff00ff);
|
test_utils_check_pixel (fb, 145, 5, 0x00ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -514,7 +497,7 @@ test_vertex_transform_hook (TestState *state)
|
|||||||
|
|
||||||
cogl_matrix_init_identity (&identity_matrix);
|
cogl_matrix_init_identity (&identity_matrix);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 255, 0, 255, 255);
|
cogl_pipeline_set_color4ub (pipeline, 255, 0, 255, 255);
|
||||||
|
|
||||||
@ -527,7 +510,7 @@ test_vertex_transform_hook (TestState *state)
|
|||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
/* Copy the current projection matrix to a uniform */
|
/* Copy the current projection matrix to a uniform */
|
||||||
cogl_get_projection_matrix (&matrix);
|
cogl_framebuffer_get_projection_matrix (fb, &matrix);
|
||||||
location = cogl_pipeline_get_uniform_location (pipeline, "pmat");
|
location = cogl_pipeline_get_uniform_location (pipeline, "pmat");
|
||||||
cogl_pipeline_set_uniform_matrix (pipeline,
|
cogl_pipeline_set_uniform_matrix (pipeline,
|
||||||
location,
|
location,
|
||||||
@ -538,17 +521,15 @@ test_vertex_transform_hook (TestState *state)
|
|||||||
|
|
||||||
/* Replace the real projection matrix with the identity. This should
|
/* Replace the real projection matrix with the identity. This should
|
||||||
mess up the drawing unless the snippet replacement is working */
|
mess up the drawing unless the snippet replacement is working */
|
||||||
cogl_set_projection_matrix (&identity_matrix);
|
cogl_framebuffer_set_projection_matrix (fb, &identity_matrix);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 150, 0, 160, 10);
|
||||||
cogl_rectangle (150, 0, 160, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
/* Restore the projection matrix */
|
/* Restore the projection matrix */
|
||||||
cogl_set_projection_matrix (&matrix);
|
cogl_framebuffer_set_projection_matrix (fb, &matrix);
|
||||||
|
|
||||||
test_utils_check_pixel (155, 5, 0xff00ffff);
|
test_utils_check_pixel (fb, 155, 5, 0xff00ffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -564,7 +545,7 @@ test_snippet_order (TestState *state)
|
|||||||
sections in the same order as they were added. Therefore the r
|
sections in the same order as they were added. Therefore the r
|
||||||
component should be taken from the the second snippet and the g
|
component should be taken from the the second snippet and the g
|
||||||
component from the first */
|
component from the first */
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_color4ub (pipeline, 0, 0, 0, 255);
|
cogl_pipeline_set_color4ub (pipeline, 0, 0, 0, 255);
|
||||||
|
|
||||||
@ -583,12 +564,10 @@ test_snippet_order (TestState *state)
|
|||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 160, 0, 170, 10);
|
||||||
cogl_rectangle (160, 0, 170, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
|
|
||||||
test_utils_check_pixel (165, 5, 0x80ff00ff);
|
test_utils_check_pixel (fb, 165, 5, 0x80ff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -609,26 +588,24 @@ test_naming_texture_units (TestState *state)
|
|||||||
"texture2D (cogl_sampler100, vec2 (0.0, 0.0)) + "
|
"texture2D (cogl_sampler100, vec2 (0.0, 0.0)) + "
|
||||||
"texture2D (cogl_sampler200, vec2 (0.0, 0.0));");
|
"texture2D (cogl_sampler200, vec2 (0.0, 0.0));");
|
||||||
|
|
||||||
tex1 = test_utils_create_color_texture (state->ctx, 0xff0000ff);
|
tex1 = test_utils_create_color_texture (ctx, 0xff0000ff);
|
||||||
tex2 = test_utils_create_color_texture (state->ctx, 0x00ff00ff);
|
tex2 = test_utils_create_color_texture (ctx, 0x00ff00ff);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 100, tex1);
|
cogl_pipeline_set_layer_texture (pipeline, 100, tex1);
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 200, tex2);
|
cogl_pipeline_set_layer_texture (pipeline, 200, tex2);
|
||||||
|
|
||||||
cogl_pipeline_add_snippet (pipeline, snippet);
|
cogl_pipeline_add_snippet (pipeline, snippet);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 0, 0, 10, 10);
|
||||||
cogl_rectangle (0, 0, 10, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
cogl_object_unref (snippet);
|
cogl_object_unref (snippet);
|
||||||
cogl_object_unref (tex1);
|
cogl_object_unref (tex1);
|
||||||
cogl_object_unref (tex2);
|
cogl_object_unref (tex2);
|
||||||
|
|
||||||
test_utils_check_pixel (5, 5, 0xffff00ff);
|
test_utils_check_pixel (fb, 5, 5, 0xffff00ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -703,7 +680,7 @@ run_tests (TestState *state)
|
|||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (tests); i++)
|
for (i = 0; i < G_N_ELEMENTS (tests); i++)
|
||||||
{
|
{
|
||||||
cogl_framebuffer_clear4f (state->fb,
|
cogl_framebuffer_clear4f (fb,
|
||||||
COGL_BUFFER_BIT_COLOR,
|
COGL_BUFFER_BIT_COLOR,
|
||||||
0, 0, 0, 1);
|
0, 0, 0, 1);
|
||||||
|
|
||||||
@ -712,25 +689,19 @@ run_tests (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_snippets (TestUtilsGTestFixture *fixture,
|
test_snippets (void)
|
||||||
void *user_data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = user_data;
|
|
||||||
|
|
||||||
/* If shaders aren't supported then we can't run the test */
|
/* If shaders aren't supported then we can't run the test */
|
||||||
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
if (cogl_features_available (COGL_FEATURE_SHADERS_GLSL))
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
cogl_framebuffer_orthographic (fb,
|
||||||
state.fb = shared_state->fb;
|
0, 0,
|
||||||
|
cogl_framebuffer_get_width (fb),
|
||||||
cogl_ortho (/* left, right */
|
cogl_framebuffer_get_height (fb),
|
||||||
0, cogl_framebuffer_get_width (shared_state->fb),
|
-1,
|
||||||
/* bottom, top */
|
100);
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0,
|
|
||||||
/* z near, far */
|
|
||||||
-1, 100);
|
|
||||||
|
|
||||||
run_tests (&state);
|
run_tests (&state);
|
||||||
|
|
||||||
|
@ -5,10 +5,8 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
int fb_width;
|
int fb_width;
|
||||||
int fb_height;
|
int fb_height;
|
||||||
CoglFramebuffer *fb;
|
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -17,17 +15,17 @@ test_sparse_layer_combine (TestState *state)
|
|||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
CoglTexture *tex1, *tex2;
|
CoglTexture *tex1, *tex2;
|
||||||
|
|
||||||
cogl_framebuffer_clear4f (state->fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
||||||
|
|
||||||
/* This tests that the TEXTURE_* numbers used in the layer combine
|
/* This tests that the TEXTURE_* numbers used in the layer combine
|
||||||
string refer to the layer number rather than the unit numbers by
|
string refer to the layer number rather than the unit numbers by
|
||||||
creating a pipeline with very large layer numbers. This should
|
creating a pipeline with very large layer numbers. This should
|
||||||
end up being mapped to much smaller unit numbers */
|
end up being mapped to much smaller unit numbers */
|
||||||
|
|
||||||
tex1 = test_utils_create_color_texture (state->ctx, 0xff0000ff);
|
tex1 = test_utils_create_color_texture (ctx, 0xff0000ff);
|
||||||
tex2 = test_utils_create_color_texture (state->ctx, 0x00ff00ff);
|
tex2 = test_utils_create_color_texture (ctx, 0x00ff00ff);
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 50, tex1);
|
cogl_pipeline_set_layer_texture (pipeline, 50, tex1);
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 100, tex2);
|
cogl_pipeline_set_layer_texture (pipeline, 100, tex2);
|
||||||
@ -35,11 +33,9 @@ test_sparse_layer_combine (TestState *state)
|
|||||||
"RGBA = ADD(TEXTURE_50, TEXTURE_100)",
|
"RGBA = ADD(TEXTURE_50, TEXTURE_100)",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, -1, -1, 1, 1);
|
||||||
cogl_rectangle (-1, -1, 1, 1);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
test_utils_check_pixel (2, 2, 0xffff00ff);
|
test_utils_check_pixel (fb, 2, 2, 0xffff00ff);
|
||||||
|
|
||||||
cogl_object_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
cogl_object_unref (tex1);
|
cogl_object_unref (tex1);
|
||||||
@ -47,16 +43,12 @@ test_sparse_layer_combine (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_sparse_pipeline (TestUtilsGTestFixture *fixture,
|
test_sparse_pipeline (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
state.fb_width = cogl_framebuffer_get_width (fb);
|
||||||
state.fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
state.fb_height = cogl_framebuffer_get_height (fb);
|
||||||
state.fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
state.fb = shared_state->fb;
|
|
||||||
|
|
||||||
test_sparse_layer_combine (&state);
|
test_sparse_layer_combine (&state);
|
||||||
|
|
||||||
|
@ -22,7 +22,6 @@ corner_colors[SOURCE_DIVISIONS_X * SOURCE_DIVISIONS_Y] =
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
CoglTexture2D *tex;
|
CoglTexture2D *tex;
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
@ -56,7 +55,7 @@ create_source (TestState *state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tex = cogl_texture_2d_new_from_data (state->ctx,
|
tex = cogl_texture_2d_new_from_data (ctx,
|
||||||
SOURCE_SIZE, SOURCE_SIZE,
|
SOURCE_SIZE, SOURCE_SIZE,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||||
COGL_PIXEL_FORMAT_ANY,
|
COGL_PIXEL_FORMAT_ANY,
|
||||||
@ -88,7 +87,7 @@ create_test_texture (TestState *state)
|
|||||||
*(p++) = 255;
|
*(p++) = 255;
|
||||||
}
|
}
|
||||||
|
|
||||||
tex = cogl_texture_2d_new_from_data (state->ctx,
|
tex = cogl_texture_2d_new_from_data (ctx,
|
||||||
256, 256,
|
256, 256,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
COGL_PIXEL_FORMAT_ANY,
|
COGL_PIXEL_FORMAT_ANY,
|
||||||
@ -107,9 +106,10 @@ paint (TestState *state)
|
|||||||
{
|
{
|
||||||
CoglTexture2D *full_texture;
|
CoglTexture2D *full_texture;
|
||||||
CoglSubTexture *sub_texture, *sub_sub_texture;
|
CoglSubTexture *sub_texture, *sub_sub_texture;
|
||||||
|
CoglPipeline *pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
/* Create a sub texture of the bottom right quarter of the texture */
|
/* Create a sub texture of the bottom right quarter of the texture */
|
||||||
sub_texture = cogl_sub_texture_new (state->ctx,
|
sub_texture = cogl_sub_texture_new (ctx,
|
||||||
COGL_TEXTURE (state->tex),
|
COGL_TEXTURE (state->tex),
|
||||||
DIVISION_WIDTH,
|
DIVISION_WIDTH,
|
||||||
DIVISION_HEIGHT,
|
DIVISION_HEIGHT,
|
||||||
@ -117,40 +117,47 @@ paint (TestState *state)
|
|||||||
DIVISION_HEIGHT);
|
DIVISION_HEIGHT);
|
||||||
|
|
||||||
/* Paint it */
|
/* Paint it */
|
||||||
cogl_set_source_texture (COGL_TEXTURE (sub_texture));
|
cogl_pipeline_set_layer_texture (pipeline, 0, COGL_TEXTURE (sub_texture));
|
||||||
cogl_rectangle (0.0f, 0.0f, DIVISION_WIDTH, DIVISION_HEIGHT);
|
|
||||||
|
|
||||||
cogl_object_unref (sub_texture);
|
cogl_object_unref (sub_texture);
|
||||||
|
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||||
|
0.0f, 0.0f, DIVISION_WIDTH, DIVISION_HEIGHT);
|
||||||
|
|
||||||
|
|
||||||
/* Repeat a sub texture of the top half of the full texture. This is
|
/* Repeat a sub texture of the top half of the full texture. This is
|
||||||
documented to be undefined so it doesn't technically have to work
|
documented to be undefined so it doesn't technically have to work
|
||||||
but it will with the current implementation */
|
but it will with the current implementation */
|
||||||
sub_texture = cogl_sub_texture_new (state->ctx,
|
sub_texture = cogl_sub_texture_new (ctx,
|
||||||
COGL_TEXTURE (state->tex),
|
COGL_TEXTURE (state->tex),
|
||||||
0, 0,
|
0, 0,
|
||||||
SOURCE_SIZE,
|
SOURCE_SIZE,
|
||||||
DIVISION_HEIGHT);
|
DIVISION_HEIGHT);
|
||||||
cogl_set_source_texture (COGL_TEXTURE (sub_texture));
|
cogl_pipeline_set_layer_texture (pipeline, 0, COGL_TEXTURE (sub_texture));
|
||||||
cogl_rectangle_with_texture_coords (0.0f, SOURCE_SIZE,
|
|
||||||
SOURCE_SIZE * 2.0f, SOURCE_SIZE * 1.5f,
|
|
||||||
0.0f, 0.0f,
|
|
||||||
2.0f, 1.0f);
|
|
||||||
cogl_object_unref (sub_texture);
|
cogl_object_unref (sub_texture);
|
||||||
|
cogl_framebuffer_draw_textured_rectangle (fb, pipeline,
|
||||||
|
0.0f,
|
||||||
|
SOURCE_SIZE,
|
||||||
|
SOURCE_SIZE * 2.0f,
|
||||||
|
SOURCE_SIZE * 1.5f,
|
||||||
|
0.0f, 0.0f,
|
||||||
|
2.0f, 1.0f);
|
||||||
|
|
||||||
/* Create a sub texture of a sub texture */
|
/* Create a sub texture of a sub texture */
|
||||||
full_texture = create_test_texture (state);
|
full_texture = create_test_texture (state);
|
||||||
sub_texture = cogl_sub_texture_new (state->ctx,
|
sub_texture = cogl_sub_texture_new (ctx,
|
||||||
COGL_TEXTURE (full_texture),
|
COGL_TEXTURE (full_texture),
|
||||||
20, 10, 30, 20);
|
20, 10, 30, 20);
|
||||||
sub_sub_texture = cogl_sub_texture_new (state->ctx,
|
cogl_object_unref (full_texture);
|
||||||
|
sub_sub_texture = cogl_sub_texture_new (ctx,
|
||||||
COGL_TEXTURE (sub_texture),
|
COGL_TEXTURE (sub_texture),
|
||||||
20, 10, 10, 10);
|
20, 10, 10, 10);
|
||||||
cogl_set_source_texture (COGL_TEXTURE (sub_sub_texture));
|
|
||||||
cogl_rectangle (0.0f, SOURCE_SIZE * 2.0f,
|
|
||||||
10.0f, SOURCE_SIZE * 2.0f + 10.0f);
|
|
||||||
cogl_object_unref (sub_sub_texture);
|
|
||||||
cogl_object_unref (sub_texture);
|
cogl_object_unref (sub_texture);
|
||||||
cogl_object_unref (full_texture);
|
cogl_pipeline_set_layer_texture (pipeline, 0, COGL_TEXTURE (sub_sub_texture));
|
||||||
|
cogl_object_unref (sub_sub_texture);
|
||||||
|
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
||||||
|
0.0f, SOURCE_SIZE * 2.0f,
|
||||||
|
10.0f, SOURCE_SIZE * 2.0f + 10.0f);
|
||||||
|
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -158,7 +165,8 @@ validate_part (int xpos, int ypos,
|
|||||||
int width, int height,
|
int width, int height,
|
||||||
guint32 color)
|
guint32 color)
|
||||||
{
|
{
|
||||||
test_utils_check_region (xpos + TEST_INSET,
|
test_utils_check_region (fb,
|
||||||
|
xpos + TEST_INSET,
|
||||||
ypos + TEST_INSET,
|
ypos + TEST_INSET,
|
||||||
width - TEST_INSET - 2,
|
width - TEST_INSET - 2,
|
||||||
height - TEST_INSET - 2,
|
height - TEST_INSET - 2,
|
||||||
@ -212,10 +220,11 @@ validate_result (TestState *state)
|
|||||||
|
|
||||||
/* Sub sub texture */
|
/* Sub sub texture */
|
||||||
p = texture_data = g_malloc (10 * 10 * 4);
|
p = texture_data = g_malloc (10 * 10 * 4);
|
||||||
cogl_read_pixels (0, SOURCE_SIZE * 2, 10, 10,
|
cogl_flush ();
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
cogl_framebuffer_read_pixels (fb,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
0, SOURCE_SIZE * 2, 10, 10,
|
||||||
p);
|
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||||
|
p);
|
||||||
for (y = 0; y < 10; y++)
|
for (y = 0; y < 10; y++)
|
||||||
for (x = 0; x < 10; x++)
|
for (x = 0; x < 10; x++)
|
||||||
{
|
{
|
||||||
@ -226,7 +235,7 @@ validate_result (TestState *state)
|
|||||||
g_free (texture_data);
|
g_free (texture_data);
|
||||||
|
|
||||||
/* Try reading back the texture data */
|
/* Try reading back the texture data */
|
||||||
sub_texture = cogl_sub_texture_new (state->ctx,
|
sub_texture = cogl_sub_texture_new (ctx,
|
||||||
COGL_TEXTURE (state->tex),
|
COGL_TEXTURE (state->tex),
|
||||||
SOURCE_SIZE / 4,
|
SOURCE_SIZE / 4,
|
||||||
SOURCE_SIZE / 4,
|
SOURCE_SIZE / 4,
|
||||||
@ -257,7 +266,7 @@ validate_result (TestState *state)
|
|||||||
/* Create a 256x256 test texture */
|
/* Create a 256x256 test texture */
|
||||||
test_tex = create_test_texture (state);
|
test_tex = create_test_texture (state);
|
||||||
/* Create a sub texture the views the center half of the texture */
|
/* Create a sub texture the views the center half of the texture */
|
||||||
sub_texture = cogl_sub_texture_new (state->ctx,
|
sub_texture = cogl_sub_texture_new (ctx,
|
||||||
COGL_TEXTURE (test_tex),
|
COGL_TEXTURE (test_tex),
|
||||||
64, 64, 128, 128);
|
64, 64, 128, 128);
|
||||||
/* Update the center half of the sub texture */
|
/* Update the center half of the sub texture */
|
||||||
@ -299,18 +308,18 @@ validate_result (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_sub_texture (TestUtilsGTestFixture *fixture,
|
test_sub_texture (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
|
||||||
state.tex = create_source (&state);
|
state.tex = create_source (&state);
|
||||||
|
|
||||||
cogl_ortho (0, cogl_framebuffer_get_width (shared_state->fb), /* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
cogl_framebuffer_get_height (shared_state->fb), 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
cogl_framebuffer_get_width (fb),
|
||||||
|
cogl_framebuffer_get_height (fb),
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
paint (&state);
|
paint (&state);
|
||||||
validate_result (&state);
|
validate_result (&state);
|
||||||
|
@ -13,10 +13,8 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
int fb_width;
|
int fb_width;
|
||||||
int fb_height;
|
int fb_height;
|
||||||
CoglFramebuffer *fb;
|
|
||||||
} TestState;
|
} TestState;
|
||||||
|
|
||||||
static CoglTexture3D *
|
static CoglTexture3D *
|
||||||
@ -75,8 +73,8 @@ create_texture_3d (CoglContext *context)
|
|||||||
static void
|
static void
|
||||||
draw_frame (TestState *state)
|
draw_frame (TestState *state)
|
||||||
{
|
{
|
||||||
CoglTexture *tex = COGL_TEXTURE (create_texture_3d (state->ctx));
|
CoglTexture *tex = COGL_TEXTURE (create_texture_3d (ctx));
|
||||||
CoglPipeline *pipeline = cogl_pipeline_new (state->ctx);
|
CoglPipeline *pipeline = cogl_pipeline_new (ctx);
|
||||||
typedef struct { float x, y, s, t, r; } Vert;
|
typedef struct { float x, y, s, t, r; } Vert;
|
||||||
CoglPrimitive *primitive;
|
CoglPrimitive *primitive;
|
||||||
CoglAttributeBuffer *attribute_buffer;
|
CoglAttributeBuffer *attribute_buffer;
|
||||||
@ -89,15 +87,13 @@ draw_frame (TestState *state)
|
|||||||
cogl_pipeline_set_layer_filters (pipeline, 0,
|
cogl_pipeline_set_layer_filters (pipeline, 0,
|
||||||
COGL_PIPELINE_FILTER_NEAREST,
|
COGL_PIPELINE_FILTER_NEAREST,
|
||||||
COGL_PIPELINE_FILTER_NEAREST);
|
COGL_PIPELINE_FILTER_NEAREST);
|
||||||
cogl_push_source (pipeline);
|
|
||||||
|
|
||||||
/* Render the texture repeated horizontally twice using a regular
|
/* Render the texture repeated horizontally twice using a regular
|
||||||
cogl rectangle. This should end up with the r texture coordinates
|
cogl rectangle. This should end up with the r texture coordinates
|
||||||
as zero */
|
as zero */
|
||||||
cogl_rectangle_with_texture_coords (0.0f, 0.0f, TEX_WIDTH * 2, TEX_HEIGHT,
|
cogl_framebuffer_draw_textured_rectangle (fb, pipeline,
|
||||||
0.0f, 0.0f, 2.0f, 1.0f);
|
0.0f, 0.0f, TEX_WIDTH * 2, TEX_HEIGHT,
|
||||||
|
0.0f, 0.0f, 2.0f, 1.0f);
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
/* Render all of the images in the texture using coordinates from a
|
/* Render all of the images in the texture using coordinates from a
|
||||||
CoglPrimitive */
|
CoglPrimitive */
|
||||||
@ -135,7 +131,7 @@ draw_frame (TestState *state)
|
|||||||
v++;
|
v++;
|
||||||
}
|
}
|
||||||
|
|
||||||
attribute_buffer = cogl_attribute_buffer_new (state->ctx,
|
attribute_buffer = cogl_attribute_buffer_new (ctx,
|
||||||
4 * TEX_DEPTH * sizeof (Vert),
|
4 * TEX_DEPTH * sizeof (Vert),
|
||||||
verts);
|
verts);
|
||||||
attributes[0] = cogl_attribute_new (attribute_buffer,
|
attributes[0] = cogl_attribute_new (attribute_buffer,
|
||||||
@ -156,11 +152,11 @@ draw_frame (TestState *state)
|
|||||||
2 /* n_attributes */);
|
2 /* n_attributes */);
|
||||||
|
|
||||||
cogl_primitive_set_indices (primitive,
|
cogl_primitive_set_indices (primitive,
|
||||||
cogl_get_rectangle_indices (state->ctx,
|
cogl_get_rectangle_indices (ctx,
|
||||||
TEX_DEPTH),
|
TEX_DEPTH),
|
||||||
6 * TEX_DEPTH);
|
6 * TEX_DEPTH);
|
||||||
|
|
||||||
cogl_framebuffer_draw_primitive (state->fb, pipeline, primitive);
|
cogl_framebuffer_draw_primitive (fb, pipeline, primitive);
|
||||||
|
|
||||||
g_free (verts);
|
g_free (verts);
|
||||||
|
|
||||||
@ -178,7 +174,8 @@ validate_block (int block_x, int block_y, int z)
|
|||||||
|
|
||||||
for (y = 0; y < TEX_HEIGHT; y++)
|
for (y = 0; y < TEX_HEIGHT; y++)
|
||||||
for (x = 0; x < TEX_WIDTH; x++)
|
for (x = 0; x < TEX_WIDTH; x++)
|
||||||
test_utils_check_pixel_rgb (block_x * TEX_WIDTH + x,
|
test_utils_check_pixel_rgb (fb,
|
||||||
|
block_x * TEX_WIDTH + x,
|
||||||
block_y * TEX_HEIGHT + y,
|
block_y * TEX_HEIGHT + y,
|
||||||
255 - x * 8,
|
255 - x * 8,
|
||||||
y * 8,
|
y * 8,
|
||||||
@ -204,20 +201,20 @@ test_multi_texture (TestState *state)
|
|||||||
CoglTexture2D *tex_2d;
|
CoglTexture2D *tex_2d;
|
||||||
guint8 tex_data[4];
|
guint8 tex_data[4];
|
||||||
|
|
||||||
cogl_framebuffer_clear4f (state->fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
cogl_framebuffer_clear4f (fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
||||||
|
|
||||||
/* Tests a pipeline that is using multi-texturing to combine a 3D
|
/* Tests a pipeline that is using multi-texturing to combine a 3D
|
||||||
texture with a 2D texture. The texture from another layer is
|
texture with a 2D texture. The texture from another layer is
|
||||||
sampled with TEXTURE_? just to pick up a specific bug that was
|
sampled with TEXTURE_? just to pick up a specific bug that was
|
||||||
happening with the ARBfp fragend */
|
happening with the ARBfp fragend */
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
|
|
||||||
tex_data[0] = 0xff;
|
tex_data[0] = 0xff;
|
||||||
tex_data[1] = 0x00;
|
tex_data[1] = 0x00;
|
||||||
tex_data[2] = 0x00;
|
tex_data[2] = 0x00;
|
||||||
tex_data[3] = 0xff;
|
tex_data[3] = 0xff;
|
||||||
tex_2d = cogl_texture_2d_new_from_data (state->ctx,
|
tex_2d = cogl_texture_2d_new_from_data (ctx,
|
||||||
1, 1, /* width/height */
|
1, 1, /* width/height */
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
@ -230,7 +227,7 @@ test_multi_texture (TestState *state)
|
|||||||
tex_data[1] = 0xff;
|
tex_data[1] = 0xff;
|
||||||
tex_data[2] = 0x00;
|
tex_data[2] = 0x00;
|
||||||
tex_data[3] = 0xff;
|
tex_data[3] = 0xff;
|
||||||
tex_3d = cogl_texture_3d_new_from_data (state->ctx,
|
tex_3d = cogl_texture_3d_new_from_data (ctx,
|
||||||
1, 1, 1, /* width/height/depth */
|
1, 1, 1, /* width/height/depth */
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
@ -247,11 +244,9 @@ test_multi_texture (TestState *state)
|
|||||||
"RGBA = ADD(TEXTURE_0, TEXTURE_1)",
|
"RGBA = ADD(TEXTURE_0, TEXTURE_1)",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
cogl_push_source (pipeline);
|
cogl_framebuffer_draw_rectangle (fb, pipeline, 0, 0, 10, 10);
|
||||||
cogl_rectangle (0, 0, 10, 10);
|
|
||||||
cogl_pop_source ();
|
|
||||||
|
|
||||||
test_utils_check_pixel (5, 5, 0xffff00ff);
|
test_utils_check_pixel (fb, 5, 5, 0xffff00ff);
|
||||||
|
|
||||||
cogl_object_unref (tex_2d);
|
cogl_object_unref (tex_2d);
|
||||||
cogl_object_unref (tex_3d);
|
cogl_object_unref (tex_3d);
|
||||||
@ -259,23 +254,18 @@ test_multi_texture (TestState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_texture_3d (TestUtilsGTestFixture *fixture,
|
test_texture_3d (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
|
|
||||||
/* Check whether GL supports the rectangle extension. If not we'll
|
/* Check whether GL supports the rectangle extension. If not we'll
|
||||||
just assume the test passes */
|
just assume the test passes */
|
||||||
if (cogl_has_feature (shared_state->ctx, COGL_FEATURE_ID_TEXTURE_3D))
|
if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_3D))
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
state.fb_width = cogl_framebuffer_get_width (fb);
|
||||||
state.fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
state.fb_height = cogl_framebuffer_get_height (fb);
|
||||||
state.fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
state.fb = shared_state->fb;
|
|
||||||
|
|
||||||
cogl_framebuffer_orthographic (shared_state->fb,
|
cogl_framebuffer_orthographic (fb,
|
||||||
0, 0, /* x_1, y_1 */
|
0, 0, /* x_1, y_1 */
|
||||||
state.fb_width, /* x_2 */
|
state.fb_width, /* x_2 */
|
||||||
state.fb_height /* y_2 */,
|
state.fb_height /* y_2 */,
|
||||||
|
@ -141,7 +141,7 @@ paint_cb (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_texture_get_set_data (TestUtilsGTestFixture *fixture,
|
test_texture_get_set_data (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
ClutterActor *stage;
|
ClutterActor *stage;
|
||||||
|
@ -103,7 +103,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_texture_mipmaps (TestUtilsGTestFixture *fixture,
|
test_texture_mipmaps (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -198,7 +198,7 @@ queue_redraw (gpointer stage)
|
|||||||
#endif /* COGL_HAS_XLIB */
|
#endif /* COGL_HAS_XLIB */
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_texture_pixmap_x11 (TestUtilsGTestFixture *fixture,
|
test_texture_pixmap_x11 (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
#ifdef COGL_HAS_XLIB
|
#ifdef COGL_HAS_XLIB
|
||||||
|
@ -237,7 +237,7 @@ check_rectangle_extension (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_texture_rectangle (TestUtilsGTestFixture *fixture,
|
test_texture_rectangle (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -9,9 +9,11 @@
|
|||||||
|
|
||||||
static gboolean cogl_test_is_verbose;
|
static gboolean cogl_test_is_verbose;
|
||||||
|
|
||||||
|
CoglContext *ctx;
|
||||||
|
CoglFramebuffer *fb;
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_init (TestUtilsSharedState *state,
|
test_utils_init (TestFlags flags)
|
||||||
TestFlags flags)
|
|
||||||
{
|
{
|
||||||
static int counter = 0;
|
static int counter = 0;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
@ -43,11 +45,11 @@ test_utils_init (TestUtilsSharedState *state,
|
|||||||
|
|
||||||
g_setenv ("COGL_X11_SYNC", "1", 0);
|
g_setenv ("COGL_X11_SYNC", "1", 0);
|
||||||
|
|
||||||
state->ctx = cogl_context_new (NULL, &error);
|
ctx = cogl_context_new (NULL, &error);
|
||||||
if (!state->ctx)
|
if (!ctx)
|
||||||
g_critical ("Failed to create a CoglContext: %s", error->message);
|
g_critical ("Failed to create a CoglContext: %s", error->message);
|
||||||
|
|
||||||
display = cogl_context_get_display (state->ctx);
|
display = cogl_context_get_display (ctx);
|
||||||
renderer = cogl_display_get_renderer (display);
|
renderer = cogl_display_get_renderer (display);
|
||||||
|
|
||||||
if (flags & TEST_REQUIREMENT_GL &&
|
if (flags & TEST_REQUIREMENT_GL &&
|
||||||
@ -57,19 +59,19 @@ test_utils_init (TestUtilsSharedState *state,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & TEST_REQUIREMENT_NPOT &&
|
if (flags & TEST_REQUIREMENT_NPOT &&
|
||||||
!cogl_has_feature (state->ctx, COGL_FEATURE_ID_TEXTURE_NPOT))
|
!cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_NPOT))
|
||||||
{
|
{
|
||||||
missing_requirement = TRUE;
|
missing_requirement = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & TEST_REQUIREMENT_TEXTURE_3D &&
|
if (flags & TEST_REQUIREMENT_TEXTURE_3D &&
|
||||||
!cogl_has_feature (state->ctx, COGL_FEATURE_ID_TEXTURE_3D))
|
!cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_3D))
|
||||||
{
|
{
|
||||||
missing_requirement = TRUE;
|
missing_requirement = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & TEST_REQUIREMENT_POINT_SPRITE &&
|
if (flags & TEST_REQUIREMENT_POINT_SPRITE &&
|
||||||
!cogl_has_feature (state->ctx, COGL_FEATURE_ID_POINT_SPRITE))
|
!cogl_has_feature (ctx, COGL_FEATURE_ID_POINT_SPRITE))
|
||||||
{
|
{
|
||||||
missing_requirement = TRUE;
|
missing_requirement = TRUE;
|
||||||
}
|
}
|
||||||
@ -81,13 +83,13 @@ test_utils_init (TestUtilsSharedState *state,
|
|||||||
|
|
||||||
if (getenv ("COGL_TEST_ONSCREEN"))
|
if (getenv ("COGL_TEST_ONSCREEN"))
|
||||||
{
|
{
|
||||||
onscreen = cogl_onscreen_new (state->ctx, 640, 480);
|
onscreen = cogl_onscreen_new (ctx, 640, 480);
|
||||||
state->fb = COGL_FRAMEBUFFER (onscreen);
|
fb = COGL_FRAMEBUFFER (onscreen);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CoglHandle offscreen;
|
CoglHandle offscreen;
|
||||||
CoglHandle tex = cogl_texture_2d_new_with_size (state->ctx,
|
CoglHandle tex = cogl_texture_2d_new_with_size (ctx,
|
||||||
FB_WIDTH, FB_HEIGHT,
|
FB_WIDTH, FB_HEIGHT,
|
||||||
COGL_PIXEL_FORMAT_ANY,
|
COGL_PIXEL_FORMAT_ANY,
|
||||||
&error);
|
&error);
|
||||||
@ -95,37 +97,33 @@ test_utils_init (TestUtilsSharedState *state,
|
|||||||
g_critical ("Failed to allocate texture: %s", error->message);
|
g_critical ("Failed to allocate texture: %s", error->message);
|
||||||
|
|
||||||
offscreen = cogl_offscreen_new_to_texture (tex);
|
offscreen = cogl_offscreen_new_to_texture (tex);
|
||||||
state->fb = COGL_FRAMEBUFFER (offscreen);
|
fb = COGL_FRAMEBUFFER (offscreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!cogl_framebuffer_allocate (state->fb, &error))
|
if (!cogl_framebuffer_allocate (fb, &error))
|
||||||
g_critical ("Failed to allocate framebuffer: %s", error->message);
|
g_critical ("Failed to allocate framebuffer: %s", error->message);
|
||||||
|
|
||||||
if (onscreen)
|
if (onscreen)
|
||||||
cogl_onscreen_show (onscreen);
|
cogl_onscreen_show (onscreen);
|
||||||
|
|
||||||
cogl_framebuffer_clear4f (state->fb,
|
cogl_framebuffer_clear4f (fb,
|
||||||
COGL_BUFFER_BIT_COLOR |
|
COGL_BUFFER_BIT_COLOR |
|
||||||
COGL_BUFFER_BIT_DEPTH |
|
COGL_BUFFER_BIT_DEPTH |
|
||||||
COGL_BUFFER_BIT_STENCIL,
|
COGL_BUFFER_BIT_STENCIL,
|
||||||
0, 0, 0, 1);
|
0, 0, 0, 1);
|
||||||
|
|
||||||
cogl_push_framebuffer (state->fb);
|
|
||||||
|
|
||||||
if (missing_requirement)
|
if (missing_requirement)
|
||||||
g_print ("WARNING: Missing required feature[s] for this test\n");
|
g_print ("WARNING: Missing required feature[s] for this test\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_fini (TestUtilsSharedState *state)
|
test_utils_fini (void)
|
||||||
{
|
{
|
||||||
cogl_pop_framebuffer ();
|
if (fb)
|
||||||
|
cogl_object_unref (fb);
|
||||||
|
|
||||||
if (state->fb)
|
if (ctx)
|
||||||
cogl_object_unref (state->fb);
|
cogl_object_unref (ctx);
|
||||||
|
|
||||||
if (state->ctx)
|
|
||||||
cogl_object_unref (state->ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -156,38 +154,42 @@ test_utils_compare_pixel (const guint8 *screen_pixel, guint32 expected_pixel)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_check_pixel (int x, int y, guint32 expected_pixel)
|
test_utils_check_pixel (CoglFramebuffer *fb,
|
||||||
|
int x, int y, guint32 expected_pixel)
|
||||||
{
|
{
|
||||||
guint8 pixel[4];
|
guint8 pixel[4];
|
||||||
|
|
||||||
cogl_read_pixels (x, y, 1, 1, COGL_READ_PIXELS_COLOR_BUFFER,
|
cogl_framebuffer_read_pixels (fb,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
x, y, 1, 1,
|
||||||
pixel);
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
||||||
|
pixel);
|
||||||
|
|
||||||
test_utils_compare_pixel (pixel, expected_pixel);
|
test_utils_compare_pixel (pixel, expected_pixel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_check_pixel_rgb (int x, int y, int r, int g, int b)
|
test_utils_check_pixel_rgb (CoglFramebuffer *fb,
|
||||||
|
int x, int y, int r, int g, int b)
|
||||||
{
|
{
|
||||||
test_utils_check_pixel (x, y, (r << 24) | (g << 16) | (b << 8));
|
test_utils_check_pixel (fb, x, y, (r << 24) | (g << 16) | (b << 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_check_region (int x, int y,
|
test_utils_check_region (CoglFramebuffer *fb,
|
||||||
|
int x, int y,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
guint32 expected_rgba)
|
guint32 expected_rgba)
|
||||||
{
|
{
|
||||||
guint8 *pixels, *p;
|
guint8 *pixels, *p;
|
||||||
|
|
||||||
pixels = p = g_malloc (width * height * 4);
|
pixels = p = g_malloc (width * height * 4);
|
||||||
cogl_read_pixels (x,
|
cogl_framebuffer_read_pixels (fb,
|
||||||
y,
|
x,
|
||||||
width,
|
y,
|
||||||
height,
|
width,
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
height,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||||
p);
|
p);
|
||||||
|
|
||||||
/* Check whether the center of each division is the right color */
|
/* Check whether the center of each division is the right color */
|
||||||
for (y = 0; y < height; y++)
|
for (y = 0; y < height; y++)
|
||||||
|
@ -16,77 +16,68 @@ typedef enum _TestFlags
|
|||||||
TEST_REQUIREMENT_POINT_SPRITE = 1<<4
|
TEST_REQUIREMENT_POINT_SPRITE = 1<<4
|
||||||
} TestFlags;
|
} TestFlags;
|
||||||
|
|
||||||
/* For compatability since we used to use the glib gtester
|
extern CoglContext *ctx;
|
||||||
* infrastructure and all our unit tests have an entry
|
extern CoglFramebuffer *fb;
|
||||||
* point with a first argument of this type... */
|
|
||||||
typedef struct _TestUtilsGTestFixture TestUtilsGTestFixture;
|
|
||||||
|
|
||||||
/* Stuff you put in here is setup once in main() and gets passed around to
|
|
||||||
* all test functions and fixture setup/teardown functions in the data
|
|
||||||
* argument */
|
|
||||||
typedef struct _TestUtilsSharedState
|
|
||||||
{
|
|
||||||
int *argc_addr;
|
|
||||||
char ***argv_addr;
|
|
||||||
|
|
||||||
CoglContext *ctx;
|
|
||||||
CoglFramebuffer *fb;
|
|
||||||
} TestUtilsSharedState;
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_init (TestUtilsSharedState *state,
|
test_utils_init (TestFlags flags);
|
||||||
TestFlags flags);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_utils_fini (TestUtilsSharedState *state);
|
test_utils_fini (void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* test_utils_check_pixel:
|
* test_utils_check_pixel:
|
||||||
|
* @framebuffer: The #CoglFramebuffer to read from
|
||||||
* @x: x co-ordinate of the pixel to test
|
* @x: x co-ordinate of the pixel to test
|
||||||
* @y: y co-ordinate of the pixel to test
|
* @y: y co-ordinate of the pixel to test
|
||||||
* @pixel: An integer of the form 0xRRGGBBAA representing the expected
|
* @pixel: An integer of the form 0xRRGGBBAA representing the expected
|
||||||
* pixel value
|
* pixel value
|
||||||
*
|
*
|
||||||
* This performs reads a pixel on the current cogl framebuffer and
|
* This performs reads a pixel on the given cogl @framebuffer and
|
||||||
* asserts that it matches the given color. The alpha channel of the
|
* asserts that it matches the given color. The alpha channel of the
|
||||||
* color is ignored. The pixels are converted to a string and compared
|
* color is ignored. The pixels are converted to a string and compared
|
||||||
* with g_assert_cmpstr so that if the comparison fails then the
|
* with g_assert_cmpstr so that if the comparison fails then the
|
||||||
* assert will display a meaningful message
|
* assert will display a meaningful message
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
test_utils_check_pixel (int x, int y, guint32 expected_pixel);
|
test_utils_check_pixel (CoglFramebuffer *framebuffer,
|
||||||
|
int x, int y, guint32 expected_pixel);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* test_utils_check_pixel:
|
* test_utils_check_pixel:
|
||||||
|
* @framebuffer: The #CoglFramebuffer to read from
|
||||||
* @x: x co-ordinate of the pixel to test
|
* @x: x co-ordinate of the pixel to test
|
||||||
* @y: y co-ordinate of the pixel to test
|
* @y: y co-ordinate of the pixel to test
|
||||||
* @pixel: An integer of the form 0xrrggbb representing the expected pixel value
|
* @pixel: An integer of the form 0xrrggbb representing the expected pixel value
|
||||||
*
|
*
|
||||||
* This performs reads a pixel on the current cogl framebuffer and
|
* This performs reads a pixel on the given cogl @framebuffer and
|
||||||
* asserts that it matches the given color. The alpha channel of the
|
* asserts that it matches the given color. The alpha channel of the
|
||||||
* color is ignored. The pixels are converted to a string and compared
|
* color is ignored. The pixels are converted to a string and compared
|
||||||
* with g_assert_cmpstr so that if the comparison fails then the
|
* with g_assert_cmpstr so that if the comparison fails then the
|
||||||
* assert will display a meaningful message
|
* assert will display a meaningful message
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
test_utils_check_pixel_rgb (int x, int y, int r, int g, int b);
|
test_utils_check_pixel_rgb (CoglFramebuffer *framebuffer,
|
||||||
|
int x, int y, int r, int g, int b);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* test_utils_check_region:
|
* test_utils_check_region:
|
||||||
|
* @framebuffer: The #CoglFramebuffer to read from
|
||||||
* @x: x co-ordinate of the region to test
|
* @x: x co-ordinate of the region to test
|
||||||
* @y: y co-ordinate of the region to test
|
* @y: y co-ordinate of the region to test
|
||||||
* @width: width of the region to test
|
* @width: width of the region to test
|
||||||
* @height: height of the region to test
|
* @height: height of the region to test
|
||||||
* @pixel: An integer of the form 0xrrggbb representing the expected region color
|
* @pixel: An integer of the form 0xrrggbb representing the expected region color
|
||||||
*
|
*
|
||||||
* Performs a read pixel on the specified region of the current cogl
|
* Performs a read pixel on the specified region of the given cogl
|
||||||
* framebuffer and asserts that it matches the given color. The alpha
|
* @framebuffer and asserts that it matches the given color. The alpha
|
||||||
* channel of the color is ignored. The pixels are converted to a
|
* channel of the color is ignored. The pixels are converted to a
|
||||||
* string and compared with g_assert_cmpstr so that if the comparison
|
* string and compared with g_assert_cmpstr so that if the comparison
|
||||||
* fails then the assert will display a meaningful message
|
* fails then the assert will display a meaningful message
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
test_utils_check_region (int x, int y,
|
test_utils_check_region (CoglFramebuffer *framebuffer,
|
||||||
|
int x, int y,
|
||||||
int width, int height,
|
int width, int height,
|
||||||
guint32 expected_rgba);
|
guint32 expected_rgba);
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ queue_redraw (gpointer stage)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_vertex_buffer_contiguous (TestUtilsGTestFixture *fixture,
|
test_vertex_buffer_contiguous (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -83,7 +83,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_vertex_buffer_interleved (TestUtilsGTestFixture *fixture,
|
test_vertex_buffer_interleved (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -126,7 +126,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_vertex_buffer_mutability (TestUtilsGTestFixture *fixture,
|
test_vertex_buffer_mutability (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
TestState state;
|
TestState state;
|
||||||
|
@ -385,7 +385,7 @@ queue_redraw (gpointer stage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_viewport (TestUtilsGTestFixture *fixture,
|
test_viewport (TestUtilsGTestFixture *fixture,
|
||||||
void *data)
|
void *data)
|
||||||
{
|
{
|
||||||
unsigned int idle_source;
|
unsigned int idle_source;
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
typedef struct _TestState
|
typedef struct _TestState
|
||||||
{
|
{
|
||||||
CoglContext *ctx;
|
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
CoglTexture *texture;
|
CoglTexture *texture;
|
||||||
@ -46,7 +45,7 @@ create_pipeline (TestState *state,
|
|||||||
{
|
{
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
pipeline = cogl_pipeline_new (state->ctx);
|
pipeline = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, state->texture);
|
cogl_pipeline_set_layer_texture (pipeline, 0, state->texture);
|
||||||
cogl_pipeline_set_layer_filters (pipeline, 0,
|
cogl_pipeline_set_layer_filters (pipeline, 0,
|
||||||
COGL_PIPELINE_FILTER_NEAREST,
|
COGL_PIPELINE_FILTER_NEAREST,
|
||||||
@ -58,7 +57,7 @@ create_pipeline (TestState *state,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CoglPipelineWrapMode
|
static CoglPipelineWrapMode
|
||||||
test_wrap_modes[] =
|
wrap_modes[] =
|
||||||
{
|
{
|
||||||
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
||||||
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
COGL_PIPELINE_WRAP_MODE_REPEAT,
|
||||||
@ -84,22 +83,25 @@ draw_tests (TestState *state)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (test_wrap_modes); i += 2)
|
for (i = 0; i < G_N_ELEMENTS (wrap_modes); i += 2)
|
||||||
{
|
{
|
||||||
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
/* Create a separate pipeline for each pair of wrap modes so
|
/* Create a separate pipeline for each pair of wrap modes so
|
||||||
that we can verify whether the batch splitting works */
|
that we can verify whether the batch splitting works */
|
||||||
wrap_mode_s = test_wrap_modes[i];
|
wrap_mode_s = wrap_modes[i];
|
||||||
wrap_mode_t = test_wrap_modes[i + 1];
|
wrap_mode_t = wrap_modes[i + 1];
|
||||||
pipeline = create_pipeline (state, wrap_mode_s, wrap_mode_t);
|
pipeline = create_pipeline (state, wrap_mode_s, wrap_mode_t);
|
||||||
cogl_set_source (pipeline);
|
|
||||||
cogl_handle_unref (pipeline);
|
|
||||||
/* Render the pipeline at four times the size of the texture */
|
/* Render the pipeline at four times the size of the texture */
|
||||||
cogl_rectangle_with_texture_coords (i * TEX_SIZE, 0,
|
cogl_framebuffer_draw_textured_rectangle (fb,
|
||||||
(i + 2) * TEX_SIZE, TEX_SIZE * 2,
|
pipeline,
|
||||||
0, 0, 2, 2);
|
i * TEX_SIZE,
|
||||||
|
0,
|
||||||
|
(i + 2) * TEX_SIZE,
|
||||||
|
TEX_SIZE * 2,
|
||||||
|
0, 0, 2, 2);
|
||||||
|
cogl_object_unref (pipeline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,16 +118,16 @@ draw_tests_polygon (TestState *state)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (test_wrap_modes); i += 2)
|
for (i = 0; i < G_N_ELEMENTS (wrap_modes); i += 2)
|
||||||
{
|
{
|
||||||
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
wrap_mode_s = test_wrap_modes[i];
|
wrap_mode_s = wrap_modes[i];
|
||||||
wrap_mode_t = test_wrap_modes[i + 1];
|
wrap_mode_t = wrap_modes[i + 1];
|
||||||
pipeline = create_pipeline (state, wrap_mode_s, wrap_mode_t);
|
pipeline = create_pipeline (state, wrap_mode_s, wrap_mode_t);
|
||||||
cogl_set_source (pipeline);
|
cogl_set_source (pipeline);
|
||||||
cogl_handle_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
cogl_push_matrix ();
|
cogl_push_matrix ();
|
||||||
cogl_translate (TEX_SIZE * i, 0.0f, 0.0f);
|
cogl_translate (TEX_SIZE * i, 0.0f, 0.0f);
|
||||||
/* Render the pipeline at four times the size of the texture */
|
/* Render the pipeline at four times the size of the texture */
|
||||||
@ -151,16 +153,16 @@ draw_tests_vbo (TestState *state)
|
|||||||
&vertices[0].tx);
|
&vertices[0].tx);
|
||||||
cogl_vertex_buffer_submit (vbo);
|
cogl_vertex_buffer_submit (vbo);
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (test_wrap_modes); i += 2)
|
for (i = 0; i < G_N_ELEMENTS (wrap_modes); i += 2)
|
||||||
{
|
{
|
||||||
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
wrap_mode_s = test_wrap_modes[i];
|
wrap_mode_s = wrap_modes[i];
|
||||||
wrap_mode_t = test_wrap_modes[i + 1];
|
wrap_mode_t = wrap_modes[i + 1];
|
||||||
pipeline = create_pipeline (state, wrap_mode_s, wrap_mode_t);
|
pipeline = create_pipeline (state, wrap_mode_s, wrap_mode_t);
|
||||||
cogl_set_source (pipeline);
|
cogl_set_source (pipeline);
|
||||||
cogl_handle_unref (pipeline);
|
cogl_object_unref (pipeline);
|
||||||
cogl_push_matrix ();
|
cogl_push_matrix ();
|
||||||
cogl_translate (TEX_SIZE * i, 0.0f, 0.0f);
|
cogl_translate (TEX_SIZE * i, 0.0f, 0.0f);
|
||||||
/* Render the pipeline at four times the size of the texture */
|
/* Render the pipeline at four times the size of the texture */
|
||||||
@ -177,18 +179,17 @@ validate_set (TestState *state, int offset)
|
|||||||
guint8 data[TEX_SIZE * 2 * TEX_SIZE * 2 * 4], *p;
|
guint8 data[TEX_SIZE * 2 * TEX_SIZE * 2 * 4], *p;
|
||||||
int x, y, i;
|
int x, y, i;
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (test_wrap_modes); i += 2)
|
for (i = 0; i < G_N_ELEMENTS (wrap_modes); i += 2)
|
||||||
{
|
{
|
||||||
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
CoglPipelineWrapMode wrap_mode_s, wrap_mode_t;
|
||||||
|
|
||||||
wrap_mode_s = test_wrap_modes[i];
|
wrap_mode_s = wrap_modes[i];
|
||||||
wrap_mode_t = test_wrap_modes[i + 1];
|
wrap_mode_t = wrap_modes[i + 1];
|
||||||
|
|
||||||
cogl_read_pixels (i * TEX_SIZE, offset * TEX_SIZE * 2,
|
cogl_framebuffer_read_pixels (fb, i * TEX_SIZE, offset * TEX_SIZE * 2,
|
||||||
TEX_SIZE * 2, TEX_SIZE * 2,
|
TEX_SIZE * 2, TEX_SIZE * 2,
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
COGL_PIXEL_FORMAT_RGBA_8888,
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888,
|
data);
|
||||||
data);
|
|
||||||
|
|
||||||
p = data;
|
p = data;
|
||||||
|
|
||||||
@ -237,7 +238,7 @@ paint (TestState *state)
|
|||||||
/* Draw the tests first with a non atlased texture */
|
/* Draw the tests first with a non atlased texture */
|
||||||
state->texture = create_texture (COGL_TEXTURE_NO_ATLAS);
|
state->texture = create_texture (COGL_TEXTURE_NO_ATLAS);
|
||||||
draw_tests (state);
|
draw_tests (state);
|
||||||
cogl_handle_unref (state->texture);
|
cogl_object_unref (state->texture);
|
||||||
|
|
||||||
/* Draw the tests again with a possible atlased texture. This should
|
/* Draw the tests again with a possible atlased texture. This should
|
||||||
end up testing software repeats */
|
end up testing software repeats */
|
||||||
@ -246,7 +247,7 @@ paint (TestState *state)
|
|||||||
cogl_translate (0.0f, TEX_SIZE * 2.0f, 0.0f);
|
cogl_translate (0.0f, TEX_SIZE * 2.0f, 0.0f);
|
||||||
draw_tests (state);
|
draw_tests (state);
|
||||||
cogl_pop_matrix ();
|
cogl_pop_matrix ();
|
||||||
cogl_handle_unref (state->texture);
|
cogl_object_unref (state->texture);
|
||||||
|
|
||||||
/* Draw the tests using cogl_polygon */
|
/* Draw the tests using cogl_polygon */
|
||||||
state->texture = create_texture (COGL_TEXTURE_NO_ATLAS);
|
state->texture = create_texture (COGL_TEXTURE_NO_ATLAS);
|
||||||
@ -254,7 +255,7 @@ paint (TestState *state)
|
|||||||
cogl_translate (0.0f, TEX_SIZE * 4.0f, 0.0f);
|
cogl_translate (0.0f, TEX_SIZE * 4.0f, 0.0f);
|
||||||
draw_tests_polygon (state);
|
draw_tests_polygon (state);
|
||||||
cogl_pop_matrix ();
|
cogl_pop_matrix ();
|
||||||
cogl_handle_unref (state->texture);
|
cogl_object_unref (state->texture);
|
||||||
|
|
||||||
/* Draw the tests using a vertex buffer */
|
/* Draw the tests using a vertex buffer */
|
||||||
state->texture = create_texture (COGL_TEXTURE_NO_ATLAS);
|
state->texture = create_texture (COGL_TEXTURE_NO_ATLAS);
|
||||||
@ -262,27 +263,31 @@ paint (TestState *state)
|
|||||||
cogl_translate (0.0f, TEX_SIZE * 6.0f, 0.0f);
|
cogl_translate (0.0f, TEX_SIZE * 6.0f, 0.0f);
|
||||||
draw_tests_vbo (state);
|
draw_tests_vbo (state);
|
||||||
cogl_pop_matrix ();
|
cogl_pop_matrix ();
|
||||||
cogl_handle_unref (state->texture);
|
cogl_object_unref (state->texture);
|
||||||
|
|
||||||
validate_result (state);
|
validate_result (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_wrap_modes (TestUtilsGTestFixture *fixture,
|
test_wrap_modes (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
TestState state;
|
TestState state;
|
||||||
|
|
||||||
state.ctx = shared_state->ctx;
|
state.width = cogl_framebuffer_get_width (fb);
|
||||||
state.width = cogl_framebuffer_get_width (shared_state->fb);
|
state.height = cogl_framebuffer_get_height (fb);
|
||||||
state.height = cogl_framebuffer_get_height (shared_state->fb);
|
|
||||||
|
|
||||||
cogl_ortho (0, state.width, /* left, right */
|
cogl_framebuffer_orthographic (fb,
|
||||||
state.height, 0, /* bottom, top */
|
0, 0,
|
||||||
-1, 100 /* z near, far */);
|
state.width,
|
||||||
|
state.height,
|
||||||
|
-1,
|
||||||
|
100);
|
||||||
|
|
||||||
|
/* XXX: we have to push/pop a framebuffer since this test currently
|
||||||
|
* uses the legacy cogl_vertex_buffer_draw() api. */
|
||||||
|
cogl_push_framebuffer (fb);
|
||||||
paint (&state);
|
paint (&state);
|
||||||
|
cogl_pop_framebuffer ();
|
||||||
|
|
||||||
if (cogl_test_verbose ())
|
if (cogl_test_verbose ())
|
||||||
g_print ("OK\n");
|
g_print ("OK\n");
|
||||||
|
@ -139,12 +139,8 @@ test_write_int (CoglContext *context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
test_cogl_write_texture_formats (TestUtilsGTestFixture *fixture,
|
test_write_texture_formats (void)
|
||||||
void *data)
|
|
||||||
{
|
{
|
||||||
TestUtilsSharedState *shared_state = data;
|
|
||||||
CoglContext *ctx = shared_state->ctx;
|
|
||||||
|
|
||||||
test_write_byte (ctx, COGL_PIXEL_FORMAT_A_8, 0x34, 0x00000034);
|
test_write_byte (ctx, COGL_PIXEL_FORMAT_A_8, 0x34, 0x00000034);
|
||||||
#if 0
|
#if 0
|
||||||
/* I'm not sure what's the right value to put here because Nvidia
|
/* I'm not sure what's the right value to put here because Nvidia
|
||||||
|
Loading…
Reference in New Issue
Block a user