[Mesa-dev] [PATCH 2/3] util/u_blit: Support blits from cubemaps.
Roland Scheidegger
sroland at vmware.com
Tue Sep 17 19:47:51 PDT 2013
Am 17.09.2013 20:32, schrieb jfonseca at vmware.com:
> From: José Fonseca <jfonseca at vmware.com>
>
> By calling util_map_texcoords2d_onto_cubemap.
>
> A new parameter for util_blit_pixels_tex is necessary, as
> pipe_sampler_view::first_layer is always supposed to point to the first
> face when sampling from cubemaps.
> ---
> src/gallium/auxiliary/util/u_blit.c | 34 +++++++++++++++++++++++++++++++---
> src/gallium/auxiliary/util/u_blit.h | 1 +
> 2 files changed, 32 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_blit.c b/src/gallium/auxiliary/util/u_blit.c
> index 8cc080c..e9bec4a 100644
> --- a/src/gallium/auxiliary/util/u_blit.c
> +++ b/src/gallium/auxiliary/util/u_blit.c
> @@ -46,6 +46,7 @@
> #include "util/u_math.h"
> #include "util/u_memory.h"
> #include "util/u_sampler.h"
> +#include "util/u_texture.h"
> #include "util/u_simple_shaders.h"
>
> #include "cso_cache/cso_context.h"
> @@ -143,7 +144,6 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)
> /* init vertex data that doesn't change */
> for (i = 0; i < 4; i++) {
> ctx->vertices[i][0][3] = 1.0f; /* w */
> - ctx->vertices[i][1][2] = 0.0f; /* r */
> ctx->vertices[i][1][3] = 1.0f; /* q */
> }
>
> @@ -327,6 +327,8 @@ get_next_slot( struct blit_state *ctx )
> */
> static unsigned
> setup_vertex_data_tex(struct blit_state *ctx,
> + unsigned src_target,
> + unsigned src_face,
> float x0, float y0, float x1, float y1,
> float s0, float t0, float s1, float t1,
> float z)
> @@ -338,24 +340,37 @@ setup_vertex_data_tex(struct blit_state *ctx,
> ctx->vertices[0][0][2] = z;
> ctx->vertices[0][1][0] = s0; /*s*/
> ctx->vertices[0][1][1] = t0; /*t*/
> + ctx->vertices[0][1][2] = 0; /*r*/
>
> ctx->vertices[1][0][0] = x1;
> ctx->vertices[1][0][1] = y0;
> ctx->vertices[1][0][2] = z;
> ctx->vertices[1][1][0] = s1; /*s*/
> ctx->vertices[1][1][1] = t0; /*t*/
> + ctx->vertices[1][1][2] = 0; /*r*/
>
> ctx->vertices[2][0][0] = x1;
> ctx->vertices[2][0][1] = y1;
> ctx->vertices[2][0][2] = z;
> ctx->vertices[2][1][0] = s1;
> ctx->vertices[2][1][1] = t1;
> + ctx->vertices[3][1][2] = 0;
>
> ctx->vertices[3][0][0] = x0;
> ctx->vertices[3][0][1] = y1;
> ctx->vertices[3][0][2] = z;
> ctx->vertices[3][1][0] = s0;
> ctx->vertices[3][1][1] = t1;
> + ctx->vertices[3][1][2] = 0;
> +
> + if (src_target == PIPE_TEXTURE_CUBE ||
> + src_target == PIPE_TEXTURE_CUBE_ARRAY) {
> + /* Map cubemap texture coordinates inplace. */
> + const unsigned stride = sizeof ctx->vertices[0] / sizeof ctx->vertices[0][0][0];
> + util_map_texcoords2d_onto_cubemap(src_face,
> + &ctx->vertices[0][1][0], stride,
> + &ctx->vertices[0][1][0], stride);
> + }
>
> offset = get_next_slot( ctx );
>
> @@ -770,6 +785,8 @@ util_blit_pixels(struct blit_state *ctx,
>
> /* draw quad */
> offset = setup_vertex_data_tex(ctx,
> + sampler_view->texture->target,
> + srcZ0 % 6,
> (float) dstX0 / dst_surface->width * 2.0f - 1.0f,
> (float) dstY0 / dst_surface->height * 2.0f - 1.0f,
> (float) dstX1 / dst_surface->width * 2.0f - 1.0f,
> @@ -811,16 +828,25 @@ util_blit_pixels(struct blit_state *ctx,
>
>
> /**
> - * Copy pixel block from src texture to dst surface.
> + * Copy pixel block from src sampler view to dst surface.
> + *
> * The sampler view's first_level field indicates the source
> * mipmap level to use.
> - * XXX need some control over blitting Z and/or stencil.
> + *
> + * The sampler view's first_layer indicate the layer to use, but for
> + * cube maps it must point to the first face. Face is passed in src_face.
> + *
> + * The main advantage over util_blit_pixels is that it allows to specify swizzles in
> + * pipe_sampler_view::swizzle_?.
> + *
> + * But there is no control over blitting Z and/or stencil.
> */
> void
> util_blit_pixels_tex(struct blit_state *ctx,
> struct pipe_sampler_view *src_sampler_view,
> int srcX0, int srcY0,
> int srcX1, int srcY1,
> + unsigned src_face,
> struct pipe_surface *dst,
> int dstX0, int dstY0,
> int dstX1, int dstY1,
> @@ -922,6 +948,8 @@ util_blit_pixels_tex(struct blit_state *ctx,
>
> /* draw quad */
> offset = setup_vertex_data_tex(ctx,
> + src_sampler_view->texture->target,
> + src_face,
> (float) dstX0 / dst->width * 2.0f - 1.0f,
> (float) dstY0 / dst->height * 2.0f - 1.0f,
> (float) dstX1 / dst->width * 2.0f - 1.0f,
> diff --git a/src/gallium/auxiliary/util/u_blit.h b/src/gallium/auxiliary/util/u_blit.h
> index 56ab030..bfcd1bb 100644
> --- a/src/gallium/auxiliary/util/u_blit.h
> +++ b/src/gallium/auxiliary/util/u_blit.h
> @@ -73,6 +73,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
> struct pipe_sampler_view *src_sampler_view,
> int srcX0, int srcY0,
> int srcX1, int srcY1,
> + unsigned src_face,
> struct pipe_surface *dst,
> int dstX0, int dstY0,
> int dstX1, int dstY1,
>
Series looks good to me. I wonder though if it wouldn't be nicer if
instead of src_face util_blit_pixels_tex would just take a layer
parameter, so the caller wouldn't need to create different views for
blitting to different array layers. But that could be changed later.
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
More information about the mesa-dev
mailing list