From fd986490917434fec94d67f8a995eba176c82b26 Mon Sep 17 00:00:00 2001 From: Neha Bhende Date: Tue, 25 May 2021 11:10:25 -0700 Subject: [PATCH] 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: 584b1070372a0e ("st/mesa: Drop the TGSI paths for drawpixels and use nir-to-tgsi") Tested with piglit, gleretrace Reviewed-by: Charmaine Lee Part-of: --- src/gallium/drivers/svga/svga_shader.c | 4 ++ src/gallium/drivers/svga/svga_shader.h | 1 + src/gallium/drivers/svga/svga_tgsi_vgpu10.c | 65 +++++++++++++++++++-- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/svga/svga_shader.c b/src/gallium/drivers/svga/svga_shader.c index 1be8cf5dd8d..3c48d6724f4 100644 --- a/src/gallium/drivers/svga/svga_shader.c +++ b/src/gallium/drivers/svga/svga_shader.c @@ -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) { diff --git a/src/gallium/drivers/svga/svga_shader.h b/src/gallium/drivers/svga/svga_shader.h index f252c6cfa27..472499c919b 100644 --- a/src/gallium/drivers/svga/svga_shader.h +++ b/src/gallium/drivers/svga/svga_shader.h @@ -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. diff --git a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c index 9645a04a3d8..90b510616c2 100644 --- a/src/gallium/drivers/svga/svga_tgsi_vgpu10.c +++ b/src/gallium/drivers/svga/svga_tgsi_vgpu10.c @@ -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;