On Sat, Oct 8, 2011 at 7:07 PM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@redhat.com> > > We need add a new set of fragment shader variants, along with new vertex > elements for signed and unsigned clears. > > The new fragment shader variants are due to the integers values requiring > CONSTANT interpolation. The new vertex element descriptions are for passing > the clear color as an unsigned or signed integer value. > > Signed-off-by: Dave Airlie <airl...@redhat.com> > --- > src/gallium/auxiliary/util/u_blitter.c | 86 ++++++++++++++++++++++++------- > src/gallium/auxiliary/util/u_blitter.h | 1 + > src/gallium/drivers/r300/r300_blit.c | 3 +- > src/gallium/drivers/r600/r600_blit.c | 6 +- > 4 files changed, 72 insertions(+), 24 deletions(-) > > diff --git a/src/gallium/auxiliary/util/u_blitter.c > b/src/gallium/auxiliary/util/u_blitter.c > index 1500aa4..5c87489 100644 > --- a/src/gallium/auxiliary/util/u_blitter.c > +++ b/src/gallium/auxiliary/util/u_blitter.c > @@ -68,6 +68,7 @@ struct blitter_context_priv > /* Fragment shaders. */ > /* The shader at index i outputs color to color buffers 0,1,...,i-1. */ > void *fs_col[PIPE_MAX_COLOR_BUFS+1]; > + void *fs_col_int[PIPE_MAX_COLOR_BUFS+1]; > > /* FS which outputs a color from a texture, > where the index is PIPE_TEXTURE_* to be sampled. */ > @@ -88,6 +89,8 @@ struct blitter_context_priv > void *dsa_keep_depth_write_stencil; > > void *velem_state; > + void *velem_uint_state; > + void *velem_sint_state; > > /* Sampler state for clamping to a miplevel. */ > void *sampler_state[PIPE_MAX_TEXTURE_LEVELS * 2]; > @@ -208,6 +211,27 @@ struct blitter_context *util_blitter_create(struct > pipe_context *pipe) > } > ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]); > > + memset(&velem[0], 0, sizeof(velem[0]) * 2); > + for (i = 0; i < 2; i++) { > + velem[i].src_offset = i * 4 * sizeof(float); > + if (i == 0) { > + velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; > + } else { > + velem[i].src_format = PIPE_FORMAT_R32G32B32A32_SINT; > + } > + } > + ctx->velem_sint_state = pipe->create_vertex_elements_state(pipe, 2, > &velem[0]); > + > + memset(&velem[0], 0, sizeof(velem[0]) * 2); > + for (i = 0; i < 2; i++) { > + velem[i].src_offset = i * 4 * sizeof(float); > + if (i == 0) { > + velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; > + } else { > + velem[i].src_format = PIPE_FORMAT_R32G32B32A32_UINT; > + } > + } > + ctx->velem_uint_state = pipe->create_vertex_elements_state(pipe, 2, > &velem[0]); > /* fragment shaders are created on-demand */ > > /* vertex shader */ > @@ -250,6 +274,8 @@ void util_blitter_destroy(struct blitter_context *blitter) > pipe->delete_rasterizer_state(pipe, ctx->rs_state); > pipe->delete_vs_state(pipe, ctx->vs); > pipe->delete_vertex_elements_state(pipe, ctx->velem_state); > + pipe->delete_vertex_elements_state(pipe, ctx->velem_sint_state); > + pipe->delete_vertex_elements_state(pipe, ctx->velem_uint_state); > > for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) { > if (ctx->fs_texfetch_col[i]) > @@ -261,6 +287,8 @@ void util_blitter_destroy(struct blitter_context *blitter) > for (i = 0; i <= PIPE_MAX_COLOR_BUFS; i++) > if (ctx->fs_col[i]) > pipe->delete_fs_state(pipe, ctx->fs_col[i]); > + if (ctx->fs_col_int[i]) > + pipe->delete_fs_state(pipe, ctx->fs_col_int[i]);
I guess you wanted to enclose the loop body in { }. With that fixed, this is: Reviewed-by: Marek Olšák <mar...@gmail.com> I wonder what happens if cb[0] is FLOAT, cb[1] is UINT, and cb[2] is SINT. Marek _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev