[Mesa-dev] [PATCH 5/7] util/blitter (and friends): generate appropriate SVIEW decls
Rob Clark
robdclark at gmail.com
Thu Jun 11 17:02:45 PDT 2015
On Thu, Jun 11, 2015 at 5:47 PM, Brian Paul <brianp at vmware.com> wrote:
> On 06/11/2015 02:38 PM, Rob Clark wrote:
>>
>> From: Rob Clark <robclark at freedesktop.org>
>>
>> Some hardware needs to know the sampler type. Update the blit related
>> shaders to include SVIEW decl.
>>
>> Signed-off-by: Rob Clark <robclark at freedesktop.org>
>> ---
>> src/gallium/auxiliary/util/u_blit.c | 35 +++++++++---
>> src/gallium/auxiliary/util/u_blitter.c | 53 +++++++++++++-----
>> src/gallium/auxiliary/util/u_simple_shaders.c | 78
>> ++++++++++++++++++++-------
>> src/gallium/auxiliary/util/u_simple_shaders.h | 16 +++---
>> src/gallium/auxiliary/util/u_tests.c | 3 +-
>> src/gallium/tests/trivial/quad-tex.c | 2 +-
>> 6 files changed, 140 insertions(+), 47 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/util/u_blit.c
>> b/src/gallium/auxiliary/util/u_blit.c
>> index 3f3b5fe..e3f3055 100644
>> --- a/src/gallium/auxiliary/util/u_blit.c
>> +++ b/src/gallium/auxiliary/util/u_blit.c
>> @@ -65,7 +65,7 @@ struct blit_state
>> struct pipe_vertex_element velem[2];
>>
>> void *vs;
>> - void *fs[PIPE_MAX_TEXTURE_TYPES][TGSI_WRITEMASK_XYZW + 1];
>> + void *fs[PIPE_MAX_TEXTURE_TYPES][TGSI_WRITEMASK_XYZW + 1][3];
>>
>> struct pipe_resource *vbuf; /**< quad vertices */
>> unsigned vbuf_slot;
>> @@ -135,15 +135,17 @@ void
>> util_destroy_blit(struct blit_state *ctx)
>> {
>> struct pipe_context *pipe = ctx->pipe;
>> - unsigned i, j;
>> + unsigned i, j, k;
>>
>> if (ctx->vs)
>> pipe->delete_vs_state(pipe, ctx->vs);
>>
>> for (i = 0; i < Elements(ctx->fs); i++) {
>> for (j = 0; j < Elements(ctx->fs[i]); j++) {
>> - if (ctx->fs[i][j])
>> - pipe->delete_fs_state(pipe, ctx->fs[i][j]);
>> + for (k = 0; k < Elements(ctx->fs[i][j]); k++) {
>> + if (ctx->fs[i][j][k])
>> + pipe->delete_fs_state(pipe, ctx->fs[i][j][k]);
>> + }
>> }
>> }
>>
>> @@ -158,18 +160,34 @@ util_destroy_blit(struct blit_state *ctx)
>> */
>> static INLINE void
>> set_fragment_shader(struct blit_state *ctx, uint writemask,
>> + enum pipe_format format,
>> enum pipe_texture_target pipe_tex)
>> {
>> - if (!ctx->fs[pipe_tex][writemask]) {
>> + enum tgsi_return_type stype;
>> + unsigned idx;
>> +
>> + if (util_format_is_pure_uint(format)) {
>> + stype = TGSI_RETURN_TYPE_UINT;
>> + idx = 0;
>> + } else if (util_format_is_pure_sint(format)) {
>> + stype = TGSI_RETURN_TYPE_SINT;
>> + idx = 1;
>> + } else {
>> + stype = TGSI_RETURN_TYPE_FLOAT;
>> + idx = 2;
>> + }
>> +
>> + if (!ctx->fs[pipe_tex][writemask][idx]) {
>> unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(pipe_tex, 0);
>>
>> - ctx->fs[pipe_tex][writemask] =
>> + ctx->fs[pipe_tex][writemask][idx] =
>> util_make_fragment_tex_shader_writemask(ctx->pipe, tgsi_tex,
>>
>> TGSI_INTERPOLATE_LINEAR,
>> - writemask);
>> + writemask,
>> + stype);
>> }
>>
>> - cso_set_fragment_shader_handle(ctx->cso,
>> ctx->fs[pipe_tex][writemask]);
>> + cso_set_fragment_shader_handle(ctx->cso,
>> ctx->fs[pipe_tex][writemask][idx]);
>> }
>>
>>
>> @@ -571,6 +589,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
>>
>> /* shaders */
>> set_fragment_shader(ctx, TGSI_WRITEMASK_XYZW,
>> + src_sampler_view->format,
>> src_sampler_view->texture->target);
>> set_vertex_shader(ctx);
>> cso_set_tessctrl_shader_handle(ctx->cso, NULL);
>> diff --git a/src/gallium/auxiliary/util/u_blitter.c
>> b/src/gallium/auxiliary/util/u_blitter.c
>> index 16bf90f..5dfe2c7 100644
>> --- a/src/gallium/auxiliary/util/u_blitter.c
>> +++ b/src/gallium/auxiliary/util/u_blitter.c
>> @@ -81,6 +81,8 @@ struct blitter_context_priv
>> /* FS which outputs a color from a texture,
>> where the index is PIPE_TEXTURE_* to be sampled. */
>> void *fs_texfetch_col[PIPE_MAX_TEXTURE_TYPES];
>> + void *fs_texfetch_col_uint[PIPE_MAX_TEXTURE_TYPES];
>> + void *fs_texfetch_col_sint[PIPE_MAX_TEXTURE_TYPES];
>>
>> /* FS which outputs a depth from a texture,
>> where the index is PIPE_TEXTURE_* to be sampled. */
>> @@ -90,6 +92,8 @@ struct blitter_context_priv
>>
>> /* FS which outputs one sample from a multisample texture. */
>> void *fs_texfetch_col_msaa[PIPE_MAX_TEXTURE_TYPES];
>> + void *fs_texfetch_col_msaa_uint[PIPE_MAX_TEXTURE_TYPES];
>> + void *fs_texfetch_col_msaa_sint[PIPE_MAX_TEXTURE_TYPES];
>> void *fs_texfetch_depth_msaa[PIPE_MAX_TEXTURE_TYPES];
>> void *fs_texfetch_depthstencil_msaa[PIPE_MAX_TEXTURE_TYPES];
>> void *fs_texfetch_stencil_msaa[PIPE_MAX_TEXTURE_TYPES];
>> @@ -438,6 +442,10 @@ void util_blitter_destroy(struct blitter_context
>> *blitter)
>> for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
>> if (ctx->fs_texfetch_col[i])
>> ctx->delete_fs_state(pipe, ctx->fs_texfetch_col[i]);
>> + if (ctx->fs_texfetch_col_sint[i])
>> + ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_sint[i]);
>> + if (ctx->fs_texfetch_col_uint[i])
>> + ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_uint[i]);
>> if (ctx->fs_texfetch_depth[i])
>> ctx->delete_fs_state(pipe, ctx->fs_texfetch_depth[i]);
>> if (ctx->fs_texfetch_depthstencil[i])
>> @@ -447,6 +455,10 @@ void util_blitter_destroy(struct blitter_context
>> *blitter)
>>
>> if (ctx->fs_texfetch_col_msaa[i])
>> ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_msaa[i]);
>> + if (ctx->fs_texfetch_col_msaa_sint[i])
>> + ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_msaa_sint[i]);
>> + if (ctx->fs_texfetch_col_msaa_uint[i])
>> + ctx->delete_fs_state(pipe, ctx->fs_texfetch_col_msaa_uint[i]);
>> if (ctx->fs_texfetch_depth_msaa[i])
>> ctx->delete_fs_state(pipe, ctx->fs_texfetch_depth_msaa[i]);
>> if (ctx->fs_texfetch_depthstencil_msaa[i])
>> @@ -844,25 +856,29 @@ static void *blitter_get_fs_texfetch_col(struct
>> blitter_context_priv *ctx,
>> {
>> struct pipe_context *pipe = ctx->base.pipe;
>> unsigned tgsi_tex = util_pipe_tex_to_tgsi_tex(target,
>> src_nr_samples);
>> + enum tgsi_return_type stype;
>>
>> assert(target < PIPE_MAX_TEXTURE_TYPES);
>>
>> + if (util_format_is_pure_uint(format))
>> + stype = TGSI_RETURN_TYPE_UINT;
>> + else if (util_format_is_pure_sint(format))
>> + stype = TGSI_RETURN_TYPE_SINT;
>> + else
>> + stype = TGSI_RETURN_TYPE_FLOAT;
>> +
>
>
> Need to indent with spaces, not tabs.
oh, whoops.. I apparently shouldn't be trying to carry on a
conversation while preparing patches.. I'll fix this up locally but I
don't think there is any point to resend unless other review
comments..
that said, I've been trying to find a good way to test the draw module
changes (w/ ST_DEBUG=tgsi to verify resulting shader) with llvmpipe
(since the hw drivers I have access to don't use draw).. not sure if
ST_DEBUG=tgsi is only dumping out the shader before draw modifies it?
Or if I'm just not running the right piglit tests.. suggestions
welcome
BR,
-R
> -Brian
>
More information about the mesa-dev
mailing list