svga: Use shader_key info to declare resources if TGSI shader is missing it
Sometimes, TGSI shader doesn't have SVIEW declaration if it is not
utilize in shader. In such cases, declare those resources with the
help of information stored in shader key.
Fixes: 584b107037 ("st/mesa: Drop the TGSI paths for drawpixels and use nir-to-tgsi")
Tested with piglit, gleretrace
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11011>
This commit is contained in:
@@ -275,6 +275,7 @@ svga_init_shader_key_common(const struct svga_context *svga,
|
||||
|
||||
key->tex[i].target = target;
|
||||
key->tex[i].sampler_return_type = vgpu10_return_type(view->format);
|
||||
key->tex[i].sampler_view = 1;
|
||||
|
||||
|
||||
/* 1D/2D array textures with one slice and cube map array textures
|
||||
@@ -345,6 +346,9 @@ svga_init_shader_key_common(const struct svga_context *svga,
|
||||
key->tex[i].swizzle_b = swizzle_tab[view->swizzle_b];
|
||||
key->tex[i].swizzle_a = swizzle_tab[view->swizzle_a];
|
||||
}
|
||||
else {
|
||||
key->tex[i].sampler_view = 0;
|
||||
}
|
||||
|
||||
if (sampler) {
|
||||
if (!sampler->normalized_coords) {
|
||||
|
||||
@@ -140,6 +140,7 @@ struct svga_compile_key
|
||||
unsigned num_samples:5; /**< Up to 16 samples */
|
||||
unsigned target:4;
|
||||
unsigned sampler_return_type:4;
|
||||
unsigned sampler_view:1;
|
||||
} tex[PIPE_MAX_SAMPLERS];
|
||||
/* Note: svga_compile_keys_equal() depends on the variable-size
|
||||
* tex[] array being at the end of this structure.
|
||||
|
||||
@@ -5677,6 +5677,48 @@ emit_sampler_declarations(struct svga_shader_emitter_v10 *emit)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Translate PIPE_TEXTURE_x to VGPU10_RESOURCE_DIMENSION_x.
|
||||
*/
|
||||
static unsigned
|
||||
pipe_texture_to_resource_dimension(enum tgsi_texture_type target,
|
||||
unsigned num_samples,
|
||||
boolean is_array)
|
||||
{
|
||||
switch (target) {
|
||||
case PIPE_BUFFER:
|
||||
return VGPU10_RESOURCE_DIMENSION_BUFFER;
|
||||
case PIPE_TEXTURE_1D:
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE1D;
|
||||
case PIPE_TEXTURE_2D:
|
||||
return num_samples > 2 ? VGPU10_RESOURCE_DIMENSION_TEXTURE2DMS :
|
||||
VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
|
||||
case PIPE_TEXTURE_RECT:
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
|
||||
case PIPE_TEXTURE_3D:
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE3D;
|
||||
case PIPE_TEXTURE_CUBE:
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURECUBE;
|
||||
case PIPE_TEXTURE_1D_ARRAY:
|
||||
return is_array ? VGPU10_RESOURCE_DIMENSION_TEXTURE1DARRAY
|
||||
: VGPU10_RESOURCE_DIMENSION_TEXTURE1D;
|
||||
case PIPE_TEXTURE_2D_ARRAY:
|
||||
if (num_samples > 2 && is_array)
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE2DMSARRAY;
|
||||
else if (is_array)
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE2DARRAY;
|
||||
else
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
|
||||
case PIPE_TEXTURE_CUBE_ARRAY:
|
||||
return is_array ? VGPU10_RESOURCE_DIMENSION_TEXTURECUBEARRAY :
|
||||
VGPU10_RESOURCE_DIMENSION_TEXTURECUBE;
|
||||
default:
|
||||
assert(!"Unexpected resource type");
|
||||
return VGPU10_RESOURCE_DIMENSION_TEXTURE2D;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Translate TGSI_TEXTURE_x to VGPU10_RESOURCE_DIMENSION_x.
|
||||
*/
|
||||
@@ -5776,10 +5818,18 @@ emit_resource_declarations(struct svga_shader_emitter_v10 *emit)
|
||||
|
||||
opcode0.value = 0;
|
||||
opcode0.opcodeType = VGPU10_OPCODE_DCL_RESOURCE;
|
||||
opcode0.resourceDimension =
|
||||
tgsi_texture_to_resource_dimension(emit->sampler_target[i],
|
||||
emit->key.tex[i].num_samples,
|
||||
emit->key.tex[i].is_array);
|
||||
if (emit->sampler_view[i] || !emit->key.tex[i].sampler_view) {
|
||||
opcode0.resourceDimension =
|
||||
tgsi_texture_to_resource_dimension(emit->sampler_target[i],
|
||||
emit->key.tex[i].num_samples,
|
||||
emit->key.tex[i].is_array);
|
||||
}
|
||||
else {
|
||||
opcode0.resourceDimension =
|
||||
pipe_texture_to_resource_dimension(emit->key.tex[i].target,
|
||||
emit->key.tex[i].num_samples,
|
||||
emit->key.tex[i].is_array);
|
||||
}
|
||||
opcode0.sampleCount = emit->key.tex[i].num_samples;
|
||||
operand0.value = 0;
|
||||
operand0.numComponents = VGPU10_OPERAND_0_COMPONENT;
|
||||
@@ -5795,7 +5845,12 @@ emit_resource_declarations(struct svga_shader_emitter_v10 *emit)
|
||||
STATIC_ASSERT(VGPU10_RETURN_TYPE_UINT == TGSI_RETURN_TYPE_UINT + 1);
|
||||
STATIC_ASSERT(VGPU10_RETURN_TYPE_FLOAT == TGSI_RETURN_TYPE_FLOAT + 1);
|
||||
assert(emit->sampler_return_type[i] <= TGSI_RETURN_TYPE_FLOAT);
|
||||
rt = emit->sampler_return_type[i] + 1;
|
||||
if (emit->sampler_view[i] || !emit->key.tex[i].sampler_view) {
|
||||
rt = emit->sampler_return_type[i] + 1;
|
||||
}
|
||||
else {
|
||||
rt = emit->key.tex[i].sampler_return_type;
|
||||
}
|
||||
#else
|
||||
switch (emit->sampler_return_type[i]) {
|
||||
case TGSI_RETURN_TYPE_UNORM: rt = VGPU10_RETURN_TYPE_UNORM; break;
|
||||
|
||||
Reference in New Issue
Block a user