Am 12.06.2015 um 02:02 schrieb Rob Clark: > On Thu, Jun 11, 2015 at 5:47 PM, Brian Paul <bri...@vmware.com> wrote: >> On 06/11/2015 02:38 PM, Rob Clark wrote: >>> >>> From: Rob Clark <robcl...@freedesktop.org> >>> >>> Some hardware needs to know the sampler type. Update the blit related >>> shaders to include SVIEW decl. >>> >>> Signed-off-by: Rob Clark <robcl...@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
ST_DEBUG=tgsi may indeed be printing out unmodified shaders. You can use GALLIVM_DEBUG=tgsi which should print out what is actually compiled (at least for llvmpipe). Not sure how you could print them out for softpipe - it seems the stages which modify the tokens have their own debug code for calling tgsi_dump but it's ifdefed out... But there's probably very few tests actually hitting these paths. Roland > BR, > -R > >> -Brian >> > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev