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;