[Mesa-dev] [PATCH 1/6] glsl: handle memory qualifiers for struct with array of images
Samuel Pitoiset
samuel.pitoiset at gmail.com
Wed May 31 09:06:23 UTC 2017
On 05/31/2017 02:43 AM, Ian Romanick wrote:
> On 05/25/2017 11:07 AM, Samuel Pitoiset wrote:
>> This handles a situation like:
>>
>> struct {
>> image2D imgs[6];
>> } s;
>
> Without looking at the surrounding code... does this also handle cases like:
>
> struct S { image2D imgs[6]; };
> struct { S s } s;
Yes. With a shader like:
%%%%%
struct S { writeonly image2D imgs[6]; };
struct { S s; } s;
void main()
{
imageStore(s.s.imgs[2], ivec2(0, 0), vec4(0, 0, 0, 0));
}
%%%%%
The generated GLSL IR looks like:
%%%%%
(
(declare (writeonly temporary ) image2D s_s_imgs_0)
(declare (writeonly temporary ) image2D s_s_imgs_1)
(declare (writeonly temporary ) image2D s_s_imgs_2)
(declare (writeonly temporary ) image2D s_s_imgs_3)
(declare (writeonly temporary ) image2D s_s_imgs_4)
(declare (writeonly temporary ) image2D s_s_imgs_5)
( function main
(signature void
(parameters
)
(
(call __intrinsic_image_store ((var_ref s_s_imgs_2) (constant
ivec2 (0 0)) (constant vec4 (0.000000 0.000000 0.000000 0.000000)) ))
))
)
)
%%%%%
The 'writeonly' qualifier is correctly propagated.
>
>>
>> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
>> ---
>> src/compiler/glsl/ast_to_hir.cpp | 7 ++++---
>> 1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
>> index 2dec8bbc32..65b6262f34 100644
>> --- a/src/compiler/glsl/ast_to_hir.cpp
>> +++ b/src/compiler/glsl/ast_to_hir.cpp
>> @@ -7402,9 +7402,10 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
>> }
>>
>> /* Memory qualifiers are allowed on buffer and image variables, while
>> - * the format qualifier is only accept for images.
>> + * the format qualifier is only accepted for images.
>> */
>> - if (var_mode == ir_var_shader_storage || field_type->is_image()) {
>> + if (var_mode == ir_var_shader_storage ||
>> + field_type->without_array()->is_image()) {
>> /* For readonly and writeonly qualifiers the field definition,
>> * if set, overwrites the layout qualifier.
>> */
>> @@ -7431,7 +7432,7 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
>> fields[i].memory_restrict = qual->flags.q.restrict_flag ||
>> (layout && layout->flags.q.restrict_flag);
>>
>> - if (field_type->is_image()) {
>> + if (field_type->without_array()->is_image()) {
>> if (qual->flags.q.explicit_image_format) {
>> if (qual->image_base_type != field_type->sampled_type) {
>> _mesa_glsl_error(&loc, state, "format qualifier doesn't "
>>
>
More information about the mesa-dev
mailing list