summaryrefslogtreecommitdiff
path: root/source/slang/hlsl.meta.slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-02-27 15:18:07 -0800
committerGitHub <noreply@github.com>2023-02-27 15:18:07 -0800
commita3ba22b51c371d5a20d61aa4e35233ba4f4f68db (patch)
tree704f8e9575fdd888d01137054b4c3887aaac9360 /source/slang/hlsl.meta.slang
parentb1b76f06ca5bdfc4b688d99095dfb7d561a04d80 (diff)
Detect and deduplicate read-only resource access. (#2680)
* Detect and deduplicate read-only resource access. * Fix tests. * Fix tests. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/hlsl.meta.slang')
-rw-r--r--source/slang/hlsl.meta.slang21
1 files changed, 20 insertions, 1 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index 37cdc205e..0b7ca535b 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -19,29 +19,39 @@ __intrinsic_type($(kIROp_HLSLByteAddressBufferType))
struct ByteAddressBuffer
{
__target_intrinsic(glsl, "$1 = $0._data.length() * 4")
+ [__readNone]
void GetDimensions(
out uint dim);
__target_intrinsic(glsl, "$0._data[$1/4]")
+ [__readNone]
uint Load(int location);
+ [__readNone]
uint Load(int location, out uint status);
__target_intrinsic(glsl, "uvec2($0._data[$1/4], $0._data[$1/4+1])")
+ [__readNone]
uint2 Load2(int location);
+ [__readNone]
uint2 Load2(int location, out uint status);
__target_intrinsic(glsl, "uvec3($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2])")
+ [__readNone]
uint3 Load3(int location);
+ [__readNone]
uint3 Load3(int location, out uint status);
__target_intrinsic(glsl, "uvec4($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2], $0._data[$1/4+3])")
+ [__readNone]
uint4 Load4(int location);
+ [__readNone]
uint4 Load4(int location, out uint status);
+ [__readNone]
T Load<T>(int location)
{
return __byteAddressBufferLoad<T>(this, location);
@@ -216,19 +226,24 @@ __intrinsic_type($(kIROp_HLSLStructuredBufferType))
struct StructuredBuffer
{
__target_intrinsic(glsl, "$1 = $0._data.length(); $2 = 0")
+ [__readNone]
void GetDimensions(
out uint numStructs,
out uint stride);
__target_intrinsic(glsl, "$0._data[$1]")
__target_intrinsic(spirv_direct, "%addr = OpAccessChain resultType*StorageBuffer resultId _0 const(int, 0) _1; OpLoad resultType resultId %addr;")
+ [__readNone]
T Load(int location);
+
+ [__readNone]
T Load(int location, out uint status);
__subscript(uint index) -> T
{
__target_intrinsic(glsl, "$0._data[$1]")
__target_intrinsic(spirv_direct, "%addr = OpAccessChain resultType*StorageBuffer resultId _0 const(int, 0) _1; OpLoad resultType resultId %addr;")
+ [__readNone]
get;
};
};
@@ -4923,6 +4938,7 @@ static const int kBaseBufferAccessLevelCount = sizeof(kBaseBufferAccessLevels) /
for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa)
{
auto access = kBaseBufferAccessLevels[aa].access;
+ bool isReadOnly = (access == SLANG_RESOURCE_ACCESS_READ);
auto flavor = TextureFlavor::create(TextureFlavor::Shape::ShapeBuffer, access).flavor;
sb << "__generic<T>\n";
sb << "__magic_type(Texture," << int(flavor) << ")\n";
@@ -4930,19 +4946,22 @@ for (int aa = 0; aa < kBaseBufferAccessLevelCount; ++aa)
sb << "struct ";
sb << kBaseBufferAccessLevels[aa].name;
sb << "Buffer {\n";
-
+ sb << "[__readNone]\n";
sb << "void GetDimensions(out uint dim);\n";
char const* glslLoadFuncName = (access == SLANG_RESOURCE_ACCESS_READ) ? "texelFetch" : "imageLoad";
sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)";
sb << "__target_intrinsic(glsl, \"" << glslLoadFuncName << "($0, $1)$z\")\n";
+ if (isReadOnly) sb << "[__readNone]\n";
sb << "T Load(int location);\n";
+ if (isReadOnly) sb << "[__readNone]\n";
sb << "T Load(int location, out uint status);\n";
sb << "__subscript(uint index) -> T {\n";
+ if (isReadOnly) sb << "[__readNone]\n";
sb << "__glsl_extension(GL_EXT_samplerless_texture_functions)";
sb << "__target_intrinsic(glsl, \"" << glslLoadFuncName << "($0, int($1))$z\") get;\n";