mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-21 23:50:22 +01:00
glsl_to_tgsi: add SVIEW decl support
Freedreno needs sampler type information to deal with int/uint textures. To accomplish this, start creating sampler-view declarations, as suggested here: http://lists.freedesktop.org/archives/mesa-dev/2014-November/071583.html create a sampler-view with index matching the sampler, to encode the texture type (ie. SINT/UINT/FLOAT). Ie: DCL SVIEW[n], 2D, UINT DCL SAMP[n] TEX OUT[1], IN[1], SAMP[n] For tgsi texture instructions which do not take an explicit SVIEW argument, the SVIEW index is implied by the SAMP index. Signed-off-by: Rob Clark <robclark@freedesktop.org> Reviewed-by: Roland Scheidegger <sroland@vmware.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
This commit is contained in:
parent
93379748f7
commit
cb258c1dec
1 changed files with 35 additions and 1 deletions
|
|
@ -239,6 +239,7 @@ public:
|
|||
st_src_reg sampler; /**< sampler register */
|
||||
int sampler_array_size; /**< 1-based size of sampler array, 1 if not array */
|
||||
int tex_target; /**< One of TEXTURE_*_INDEX */
|
||||
glsl_base_type tex_type;
|
||||
GLboolean tex_shadow;
|
||||
|
||||
st_src_reg tex_offsets[MAX_GLSL_TEXTURE_OFFSET];
|
||||
|
|
@ -345,6 +346,8 @@ public:
|
|||
|
||||
int num_address_regs;
|
||||
int samplers_used;
|
||||
glsl_base_type sampler_types[PIPE_MAX_SAMPLERS];
|
||||
int sampler_targets[PIPE_MAX_SAMPLERS]; /**< One of TGSI_TEXTURE_* */
|
||||
bool indirect_addr_consts;
|
||||
int wpos_transform_const;
|
||||
|
||||
|
|
@ -579,6 +582,10 @@ glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op,
|
|||
inst->src[3] = src3;
|
||||
inst->ir = ir;
|
||||
inst->dead_mask = 0;
|
||||
/* default to float, for paths where this is not initialized
|
||||
* (since 0==UINT which is likely wrong):
|
||||
*/
|
||||
inst->tex_type = GLSL_TYPE_FLOAT;
|
||||
|
||||
inst->function = NULL;
|
||||
|
||||
|
|
@ -3324,6 +3331,8 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
|
|||
assert(!"Should not get here.");
|
||||
}
|
||||
|
||||
inst->tex_type = ir->type->base_type;
|
||||
|
||||
this->result = result_src;
|
||||
}
|
||||
|
||||
|
|
@ -3476,7 +3485,13 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog)
|
|||
foreach_in_list(glsl_to_tgsi_instruction, inst, &v->instructions) {
|
||||
if (is_tex_instruction(inst->op)) {
|
||||
for (int i = 0; i < inst->sampler_array_size; i++) {
|
||||
v->samplers_used |= 1 << (inst->sampler.index + i);
|
||||
unsigned idx = inst->sampler.index + i;
|
||||
v->samplers_used |= 1 << idx;
|
||||
|
||||
debug_assert(idx < (int)ARRAY_SIZE(v->sampler_types));
|
||||
v->sampler_types[idx] = inst->tex_type;
|
||||
v->sampler_targets[idx] =
|
||||
st_translate_texture_target(inst->tex_target, inst->tex_shadow);
|
||||
|
||||
if (inst->tex_shadow) {
|
||||
prog->ShadowSamplers |= 1 << (inst->sampler.index + i);
|
||||
|
|
@ -5536,7 +5551,26 @@ st_translate_program(
|
|||
/* texture samplers */
|
||||
for (i = 0; i < ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits; i++) {
|
||||
if (program->samplers_used & (1 << 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");
|
||||
}
|
||||
|
||||
ureg_DECL_sampler_view( ureg, i, program->sampler_targets[i],
|
||||
type, type, type, type );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue