[Cogl] [PATCH 3/3] Add a conformance test for some wrap modes on a rectangle texture
Robert Bragg
robert at sixbynine.org
Wed Jan 16 05:53:57 PST 2013
This looks good to land to me:
Reviewed-by: Robert Bragg <robert at linux.intel.com>
thanks,
- Robert
On Tue, Dec 11, 2012 at 2:56 PM, Neil Roberts <neil at linux.intel.com> wrote:
> This adds a conformance test which renders a rectangle texture using
> the two wrap modes clamp-to-edge and repeat. It then verifies that the
> correct region of the texture is drawn for the texture coordinates
> that are > 1.0.
>
> The test currently always fails. The cogl_framebuffer_draw_rectangle
> function is documented to always take normalized texture coordinates
> regardless of the coordinate system of the texture. This works
> correctly if all of the texture coordinates are in the range [0.0,1.0]
> because cogl-primitives uses a different code path in that case.
> However if the multiple-quad code path is taken then the coordinates
> actually need to un-normalized for it to work.
>
> There is a comment in cogl_meta_texture_foreach_in_region() which
> implies that the incoming coordinates should always be normalized.
> The documentation for the callback says that the resulting sub-texture
> coordinates will always be in the coordinate system of the low-level
> texture. However it doesn't work out like this because the meta
> texture function uses the span iterating function which always returns
> normalized coordinates. It looks like there needs to be some more
> conversions going on somewhere.
> ---
> tests/conform/Makefile.am | 1 +
> tests/conform/test-conform-main.c | 3 +
> tests/conform/test-utils.c | 6 +
> tests/conform/test-utils.h | 17 +--
> tests/conform/test-wrap-rectangle-textures.c | 179 +++++++++++++++++++++++++++
> 5 files changed, 198 insertions(+), 8 deletions(-)
> create mode 100644 tests/conform/test-wrap-rectangle-textures.c
>
> diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
> index d8536d0..013f29f 100644
> --- a/tests/conform/Makefile.am
> +++ b/tests/conform/Makefile.am
> @@ -58,6 +58,7 @@ test_sources = \
> test-map-buffer-range.c \
> test-npot-texture.c \
> test-alpha-textures.c \
> + test-wrap-rectangle-textures.c \
> test-texture-get-set-data.c \
> test-texture-mipmap-get-set.c \
> $(NULL)
> diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
> index 8e30b84..486479b 100644
> --- a/tests/conform/test-conform-main.c
> +++ b/tests/conform/test-conform-main.c
> @@ -80,6 +80,9 @@ main (int argc, char **argv)
> ADD_TEST (test_read_texture_formats, 0, 0);
> ADD_TEST (test_write_texture_formats, 0, 0);
> ADD_TEST (test_alpha_textures, 0, 0);
> + ADD_TEST (test_wrap_rectangle_textures,
> + TEST_REQUIREMENT_TEXTURE_RECTANGLE,
> + TEST_KNOWN_FAILURE);
>
> UNPORTED_TEST (test_vertex_buffer_contiguous);
> UNPORTED_TEST (test_vertex_buffer_interleved);
> diff --git a/tests/conform/test-utils.c b/tests/conform/test-utils.c
> index 2173cd0..ba2ec47 100644
> --- a/tests/conform/test-utils.c
> +++ b/tests/conform/test-utils.c
> @@ -34,6 +34,12 @@ check_flags (TestFlags flags,
> return FALSE;
> }
>
> + if (flags & TEST_REQUIREMENT_TEXTURE_RECTANGLE &&
> + !cogl_has_feature (test_ctx, COGL_FEATURE_ID_TEXTURE_RECTANGLE))
> + {
> + return FALSE;
> + }
> +
> if (flags & TEST_REQUIREMENT_POINT_SPRITE &&
> !cogl_has_feature (test_ctx, COGL_FEATURE_ID_POINT_SPRITE))
> {
> diff --git a/tests/conform/test-utils.h b/tests/conform/test-utils.h
> index 02af5f4..ec96913 100644
> --- a/tests/conform/test-utils.h
> +++ b/tests/conform/test-utils.h
> @@ -11,14 +11,15 @@
>
> typedef enum _TestFlags
> {
> - TEST_KNOWN_FAILURE = 1<<0,
> - TEST_REQUIREMENT_GL = 1<<1,
> - TEST_REQUIREMENT_NPOT = 1<<2,
> - TEST_REQUIREMENT_TEXTURE_3D = 1<<3,
> - TEST_REQUIREMENT_POINT_SPRITE = 1<<4,
> - TEST_REQUIREMENT_GLES2_CONTEXT = 1<<5,
> - TEST_REQUIREMENT_MAP_WRITE = 1<<6,
> - TEST_REQUIREMENT_GLSL = 1<<7
> + TEST_KNOWN_FAILURE = 1<<0,
> + TEST_REQUIREMENT_GL = 1<<1,
> + TEST_REQUIREMENT_NPOT = 1<<2,
> + TEST_REQUIREMENT_TEXTURE_3D = 1<<3,
> + TEST_REQUIREMENT_TEXTURE_RECTANGLE = 1<<4,
> + TEST_REQUIREMENT_POINT_SPRITE = 1<<5,
> + TEST_REQUIREMENT_GLES2_CONTEXT = 1<<6,
> + TEST_REQUIREMENT_MAP_WRITE = 1<<7,
> + TEST_REQUIREMENT_GLSL = 1<<8
> } TestFlags;
>
> extern CoglContext *test_ctx;
> diff --git a/tests/conform/test-wrap-rectangle-textures.c b/tests/conform/test-wrap-rectangle-textures.c
> new file mode 100644
> index 0000000..7fee765
> --- /dev/null
> +++ b/tests/conform/test-wrap-rectangle-textures.c
> @@ -0,0 +1,179 @@
> +#include <cogl/cogl.h>
> +#include <gdk-pixbuf/gdk-pixbuf.h>
> +
> +#include <string.h>
> +
> +#include "test-utils.h"
> +
> +#define DRAW_SIZE 64
> +
> +static CoglPipeline *
> +create_base_pipeline (void)
> +{
> + CoglBitmap *bmp;
> + CoglTextureRectangle *tex;
> + CoglPipeline *pipeline;
> + uint8_t tex_data[] =
> + {
> + 0x44, 0x44, 0x44, 0x88, 0x88, 0x88,
> + 0xcc, 0xcc, 0xcc, 0xff, 0xff, 0xff
> + };
> +
> + bmp = cogl_bitmap_new_for_data (test_ctx,
> + 2, 2, /* width/height */
> + COGL_PIXEL_FORMAT_RGB_888,
> + 2 * 3, /* rowstride */
> + tex_data);
> +
> + tex = cogl_texture_rectangle_new_from_bitmap (bmp,
> + /* internal format */
> + COGL_PIXEL_FORMAT_ANY,
> + NULL);
> +
> + cogl_object_unref (bmp);
> +
> + pipeline = cogl_pipeline_new (test_ctx);
> +
> + cogl_pipeline_set_layer_filters (pipeline,
> + 0, /* layer */
> + COGL_PIPELINE_FILTER_NEAREST,
> + COGL_PIPELINE_FILTER_NEAREST);
> +
> + cogl_pipeline_set_layer_texture (pipeline,
> + 0, /* layer */
> + COGL_TEXTURE (tex));
> +
> + cogl_object_unref (tex);
> +
> + return pipeline;
> +}
> +
> +static void
> +check_colors (int x_offset,
> + int y_offset,
> + const uint8_t expected_colors[9])
> +{
> + int x, y;
> +
> + for (y = 0; y < 4; y++)
> + for (x = 0; x < 4; x++)
> + {
> + uint32_t color = expected_colors[x + y * 4];
> + test_utils_check_region (test_fb,
> + x * DRAW_SIZE / 4 + 1 + x_offset,
> + y * DRAW_SIZE / 4 + 1 + y_offset,
> + DRAW_SIZE / 4 - 2,
> + DRAW_SIZE / 4 - 2,
> + 0xff |
> + (color << 8) |
> + (color << 16) |
> + (color << 24));
> + }
> +}
> +
> +static void
> +test_pipeline (CoglPipeline *pipeline,
> + int x_offset,
> + int y_offset,
> + const uint8_t expected_colors[9])
> +{
> + float x1 = x_offset;
> + float y1 = y_offset;
> + float x2 = x1 + DRAW_SIZE;
> + float y2 = y1 + DRAW_SIZE;
> + int y, x;
> +
> + cogl_framebuffer_draw_textured_rectangle (test_fb,
> + pipeline,
> + x1, y1,
> + x2, y2,
> + -0.5f, /* s1 */
> + -0.5f, /* t1 */
> + 1.5f, /* s2 */
> + 1.5f /* t2 */);
> +
> + check_colors (x_offset, y_offset, expected_colors);
> +
> + /* Also try drawing each quadrant of the rectangle with a small
> + * rectangle */
> +
> + for (y = -1; y < 3; y++)
> + for (x = -1; x < 3; x++)
> + {
> + x1 = x_offset + (x + 1) * DRAW_SIZE / 4 + DRAW_SIZE;
> + y1 = y_offset + (y + 1) * DRAW_SIZE / 4;
> + x2 = x1 + DRAW_SIZE / 4;
> + y2 = y1 + DRAW_SIZE / 4;
> +
> + cogl_framebuffer_draw_textured_rectangle (test_fb,
> + pipeline,
> + x1, y1,
> + x2, y2,
> + x / 2.0f, /* s1 */
> + y / 2.0f, /* t1 */
> + (x + 1) / 2.0f, /* s2 */
> + (y + 1) / 2.0f /* t2 */);
> + }
> +
> + check_colors (x_offset + DRAW_SIZE, y_offset, expected_colors);
> +}
> +
> +void
> +test_wrap_rectangle_textures (void)
> +{
> + float fb_width = cogl_framebuffer_get_width (test_fb);
> + float fb_height = cogl_framebuffer_get_height (test_fb);
> + CoglPipeline *base_pipeline;
> + CoglPipeline *clamp_pipeline;
> + CoglPipeline *repeat_pipeline;
> + /* The textures are drawn with the texture coordinates from
> + * -0.5→1.5. That means we get one complete copy of the texture and
> + * an extra half of the texture surrounding it. The drawing is
> + * tested against a 4x4 grid of colors. The center 2x2 colours
> + * specify the normal texture colors and the other colours specify
> + * what the wrap mode should generate */
> + static const uint8_t clamp_colors[] =
> + {
> + 0x44, 0x44, 0x88, 0x88,
> + 0x44, 0x44, 0x88, 0x88,
> + 0xcc, 0xcc, 0xff, 0xff,
> + 0xcc, 0xcc, 0xff, 0xff
> + };
> + static const uint8_t repeat_colors[] =
> + {
> + 0xff, 0xcc, 0xff, 0xcc,
> + 0x88, 0x44, 0x88, 0x44,
> + 0xff, 0xcc, 0xff, 0xcc,
> + 0x88, 0x44, 0x88, 0x44
> + };
> +
> + cogl_framebuffer_orthographic (test_fb,
> + 0, 0, /* x_1, y_1 */
> + fb_width, /* x_2 */
> + fb_height /* y_2 */,
> + -1, 100 /* near/far */);
> +
> + base_pipeline = create_base_pipeline ();
> +
> + clamp_pipeline = cogl_pipeline_copy (base_pipeline);
> + cogl_pipeline_set_layer_wrap_mode (clamp_pipeline,
> + 0, /* layer */
> + COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE);
> +
> + repeat_pipeline = cogl_pipeline_copy (base_pipeline);
> + cogl_pipeline_set_layer_wrap_mode (repeat_pipeline,
> + 0, /* layer */
> + COGL_PIPELINE_WRAP_MODE_REPEAT);
> +
> + test_pipeline (clamp_pipeline,
> + 0, 0, /* x/y offset */
> + clamp_colors);
> +
> + test_pipeline (repeat_pipeline,
> + 0, DRAW_SIZE * 2, /* x/y offset */
> + repeat_colors);
> +
> + cogl_object_unref (repeat_pipeline);
> + cogl_object_unref (clamp_pipeline);
> + cogl_object_unref (base_pipeline);
> +}
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list