summaryrefslogtreecommitdiff
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2017-05-30 19:24:17 +0200
committerMarek Olšák <marek.olsak@amd.com>2017-06-07 18:10:50 +0200
commiteedca3323efc0ec3c19afd975fcba00e923967e2 (patch)
tree7be4cc20c1c944fa91405cec0296f66b6e2663ba /src/gallium/auxiliary
parent20c2785f7c8c23a64866785c8054eb01e0967d35 (diff)
gallium/util: add _LZ and TXF options to simple shaders
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/util/u_blit.c2
-rw-r--r--src/gallium/auxiliary/util/u_blitter.c13
-rw-r--r--src/gallium/auxiliary/util/u_simple_shaders.c70
-rw-r--r--src/gallium/auxiliary/util/u_simple_shaders.h20
-rw-r--r--src/gallium/auxiliary/util/u_tests.c2
5 files changed, 75 insertions, 32 deletions
diff --git a/src/gallium/auxiliary/util/u_blit.c b/src/gallium/auxiliary/util/u_blit.c
index 6d8178ee561..3e49667029a 100644
--- a/src/gallium/auxiliary/util/u_blit.c
+++ b/src/gallium/auxiliary/util/u_blit.c
@@ -186,7 +186,7 @@ set_fragment_shader(struct blit_state *ctx, uint writemask,
util_make_fragment_tex_shader_writemask(ctx->pipe, tgsi_tex,
TGSI_INTERPOLATE_LINEAR,
writemask,
- stype, stype);
+ stype, stype, false, false);
}
cso_set_fragment_shader_handle(ctx->cso, ctx->fs[pipe_tex][writemask][idx]);
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
index 13fa9651392..1aef01376ee 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -952,7 +952,8 @@ static void *blitter_get_fs_texfetch_col(struct blitter_context_priv *ctx,
assert(!ctx->cached_all_shaders);
*shader = util_make_fragment_tex_shader(pipe, tgsi_tex,
TGSI_INTERPOLATE_LINEAR,
- stype, dtype);
+ stype, dtype,
+ false, false);
}
return *shader;
@@ -990,7 +991,8 @@ void *blitter_get_fs_texfetch_depth(struct blitter_context_priv *ctx,
tgsi_tex = util_pipe_tex_to_tgsi_tex(target, 0);
*shader =
util_make_fragment_tex_shader_writedepth(pipe, tgsi_tex,
- TGSI_INTERPOLATE_LINEAR);
+ TGSI_INTERPOLATE_LINEAR,
+ false, false);
}
return *shader;
@@ -1028,7 +1030,9 @@ void *blitter_get_fs_texfetch_depthstencil(struct blitter_context_priv *ctx,
tgsi_tex = util_pipe_tex_to_tgsi_tex(target, 0);
*shader =
util_make_fragment_tex_shader_writedepthstencil(pipe, tgsi_tex,
- TGSI_INTERPOLATE_LINEAR);
+ TGSI_INTERPOLATE_LINEAR,
+ false,
+ false);
}
return *shader;
@@ -1066,7 +1070,8 @@ void *blitter_get_fs_texfetch_stencil(struct blitter_context_priv *ctx,
tgsi_tex = util_pipe_tex_to_tgsi_tex(target, 0);
*shader =
util_make_fragment_tex_shader_writestencil(pipe, tgsi_tex,
- TGSI_INTERPOLATE_LINEAR);
+ TGSI_INTERPOLATE_LINEAR,
+ false, false);
}
return *shader;
diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c b/src/gallium/auxiliary/util/u_simple_shaders.c
index 613ec4ab98f..5874d0e9aa4 100644
--- a/src/gallium/auxiliary/util/u_simple_shaders.c
+++ b/src/gallium/auxiliary/util/u_simple_shaders.c
@@ -205,6 +205,28 @@ void *util_make_layered_clear_geometry_shader(struct pipe_context *pipe)
return pipe->create_gs_state(pipe, &state);
}
+static void
+ureg_load_tex(struct ureg_program *ureg, struct ureg_dst out,
+ struct ureg_src coord, struct ureg_src sampler,
+ unsigned tex_target, bool load_level_zero, bool use_txf)
+{
+ if (use_txf) {
+ struct ureg_dst temp = ureg_DECL_temporary(ureg);
+
+ ureg_F2I(ureg, temp, coord);
+
+ if (load_level_zero)
+ ureg_TXF_LZ(ureg, out, tex_target, ureg_src(temp), sampler);
+ else
+ ureg_TXF(ureg, out, tex_target, ureg_src(temp), sampler);
+ } else {
+ if (load_level_zero)
+ ureg_TEX_LZ(ureg, out, tex_target, coord, sampler);
+ else
+ ureg_TEX(ureg, out, tex_target, coord, sampler);
+ }
+}
+
/**
* Make simple fragment texture shader:
* IMM {0,0,0,1} // (if writemask != 0xf)
@@ -224,7 +246,9 @@ util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
unsigned interp_mode,
unsigned writemask,
enum tgsi_return_type stype,
- enum tgsi_return_type dtype)
+ enum tgsi_return_type dtype,
+ bool load_level_zero,
+ bool use_txf)
{
struct ureg_program *ureg;
struct ureg_src sampler;
@@ -265,9 +289,8 @@ util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
ureg_writemask(temp, writemask),
tex_target, tex, sampler);
else
- ureg_TEX(ureg,
- ureg_writemask(temp, writemask),
- tex_target, tex, sampler);
+ ureg_load_tex(ureg, ureg_writemask(temp, writemask), tex, sampler,
+ tex_target, load_level_zero, use_txf);
if (stype != dtype) {
if (stype == TGSI_RETURN_TYPE_SINT) {
@@ -299,13 +322,16 @@ void *
util_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target,
unsigned interp_mode,
enum tgsi_return_type stype,
- enum tgsi_return_type dtype)
+ enum tgsi_return_type dtype,
+ bool load_level_zero,
+ bool use_txf)
{
return util_make_fragment_tex_shader_writemask( pipe,
tex_target,
interp_mode,
TGSI_WRITEMASK_XYZW,
- stype, dtype );
+ stype, dtype, load_level_zero,
+ use_txf);
}
@@ -316,7 +342,9 @@ util_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target,
void *
util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
unsigned tex_target,
- unsigned interp_mode)
+ unsigned interp_mode,
+ bool load_level_zero,
+ bool use_txf)
{
struct ureg_program *ureg;
struct ureg_src sampler;
@@ -352,9 +380,8 @@ util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
ureg_MOV( ureg, out, imm );
- ureg_TEX( ureg,
- ureg_writemask(depth, TGSI_WRITEMASK_Z),
- tex_target, tex, sampler );
+ 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 );
@@ -368,7 +395,9 @@ util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
void *
util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
unsigned tex_target,
- unsigned interp_mode)
+ unsigned interp_mode,
+ bool load_level_zero,
+ bool use_txf)
{
struct ureg_program *ureg;
struct ureg_src depth_sampler, stencil_sampler;
@@ -413,12 +442,10 @@ util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
ureg_MOV( ureg, out, imm );
- ureg_TEX( ureg,
- ureg_writemask(depth, TGSI_WRITEMASK_Z),
- tex_target, tex, depth_sampler );
- ureg_TEX( ureg,
- ureg_writemask(stencil, TGSI_WRITEMASK_Y),
- tex_target, tex, stencil_sampler );
+ 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 );
@@ -432,7 +459,9 @@ util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
void *
util_make_fragment_tex_shader_writestencil(struct pipe_context *pipe,
unsigned tex_target,
- unsigned interp_mode)
+ unsigned interp_mode,
+ bool load_level_zero,
+ bool use_txf)
{
struct ureg_program *ureg;
struct ureg_src stencil_sampler;
@@ -468,9 +497,8 @@ util_make_fragment_tex_shader_writestencil(struct pipe_context *pipe,
ureg_MOV( ureg, out, imm );
- ureg_TEX( ureg,
- ureg_writemask(stencil, TGSI_WRITEMASK_Y),
- tex_target, tex, stencil_sampler );
+ 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 );
diff --git a/src/gallium/auxiliary/util/u_simple_shaders.h b/src/gallium/auxiliary/util/u_simple_shaders.h
index 04810982024..de05aad3a65 100644
--- a/src/gallium/auxiliary/util/u_simple_shaders.h
+++ b/src/gallium/auxiliary/util/u_simple_shaders.h
@@ -74,30 +74,40 @@ util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
unsigned interp_mode,
unsigned writemask,
enum tgsi_return_type stype,
- enum tgsi_return_type dtype);
+ enum tgsi_return_type dtype,
+ bool load_level_zero,
+ bool use_txf);
extern void *
util_make_fragment_tex_shader(struct pipe_context *pipe, unsigned tex_target,
unsigned interp_mode,
enum tgsi_return_type stype,
- enum tgsi_return_type dtype);
+ enum tgsi_return_type dtype,
+ bool load_level_zero,
+ bool use_txf);
extern void *
util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
unsigned tex_target,
- unsigned interp_mode);
+ unsigned interp_mode,
+ bool load_level_zero,
+ bool use_txf);
extern void *
util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
unsigned tex_target,
- unsigned interp_mode);
+ unsigned interp_mode,
+ bool load_level_zero,
+ bool use_txf);
extern void *
util_make_fragment_tex_shader_writestencil(struct pipe_context *pipe,
unsigned tex_target,
- unsigned interp_mode);
+ unsigned interp_mode,
+ bool load_level_zero,
+ bool use_txf);
extern void *
diff --git a/src/gallium/auxiliary/util/u_tests.c b/src/gallium/auxiliary/util/u_tests.c
index 30eb589b06f..7ec8eef65fc 100644
--- a/src/gallium/auxiliary/util/u_tests.c
+++ b/src/gallium/auxiliary/util/u_tests.c
@@ -375,7 +375,7 @@ null_sampler_view(struct pipe_context *ctx, unsigned tgsi_tex_target)
fs = util_make_fragment_tex_shader(ctx, tgsi_tex_target,
TGSI_INTERPOLATE_LINEAR,
TGSI_RETURN_TYPE_FLOAT,
- TGSI_RETURN_TYPE_FLOAT);
+ TGSI_RETURN_TYPE_FLOAT, false, false);
cso_set_fragment_shader_handle(cso, fs);
/* Vertex shader. */