mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 00:00:11 +01:00
tgsi: store the sampler view type directly in the instruction
RadeonSI needs to do a special lowering for Gather4 with integer formats, but with bindless samplers we just can't access the index. Instead, store the return type in the instruction like the target. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
ac3f6bf608
commit
5cb2eee557
8 changed files with 49 additions and 23 deletions
|
|
@ -720,6 +720,7 @@ tgsi_default_instruction_texture( void )
|
|||
|
||||
instruction_texture.Texture = TGSI_TEXTURE_UNKNOWN;
|
||||
instruction_texture.NumOffsets = 0;
|
||||
instruction_texture.ReturnType = TGSI_RETURN_TYPE_UNKNOWN;
|
||||
instruction_texture.Padding = 0;
|
||||
|
||||
return instruction_texture;
|
||||
|
|
@ -729,6 +730,7 @@ static struct tgsi_instruction_texture
|
|||
tgsi_build_instruction_texture(
|
||||
unsigned texture,
|
||||
unsigned num_offsets,
|
||||
unsigned return_type,
|
||||
struct tgsi_token *prev_token,
|
||||
struct tgsi_instruction *instruction,
|
||||
struct tgsi_header *header )
|
||||
|
|
@ -737,6 +739,7 @@ tgsi_build_instruction_texture(
|
|||
|
||||
instruction_texture.Texture = texture;
|
||||
instruction_texture.NumOffsets = num_offsets;
|
||||
instruction_texture.ReturnType = return_type;
|
||||
instruction_texture.Padding = 0;
|
||||
instruction->Texture = 1;
|
||||
|
||||
|
|
@ -1090,7 +1093,8 @@ tgsi_build_full_instruction(
|
|||
|
||||
*instruction_texture = tgsi_build_instruction_texture(
|
||||
full_inst->Texture.Texture,
|
||||
full_inst->Texture.NumOffsets,
|
||||
full_inst->Texture.NumOffsets,
|
||||
full_inst->Texture.ReturnType,
|
||||
prev_token,
|
||||
instruction,
|
||||
header );
|
||||
|
|
|
|||
|
|
@ -1289,7 +1289,7 @@ ureg_fixup_label(struct ureg_program *ureg,
|
|||
void
|
||||
ureg_emit_texture(struct ureg_program *ureg,
|
||||
unsigned extended_token,
|
||||
unsigned target, unsigned num_offsets)
|
||||
unsigned target, unsigned return_type, unsigned num_offsets)
|
||||
{
|
||||
union tgsi_any_token *out, *insn;
|
||||
|
||||
|
|
@ -1301,6 +1301,7 @@ ureg_emit_texture(struct ureg_program *ureg,
|
|||
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
|
||||
|
|
@ -1386,6 +1387,7 @@ ureg_tex_insn(struct ureg_program *ureg,
|
|||
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,
|
||||
|
|
@ -1407,7 +1409,8 @@ ureg_tex_insn(struct ureg_program *ureg,
|
|||
nr_dst,
|
||||
nr_src);
|
||||
|
||||
ureg_emit_texture( ureg, insn.extended_token, target, nr_offset );
|
||||
ureg_emit_texture( ureg, insn.extended_token, target, return_type,
|
||||
nr_offset );
|
||||
|
||||
for (i = 0; i < nr_offset; i++)
|
||||
ureg_emit_texture_offset( ureg, &texoffsets[i]);
|
||||
|
|
|
|||
|
|
@ -555,6 +555,7 @@ ureg_tex_insn(struct ureg_program *ureg,
|
|||
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,
|
||||
|
|
@ -596,7 +597,7 @@ ureg_emit_label(struct ureg_program *ureg,
|
|||
void
|
||||
ureg_emit_texture(struct ureg_program *ureg,
|
||||
unsigned insn_token,
|
||||
unsigned target, unsigned num_offsets);
|
||||
unsigned target, unsigned return_type, unsigned num_offsets);
|
||||
|
||||
void
|
||||
ureg_emit_texture_offset(struct ureg_program *ureg,
|
||||
|
|
@ -748,6 +749,7 @@ static inline void ureg_##op( struct ureg_program *ureg, \
|
|||
struct ureg_src src1 ) \
|
||||
{ \
|
||||
unsigned opcode = TGSI_OPCODE_##op; \
|
||||
unsigned return_type = TGSI_RETURN_TYPE_UNKNOWN; \
|
||||
struct ureg_emit_insn_result insn; \
|
||||
if (ureg_dst_is_empty(dst)) \
|
||||
return; \
|
||||
|
|
@ -756,7 +758,8 @@ static inline void ureg_##op( struct ureg_program *ureg, \
|
|||
dst.Saturate, \
|
||||
1, \
|
||||
2); \
|
||||
ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
|
||||
ureg_emit_texture( ureg, insn.extended_token, target, \
|
||||
return_type, 0 ); \
|
||||
ureg_emit_dst( ureg, dst ); \
|
||||
ureg_emit_src( ureg, src0 ); \
|
||||
ureg_emit_src( ureg, src1 ); \
|
||||
|
|
@ -796,6 +799,7 @@ static inline void ureg_##op( struct ureg_program *ureg, \
|
|||
struct ureg_src src3 ) \
|
||||
{ \
|
||||
unsigned opcode = TGSI_OPCODE_##op; \
|
||||
unsigned return_type = TGSI_RETURN_TYPE_UNKNOWN; \
|
||||
struct ureg_emit_insn_result insn; \
|
||||
if (ureg_dst_is_empty(dst)) \
|
||||
return; \
|
||||
|
|
@ -804,7 +808,8 @@ static inline void ureg_##op( struct ureg_program *ureg, \
|
|||
dst.Saturate, \
|
||||
1, \
|
||||
4); \
|
||||
ureg_emit_texture( ureg, insn.extended_token, target, 0 ); \
|
||||
ureg_emit_texture( ureg, insn.extended_token, target, \
|
||||
return_type, 0 ); \
|
||||
ureg_emit_dst( ureg, dst ); \
|
||||
ureg_emit_src( ureg, src0 ); \
|
||||
ureg_emit_src( ureg, src1 ); \
|
||||
|
|
|
|||
|
|
@ -233,6 +233,7 @@ enum tgsi_return_type {
|
|||
TGSI_RETURN_TYPE_SINT,
|
||||
TGSI_RETURN_TYPE_UINT,
|
||||
TGSI_RETURN_TYPE_FLOAT,
|
||||
TGSI_RETURN_TYPE_UNKNOWN,
|
||||
TGSI_RETURN_TYPE_COUNT
|
||||
};
|
||||
|
||||
|
|
@ -694,7 +695,8 @@ struct tgsi_instruction_texture
|
|||
{
|
||||
unsigned Texture : 8; /* TGSI_TEXTURE_ */
|
||||
unsigned NumOffsets : 4;
|
||||
unsigned Padding : 20;
|
||||
unsigned ReturnType : 3; /* TGSI_RETURN_TYPE_x */
|
||||
unsigned Padding : 17;
|
||||
};
|
||||
|
||||
/* for texture offsets in GLSL and DirectX.
|
||||
|
|
|
|||
|
|
@ -334,7 +334,7 @@ compile_setupinst(struct st_translate *t,
|
|||
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,
|
||||
NULL, 0, src, 2);
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5877,6 +5877,7 @@ compile_tgsi_instruction(struct st_translate *t,
|
|||
inst->op,
|
||||
dst, num_dst,
|
||||
tex_target,
|
||||
st_translate_texture_type(inst->tex_type),
|
||||
texoffsets, inst->tex_offset_num_offset,
|
||||
src, num_src);
|
||||
return;
|
||||
|
|
@ -6570,24 +6571,10 @@ st_translate_program(
|
|||
/* texture samplers */
|
||||
for (i = 0; i < frag_const->MaxTextureImageUnits; i++) {
|
||||
if (program->samplers_used & (1u << i)) {
|
||||
unsigned type;
|
||||
unsigned type = st_translate_texture_type(program->sampler_types[i]);
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
ureg_DECL_sampler_view( ureg, i, program->sampler_targets[i],
|
||||
type, type, type, type );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -222,6 +222,26 @@ st_translate_texture_target(GLuint textarget, GLboolean shadow)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Map GLSL base type to TGSI return type.
|
||||
*/
|
||||
unsigned
|
||||
st_translate_texture_type(enum glsl_base_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case GLSL_TYPE_INT:
|
||||
return TGSI_RETURN_TYPE_SINT;
|
||||
case GLSL_TYPE_UINT:
|
||||
return TGSI_RETURN_TYPE_UINT;
|
||||
case GLSL_TYPE_FLOAT:
|
||||
return TGSI_RETURN_TYPE_FLOAT;
|
||||
default:
|
||||
assert(!"unexpected texture type");
|
||||
return TGSI_RETURN_TYPE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Translate a (1 << TEXTURE_x_INDEX) bit into a TGSI_TEXTURE_x enum.
|
||||
*/
|
||||
|
|
@ -536,6 +556,7 @@ compile_instruction(
|
|||
dst, num_dst,
|
||||
st_translate_texture_target( inst->TexSrcTarget,
|
||||
inst->TexShadow ),
|
||||
TGSI_RETURN_TYPE_FLOAT,
|
||||
NULL, 0,
|
||||
src, num_src );
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#include "pipe/p_compiler.h"
|
||||
#include "pipe/p_defines.h"
|
||||
|
||||
#include "compiler/glsl_types.h"
|
||||
|
||||
#if defined __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
@ -63,6 +65,8 @@ st_translate_mesa_program(
|
|||
unsigned
|
||||
st_translate_texture_target(GLuint textarget, GLboolean shadow);
|
||||
|
||||
unsigned
|
||||
st_translate_texture_type(enum glsl_base_type type);
|
||||
|
||||
#if defined __cplusplus
|
||||
} /* extern "C" */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue