diff options
author | Marek Olšák <[email protected]> | 2019-06-20 19:52:23 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-07-03 15:51:12 -0400 |
commit | 13a5e9d68528236676ff7975fcf61ca26ae3baa0 (patch) | |
tree | 0586326b000dd008af354a48346b6aeebc74f5f4 /src | |
parent | 131d40cfc91fc08cd8086478c344e3091f9f3833 (diff) |
gallium/util: rewrite depth-stencil blit shaders
- 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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/util/u_blitter.c | 19 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_simple_shaders.c | 185 | ||||
-rw-r--r-- | 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 @@ -379,172 +379,61 @@ 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, |