From 13a5e9d68528236676ff7975fcf61ca26ae3baa0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 20 Jun 2019 19:52:23 -0400 Subject: [PATCH] gallium/util: rewrite depth-stencil blit shaders MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - merge all 3 functions (Z, S, ZS) - don't write the color output - read the value from texel.x, then write it to position.z or stencil.y (don't use the value from texel.y or texel.z) Tested-by: Dieter Nützel --- src/gallium/auxiliary/util/u_blitter.c | 19 +- src/gallium/auxiliary/util/u_simple_shaders.c | 185 ++++-------------- src/gallium/auxiliary/util/u_simple_shaders.h | 25 +-- 3 files changed, 46 insertions(+), 183 deletions(-) diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index 1c141e67f27..3504f5c31de 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -1029,10 +1029,8 @@ void *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx, enum tgsi_texture_type tgsi_tex; assert(!ctx->cached_all_shaders); tgsi_tex = util_pipe_tex_to_tgsi_tex(target, 0); - *shader = - util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex, - TGSI_INTERPOLATE_LINEAR, - ctx->has_tex_lz, use_txf); + *shader = util_make_fs_blit_zs(pipe, PIPE_MASK_Z, tgsi_tex, + ctx->has_tex_lz, use_txf); } return *shader; @@ -1074,11 +1072,8 @@ void *blitter_get_fs_texfetch_depthstencil(struct blitter_context_priv *ctx, enum tgsi_texture_type tgsi_tex; assert(!ctx->cached_all_shaders); tgsi_tex = util_pipe_tex_to_tgsi_tex(target, 0); - *shader = - util_make_fragment_tex_shader_writedepthstencil(pipe, tgsi_tex, - TGSI_INTERPOLATE_LINEAR, - ctx->has_tex_lz, - use_txf); + *shader = util_make_fs_blit_zs(pipe, PIPE_MASK_ZS, tgsi_tex, + ctx->has_tex_lz, use_txf); } return *shader; @@ -1120,10 +1115,8 @@ void *blitter_get_fs_texfetch_stencil(struct blitter_context_priv *ctx, enum tgsi_texture_type tgsi_tex; assert(!ctx->cached_all_shaders); tgsi_tex = util_pipe_tex_to_tgsi_tex(target, 0); - *shader = - util_make_fragment_tex_shader_writestencil(pipe, tgsi_tex, - TGSI_INTERPOLATE_LINEAR, - ctx->has_tex_lz, use_txf); + *shader = util_make_fs_blit_zs(pipe, PIPE_MASK_S, tgsi_tex, + ctx->has_tex_lz, use_txf); } return *shader; diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c b/src/gallium/auxiliary/util/u_simple_shaders.c index d62a65579ae..c111eaf1db5 100644 --- a/src/gallium/auxiliary/util/u_simple_shaders.c +++ b/src/gallium/auxiliary/util/u_simple_shaders.c @@ -378,173 +378,62 @@ util_make_fragment_tex_shader(struct pipe_context *pipe, } -/** - * Make a simple fragment texture shader which reads an X component from - * a texture and writes it as depth. - */ -void * -util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe, - enum tgsi_texture_type tex_target, - enum tgsi_interpolate_mode interp_mode, - bool load_level_zero, - bool use_txf) -{ - struct ureg_program *ureg; - struct ureg_src sampler; - struct ureg_src tex; - struct ureg_dst out, depth; - struct ureg_src imm; - - ureg = ureg_create( PIPE_SHADER_FRAGMENT ); - if (!ureg) - return NULL; - - sampler = ureg_DECL_sampler( ureg, 0 ); - - ureg_DECL_sampler_view(ureg, 0, tex_target, - TGSI_RETURN_TYPE_FLOAT, - TGSI_RETURN_TYPE_FLOAT, - TGSI_RETURN_TYPE_FLOAT, - TGSI_RETURN_TYPE_FLOAT); - - tex = ureg_DECL_fs_input( ureg, - TGSI_SEMANTIC_GENERIC, 0, - interp_mode ); - - out = ureg_DECL_output( ureg, - TGSI_SEMANTIC_COLOR, - 0 ); - - depth = ureg_DECL_output( ureg, - TGSI_SEMANTIC_POSITION, - 0 ); - - imm = ureg_imm4f( ureg, 0, 0, 0, 1 ); - - ureg_MOV( ureg, out, imm ); - - ureg_load_tex(ureg, ureg_writemask(depth, TGSI_WRITEMASK_Z), tex, sampler, - tex_target, load_level_zero, use_txf); - ureg_END( ureg ); - - return ureg_create_shader_and_destroy( ureg, pipe ); -} - - /** * Make a simple fragment texture shader which reads the texture unit 0 and 1 * and writes it as depth and stencil, respectively. */ void * -util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe, - enum tgsi_texture_type tex_target, - enum tgsi_interpolate_mode interp_mode, - bool load_level_zero, - bool use_txf) +util_make_fs_blit_zs(struct pipe_context *pipe, unsigned zs_mask, + enum tgsi_texture_type tex_target, + bool load_level_zero, bool use_txf) { struct ureg_program *ureg; - struct ureg_src depth_sampler, stencil_sampler; - struct ureg_src tex; - struct ureg_dst out, depth, stencil; - struct ureg_src imm; + struct ureg_src depth_sampler, stencil_sampler, coord; + struct ureg_dst depth, stencil, tmp; - ureg = ureg_create( PIPE_SHADER_FRAGMENT ); - if (!ureg) - return NULL; - - depth_sampler = ureg_DECL_sampler( ureg, 0 ); - ureg_DECL_sampler_view(ureg, 0, tex_target, - TGSI_RETURN_TYPE_FLOAT, - TGSI_RETURN_TYPE_FLOAT, - TGSI_RETURN_TYPE_FLOAT, - TGSI_RETURN_TYPE_FLOAT); - stencil_sampler = ureg_DECL_sampler( ureg, 1 ); - ureg_DECL_sampler_view(ureg, 0, tex_target, - TGSI_RETURN_TYPE_UINT, - TGSI_RETURN_TYPE_UINT, - TGSI_RETURN_TYPE_UINT, - TGSI_RETURN_TYPE_UINT); - - tex = ureg_DECL_fs_input( ureg, - TGSI_SEMANTIC_GENERIC, 0, - interp_mode ); - - out = ureg_DECL_output( ureg, - TGSI_SEMANTIC_COLOR, - 0 ); - - depth = ureg_DECL_output( ureg, - TGSI_SEMANTIC_POSITION, - 0 ); - - stencil = ureg_DECL_output( ureg, - TGSI_SEMANTIC_STENCIL, - 0 ); - - imm = ureg_imm4f( ureg, 0, 0, 0, 1 ); - - ureg_MOV( ureg, out, imm ); - - ureg_load_tex(ureg, ureg_writemask(depth, TGSI_WRITEMASK_Z), tex, - depth_sampler, tex_target, load_level_zero, use_txf); - ureg_load_tex(ureg, ureg_writemask(stencil, TGSI_WRITEMASK_Y), tex, - stencil_sampler, tex_target, load_level_zero, use_txf); - ureg_END( ureg ); - - return ureg_create_shader_and_destroy( ureg, pipe ); -} - - -/** - * Make a simple fragment texture shader which reads a texture and writes it - * as stencil. - */ -void * -util_make_fragment_tex_shader_writestencil(struct pipe_context *pipe, - enum tgsi_texture_type tex_target, - enum tgsi_interpolate_mode interp_mode, - bool load_level_zero, - bool use_txf) -{ - struct ureg_program *ureg; - struct ureg_src stencil_sampler; - struct ureg_src tex; - struct ureg_dst out, stencil; - struct ureg_src imm; - - ureg = ureg_create( PIPE_SHADER_FRAGMENT ); + ureg = ureg_create(PIPE_SHADER_FRAGMENT); if (!ureg) return NULL; - stencil_sampler = ureg_DECL_sampler( ureg, 0 ); + coord = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, 0, + TGSI_INTERPOLATE_LINEAR); + tmp = ureg_DECL_temporary(ureg); - ureg_DECL_sampler_view(ureg, 0, tex_target, - TGSI_RETURN_TYPE_UINT, - TGSI_RETURN_TYPE_UINT, - TGSI_RETURN_TYPE_UINT, - TGSI_RETURN_TYPE_UINT); + if (zs_mask & PIPE_MASK_Z) { + depth_sampler = ureg_DECL_sampler(ureg, 0); + ureg_DECL_sampler_view(ureg, 0, tex_target, + TGSI_RETURN_TYPE_FLOAT, + TGSI_RETURN_TYPE_FLOAT, + TGSI_RETURN_TYPE_FLOAT, + TGSI_RETURN_TYPE_FLOAT); - tex = ureg_DECL_fs_input( ureg, - TGSI_SEMANTIC_GENERIC, 0, - interp_mode ); + ureg_load_tex(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), coord, + depth_sampler, tex_target, load_level_zero, use_txf); - out = ureg_DECL_output( ureg, - TGSI_SEMANTIC_COLOR, - 0 ); + depth = ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0); + ureg_MOV(ureg, ureg_writemask(depth, TGSI_WRITEMASK_Z), + ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X)); + } - stencil = ureg_DECL_output( ureg, - TGSI_SEMANTIC_STENCIL, - 0 ); + if (zs_mask & PIPE_MASK_S) { + stencil_sampler = ureg_DECL_sampler(ureg, zs_mask & PIPE_MASK_Z ? 1 : 0); + ureg_DECL_sampler_view(ureg, 0, tex_target, + TGSI_RETURN_TYPE_UINT, + TGSI_RETURN_TYPE_UINT, + TGSI_RETURN_TYPE_UINT, + TGSI_RETURN_TYPE_UINT); - imm = ureg_imm4f( ureg, 0, 0, 0, 1 ); + ureg_load_tex(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), coord, + stencil_sampler, tex_target, load_level_zero, use_txf); - ureg_MOV( ureg, out, imm ); + stencil = ureg_DECL_output(ureg, TGSI_SEMANTIC_STENCIL, 0); + ureg_MOV(ureg, ureg_writemask(stencil, TGSI_WRITEMASK_Y), + ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X)); + } - ureg_load_tex(ureg, ureg_writemask(stencil, TGSI_WRITEMASK_Y), tex, - stencil_sampler, tex_target, load_level_zero, use_txf); - ureg_END( ureg ); + ureg_END(ureg); - return ureg_create_shader_and_destroy( ureg, pipe ); + return ureg_create_shader_and_destroy(ureg, pipe); } diff --git a/src/gallium/auxiliary/util/u_simple_shaders.h b/src/gallium/auxiliary/util/u_simple_shaders.h index 3afe4cc050b..4d4f5e97f5b 100644 --- a/src/gallium/auxiliary/util/u_simple_shaders.h +++ b/src/gallium/auxiliary/util/u_simple_shaders.h @@ -92,28 +92,9 @@ util_make_fragment_tex_shader(struct pipe_context *pipe, bool use_txf); extern void * -util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe, - enum tgsi_texture_type tex_target, - enum tgsi_interpolate_mode interp_mode, - bool load_level_zero, - bool use_txf); - - -extern void * -util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe, - enum tgsi_texture_type tex_target, - enum tgsi_interpolate_mode interp_mode, - bool load_level_zero, - bool use_txf); - - -extern void * -util_make_fragment_tex_shader_writestencil(struct pipe_context *pipe, - enum tgsi_texture_type tex_target, - enum tgsi_interpolate_mode interp_mode, - bool load_level_zero, - bool use_txf); - +util_make_fs_blit_zs(struct pipe_context *pipe, unsigned zs_mask, + enum tgsi_texture_type tex_target, + bool load_level_zero, bool use_txf); extern void * util_make_fragment_passthrough_shader(struct pipe_context *pipe, -- 2.30.2