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 <Dieter@nuetzel-hh.de>
This commit is contained in:
Marek Olšák
2019-06-20 19:52:23 -04:00
parent 131d40cfc9
commit 13a5e9d685
3 changed files with 46 additions and 183 deletions
+6 -13
View File
@@ -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;
+37 -148
View File
@@ -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 );
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);
coord = ureg_DECL_fs_input(ureg, TGSI_SEMANTIC_GENERIC, 0,
TGSI_INTERPOLATE_LINEAR);
tmp = ureg_DECL_temporary(ureg);
tex = ureg_DECL_fs_input( ureg,
TGSI_SEMANTIC_GENERIC, 0,
interp_mode );
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);
out = ureg_DECL_output( ureg,
TGSI_SEMANTIC_COLOR,
0 );
ureg_load_tex(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), coord,
depth_sampler, tex_target, load_level_zero, use_txf);
depth = ureg_DECL_output( ureg,
TGSI_SEMANTIC_POSITION,
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(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 );
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 );
if (!ureg)
return NULL;
stencil_sampler = ureg_DECL_sampler( ureg, 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);
tex = ureg_DECL_fs_input( ureg,
TGSI_SEMANTIC_GENERIC, 0,
interp_mode );
out = ureg_DECL_output( ureg,
TGSI_SEMANTIC_COLOR,
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(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 );
return ureg_create_shader_and_destroy(ureg, pipe);
}
+3 -22
View File
@@ -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,