[Mesa-dev] [PATCH] spirv: Use correct type for sampled images
Alex Smith
asmith at feralinteractive.com
Sat Jan 6 09:27:21 UTC 2018
On 6 January 2018 at 01:03, Jason Ekstrand <jason at jlekstrand.net> wrote:
> On Tue, Nov 7, 2017 at 3:08 AM, Alex Smith <asmith at feralinteractive.com>
> wrote:
>
>> Thanks Jason. Can someone push this?
>>
>
> Did you never get push access?
>
I did - this is commit e9eb3c4753e4f56b03d16d8d6f71d49f1e7b97db.
Thanks,
Alex
> --Jason
>
>
>> On 6 November 2017 at 16:21, Jason Ekstrand <jason at jlekstrand.net> wrote:
>>
>>> On Mon, Nov 6, 2017 at 2:37 AM, Alex Smith <asmith at feralinteractive.com>
>>> wrote:
>>>
>>>> We should use the result type of the OpSampledImage opcode, rather than
>>>> the type of the underlying image/samplers.
>>>>
>>>> This resolves an issue when using separate images and shadow samplers
>>>> with glslang. Example:
>>>>
>>>> layout (...) uniform samplerShadow s0;
>>>> layout (...) uniform texture2D res0;
>>>> ...
>>>> float result = textureLod(sampler2DShadow(res0, s0), uv, 0);
>>>>
>>>> For this, for the combined OpSampledImage, the type of the base image
>>>> was being used (which does not have the Depth flag set, whereas the
>>>> result type does), therefore it was not being recognised as a shadow
>>>> sampler. This led to the wrong LLVM intrinsics being emitted by RADV.
>>>>
>>>
>>> Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
>>>
>>>
>>>> Signed-off-by: Alex Smith <asmith at feralinteractive.com>
>>>> Cc: "17.2 17.3" <mesa-stable at lists.freedesktop.org>
>>>> ---
>>>> src/compiler/spirv/spirv_to_nir.c | 10 ++++------
>>>> src/compiler/spirv/vtn_private.h | 1 +
>>>> src/compiler/spirv/vtn_variables.c | 1 +
>>>> 3 files changed, 6 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/src/compiler/spirv/spirv_to_nir.c
>>>> b/src/compiler/spirv/spirv_to_nir.c
>>>> index 6825e0d6a8..93a515d731 100644
>>>> --- a/src/compiler/spirv/spirv_to_nir.c
>>>> +++ b/src/compiler/spirv/spirv_to_nir.c
>>>> @@ -1490,6 +1490,8 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp
>>>> opcode,
>>>> struct vtn_value *val =
>>>> vtn_push_value(b, w[2], vtn_value_type_sampled_image);
>>>> val->sampled_image = ralloc(b, struct vtn_sampled_image);
>>>> + val->sampled_image->type =
>>>> + vtn_value(b, w[1], vtn_value_type_type)->type;
>>>> val->sampled_image->image =
>>>> vtn_value(b, w[3], vtn_value_type_pointer)->pointer;
>>>> val->sampled_image->sampler =
>>>> @@ -1516,16 +1518,12 @@ vtn_handle_texture(struct vtn_builder *b, SpvOp
>>>> opcode,
>>>> sampled = *sampled_val->sampled_image;
>>>> } else {
>>>> assert(sampled_val->value_type == vtn_value_type_pointer);
>>>> + sampled.type = sampled_val->pointer->type;
>>>> sampled.image = NULL;
>>>> sampled.sampler = sampled_val->pointer;
>>>> }
>>>>
>>>> - const struct glsl_type *image_type;
>>>> - if (sampled.image) {
>>>> - image_type = sampled.image->var->var->interface_type;
>>>> - } else {
>>>> - image_type = sampled.sampler->var->var->interface_type;
>>>> - }
>>>> + const struct glsl_type *image_type = sampled.type->type;
>>>> const enum glsl_sampler_dim sampler_dim =
>>>> glsl_get_sampler_dim(image_type);
>>>> const bool is_array = glsl_sampler_type_is_array(image_type);
>>>> const bool is_shadow = glsl_sampler_type_is_shadow(image_type);
>>>> diff --git a/src/compiler/spirv/vtn_private.h
>>>> b/src/compiler/spirv/vtn_private.h
>>>> index 84584620fc..6b4645acc8 100644
>>>> --- a/src/compiler/spirv/vtn_private.h
>>>> +++ b/src/compiler/spirv/vtn_private.h
>>>> @@ -411,6 +411,7 @@ struct vtn_image_pointer {
>>>> };
>>>>
>>>> struct vtn_sampled_image {
>>>> + struct vtn_type *type;
>>>> struct vtn_pointer *image; /* Image or array of images */
>>>> struct vtn_pointer *sampler; /* Sampler */
>>>> };
>>>> diff --git a/src/compiler/spirv/vtn_variables.c
>>>> b/src/compiler/spirv/vtn_variables.c
>>>> index 1cf9d597cf..9a69b4f6fc 100644
>>>> --- a/src/compiler/spirv/vtn_variables.c
>>>> +++ b/src/compiler/spirv/vtn_variables.c
>>>> @@ -1805,6 +1805,7 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp
>>>> opcode,
>>>> struct vtn_value *val =
>>>> vtn_push_value(b, w[2], vtn_value_type_sampled_image);
>>>> val->sampled_image = ralloc(b, struct vtn_sampled_image);
>>>> + val->sampled_image->type = base_val->sampled_image->type;
>>>> val->sampled_image->image =
>>>> vtn_pointer_dereference(b, base_val->sampled_image->image,
>>>> chain);
>>>> val->sampled_image->sampler = base_val->sampled_image->sampl
>>>> er;
>>>> --
>>>> 2.13.6
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180106/f59ef17b/attachment-0001.html>
More information about the mesa-dev
mailing list