[Mesa-dev] [PATCH 1/3] gallium: add explicit return type to texture opcodes
Marek Olšák
maraeo at gmail.com
Mon Aug 22 14:38:41 UTC 2016
From: Marek Olšák <marek.olsak at amd.com>
Sampler view declarations have return types, but that doesn't work with
variable indexing (e.g. SAMP[-1+i]).
Adding the return type to the instruction is simpler.
All sampler view declaration flags might have to be removed since variable
indexing makes them inaccessible.
---
src/gallium/auxiliary/tgsi/tgsi_ureg.c | 7 ++-
src/gallium/auxiliary/tgsi/tgsi_ureg.h | 21 ++++++---
src/gallium/auxiliary/util/u_simple_shaders.c | 32 +++++++-------
src/gallium/auxiliary/vl/vl_bicubic_filter.c | 3 +-
src/gallium/auxiliary/vl/vl_compositor.c | 16 ++++---
src/gallium/auxiliary/vl/vl_deint_filter.c | 39 +++++++++++------
src/gallium/auxiliary/vl/vl_idct.c | 6 ++-
src/gallium/auxiliary/vl/vl_matrix_filter.c | 3 +-
src/gallium/auxiliary/vl/vl_mc.c | 3 +-
src/gallium/auxiliary/vl/vl_median_filter.c | 3 +-
src/gallium/auxiliary/vl/vl_mpeg12_decoder.c | 3 +-
src/gallium/auxiliary/vl/vl_zscan.c | 9 ++--
src/gallium/drivers/freedreno/freedreno_program.c | 4 +-
src/gallium/drivers/nouveau/nv50/nv50_surface.c | 4 +-
src/gallium/include/pipe/p_shader_tokens.h | 3 +-
src/gallium/state_trackers/nine/nine_ff.c | 6 +--
src/gallium/state_trackers/nine/nine_shader.c | 53 +++++++++++++++--------
src/gallium/state_trackers/xa/xa_tgsi.c | 21 +++++----
src/mesa/state_tracker/st_atifs_to_tgsi.c | 1 +
src/mesa/state_tracker/st_cb_drawpixels.c | 6 ++-
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 35 +++++++++------
src/mesa/state_tracker/st_mesa_to_tgsi.c | 1 +
src/mesa/state_tracker/st_pbo.c | 8 +++-
23 files changed, 180 insertions(+), 107 deletions(-)
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
index b67c383..b82a2ea 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
@@ -1207,32 +1207,33 @@ ureg_fixup_label(struct ureg_program *ureg,
{
union tgsi_any_token *out = retrieve_token( ureg, DOMAIN_INSN, label_token );
out->insn_label.Label = instruction_number;
}
void
ureg_emit_texture(struct ureg_program *ureg,
unsigned extended_token,
- unsigned target, unsigned num_offsets)
+ unsigned target, unsigned num_offsets, unsigned return_type)
{
union tgsi_any_token *out, *insn;
out = get_tokens( ureg, DOMAIN_INSN, 1 );
insn = retrieve_token( ureg, DOMAIN_INSN, extended_token );
insn->insn.Texture = 1;
out[0].value = 0;
out[0].insn_texture.Texture = target;
out[0].insn_texture.NumOffsets = num_offsets;
+ out[0].insn_texture.ReturnType = return_type;
}
void
ureg_emit_texture_offset(struct ureg_program *ureg,
const struct tgsi_texture_offset *offset)
{
union tgsi_any_token *out;
out = get_tokens( ureg, DOMAIN_INSN, 1);
@@ -1321,20 +1322,21 @@ ureg_insn(struct ureg_program *ureg,
ureg_fixup_insn_size( ureg, insn.insn_token );
}
void
ureg_tex_insn(struct ureg_program *ureg,
unsigned opcode,
const struct ureg_dst *dst,
unsigned nr_dst,
unsigned target,
+ unsigned return_type,
const struct tgsi_texture_offset *texoffsets,
unsigned nr_offset,
const struct ureg_src *src,
unsigned nr_src )
{
struct ureg_emit_insn_result insn;
unsigned i;
boolean saturate;
boolean predicate;
boolean negate = FALSE;
@@ -1359,21 +1361,22 @@ ureg_tex_insn(struct ureg_program *ureg,
saturate,
predicate,
negate,
swizzle[0],
swizzle[1],
swizzle[2],
swizzle[3],
nr_dst,
nr_src);
- ureg_emit_texture( ureg, insn.extended_token, target, nr_offset );
+ ureg_emit_texture(ureg, insn.extended_token, target, nr_offset,
+ return_type);
for (i = 0; i < nr_offset; i++)
ureg_emit_texture_offset( ureg, &texoffsets[i]);
for (i = 0; i < nr_dst; i++)
ureg_emit_dst( ureg, dst[i] );
for (i = 0; i < nr_src; i++)
ureg_emit_src( ureg, src[i] );
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
index b4258fd..cc0b51a 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
@@ -516,20 +516,21 @@ ureg_insn(struct ureg_program *ureg,
const struct ureg_src *src,
unsigned nr_src );
void
ureg_tex_insn(struct ureg_program *ureg,
unsigned opcode,
const struct ureg_dst *dst,
unsigned nr_dst,
unsigned target,
+ unsigned return_type,
const struct tgsi_texture_offset *texoffsets,
unsigned nr_offset,
const struct ureg_src *src,
unsigned nr_src );
void
ureg_label_insn(struct ureg_program *ureg,
unsigned opcode,
const struct ureg_src *src,
@@ -570,21 +571,21 @@ ureg_emit_insn(struct ureg_program *ureg,
unsigned num_src );
void
ureg_emit_label(struct ureg_program *ureg,
unsigned insn_token,
unsigned *label_token );
void
ureg_emit_texture(struct ureg_program *ureg,
unsigned insn_token,
- unsigned target, unsigned num_offsets);
+ unsigned target, unsigned num_offsets, unsigned return_type);
void
ureg_emit_texture_offset(struct ureg_program *ureg,
const struct tgsi_texture_offset *offset);
void
ureg_emit_memory(struct ureg_program *ureg,
unsigned insn_token,
unsigned qualifier,
unsigned texture,
@@ -760,68 +761,70 @@ static inline void ureg_##op( struct ureg_program *ureg, \
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP12_TEX( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
unsigned target, \
+ unsigned return_type, \
struct ureg_src src0, \
struct ureg_src src1 ) \
{ \
unsigned opcode = TGSI_OPCODE_##op; \
struct ureg_emit_insn_result insn; \
if (ureg_dst_is_empty(dst)) \
return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
dst.Predicate, \
dst.PredNegate, \
dst.PredSwizzleX, \
dst.PredSwizzleY, \
dst.PredSwizzleZ, \
dst.PredSwizzleW, \
1, \
2); \
- ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
+ ureg_emit_texture(ureg, insn.extended_token, target, 0, return_type);\
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP12_SAMPLE( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
+ unsigned return_type, \
struct ureg_src src0, \
struct ureg_src src1 ) \
{ \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
if (ureg_dst_is_empty(dst)) \
return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
dst.Predicate, \
dst.PredNegate, \
dst.PredSwizzleX, \
dst.PredSwizzleY, \
dst.PredSwizzleZ, \
dst.PredSwizzleW, \
1, \
2); \
- ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
+ ureg_emit_texture(ureg, insn.extended_token, target, 0, return_type);\
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP13( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
struct ureg_src src0, \
@@ -846,84 +849,87 @@ static inline void ureg_##op( struct ureg_program *ureg, \
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_emit_src( ureg, src2 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP13_SAMPLE( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
+ unsigned return_type, \
struct ureg_src src0, \
struct ureg_src src1, \
struct ureg_src src2 ) \
{ \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
if (ureg_dst_is_empty(dst)) \
return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
dst.Predicate, \
dst.PredNegate, \
dst.PredSwizzleX, \
dst.PredSwizzleY, \
dst.PredSwizzleZ, \
dst.PredSwizzleW, \
1, \
3); \
- ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
+ ureg_emit_texture(ureg, insn.extended_token, target, 0, return_type);\
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_emit_src( ureg, src2 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP14_TEX( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
unsigned target, \
+ unsigned return_type, \
struct ureg_src src0, \
struct ureg_src src1, \
struct ureg_src src2, \
struct ureg_src src3 ) \
{ \
unsigned opcode = TGSI_OPCODE_##op; \
struct ureg_emit_insn_result insn; \
if (ureg_dst_is_empty(dst)) \
return; \
insn = ureg_emit_insn(ureg, \
opcode, \
dst.Saturate, \
dst.Predicate, \
dst.PredNegate, \
dst.PredSwizzleX, \
dst.PredSwizzleY, \
dst.PredSwizzleZ, \
dst.PredSwizzleW, \
1, \
4); \
- ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
+ ureg_emit_texture(ureg, insn.extended_token, target, 0, return_type);\
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_emit_src( ureg, src2 ); \
ureg_emit_src( ureg, src3 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP14_SAMPLE( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
+ unsigned return_type, \
struct ureg_src src0, \
struct ureg_src src1, \
struct ureg_src src2, \
struct ureg_src src3 ) \
{ \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
if (ureg_dst_is_empty(dst)) \
return; \
@@ -931,21 +937,21 @@ static inline void ureg_##op( struct ureg_program *ureg, \
opcode, \
dst.Saturate, \
dst.Predicate, \
dst.PredNegate, \
dst.PredSwizzleX, \
dst.PredSwizzleY, \
dst.PredSwizzleZ, \
dst.PredSwizzleW, \
1, \
4); \
- ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
+ ureg_emit_texture(ureg, insn.extended_token, target, 0, return_type);\
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_emit_src( ureg, src2 ); \
ureg_emit_src( ureg, src3 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP14( op ) \
@@ -1009,20 +1015,21 @@ static inline void ureg_##op( struct ureg_program *ureg, \
ureg_emit_src( ureg, src1 ); \
ureg_emit_src( ureg, src2 ); \
ureg_emit_src( ureg, src3 ); \
ureg_emit_src( ureg, src4 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
#define OP15_SAMPLE( op ) \
static inline void ureg_##op( struct ureg_program *ureg, \
struct ureg_dst dst, \
+ unsigned return_type, \
struct ureg_src src0, \
struct ureg_src src1, \
struct ureg_src src2, \
struct ureg_src src3, \
struct ureg_src src4 ) \
{ \
unsigned opcode = TGSI_OPCODE_##op; \
unsigned target = TGSI_TEXTURE_UNKNOWN; \
struct ureg_emit_insn_result insn; \
if (ureg_dst_is_empty(dst)) \
@@ -1031,21 +1038,21 @@ static inline void ureg_##op( struct ureg_program *ureg, \
opcode, \
dst.Saturate, \
dst.Predicate, \
dst.PredNegate, \
dst.PredSwizzleX, \
dst.PredSwizzleY, \
dst.PredSwizzleZ, \
dst.PredSwizzleW, \
1, \
5); \
- ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
+ ureg_emit_texture(ureg, insn.extended_token, target, 0, return_type);\
ureg_emit_dst( ureg, dst ); \
ureg_emit_src( ureg, src0 ); \
ureg_emit_src( ureg, src1 ); \
ureg_emit_src( ureg, src2 ); \
ureg_emit_src( ureg, src3 ); \
ureg_emit_src( ureg, src4 ); \
ureg_fixup_insn_size( ureg, insn.insn_token ); \
}
/* Use a template include to generate a correctly-typed ureg_OP()
diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c b/src/gallium/auxiliary/util/u_simple_shaders.c
index 1220e18..1262e9e 100644
--- a/src/gallium/auxiliary/util/u_simple_shaders.c
+++ b/src/gallium/auxiliary/util/u_simple_shaders.c
@@ -248,25 +248,25 @@ util_make_fragment_tex_shader_writemask(struct pipe_context *pipe,
if (writemask != TGSI_WRITEMASK_XYZW) {
struct ureg_src imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
ureg_MOV( ureg, out, imm );
}
if (tex_target == TGSI_TEXTURE_BUFFER)
ureg_TXF(ureg,
ureg_writemask(out, writemask),
- tex_target, tex, sampler);
+ tex_target, stype, tex, sampler);
else
ureg_TEX(ureg,
ureg_writemask(out, writemask),
- tex_target, tex, sampler);
+ tex_target, stype, tex, sampler);
ureg_END( ureg );
return ureg_create_shader_and_destroy( ureg, pipe );
}
/**
* Make a simple fragment shader that sets the output color to a color
* taken from a texture.
@@ -321,23 +321,23 @@ util_make_fragment_tex_shader_writedepth(struct pipe_context *pipe,
0 );
depth = ureg_DECL_output( ureg,
TGSI_SEMANTIC_POSITION,
0 );
imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
ureg_MOV( ureg, out, imm );
- ureg_TEX( ureg,
- ureg_writemask(depth, TGSI_WRITEMASK_Z),
- tex_target, tex, sampler );
+ ureg_TEX(ureg,
+ ureg_writemask(depth, TGSI_WRITEMASK_Z),
+ tex_target, TGSI_RETURN_TYPE_FLOAT, tex, sampler);
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.
*/
@@ -382,26 +382,26 @@ util_make_fragment_tex_shader_writedepthstencil(struct pipe_context *pipe,
0 );
stencil = ureg_DECL_output( ureg,
TGSI_SEMANTIC_STENCIL,
0 );
imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
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_TEX(ureg,
+ ureg_writemask(depth, TGSI_WRITEMASK_Z),
+ tex_target, TGSI_RETURN_TYPE_FLOAT, tex, depth_sampler);
+ ureg_TEX(ureg,
+ ureg_writemask(stencil, TGSI_WRITEMASK_Y),
+ tex_target, TGSI_RETURN_TYPE_UINT, tex, stencil_sampler);
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.
*/
@@ -437,23 +437,23 @@ util_make_fragment_tex_shader_writestencil(struct pipe_context *pipe,
0 );
stencil = ureg_DECL_output( ureg,
TGSI_SEMANTIC_STENCIL,
0 );
imm = ureg_imm4f( ureg, 0, 0, 0, 1 );
ureg_MOV( ureg, out, imm );
- ureg_TEX( ureg,
- ureg_writemask(stencil, TGSI_WRITEMASK_Y),
- tex_target, tex, stencil_sampler );
+ ureg_TEX(ureg,
+ ureg_writemask(stencil, TGSI_WRITEMASK_Y),
+ tex_target, TGSI_RETURN_TYPE_UINT, tex, stencil_sampler);
ureg_END( ureg );
return ureg_create_shader_and_destroy( ureg, pipe );
}
/**
* Make simple fragment color pass-through shader that replicates OUT[0]
* to all bound colorbuffers.
*/
@@ -709,21 +709,21 @@ util_make_fs_msaa_resolve(struct pipe_context *pipe,
tmp = ureg_DECL_temporary(ureg);
/* Instructions. */
ureg_MOV(ureg, tmp_sum, ureg_imm1f(ureg, 0));
ureg_F2U(ureg, tmp_coord, coord);
for (i = 0; i < nr_samples; i++) {
/* Read one sample. */
ureg_MOV(ureg, ureg_writemask(tmp_coord, TGSI_WRITEMASK_W),
ureg_imm1u(ureg, i));
- ureg_TXF(ureg, tmp, tgsi_tex, ureg_src(tmp_coord), sampler);
+ ureg_TXF(ureg, tmp, tgsi_tex, stype, ureg_src(tmp_coord), sampler);
if (stype == TGSI_RETURN_TYPE_UINT)
ureg_U2F(ureg, tmp, ureg_src(tmp));
else if (stype == TGSI_RETURN_TYPE_SINT)
ureg_I2F(ureg, tmp, ureg_src(tmp));
/* Add it to the sum.*/
ureg_ADD(ureg, tmp_sum, ureg_src(tmp_sum), ureg_src(tmp));
}
@@ -784,21 +784,21 @@ util_make_fs_msaa_resolve_bilinear(struct pipe_context *pipe,
ureg_UADD(ureg, tmp_coord[2], ureg_src(tmp_coord[0]),
ureg_imm4u(ureg, 0, 1, 0, 0)); /* bottom-left */
ureg_UADD(ureg, tmp_coord[3], ureg_src(tmp_coord[0]),
ureg_imm4u(ureg, 1, 1, 0, 0)); /* bottom-right */
for (i = 0; i < nr_samples; i++) {
for (c = 0; c < 4; c++) {
/* Read one sample. */
ureg_MOV(ureg, ureg_writemask(tmp_coord[c], TGSI_WRITEMASK_W),
ureg_imm1u(ureg, i));
- ureg_TXF(ureg, tmp, tgsi_tex, ureg_src(tmp_coord[c]), sampler);
+ ureg_TXF(ureg, tmp, tgsi_tex, stype, ureg_src(tmp_coord[c]), sampler);
if (stype == TGSI_RETURN_TYPE_UINT)
ureg_U2F(ureg, tmp, ureg_src(tmp));
else if (stype == TGSI_RETURN_TYPE_SINT)
ureg_I2F(ureg, tmp, ureg_src(tmp));
/* Add it to the sum.*/
ureg_ADD(ureg, tmp_sum[c], ureg_src(tmp_sum[c]), ureg_src(tmp));
}
}
diff --git a/src/gallium/auxiliary/vl/vl_bicubic_filter.c b/src/gallium/auxiliary/vl/vl_bicubic_filter.c
index 0364d43..c4dc830 100644
--- a/src/gallium/auxiliary/vl/vl_bicubic_filter.c
+++ b/src/gallium/auxiliary/vl/vl_bicubic_filter.c
@@ -208,21 +208,22 @@ create_frag_shader(struct vl_bicubic_filter *filter, unsigned video_width,
*/
vtex = ureg_src(t_array[22]);
for (i = 0; i < 16; ++i) {
ureg_ADD(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_XY),
vtex, ureg_imm2f(shader, offsets[i].x, offsets[i].y));
ureg_MOV(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_ZW),
ureg_imm1f(shader, 0.0f));
}
for (i = 0; i < 16; ++i) {
- ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, ureg_src(t_array[i]), sampler);
+ ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_array[i]), sampler);
}
for(i = 0; i < 4; ++i)
create_frag_shader_cubic_interpolater(shader, ureg_src(t_array[4*i]),
ureg_src(t_array[4*i+1]), ureg_src(t_array[4*i+2]), ureg_src(t_array[4*i+3]),
ureg_scalar(ureg_src(t), TGSI_SWIZZLE_X), t_array[16+i]);
create_frag_shader_cubic_interpolater(shader, ureg_src(t_array[16]),
ureg_src(t_array[17]), ureg_src(t_array[18]), ureg_src(t_array[19]),
ureg_scalar(ureg_src(t), TGSI_SWIZZLE_Y), o_fragment);
diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c
index 03a0a64..c2dcd87 100644
--- a/src/gallium/auxiliary/vl/vl_compositor.c
+++ b/src/gallium/auxiliary/vl/vl_compositor.c
@@ -168,21 +168,21 @@ create_frag_shader_weave(struct ureg_program *shader, struct ureg_dst fragment)
* texel[0..1].x = tex(t_tc[0..1][0])
* texel[0..1].y = tex(t_tc[0..1][1])
* texel[0..1].z = tex(t_tc[0..1][2])
*/
for (i = 0; i < 2; ++i)
for (j = 0; j < 3; ++j) {
struct ureg_src src = ureg_swizzle(ureg_src(t_tc[i]),
TGSI_SWIZZLE_X, j ? TGSI_SWIZZLE_Z : TGSI_SWIZZLE_Y, TGSI_SWIZZLE_W, TGSI_SWIZZLE_W);
ureg_TEX(shader, ureg_writemask(t_texel[i], TGSI_WRITEMASK_X << j),
- TGSI_TEXTURE_2D_ARRAY, src, sampler[j]);
+ TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT, src, sampler[j]);
}
/* calculate linear interpolation factor
* factor = |round(i_tc.y) - i_tc.y| * 2
*/
ureg_ROUND(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ), i_tc[0]);
ureg_ADD(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ),
ureg_src(t_tc[0]), ureg_negate(i_tc[0]));
ureg_MUL(shader, ureg_writemask(t_tc[0], TGSI_WRITEMASK_YZ),
ureg_abs(ureg_src(t_tc[0])), ureg_imm1f(shader, 2.0f));
@@ -252,21 +252,22 @@ create_frag_shader_video_buffer(struct vl_compositor *c)
sampler[i] = ureg_DECL_sampler(shader, i);
texel = ureg_DECL_temporary(shader);
fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
/*
* texel.xyz = tex(tc, sampler[i])
* fragment = csc * texel
*/
for (i = 0; i < 3; ++i)
- ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_2D_ARRAY, tc, sampler[i]);
+ ureg_TEX(shader, ureg_writemask(texel, TGSI_WRITEMASK_X << i),
+ TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT, tc, sampler[i]);
create_frag_shader_csc(shader, texel, fragment);
ureg_release_temporary(shader, texel);
ureg_END(shader);
return ureg_create_shader_and_destroy(shader, c->pipe);
}
static void *
@@ -345,30 +346,32 @@ create_frag_shader_palette(struct vl_compositor *c, bool include_cc)
palette = ureg_DECL_sampler(shader, 1);
texel = ureg_DECL_temporary(shader);
fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
/*
* texel = tex(tc, sampler)
* fragment.xyz = tex(texel, palette) * csc
* fragment.a = texel.a
*/
- ureg_TEX(shader, texel, TGSI_TEXTURE_2D, tc, sampler);
+ ureg_TEX(shader, texel, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ tc, sampler);
ureg_MOV(shader, ureg_writemask(fragment, TGSI_WRITEMASK_W), ureg_src(texel));
if (include_cc) {
- ureg_TEX(shader, texel, TGSI_TEXTURE_1D, ureg_src(texel), palette);
+ ureg_TEX(shader, texel, TGSI_TEXTURE_1D, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(texel), palette);
for (i = 0; i < 3; ++i)
ureg_DP4(shader, ureg_writemask(fragment, TGSI_WRITEMASK_X << i), csc[i], ureg_src(texel));
} else {
ureg_TEX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ),
- TGSI_TEXTURE_1D, ureg_src(texel), palette);
+ TGSI_TEXTURE_1D, TGSI_RETURN_TYPE_FLOAT, ureg_src(texel), palette);
}
ureg_release_temporary(shader, texel);
ureg_END(shader);
return ureg_create_shader_and_destroy(shader, c->pipe);
}
static void *
create_frag_shader_rgba(struct vl_compositor *c)
@@ -383,21 +386,22 @@ create_frag_shader_rgba(struct vl_compositor *c)
tc = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, VS_O_VTEX, TGSI_INTERPOLATE_LINEAR);
color = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_COLOR, VS_O_COLOR, TGSI_INTERPOLATE_LINEAR);
sampler = ureg_DECL_sampler(shader, 0);
texel = ureg_DECL_temporary(shader);
fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
/*
* fragment = tex(tc, sampler)
*/
- ureg_TEX(shader, texel, TGSI_TEXTURE_2D, tc, sampler);
+ ureg_TEX(shader, texel, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ tc, sampler);
ureg_MUL(shader, fragment, ureg_src(texel), color);
ureg_END(shader);
return ureg_create_shader_and_destroy(shader, c->pipe);
}
static bool
init_shaders(struct vl_compositor *c)
{
assert(c);
diff --git a/src/gallium/auxiliary/vl/vl_deint_filter.c b/src/gallium/auxiliary/vl/vl_deint_filter.c
index 3ca3b49..467cf9f 100644
--- a/src/gallium/auxiliary/vl/vl_deint_filter.c
+++ b/src/gallium/auxiliary/vl/vl_deint_filter.c
@@ -104,21 +104,22 @@ create_copy_frag_shader(struct vl_deint_filter *filter, unsigned field)
ureg_MOV(shader, t_tex, i_vtex);
if (field) {
ureg_MOV(shader, ureg_writemask(t_tex, TGSI_WRITEMASK_ZW),
ureg_imm4f(shader, 0, 0, 1.0f, 0));
} else {
ureg_MOV(shader, ureg_writemask(t_tex, TGSI_WRITEMASK_ZW),
ureg_imm1f(shader, 0));
}
- ureg_TEX(shader, o_fragment, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_tex), sampler);
+ ureg_TEX(shader, o_fragment, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_tex), sampler);
ureg_release_temporary(shader, t_tex);
ureg_END(shader);
return ureg_create_shader_and_destroy(shader, filter->pipe);
}
static void *
create_deint_frag_shader(struct vl_deint_filter *filter, unsigned field,
struct vertex2f *sizes, bool spatial_filter)
@@ -164,56 +165,68 @@ create_deint_frag_shader(struct vl_deint_filter *filter, unsigned field,
// sample between texels for cheap lowpass
ureg_ADD(shader, t_comp_top, ureg_src(t_tex),
ureg_imm4f(shader, sizes->x * 0.5f, sizes->y * -0.5f, 0, 0));
ureg_ADD(shader, t_comp_bot, ureg_src(t_tex),
ureg_imm4f(shader, sizes->x * -0.5f, sizes->y * 0.5f, 1.0f, 0));
if (field == 0) {
/* interpolating top field -> current field is a bottom field */
// cur vs prev2
- ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_cur);
- ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_prevprev);
+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_bot), sampler_cur);
+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_bot), sampler_prevprev);
ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_src(t_a), ureg_src(t_b));
// prev vs next
- ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_prev);
- ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_next);
+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_top), sampler_prev);
+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_top), sampler_next);
ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_Y), ureg_src(t_a), ureg_src(t_b));
} else {
/* interpolating bottom field -> current field is a top field */
// cur vs prev2
- ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_cur);
- ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_prevprev);
+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_top), sampler_cur);
+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_top), sampler_prevprev);
ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_src(t_a), ureg_src(t_b));
// prev vs next
- ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_prev);
- ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_next);
+ ureg_TEX(shader, t_a, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_bot), sampler_prev);
+ ureg_TEX(shader, t_b, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_bot), sampler_next);
ureg_SUB(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_Y), ureg_src(t_a), ureg_src(t_b));
}
// absolute maximum of differences
ureg_MAX(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_abs(ureg_src(t_diff)),
ureg_scalar(ureg_abs(ureg_src(t_diff)), TGSI_SWIZZLE_Y));
if (field == 0) {
/* weave with prev top field */
- ureg_TEX(shader, t_weave, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_tex), sampler_prev);
+ ureg_TEX(shader, t_weave, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_tex), sampler_prev);
/* get linear interpolation from current bottom field */
ureg_ADD(shader, t_comp_top, ureg_src(t_tex), ureg_imm4f(shader, 0, sizes->y * -1.0f, 1.0f, 0));
- ureg_TEX(shader, t_linear, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_top), sampler_cur);
+ ureg_TEX(shader, t_linear, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_top), sampler_cur);
} else {
/* weave with prev bottom field */
ureg_ADD(shader, t_comp_bot, ureg_src(t_tex), ureg_imm4f(shader, 0, 0, 1.0f, 0));
- ureg_TEX(shader, t_weave, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_prev);
+ ureg_TEX(shader, t_weave, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_bot), sampler_prev);
/* get linear interpolation from current top field */
ureg_ADD(shader, t_comp_bot, ureg_src(t_tex), ureg_imm4f(shader, 0, sizes->y * 1.0f, 0, 0));
- ureg_TEX(shader, t_linear, TGSI_TEXTURE_2D_ARRAY, ureg_src(t_comp_bot), sampler_cur);
+ ureg_TEX(shader, t_linear, TGSI_TEXTURE_2D_ARRAY, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(t_comp_bot), sampler_cur);
}
// mix between weave and linear
// fully weave if diff < 6 (0.02353), fully interpolate if diff > 14 (0.05490)
ureg_ADD(shader, ureg_writemask(t_diff, TGSI_WRITEMASK_X), ureg_src(t_diff),
ureg_imm4f(shader, -0.02353f, 0, 0, 0));
ureg_MUL(shader, ureg_saturate(ureg_writemask(t_diff, TGSI_WRITEMASK_X)),
ureg_src(t_diff), ureg_imm4f(shader, 31.8750f, 0, 0, 0));
ureg_LRP(shader, ureg_writemask(t_tex, TGSI_WRITEMASK_X), ureg_src(t_diff),
ureg_src(t_linear), ureg_src(t_weave));
diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c
index 3e6f581..8c15997 100644
--- a/src/gallium/auxiliary/vl/vl_idct.c
+++ b/src/gallium/auxiliary/vl/vl_idct.c
@@ -108,22 +108,24 @@ increment_addr(struct ureg_program *shader, struct ureg_dst daddr[2],
ureg_MOV(shader, ureg_writemask(daddr[0], wm_start), saddr[0]);
ureg_ADD(shader, ureg_writemask(daddr[0], wm_tc), saddr[0], ureg_imm1f(shader, pos / size));
ureg_MOV(shader, ureg_writemask(daddr[1], wm_start), saddr[1]);
ureg_ADD(shader, ureg_writemask(daddr[1], wm_tc), saddr[1], ureg_imm1f(shader, pos / size));
}
static void
fetch_four(struct ureg_program *shader, struct ureg_dst m[2], struct ureg_src addr[2],
struct ureg_src sampler, bool resource3d)
{
- ureg_TEX(shader, m[0], resource3d ? TGSI_TEXTURE_3D : TGSI_TEXTURE_2D, addr[0], sampler);
- ureg_TEX(shader, m[1], resource3d ? TGSI_TEXTURE_3D : TGSI_TEXTURE_2D, addr[1], sampler);
+ ureg_TEX(shader, m[0], resource3d ? TGSI_TEXTURE_3D : TGSI_TEXTURE_2D,
+ TGSI_RETURN_TYPE_FLOAT, addr[0], sampler);
+ ureg_TEX(shader, m[1], resource3d ? TGSI_TEXTURE_3D : TGSI_TEXTURE_2D,
+ TGSI_RETURN_TYPE_FLOAT, addr[1], sampler);
}
static void
matrix_mul(struct ureg_program *shader, struct ureg_dst dst, struct ureg_dst l[2], struct ureg_dst r[2])
{
struct ureg_dst tmp;
tmp = ureg_DECL_temporary(shader);
/*
diff --git a/src/gallium/auxiliary/vl/vl_matrix_filter.c b/src/gallium/auxiliary/vl/vl_matrix_filter.c
index e331cb7..9c66390 100644
--- a/src/gallium/auxiliary/vl/vl_matrix_filter.c
+++ b/src/gallium/auxiliary/vl/vl_matrix_filter.c
@@ -113,21 +113,22 @@ create_frag_shader(struct vl_matrix_filter *filter, unsigned num_offsets,
ureg_ADD(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_XY),
i_vtex, ureg_imm2f(shader, offsets[i].x, offsets[i].y));
ureg_MOV(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_ZW),
ureg_imm1f(shader, 0.0f));
}
}
for (i = 0; i < num_offsets; ++i) {
if (matrix_values[i] != 0.0f) {
struct ureg_src src = is_vec_zero(offsets[i]) ? i_vtex : ureg_src(t_array[i]);
- ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, src, sampler);
+ ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ src, sampler);
}
}
for (i = 0, first = true; i < num_offsets; ++i) {
if (matrix_values[i] != 0.0f) {
if (first) {
t_sum = t_array[i];
ureg_MUL(shader, t_sum, ureg_src(t_array[i]),
ureg_imm1f(shader, matrix_values[i]));
first = false;
diff --git a/src/gallium/auxiliary/vl/vl_mc.c b/src/gallium/auxiliary/vl/vl_mc.c
index a202fac..a916d420 100644
--- a/src/gallium/auxiliary/vl/vl_mc.c
+++ b/src/gallium/auxiliary/vl/vl_mc.c
@@ -208,21 +208,22 @@ create_ref_frag_shader(struct vl_mc *r)
ureg_src(ref), ureg_imm1f(shader, y_scale));
ureg_FLR(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y), ureg_src(ref));
ureg_ADD(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y),
ureg_src(ref), ureg_scalar(ureg_src(ref), TGSI_SWIZZLE_Z));
ureg_MUL(shader, ureg_writemask(ref, TGSI_WRITEMASK_Y),
ureg_src(ref), ureg_imm1f(shader, 1.0f / y_scale));
ureg_fixup_label(shader, label, ureg_get_instruction_number(shader));
ureg_ENDIF(shader);
- ureg_TEX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ), TGSI_TEXTURE_2D, ureg_src(ref), sampler);
+ ureg_TEX(shader, ureg_writemask(fragment, TGSI_WRITEMASK_XYZ),
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, ureg_src(ref), sampler);
ureg_release_temporary(shader, ref);
ureg_release_temporary(shader, field);
ureg_END(shader);
return ureg_create_shader_and_destroy(shader, r->pipe);
}
static void *
diff --git a/src/gallium/auxiliary/vl/vl_median_filter.c b/src/gallium/auxiliary/vl/vl_median_filter.c
index f7477b7..e27a847 100644
--- a/src/gallium/auxiliary/vl/vl_median_filter.c
+++ b/src/gallium/auxiliary/vl/vl_median_filter.c
@@ -122,21 +122,22 @@ create_frag_shader(struct vl_median_filter *filter,
if (!is_vec_zero(offsets[i])) {
ureg_ADD(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_XY),
i_vtex, ureg_imm2f(shader, offsets[i].x, offsets[i].y));
ureg_MOV(shader, ureg_writemask(t_array[i], TGSI_WRITEMASK_ZW),
ureg_imm1f(shader, 0.0f));
}
}
for (i = 0; i < num_offsets; ++i) {
struct ureg_src src = is_vec_zero(offsets[i]) ? i_vtex : ureg_src(t_array[i]);
- ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, src, sampler);
+ ureg_TEX(shader, t_array[i], TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ src, sampler);
}
// TODO: Couldn't this be improved even more?
for (i = 0; i <= median; ++i) {
for (j = 1; j < (num_offsets - i - 1); ++j) {
struct ureg_dst tmp = ureg_DECL_temporary(shader);
ureg_MOV(shader, tmp, ureg_src(t_array[j]));
ureg_MAX(shader, t_array[j], ureg_src(t_array[j]), ureg_src(t_array[j - 1]));
ureg_MIN(shader, t_array[j - 1], ureg_src(tmp), ureg_src(t_array[j - 1]));
ureg_release_temporary(shader, tmp);
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
index db62b44..fb1e080 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
@@ -1092,21 +1092,22 @@ mc_frag_shader_callback(void *priv, struct vl_mc *mc,
assert(priv && mc);
assert(shader);
if (dec->base.entrypoint <= PIPE_VIDEO_ENTRYPOINT_IDCT) {
struct vl_idct *idct = mc == &dec->mc_y ? &dec->idct_y : &dec->idct_c;
vl_idct_stage2_frag_shader(idct, shader, first_input, dst);
} else {
src = ureg_DECL_fs_input(shader, TGSI_SEMANTIC_GENERIC, first_input, TGSI_INTERPOLATE_LINEAR);
sampler = ureg_DECL_sampler(shader, 0);
- ureg_TEX(shader, dst, TGSI_TEXTURE_2D, src, sampler);
+ ureg_TEX(shader, dst, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ src, sampler);
}
}
struct pipe_video_codec *
vl_create_mpeg12_decoder(struct pipe_context *context,
const struct pipe_video_codec *templat)
{
const unsigned block_size_pixels = VL_BLOCK_WIDTH * VL_BLOCK_HEIGHT;
const struct format_config *format_config;
struct vl_mpeg12_decoder *dec;
diff --git a/src/gallium/auxiliary/vl/vl_zscan.c b/src/gallium/auxiliary/vl/vl_zscan.c
index ef05af4..0878465 100644
--- a/src/gallium/auxiliary/vl/vl_zscan.c
+++ b/src/gallium/auxiliary/vl/vl_zscan.c
@@ -202,28 +202,31 @@ create_frag_shader(struct vl_zscan *zscan)
quant = ureg_DECL_temporary(shader);
fragment = ureg_DECL_output(shader, TGSI_SEMANTIC_COLOR, 0);
/*
* tmp.x = tex(vtex, 1)
* tmp.y = vtex.z
* fragment = tex(tmp, 0) * quant
*/
for (i = 0; i < zscan->num_channels; ++i)
- ureg_TEX(shader, ureg_writemask(tmp[i], TGSI_WRITEMASK_X), TGSI_TEXTURE_2D, vtex[i], samp_scan);
+ ureg_TEX(shader, ureg_writemask(tmp[i], TGSI_WRITEMASK_X),
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, vtex[i], samp_scan);
for (i = 0; i < zscan->num_channels; ++i)
ureg_MOV(shader, ureg_writemask(tmp[i], TGSI_WRITEMASK_Y), ureg_scalar(vtex[i], TGSI_SWIZZLE_W));
for (i = 0; i < zscan->num_channels; ++i) {
- ureg_TEX(shader, ureg_writemask(tmp[0], TGSI_WRITEMASK_X << i), TGSI_TEXTURE_2D, ureg_src(tmp[i]), samp_src);
- ureg_TEX(shader, ureg_writemask(quant, TGSI_WRITEMASK_X << i), TGSI_TEXTURE_3D, vtex[i], samp_quant);
+ ureg_TEX(shader, ureg_writemask(tmp[0], TGSI_WRITEMASK_X << i),
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, ureg_src(tmp[i]), samp_src);
+ ureg_TEX(shader, ureg_writemask(quant, TGSI_WRITEMASK_X << i),
+ TGSI_TEXTURE_3D, TGSI_RETURN_TYPE_FLOAT, vtex[i], samp_quant);
}
ureg_MUL(shader, quant, ureg_src(quant), ureg_imm1f(shader, 16.0f));
ureg_MUL(shader, fragment, ureg_src(tmp[0]), ureg_src(quant));
for (i = 0; i < zscan->num_channels; ++i)
ureg_release_temporary(shader, tmp[i]);
ureg_END(shader);
FREE(vtex);
diff --git a/src/gallium/drivers/freedreno/freedreno_program.c b/src/gallium/drivers/freedreno/freedreno_program.c
index db6b258..8dbf0b8 100644
--- a/src/gallium/drivers/freedreno/freedreno_program.c
+++ b/src/gallium/drivers/freedreno/freedreno_program.c
@@ -100,27 +100,27 @@ fd_prog_blit(struct pipe_context *pctx, int rts, bool depth)
debug_assert(rts <= MAX_RENDER_TARGETS);
ureg = ureg_create(PIPE_SHADER_FRAGMENT);
if (!ureg)
return NULL;
tc = ureg_DECL_fs_input(
ureg, TGSI_SEMANTIC_GENERIC, 0, TGSI_INTERPOLATE_PERSPECTIVE);
for (i = 0; i < rts; i++)
ureg_TEX(ureg, ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, i),
- TGSI_TEXTURE_2D, tc, ureg_DECL_sampler(ureg, i));
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, tc, ureg_DECL_sampler(ureg, i));
if (depth)
ureg_TEX(ureg,
ureg_writemask(
ureg_DECL_output(ureg, TGSI_SEMANTIC_POSITION, 0),
TGSI_WRITEMASK_Z),
- TGSI_TEXTURE_2D, tc, ureg_DECL_sampler(ureg, rts));
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, tc, ureg_DECL_sampler(ureg, rts));
ureg_END(ureg);
return ureg_create_shader_and_destroy(ureg, pctx);
}
void fd_prog_init(struct pipe_context *pctx)
{
struct fd_context *ctx = fd_context(pctx);
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c
index 52e8907..2458788 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c
@@ -914,29 +914,29 @@ nv50_blitter_make_fp(struct pipe_context *pipe,
if (ptarg == PIPE_TEXTURE_1D_ARRAY) {
/* Adjust coordinates. Depth is in z, but TEX expects it to be in y. */
tc = ureg_swizzle(tc, TGSI_SWIZZLE_X, TGSI_SWIZZLE_Z,
TGSI_SWIZZLE_Z, TGSI_SWIZZLE_Z);
}
data = ureg_DECL_temporary(ureg);
if (tex_s) {
ureg_TEX(ureg, ureg_writemask(data, TGSI_WRITEMASK_X),
- target, tc, ureg_DECL_sampler(ureg, 1));
+ target, TGSI_RETURN_TYPE_FLOAT, tc, ureg_DECL_sampler(ureg, 1));
ureg_MOV(ureg, ureg_writemask(data, TGSI_WRITEMASK_Y),
ureg_scalar(ureg_src(data), TGSI_SWIZZLE_X));
}
if (tex_rgbaz) {
const unsigned mask = (mode == NV50_BLIT_MODE_PASS) ?
TGSI_WRITEMASK_XYZW : TGSI_WRITEMASK_X;
ureg_TEX(ureg, ureg_writemask(data, mask),
- target, tc, ureg_DECL_sampler(ureg, 0));
+ target, TGSI_RETURN_TYPE_FLOAT, tc, ureg_DECL_sampler(ureg, 0));
}
if (cvt_un8) {
struct ureg_src mask;
struct ureg_src scale;
struct ureg_dst outz;
struct ureg_dst outs;
struct ureg_dst zdst3 = ureg_writemask(data, TGSI_WRITEMASK_XYZ);
struct ureg_dst zdst = ureg_writemask(data, TGSI_WRITEMASK_X);
struct ureg_dst sdst = ureg_writemask(data, TGSI_WRITEMASK_Y);
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index 7621ab9..875fcd9 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -646,21 +646,22 @@ enum tgsi_texture_type {
TGSI_TEXTURE_CUBE_ARRAY,
TGSI_TEXTURE_SHADOWCUBE_ARRAY,
TGSI_TEXTURE_UNKNOWN,
TGSI_TEXTURE_COUNT,
};
struct tgsi_instruction_texture
{
unsigned Texture : 8; /* TGSI_TEXTURE_ */
unsigned NumOffsets : 4;
- unsigned Padding : 20;
+ unsigned ReturnType : 2;
+ unsigned Padding : 18;
};
/* for texture offsets in GLSL and DirectX.
* Generally these always come from TGSI_FILE_IMMEDIATE,
* however DX11 appears to have the capability to do
* non-constant texture offsets.
*/
struct tgsi_texture_offset
{
int Index : 16;
diff --git a/src/gallium/state_trackers/nine/nine_ff.c b/src/gallium/state_trackers/nine/nine_ff.c
index 899e54e..7b96195 100644
--- a/src/gallium/state_trackers/nine/nine_ff.c
+++ b/src/gallium/state_trackers/nine/nine_ff.c
@@ -1338,28 +1338,28 @@ nine_ff_build_ps(struct NineDevice9 *device, struct nine_ff_ps_key *key)
if (key->ts[s-1].colorop == D3DTOP_BUMPENVMAPLUMINANCE) {
struct ureg_src bumpenvlscale = ((s-1) & 1) ? _ZZZZ(_CONST(16 + (s-1) / 2)) : _XXXX(_CONST(16 + (s-1) / 2));
struct ureg_src bumpenvloffset = ((s-1) & 1) ? _WWWW(_CONST(16 + (s-1) / 2)) : _YYYY(_CONST(16 + (s-1) / 2));
ureg_MAD(ureg, ureg_saturate(ureg_writemask(delta, TGSI_WRITEMASK_X)), _Z(ps.rTex), bumpenvlscale, bumpenvloffset);
}
}
if (key->projected & (3 << (s *2))) {
unsigned dim = 1 + ((key->projected >> (2 * s)) & 3);
if (dim == 4)
- ureg_TXP(ureg, ps.rTex, target, texture_coord, ps.s[s]);
+ ureg_TXP(ureg, ps.rTex, target, TGSI_RETURN_TYPE_FLOAT, texture_coord, ps.s[s]);
else {
ureg_RCP(ureg, ureg_writemask(ps.rTmp, TGSI_WRITEMASK_X), ureg_scalar(texture_coord, dim-1));
ureg_MUL(ureg, ps.rTmp, _XXXX(ps.rTmpSrc), texture_coord);
- ureg_TEX(ureg, ps.rTex, target, ps.rTmpSrc, ps.s[s]);
+ ureg_TEX(ureg, ps.rTex, target, TGSI_RETURN_TYPE_FLOAT, ps.rTmpSrc, ps.s[s]);
}
} else {
- ureg_TEX(ureg, ps.rTex, target, texture_coord, ps.s[s]);
+ ureg_TEX(ureg, ps.rTex, target, TGSI_RETURN_TYPE_FLOAT, texture_coord, ps.s[s]);
}
if (s >= 1 && key->ts[s-1].colorop == D3DTOP_BUMPENVMAPLUMINANCE)
ureg_MUL(ureg, ps.rTex, ureg_src(ps.rTex), _X(delta));
}
if (((s == 0 && key->ts[0].colorop != D3DTOP_BUMPENVMAP &&
key->ts[0].colorop != D3DTOP_BUMPENVMAPLUMINANCE) ||
(s == 1 &&
(key->ts[0].colorop == D3DTOP_BUMPENVMAP ||
key->ts[0].colorop == D3DTOP_BUMPENVMAPLUMINANCE)))&&
diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c
index bd373d7..c54b3ff 100644
--- a/src/gallium/state_trackers/nine/nine_shader.c
+++ b/src/gallium/state_trackers/nine/nine_shader.c
@@ -714,27 +714,27 @@ TEX_with_ps1x_projection(struct shader_translator *tx, struct ureg_dst dst,
struct ureg_src src1, INT idx)
{
unsigned dim = 1 + ((tx->info->projected >> (2 * idx)) & 3);
struct ureg_dst tmp;
/* dim == 1: no projection
* Looks like must be disabled when it makes no
* sense according the texture dimensions
*/
if (dim == 1 || dim <= target) {
- ureg_TEX(tx->ureg, dst, target, src0, src1);
+ ureg_TEX(tx->ureg, dst, target, TGSI_RETURN_TYPE_FLOAT, src0, src1);
} else if (dim == 4) {
- ureg_TXP(tx->ureg, dst, target, src0, src1);
+ ureg_TXP(tx->ureg, dst, target, TGSI_RETURN_TYPE_FLOAT, src0, src1);
} else {
tmp = tx_scratch(tx);
apply_ps1x_projection(tx, tmp, src0, idx);
- ureg_TEX(tx->ureg, dst, target, ureg_src(tmp), src1);
+ ureg_TEX(tx->ureg, dst, target, TGSI_RETURN_TYPE_FLOAT, ureg_src(tmp), src1);
}
}
static inline void
tx_texcoord_alloc(struct shader_translator *tx, INT idx)
{
assert(IS_PS);
assert(idx >= 0 && idx < ARRAY_SIZE(tx->regs.vT));
if (ureg_src_is_undef(tx->regs.vT[idx]))
tx->regs.vT[idx] = ureg_DECL_fs_input(tx->ureg, tx->texcoord_sn, idx,
@@ -2286,24 +2286,26 @@ DECL_SPECIAL(TEXBEM)
ureg_MAD(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), m01,
NINE_APPLY_SWIZZLE(ureg_src(tx->regs.tS[n]), X), ureg_src(texcoord));
/* v' = v' + D3DTSS_BUMPENVMAT11(stage m)*t(n)G*/
ureg_MAD(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), m11,
NINE_APPLY_SWIZZLE(ureg_src(tx->regs.tS[n]), Y),
NINE_APPLY_SWIZZLE(ureg_src(tmp), Y));
/* Now the texture coordinates are in tmp.xy */
if (tx->insn.opcode == D3DSIO_TEXBEM) {
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), ureg_src(tmp), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m),
+ TGSI_RETURN_TYPE_FLOAT, ureg_src(tmp), sample);
} else if (tx->insn.opcode == D3DSIO_TEXBEML) {
/* t(m)RGBA = t(m)RGBA * [(t(n)B * D3DTSS_BUMPENVLSCALE(stage m)) + D3DTSS_BUMPENVLOFFSET(stage m)] */
- ureg_TEX(ureg, tmp, ps1x_sampler_type(tx->info, m), ureg_src(tmp), sample);
+ ureg_TEX(ureg, tmp, ps1x_sampler_type(tx->info, m),
+ TGSI_RETURN_TYPE_FLOAT, ureg_src(tmp), sample);
ureg_MAD(ureg, tmp2, NINE_APPLY_SWIZZLE(ureg_src(tx->regs.tS[n]), Z),
bumpenvlscale, bumpenvloffset);
ureg_MUL(ureg, dst, ureg_src(tmp), ureg_src(tmp2));
}
tx->info->bumpenvmat_needed = 1;
return D3D_OK;
}
@@ -2311,37 +2313,39 @@ DECL_SPECIAL(TEXREG2AR)
{
struct ureg_program *ureg = tx->ureg;
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
struct ureg_src sample;
const int m = tx->insn.dst[0].idx;
const int n = tx->insn.src[0].idx;
assert(m >= 0 && m > n);
sample = ureg_DECL_sampler(ureg, m);
tx->info->sampler_mask |= 1 << m;
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), ureg_swizzle(ureg_src(tx->regs.tS[n]), NINE_SWIZZLE4(W,X,X,X)), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), TGSI_RETURN_TYPE_FLOAT,
+ ureg_swizzle(ureg_src(tx->regs.tS[n]), NINE_SWIZZLE4(W,X,X,X)), sample);
return D3D_OK;
}
DECL_SPECIAL(TEXREG2GB)
{
struct ureg_program *ureg = tx->ureg;
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
struct ureg_src sample;
const int m = tx->insn.dst[0].idx;
const int n = tx->insn.src[0].idx;
assert(m >= 0 && m > n);
sample = ureg_DECL_sampler(ureg, m);
tx->info->sampler_mask |= 1 << m;
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), ureg_swizzle(ureg_src(tx->regs.tS[n]), NINE_SWIZZLE4(Y,Z,Z,Z)), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), TGSI_RETURN_TYPE_FLOAT,
+ ureg_swizzle(ureg_src(tx->regs.tS[n]), NINE_SWIZZLE4(Y,Z,Z,Z)), sample);
return D3D_OK;
}
DECL_SPECIAL(TEXM3x2PAD)
{
return D3D_OK; /* this is just padding */
}
DECL_SPECIAL(TEXM3x2TEX)
@@ -2355,21 +2359,22 @@ DECL_SPECIAL(TEXM3x2TEX)
tx_texcoord_alloc(tx, m);
tx_texcoord_alloc(tx, m+1);
/* performs the matrix multiplication */
ureg_DP3(ureg, ureg_writemask(dst, TGSI_WRITEMASK_X), tx->regs.vT[m], ureg_src(tx->regs.tS[n]));
ureg_DP3(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Y), tx->regs.vT[m+1], ureg_src(tx->regs.tS[n]));
sample = ureg_DECL_sampler(ureg, m + 1);
tx->info->sampler_mask |= 1 << (m + 1);
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 1), ureg_src(dst), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 1),
+ TGSI_RETURN_TYPE_FLOAT, ureg_src(dst), sample);
return D3D_OK;
}
DECL_SPECIAL(TEXM3x3PAD)
{
return D3D_OK; /* this is just padding */
}
DECL_SPECIAL(TEXM3x3SPEC)
@@ -2402,37 +2407,39 @@ DECL_SPECIAL(TEXM3x3SPEC)
ureg_RCP(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X));
/* at this step tmp.x = 1/N.N */
ureg_DP3(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), ureg_src(dst), E);
/* at this step tmp.y = N.E */
ureg_MUL(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y));
/* at this step tmp.x = N.E/N.N */
ureg_MUL(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(ureg, 2.0f));
ureg_MUL(ureg, tmp, ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_src(dst));
/* at this step tmp.xyz = 2 * (N.E / N.N) * N */
ureg_SUB(ureg, tmp, ureg_src(tmp), E);
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 2), ureg_src(tmp), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 2),
+ TGSI_RETURN_TYPE_FLOAT, ureg_src(tmp), sample);
return D3D_OK;
}
DECL_SPECIAL(TEXREG2RGB)
{
struct ureg_program *ureg = tx->ureg;
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
struct ureg_src sample;
const int m = tx->insn.dst[0].idx;
const int n = tx->insn.src[0].idx;
assert(m >= 0 && m > n);
sample = ureg_DECL_sampler(ureg, m);
tx->info->sampler_mask |= 1 << m;
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), ureg_src(tx->regs.tS[n]), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(tx->regs.tS[n]), sample);
return D3D_OK;
}
DECL_SPECIAL(TEXDP3TEX)
{
struct ureg_program *ureg = tx->ureg;
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
struct ureg_dst tmp;
struct ureg_src sample;
@@ -2441,21 +2448,22 @@ DECL_SPECIAL(TEXDP3TEX)
assert(m >= 0 && m > n);
tx_texcoord_alloc(tx, m);
tmp = tx_scratch(tx);
ureg_DP3(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), tx->regs.vT[m], ureg_src(tx->regs.tS[n]));
ureg_MOV(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_YZ), ureg_imm1f(ureg, 0.0f));
sample = ureg_DECL_sampler(ureg, m);
tx->info->sampler_mask |= 1 << m;
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), ureg_src(tmp), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m), TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(tmp), sample);
return D3D_OK;
}
DECL_SPECIAL(TEXM3x2DEPTH)
{
struct ureg_program *ureg = tx->ureg;
struct ureg_dst tmp;
const int m = tx->insn.dst[0].idx - 1;
const int n = tx->insn.src[0].idx;
@@ -2517,21 +2525,22 @@ DECL_SPECIAL(TEXM3x3)
ureg_DP3(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Y), tx->regs.vT[m+1], ureg_src(tx->regs.tS[n]));
ureg_DP3(ureg, ureg_writemask(dst, TGSI_WRITEMASK_Z), tx->regs.vT[m+2], ureg_src(tx->regs.tS[n]));
switch (tx->insn.opcode) {
case D3DSIO_TEXM3x3:
ureg_MOV(ureg, ureg_writemask(dst, TGSI_WRITEMASK_W), ureg_imm1f(ureg, 1.0f));
break;
case D3DSIO_TEXM3x3TEX:
sample = ureg_DECL_sampler(ureg, m + 2);
tx->info->sampler_mask |= 1 << (m + 2);
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 2), ureg_src(dst), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 2),
+ TGSI_RETURN_TYPE_FLOAT, ureg_src(dst), sample);
break;
case D3DSIO_TEXM3x3VSPEC:
sample = ureg_DECL_sampler(ureg, m + 2);
tx->info->sampler_mask |= 1 << (m + 2);
E = tx_scratch(tx);
tmp = ureg_writemask(tx_scratch(tx), TGSI_WRITEMASK_XYZ);
ureg_MOV(ureg, ureg_writemask(E, TGSI_WRITEMASK_X), ureg_scalar(tx->regs.vT[m], TGSI_SWIZZLE_W));
ureg_MOV(ureg, ureg_writemask(E, TGSI_WRITEMASK_Y), ureg_scalar(tx->regs.vT[m+1], TGSI_SWIZZLE_W));
ureg_MOV(ureg, ureg_writemask(E, TGSI_WRITEMASK_Z), ureg_scalar(tx->regs.vT[m+2], TGSI_SWIZZLE_W));
/* At this step, dst = N = (u', w', z').
@@ -2541,21 +2550,22 @@ DECL_SPECIAL(TEXM3x3)
ureg_RCP(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X));
/* at this step tmp.x = 1/N.N */
ureg_DP3(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_Y), ureg_src(dst), ureg_src(E));
/* at this step tmp.y = N.E */
ureg_MUL(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_Y));
/* at this step tmp.x = N.E/N.N */
ureg_MUL(ureg, ureg_writemask(tmp, TGSI_WRITEMASK_X), ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_imm1f(ureg, 2.0f));
ureg_MUL(ureg, tmp, ureg_scalar(ureg_src(tmp), TGSI_SWIZZLE_X), ureg_src(dst));
/* at this step tmp.xyz = 2 * (N.E / N.N) * N */
ureg_SUB(ureg, tmp, ureg_src(tmp), ureg_src(E));
- ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 2), ureg_src(tmp), sample);
+ ureg_TEX(ureg, dst, ps1x_sampler_type(tx->info, m + 2), TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(tmp), sample);
break;
default:
return D3DERR_INVALIDCALL;
}
return D3D_OK;
}
DECL_SPECIAL(TEXDEPTH)
{
struct ureg_program *ureg = tx->ureg;
@@ -2632,45 +2642,49 @@ DECL_SPECIAL(TEXLD)
struct ureg_src src[2] = {
tx_src_param(tx, &tx->insn.src[0]),
tx_src_param(tx, &tx->insn.src[1])
};
assert(tx->insn.src[1].idx >= 0 &&
tx->insn.src[1].idx < ARRAY_SIZE(tx->sampler_targets));
target = tx->sampler_targets[tx->insn.src[1].idx];
switch (tx->insn.flags) {
case 0:
- ureg_TEX(ureg, dst, target, src[0], src[1]);
+ ureg_TEX(ureg, dst, target, TGSI_RETURN_TYPE_FLOAT,
+ src[0], src[1]);
break;
case NINED3DSI_TEXLD_PROJECT:
- ureg_TXP(ureg, dst, target, src[0], src[1]);
+ ureg_TXP(ureg, dst, target, TGSI_RETURN_TYPE_FLOAT,
+ src[0], src[1]);
break;
case NINED3DSI_TEXLD_BIAS:
- ureg_TXB(ureg, dst, target, src[0], src[1]);
+ ureg_TXB(ureg, dst, target, TGSI_RETURN_TYPE_FLOAT,
+ src[0], src[1]);
break;
default:
assert(0);
return D3DERR_INVALIDCALL;
}
return D3D_OK;
}
DECL_SPECIAL(TEXLD_14)
{
struct ureg_program *ureg = tx->ureg;
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
struct ureg_src src = tx_src_param(tx, &tx->insn.src[0]);
const unsigned s = tx->insn.dst[0].idx;
const unsigned t = ps1x_sampler_type(tx->info, s);
tx->info->sampler_mask |= 1 << s;
- ureg_TEX(ureg, dst, t, src, ureg_DECL_sampler(ureg, s));
+ ureg_TEX(ureg, dst, t, TGSI_RETURN_TYPE_FLOAT,
+ src, ureg_DECL_sampler(ureg, s));
return D3D_OK;
}
DECL_SPECIAL(TEX)
{
struct ureg_program *ureg = tx->ureg;
const unsigned s = tx->insn.dst[0].idx;
const unsigned t = ps1x_sampler_type(tx->info, s);
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
@@ -2694,37 +2708,38 @@ DECL_SPECIAL(TEXLDD)
struct ureg_src src[4] = {
tx_src_param(tx, &tx->insn.src[0]),
tx_src_param(tx, &tx->insn.src[1]),
tx_src_param(tx, &tx->insn.src[2]),
tx_src_param(tx, &tx->insn.src[3])
};
assert(tx->insn.src[1].idx >= 0 &&
tx->insn.src[1].idx < ARRAY_SIZE(tx->sampler_targets));
target = tx->sampler_targets[tx->insn.src[1].idx];
- ureg_TXD(tx->ureg, dst, target, src[0], src[2], src[3], src[1]);
+ ureg_TXD(tx->ureg, dst, target, TGSI_RETURN_TYPE_FLOAT,
+ src[0], src[2], src[3], src[1]);
return D3D_OK;
}
DECL_SPECIAL(TEXLDL)
{
unsigned target;
struct ureg_dst dst = tx_dst_param(tx, &tx->insn.dst[0]);
struct ureg_src src[2] = {
tx_src_param(tx, &tx->insn.src[0]),
tx_src_param(tx, &tx->insn.src[1])
};
assert(tx->insn.src[1].idx >= 0 &&
tx->insn.src[1].idx < ARRAY_SIZE(tx->sampler_targets));
target = tx->sampler_targets[tx->insn.src[1].idx];
- ureg_TXL(tx->ureg, dst, target, src[0], src[1]);
+ ureg_TXL(tx->ureg, dst, target, TGSI_RETURN_TYPE_FLOAT, src[0], src[1]);
return D3D_OK;
}
DECL_SPECIAL(SETP)
{
STUB(D3DERR_INVALIDCALL);
}
DECL_SPECIAL(BREAKP)
{
diff --git a/src/gallium/state_trackers/xa/xa_tgsi.c b/src/gallium/state_trackers/xa/xa_tgsi.c
index f3f665d..e2391a6 100644
--- a/src/gallium/state_trackers/xa/xa_tgsi.c
+++ b/src/gallium/state_trackers/xa/xa_tgsi.c
@@ -173,21 +173,22 @@ linear_gradient(struct ureg_program *ureg,
ureg_MUL(ureg, temp0,
ureg_scalar(coords, TGSI_SWIZZLE_Y),
ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_Y));
ureg_MAD(ureg, temp1,
ureg_scalar(coords, TGSI_SWIZZLE_X),
ureg_scalar(ureg_src(temp4), TGSI_SWIZZLE_X), ureg_src(temp0));
ureg_MUL(ureg, temp2, ureg_src(temp1), ureg_scalar(coords, TGSI_SWIZZLE_Z));
- ureg_TEX(ureg, out, TGSI_TEXTURE_1D, ureg_src(temp2), sampler);
+ ureg_TEX(ureg, out, TGSI_TEXTURE_1D, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(temp2), sampler);
ureg_release_temporary(ureg, temp0);
ureg_release_temporary(ureg, temp1);
ureg_release_temporary(ureg, temp2);
ureg_release_temporary(ureg, temp3);
ureg_release_temporary(ureg, temp4);
ureg_release_temporary(ureg, temp5);
}
static void
@@ -241,21 +242,22 @@ radial_gradient(struct ureg_program *ureg,
ureg_MUL(ureg, temp3, ureg_src(temp1), ureg_src(temp1));
ureg_SUB(ureg, temp2, ureg_src(temp3), ureg_src(temp0));
ureg_RSQ(ureg, temp2, ureg_abs(ureg_src(temp2)));
ureg_RCP(ureg, temp2, ureg_src(temp2));
ureg_SUB(ureg, temp1, ureg_src(temp2), ureg_src(temp1));
ureg_ADD(ureg, temp0,
ureg_scalar(coords, TGSI_SWIZZLE_Z),
ureg_scalar(coords, TGSI_SWIZZLE_Z));
ureg_RCP(ureg, temp0, ureg_src(temp0));
ureg_MUL(ureg, temp2, ureg_src(temp1), ureg_src(temp0));
- ureg_TEX(ureg, out, TGSI_TEXTURE_1D, ureg_src(temp2), sampler);
+ ureg_TEX(ureg, out, TGSI_TEXTURE_1D, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(temp2), sampler);
ureg_release_temporary(ureg, temp0);
ureg_release_temporary(ureg, temp1);
ureg_release_temporary(ureg, temp2);
ureg_release_temporary(ureg, temp3);
ureg_release_temporary(ureg, temp4);
ureg_release_temporary(ureg, temp5);
}
static void *
@@ -347,23 +349,23 @@ create_yuv_shader(struct pipe_context *pipe, struct ureg_program *ureg)
TGSI_RETURN_TYPE_FLOAT, TGSI_RETURN_TYPE_FLOAT);
ureg_DECL_sampler_view(ureg, 2, TGSI_TEXTURE_2D,
TGSI_RETURN_TYPE_FLOAT, TGSI_RETURN_TYPE_FLOAT,
TGSI_RETURN_TYPE_FLOAT, TGSI_RETURN_TYPE_FLOAT);
matrow0 = ureg_DECL_constant(ureg, 0);
matrow1 = ureg_DECL_constant(ureg, 1);
matrow2 = ureg_DECL_constant(ureg, 2);
matrow3 = ureg_DECL_constant(ureg, 3);
- ureg_TEX(ureg, y, TGSI_TEXTURE_2D, pos, y_sampler);
- ureg_TEX(ureg, u, TGSI_TEXTURE_2D, pos, u_sampler);
- ureg_TEX(ureg, v, TGSI_TEXTURE_2D, pos, v_sampler);
+ ureg_TEX(ureg, y, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, pos, y_sampler);
+ ureg_TEX(ureg, u, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, pos, u_sampler);
+ ureg_TEX(ureg, v, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT, pos, v_sampler);
ureg_MOV(ureg, rgb, matrow3);
ureg_MAD(ureg, rgb,
ureg_scalar(ureg_src(y), TGSI_SWIZZLE_X), matrow0, ureg_src(rgb));
ureg_MAD(ureg, rgb,
ureg_scalar(ureg_src(u), TGSI_SWIZZLE_X), matrow1, ureg_src(rgb));
ureg_MAD(ureg, rgb,
ureg_scalar(ureg_src(v), TGSI_SWIZZLE_X), matrow2, ureg_src(rgb));
ureg_MOV(ureg, out, ureg_src(rgb));
@@ -396,45 +398,48 @@ xrender_tex(struct ureg_program *ureg,
TGSI_SWIZZLE_X,
TGSI_SWIZZLE_Y), ureg_scalar(imm0,
TGSI_SWIZZLE_X));
ureg_SLT(ureg, tmp0,
ureg_swizzle(coords, TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y,
TGSI_SWIZZLE_X, TGSI_SWIZZLE_Y), ureg_scalar(imm0,
TGSI_SWIZZLE_W));
ureg_MIN(ureg, tmp0, ureg_src(tmp0), ureg_src(tmp1));
ureg_MIN(ureg, tmp0, ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_X),
ureg_scalar(ureg_src(tmp0), TGSI_SWIZZLE_Y));
- ureg_TEX(ureg, tmp1, TGSI_TEXTURE_2D, coords, sampler);
+ ureg_TEX(ureg, tmp1, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ coords, sampler);
if (swizzle)
ureg_MOV(ureg, tmp1, ureg_swizzle(ureg_src(tmp1),
TGSI_SWIZZLE_Z,
TGSI_SWIZZLE_Y, TGSI_SWIZZLE_X,
TGSI_SWIZZLE_W));
if (set_alpha)
ureg_MOV(ureg,
ureg_writemask(tmp1, TGSI_WRITEMASK_W),
ureg_scalar(imm0, TGSI_SWIZZLE_W));
ureg_MUL(ureg, dst, ureg_src(tmp1), ureg_src(tmp0));
ureg_release_temporary(ureg, tmp0);
ureg_release_temporary(ureg, tmp1);
} else {
if (swizzle) {
struct ureg_dst tmp = ureg_DECL_temporary(ureg);
- ureg_TEX(ureg, tmp, TGSI_TEXTURE_2D, coords, sampler);
+ ureg_TEX(ureg, tmp, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ coords, sampler);
ureg_MOV(ureg, dst, ureg_swizzle(ureg_src(tmp),
TGSI_SWIZZLE_Z,
TGSI_SWIZZLE_Y, TGSI_SWIZZLE_X,
TGSI_SWIZZLE_W));
ureg_release_temporary(ureg, tmp);
} else {
- ureg_TEX(ureg, dst, TGSI_TEXTURE_2D, coords, sampler);
+ ureg_TEX(ureg, dst, TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ coords, sampler);
}
if (set_alpha)
ureg_MOV(ureg,
ureg_writemask(dst, TGSI_WRITEMASK_W),
ureg_scalar(imm0, TGSI_SWIZZLE_W));
}
}
static void *
create_fs(struct pipe_context *pipe, unsigned fs_traits)
diff --git a/src/mesa/state_tracker/st_atifs_to_tgsi.c b/src/mesa/state_tracker/st_atifs_to_tgsi.c
index ae08796..71b786e 100644
--- a/src/mesa/state_tracker/st_atifs_to_tgsi.c
+++ b/src/mesa/state_tracker/st_atifs_to_tgsi.c
@@ -324,20 +324,21 @@ compile_setupinst(struct st_translate *t,
src[0] = ureg_imm1f(t->ureg, 0.0f);
}
}
src[0] = apply_swizzle(t, src[0], texinst->swizzle);
if (texinst->Opcode == ATI_FRAGMENT_SHADER_SAMPLE_OP) {
/* by default texture and sampler indexes are the same */
src[1] = t->samplers[r];
/* the texture target is still unknown, it will be fixed in the draw call */
ureg_tex_insn(t->ureg, TGSI_OPCODE_TEX, dst, 1, TGSI_TEXTURE_2D,
+ TGSI_RETURN_TYPE_FLOAT,
NULL, 0, src, 2);
} else if (texinst->Opcode == ATI_FRAGMENT_SHADER_PASS_OP) {
ureg_insn(t->ureg, TGSI_OPCODE_MOV, dst, 1, src, 1);
}
t->regs_written[t->current_pass][r] = true;
}
/**
* Compile one arithmetic operation COLOR&ALPHA pair into TGSI instructions.
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index d2b964e..de3d6cd 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -162,27 +162,29 @@ get_drawpix_z_stencil_program(struct st_context *st,
}
texcoord = ureg_DECL_fs_input(ureg,
st->needs_texcoord_semantic ?
TGSI_SEMANTIC_TEXCOORD :
TGSI_SEMANTIC_GENERIC,
0, TGSI_INTERPOLATE_LINEAR);
if (write_depth) {
ureg_TEX(ureg, ureg_writemask(out_depth, TGSI_WRITEMASK_Z),
- TGSI_TEXTURE_2D, texcoord, depth_sampler);
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_FLOAT,
+ texcoord, depth_sampler);
ureg_MOV(ureg, out_color, color);
}
if (write_stencil)
ureg_TEX(ureg, ureg_writemask(out_stencil, TGSI_WRITEMASK_Y),
- TGSI_TEXTURE_2D, texcoord, stencil_sampler);
+ TGSI_TEXTURE_2D, TGSI_RETURN_TYPE_UINT,
+ texcoord, stencil_sampler);
ureg_END(ureg);
cso = ureg_create_shader_and_destroy(ureg, st->pipe);
/* save the new shader */
st->drawpix.zs_shaders[shaderIndex] = cso;
return cso;
}
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 5a9cadc..b8885bc 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -5457,20 +5457,39 @@ src_register(struct st_translate *t, const st_src_reg *reg)
case PROGRAM_SYSTEM_VALUE:
assert(reg->index < (int) ARRAY_SIZE(t->systemValues));
return t->systemValues[reg->index];
default:
assert(!"unknown src register file");
return ureg_src_undef();
}
}
+static inline unsigned
+translate_return_type(glsl_base_type type)
+{
+ switch (type) {
+ case GLSL_TYPE_INT:
+ return TGSI_RETURN_TYPE_SINT;
+ break;
+ case GLSL_TYPE_UINT:
+ return TGSI_RETURN_TYPE_UINT;
+ break;
+ case GLSL_TYPE_FLOAT:
+ return TGSI_RETURN_TYPE_FLOAT;
+ break;
+ default:
+ unreachable("not reached");
+ return 0;
+ }
+}
+
/**
* Create a TGSI ureg_dst register from an st_dst_reg.
*/
static struct ureg_dst
translate_dst(struct st_translate *t,
const st_dst_reg *dst_reg,
bool saturate)
{
struct ureg_dst dst = dst_register(t, dst_reg->file, dst_reg->index,
dst_reg->array_id);
@@ -5655,20 +5674,21 @@ compile_tgsi_instruction(struct st_translate *t,
num_src++;
for (i = 0; i < (int)inst->tex_offset_num_offset; i++) {
texoffsets[i] = translate_tex_offset(t, &inst->tex_offsets[i], i);
}
tex_target = st_translate_texture_target(inst->tex_target, inst->tex_shadow);
ureg_tex_insn(ureg,
inst->op,
dst, num_dst,
tex_target,
+ translate_return_type(inst->tex_type),
texoffsets, inst->tex_offset_num_offset,
src, num_src);
return;
case TGSI_OPCODE_RESQ:
case TGSI_OPCODE_LOAD:
case TGSI_OPCODE_ATOMUADD:
case TGSI_OPCODE_ATOMXCHG:
case TGSI_OPCODE_ATOMCAS:
case TGSI_OPCODE_ATOMAND:
@@ -6324,34 +6344,21 @@ st_translate_program(
t->immediates[i++] = emit_immediate(t, imm->values, imm->type, imm->size32);
}
assert(i == program->num_immediates);
/* texture samplers */
for (i = 0; i < frag_const->MaxTextureImageUnits; i++) {
if (program->samplers_used & (1u << i)) {
unsigned type;
t->samplers[i] = ureg_DECL_sampler(ureg, i);
-
- switch (program->sampler_types[i]) {
- case GLSL_TYPE_INT:
- type = TGSI_RETURN_TYPE_SINT;
- break;
- case GLSL_TYPE_UINT:
- type = TGSI_RETURN_TYPE_UINT;
- break;
- case GLSL_TYPE_FLOAT:
- type = TGSI_RETURN_TYPE_FLOAT;
- break;
- default:
- unreachable("not reached");
- }
+ type = translate_return_type(program->sampler_types[i]);
ureg_DECL_sampler_view( ureg, i, program->sampler_targets[i],
type, type, type, type );
}
}
for (i = 0; i < frag_const->MaxAtomicBuffers; i++) {
if (program->buffers_used & (1 << i)) {
t->buffers[i] = ureg_DECL_buffer(ureg, i, true);
}
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index b989257..5ee48ee 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -666,20 +666,21 @@ compile_instruction(
case OPCODE_TXB:
case OPCODE_TXD:
case OPCODE_TXL:
case OPCODE_TXP:
src[num_src++] = t->samplers[inst->TexSrcUnit];
ureg_tex_insn( ureg,
translate_opcode( inst->Opcode ),
dst, num_dst,
st_translate_texture_target( inst->TexSrcTarget,
inst->TexShadow ),
+ TGSI_RETURN_TYPE_FLOAT,
NULL, 0,
src, num_src );
return;
case OPCODE_SCS:
dst[0] = ureg_writemask(dst[0], TGSI_WRITEMASK_XY );
ureg_insn( ureg,
translate_opcode( inst->Opcode ),
dst, num_dst,
src, num_src );
diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c
index ca6bdea..059e9cd 100644
--- a/src/mesa/state_tracker/st_pbo.c
+++ b/src/mesa/state_tracker/st_pbo.c
@@ -485,33 +485,37 @@ create_fs(struct st_context *st, bool download, enum pipe_texture_target target)
if (target == PIPE_TEXTURE_3D) {
/* temp1.z += layer_offset */
ureg_UADD(ureg, temp1_layer,
ureg_scalar(ureg_src(temp1), TGSI_SWIZZLE_Z),
ureg_scalar(const1, TGSI_SWIZZLE_X));
}
}
/* temp1 = txf(sampler, temp1) */
+ /* TODO: The return type is wrong, though it was also wrong before.
+ */
ureg_TXF(ureg, temp1, util_pipe_tex_to_tgsi_tex(target, 1),
- ureg_src(temp1), sampler);
+ TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(temp1), sampler);
/* store(out, temp0, temp1) */
op[0] = ureg_src(temp0);
op[1] = ureg_src(temp1);
ureg_memory_insn(ureg, TGSI_OPCODE_STORE, &out, 1, op, 2, 0,
TGSI_TEXTURE_BUFFER, PIPE_FORMAT_NONE);
ureg_release_temporary(ureg, temp1);
} else {
/* out = txf(sampler, temp0.x) */
- ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER, ureg_src(temp0), sampler);
+ ureg_TXF(ureg, out, TGSI_TEXTURE_BUFFER, TGSI_RETURN_TYPE_FLOAT,
+ ureg_src(temp0), sampler);
}
ureg_release_temporary(ureg, temp0);
ureg_END(ureg);
return ureg_create_shader_and_destroy(ureg, pipe);
}
void *
--
2.7.4
More information about the mesa-dev
mailing list