[Cogl] [PATCH 1/3] texture-2d-slice: Fix the foreach_sub_texture_in_region implementation
Robert Bragg
robert at sixbynine.org
Wed Jan 16 05:21:47 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:
> There were a few problems with the sub texture iterating code of
> sliced textures which were causing some conformance tests to fail when
> NPOT textures are disabled:
>
> • The spans are stored in un-normalized coordinates and the
> coordinates passed to the foreach function are normalized. The
> function was trying to un-normalize them before passing them to the
> span iterator code but it was using the wrong factor which was
> causing it to actually doubley normalize them.
>
> • The shim function to renormalize the coordinates before passing them
> to the callback was renormalizing the sub-texture coordinates
> instead of the virtual coordinates. The sub-texture coordinates are
> already in the right scale for whatever is the underlying texture so
> we don't need to touch them. Instead we need to normalize the
> virtual coordinates because these are coming from the un-normalized
> coordinates that we passed to the span iterating code.
>
> • The normalize factors passed to the span iterating were always 1.
> The code uses this normalizing factor to round the incoming
> coordinates to the nearest multiple of a full texture. It divides
> the coordinates by the factor rather than multiplying so it looks
> like we should be passing the virtual texture size here.
> ---
> cogl/cogl-texture-2d-sliced.c | 28 +++++++++++++++++-----------
> tests/conform/test-conform-main.c | 4 ++--
> 2 files changed, 19 insertions(+), 13 deletions(-)
>
> diff --git a/cogl/cogl-texture-2d-sliced.c b/cogl/cogl-texture-2d-sliced.c
> index 6d1f530..96df692 100644
> --- a/cogl/cogl-texture-2d-sliced.c
> +++ b/cogl/cogl-texture-2d-sliced.c
> @@ -75,15 +75,18 @@ re_normalize_sub_texture_coords_cb (CoglTexture *sub_texture,
> void *user_data)
> {
> ForeachData *data = user_data;
> + /* The coordinates passed to the span iterating code were
> + * un-normalized so we need to renormalize them before passing them
> + * on */
> float re_normalized_coords[4] =
> {
> - sub_texture_coords[0] * data->x_normalize_factor,
> - sub_texture_coords[1] * data->y_normalize_factor,
> - sub_texture_coords[2] * data->x_normalize_factor,
> - sub_texture_coords[3] * data->y_normalize_factor
> + meta_coords[0] * data->x_normalize_factor,
> + meta_coords[1] * data->y_normalize_factor,
> + meta_coords[2] * data->x_normalize_factor,
> + meta_coords[3] * data->y_normalize_factor
> };
>
> - data->callback (sub_texture, re_normalized_coords, meta_coords,
> + data->callback (sub_texture, sub_texture_coords, re_normalized_coords,
> data->user_data);
> }
>
> @@ -115,19 +118,22 @@ _cogl_texture_2d_sliced_foreach_sub_texture_in_region (
> data.x_normalize_factor = 1.0f / tex_2ds->width;
> data.y_normalize_factor = 1.0f / tex_2ds->height;
>
> - un_normalized_coords[0] = virtual_tx_1 * data.x_normalize_factor;
> - un_normalized_coords[1] = virtual_ty_1 * data.y_normalize_factor;
> - un_normalized_coords[2] = virtual_tx_2 * data.x_normalize_factor;
> - un_normalized_coords[3] = virtual_ty_2 * data.y_normalize_factor;
> + un_normalized_coords[0] = virtual_tx_1 * tex_2ds->width;
> + un_normalized_coords[1] = virtual_ty_1 * tex_2ds->height;
> + un_normalized_coords[2] = virtual_tx_2 * tex_2ds->width;
> + un_normalized_coords[3] = virtual_ty_2 * tex_2ds->height;
>
> + /* Note that the normalize factors passed here are the reciprocal of
> + * the factors calculated above because the span iterating code
> + * normalizes by dividing by the factor instead of multiplying */
> _cogl_texture_spans_foreach_in_region (x_spans,
> tex_2ds->slice_x_spans->len,
> y_spans,
> tex_2ds->slice_y_spans->len,
> textures,
> un_normalized_coords,
> - 1, /* x_normalize_factor */
> - 1, /* y_normalize_factor */
> + tex_2ds->width,
> + tex_2ds->height,
> COGL_PIPELINE_WRAP_MODE_REPEAT,
> COGL_PIPELINE_WRAP_MODE_REPEAT,
> re_normalize_sub_texture_coords_cb,
> diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
> index c49ea58..5acf2e5 100644
> --- a/tests/conform/test-conform-main.c
> +++ b/tests/conform/test-conform-main.c
> @@ -63,7 +63,7 @@ main (int argc, char **argv)
>
> ADD_TEST (test_sparse_pipeline, 0, 0);
>
> - ADD_TEST (test_npot_texture, 0, TEST_REQUIREMENT_NPOT);
> + ADD_TEST (test_npot_texture, 0, 0);
> UNPORTED_TEST (test_multitexture);
> UNPORTED_TEST (test_texture_mipmaps);
> ADD_TEST (test_sub_texture, 0, 0);
> @@ -74,7 +74,7 @@ main (int argc, char **argv)
> ADD_TEST (test_texture_3d, TEST_REQUIREMENT_TEXTURE_3D, 0);
> ADD_TEST (test_wrap_modes, 0, 0);
> UNPORTED_TEST (test_texture_pixmap_x11);
> - ADD_TEST (test_texture_get_set_data, 0, TEST_REQUIREMENT_NPOT);
> + ADD_TEST (test_texture_get_set_data, 0, 0);
> ADD_TEST (test_texture_mipmap_get_set, 0, 0);
> ADD_TEST (test_atlas_migration, 0, 0);
> ADD_TEST (test_read_texture_formats, 0, 0);
> --
> 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