[glsl-writer] Fix several bugs about storage image
This patch fixes several bugs about storage image on GLSL writer.
- Correctly translate storage texture access
- Translate textureLoad() to imageLoad() for storage images
- Add support of TextureBarrier()
Note that in this patch we translate ReadWrite storage textures with
the formats other than r32f, r32i and r32ui into "writeonly" because
using such image format without memory qualifier is illegal in ESSL
SPEC according to ESSL 3.1 SPEC (chapter 4.9, Memory Access Qualifiers):
Except for image variables qualified with the format qualifiers r32f,
r32i, and r32ui, image variables must specify either memory qualifier
readonly or the memory qualifier writeonly.
Bug: dawn:595, dawn:1972, tint:2007
Change-Id: Iebae00f7f97d28364e922087db60b395f567e1ec
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/147460
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
Reviewed-by: Austin Eng <enga@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/test/tint/builtins/gen/literal/textureLoad/4638a0.wgsl.expected.glsl b/test/tint/builtins/gen/literal/textureLoad/4638a0.wgsl.expected.glsl
index 97b963d..2afa845 100644
--- a/test/tint/builtins/gen/literal/textureLoad/4638a0.wgsl.expected.glsl
+++ b/test/tint/builtins/gen/literal/textureLoad/4638a0.wgsl.expected.glsl
@@ -1,14 +1,12 @@
-SKIP: FAILED
-
#version 310 es
-layout(rgba16i) uniform highp iimage2DArray arg_0;
+layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
ivec4 inner;
} prevent_dce;
void textureLoad_4638a0() {
- ivec4 res = texelFetch(arg_0, ivec3(ivec2(1), int(1u)));
+ ivec4 res = imageLoad(arg_0, ivec3(ivec2(1), int(1u)));
prevent_dce.inner = res;
}
@@ -25,22 +23,16 @@
gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
return;
}
-Error parsing GLSL shader:
-ERROR: 0:3: 'rgba16i' : format requires readonly or writeonly memory qualifier
-ERROR: 1 compilation errors. No code generated.
-
-
-
#version 310 es
precision highp float;
-layout(rgba16i) uniform highp iimage2DArray arg_0;
+layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
ivec4 inner;
} prevent_dce;
void textureLoad_4638a0() {
- ivec4 res = texelFetch(arg_0, ivec3(ivec2(1), int(1u)));
+ ivec4 res = imageLoad(arg_0, ivec3(ivec2(1), int(1u)));
prevent_dce.inner = res;
}
@@ -52,21 +44,15 @@
fragment_main();
return;
}
-Error parsing GLSL shader:
-ERROR: 0:4: 'rgba16i' : format requires readonly or writeonly memory qualifier
-ERROR: 1 compilation errors. No code generated.
-
-
-
#version 310 es
-layout(rgba16i) uniform highp iimage2DArray arg_0;
+layout(rgba16i) uniform highp readonly iimage2DArray arg_0;
layout(binding = 0, std430) buffer prevent_dce_block_ssbo {
ivec4 inner;
} prevent_dce;
void textureLoad_4638a0() {
- ivec4 res = texelFetch(arg_0, ivec3(ivec2(1), int(1u)));
+ ivec4 res = imageLoad(arg_0, ivec3(ivec2(1), int(1u)));
prevent_dce.inner = res;
}
@@ -79,9 +65,3 @@
compute_main();
return;
}
-Error parsing GLSL shader:
-ERROR: 0:3: 'rgba16i' : format requires readonly or writeonly memory qualifier
-ERROR: 1 compilation errors. No code generated.
-
-
-