mirror of
https://github.com/brl/mutter.git
synced 2024-11-11 00:26:40 -05:00
bf7f1e358d
There are currently quite a few places in Cogl where we muddle the layer index and the texture unit number. The theory is that these two numbers shouldn't be related and it should be possible to pick large layer numbers with gaps. This patch adds a test case to check that we can reference a large layer number from a texture combine string by creating a pipeline with only three layers but that have very large layer indices. This doesn't currently work because Cogl interprets the numbers in the combine strings to be the unit indices and not the layer indices. The documentation however calls these numbers layer numbers so presumably it is not meant to work that way. There are probably many other bugs related to this that the test case doesn't pick up so it would be good to add some more tests here, for example to test that you can bind an attribute to the texture coordinates for a large layer index. Reviewed-by: Robert Bragg <robert@linux.intel.com>
90 lines
2.5 KiB
C
90 lines
2.5 KiB
C
#include <cogl/cogl2-experimental.h>
|
|
#include <string.h>
|
|
|
|
#include "test-utils.h"
|
|
|
|
typedef struct _TestState
|
|
{
|
|
CoglContext *context;
|
|
int fb_width;
|
|
int fb_height;
|
|
CoglFramebuffer *fb;
|
|
} TestState;
|
|
|
|
static CoglTexture *
|
|
create_color_texture (CoglContext *context,
|
|
guint32 color)
|
|
{
|
|
CoglTexture2D *tex_2d;
|
|
|
|
color = GUINT32_TO_BE (color);
|
|
|
|
tex_2d = cogl_texture_2d_new_from_data (context,
|
|
1, 1, /* width/height */
|
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
|
4, /* rowstride */
|
|
(guint8 *) &color,
|
|
NULL);
|
|
|
|
return COGL_TEXTURE (tex_2d);
|
|
}
|
|
|
|
static void
|
|
test_sparse_layer_combine (TestState *state)
|
|
{
|
|
CoglPipeline *pipeline;
|
|
CoglTexture *tex1, *tex2;
|
|
|
|
cogl_framebuffer_clear4f (state->fb, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 1);
|
|
|
|
/* This tests that the TEXTURE_* numbers used in the layer combine
|
|
string refer to the layer number rather than the unit numbers by
|
|
creating a pipeline with very large layer numbers. This should
|
|
end up being mapped to much smaller unit numbers */
|
|
|
|
tex1 = create_color_texture (state->context, 0xff0000ff);
|
|
tex2 = create_color_texture (state->context, 0x00ff00ff);
|
|
|
|
pipeline = cogl_pipeline_new ();
|
|
|
|
cogl_pipeline_set_layer_texture (pipeline, 50, tex1);
|
|
cogl_pipeline_set_layer_texture (pipeline, 100, tex2);
|
|
cogl_pipeline_set_layer_combine (pipeline, 200,
|
|
"RGBA = ADD(TEXTURE_50, TEXTURE_100)",
|
|
NULL);
|
|
|
|
cogl_push_source (pipeline);
|
|
cogl_rectangle (-1, -1, 1, 1);
|
|
cogl_pop_source ();
|
|
|
|
test_utils_check_pixel (2, 2, 0xffff00ff);
|
|
|
|
cogl_object_unref (pipeline);
|
|
cogl_object_unref (tex1);
|
|
cogl_object_unref (tex2);
|
|
}
|
|
|
|
void
|
|
test_cogl_sparse_pipeline (TestUtilsGTestFixture *fixture,
|
|
void *data)
|
|
{
|
|
TestUtilsSharedState *shared_state = data;
|
|
TestState state;
|
|
|
|
state.context = shared_state->ctx;
|
|
state.fb_width = cogl_framebuffer_get_width (shared_state->fb);
|
|
state.fb_height = cogl_framebuffer_get_height (shared_state->fb);
|
|
state.fb = shared_state->fb;
|
|
|
|
test_sparse_layer_combine (&state);
|
|
|
|
/* FIXME: This should have a lot more tests, for example testing
|
|
whether using an attribute with sparse texture coordinates will
|
|
work */
|
|
|
|
if (g_test_verbose ())
|
|
g_print ("OK\n");
|
|
}
|
|
|