[Mesa-dev] [PATCH 2/3] util/u_blit: Support blits from cubemaps.
Jose Fonseca
jfonseca at vmware.com
Wed Sep 18 03:37:58 PDT 2013
----- Original Message -----
> 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.
Yes, it probably would be better. That would require computing r texcoord for 3d surfaces, and arrays.
Jose
More information about the mesa-dev
mailing list