Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Taparauskas <lukas.taparauskas@unity3d.com>2021-04-29 21:01:26 +0300
committerGitHub <noreply@github.com>2021-04-29 21:01:26 +0300
commit72a2ec4c1b56ce233e0da97a36f87af98927256c (patch)
tree6ec325a51ddfb3b42c7d5442475f6d1e001cfa5d /reference/shaders-msl-no-opt
parent995c7981cc3ec0cbd1e5a07321cfdee3d1219524 (diff)
MSL: Fix '--msl-multi-patch-workgroup' out of bounds reads when dispatching more threads than control points (#1662)
* Fix '--msl-multi-patch-workgroup' cases where thread count exceeds data bounds *Fix gl_PrimitiveID off by one error when computing last valid index *Point gl_out to the last patch's data when threads exceed input data bounds *Point patchOut to the last patch's data when threads exceed input data bounds * Update MSL test expectations. * Undo change to MSL multi-patch hull output bound checks * Update MSL multi-patch test expectations.
Diffstat (limited to 'reference/shaders-msl-no-opt')
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-0.multi-patch.msl2.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-1.multi-patch.msl2.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/asm/tesc/tess-fixed-input-array-builtin-array.invalid.multi-patch.asm.tesc2
-rw-r--r--reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc2
10 files changed, 10 insertions, 10 deletions
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-0.multi-patch.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-0.multi-patch.msl2.asm.tesc
index 29622999..87487408 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-0.multi-patch.msl2.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-0.multi-patch.msl2.asm.tesc
@@ -76,7 +76,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4];
patchOut.P_v = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
c[gl_InvocationID].v = float4(1.0);
patchOut.P_v = float4(2.0);
gl_out[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-1.multi-patch.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-1.multi-patch.msl2.asm.tesc
index 7427e36c..04d19bb8 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-1.multi-patch.msl2.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-location-1.multi-patch.msl2.asm.tesc
@@ -75,7 +75,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
threadgroup P (&p) = spvStoragep[(gl_GlobalInvocationID.x / 4) % 8];
p = P{ float4(0.0) };
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].C_v = float4(1.0);
p.v = float4(2.0);
gl_out[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc
index daf07834..5394741b 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-point-size.multi-patch.msl2.asm.tesc
@@ -94,7 +94,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4];
patchOut.P_v = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].C_v = float4(1.0);
patchOut.P_v = float4(2.0);
gl_out[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc
index c20467af..a6790894 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers-block.mask-position.multi-patch.msl2.asm.tesc
@@ -94,7 +94,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4];
patchOut.P_v = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].C_v = float4(1.0);
patchOut.P_v = float4(2.0);
gl_out_masked[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc
index b58ba996..750ef96d 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-0.msl2.multi-patch.asm.tesc
@@ -84,7 +84,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4];
patchOut.foo_patch = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
foo[gl_InvocationID] = float4(1.0);
patchOut.foo_patch = float4(2.0);
gl_out[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc
index 167c24c5..a7c1e5d6 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-location-1.multi-patch.asm.tesc
@@ -83,7 +83,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
threadgroup float4 (&foo_patch) = spvStoragefoo_patch[(gl_GlobalInvocationID.x / 4) % 8];
foo_patch = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].foo = float4(1.0);
foo_patch = float4(2.0);
gl_out[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc
index 33379f2c..92731ec0 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-point-size.msl2.multi-patch.asm.tesc
@@ -84,7 +84,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4];
patchOut.foo_patch = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].foo = float4(1.0);
patchOut.foo_patch = float4(2.0);
gl_out[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc
index 1fa5d1eb..7283eddb 100644
--- a/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/masking/initializers.mask-position.msl2.multi-patch.asm.tesc
@@ -84,7 +84,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_patchOut& patchOut = spvPatchOut[gl_GlobalInvocationID.x / 4];
patchOut.foo_patch = float4(0.0);
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].foo = float4(1.0);
patchOut.foo_patch = float4(2.0);
gl_out_masked[gl_InvocationID].gl_Position = float4(3.0);
diff --git a/reference/shaders-msl-no-opt/asm/tesc/tess-fixed-input-array-builtin-array.invalid.multi-patch.asm.tesc b/reference/shaders-msl-no-opt/asm/tesc/tess-fixed-input-array-builtin-array.invalid.multi-patch.asm.tesc
index e16e0c0b..dabe1b38 100644
--- a/reference/shaders-msl-no-opt/asm/tesc/tess-fixed-input-array-builtin-array.invalid.multi-patch.asm.tesc
+++ b/reference/shaders-msl-no-opt/asm/tesc/tess-fixed-input-array-builtin-array.invalid.multi-patch.asm.tesc
@@ -110,7 +110,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_out* gl_out = &spvOut[gl_GlobalInvocationID.x - gl_GlobalInvocationID.x % 3];
device main0_in* gl_in = &spvIn[min(gl_GlobalInvocationID.x / 3, spvIndirectParams[1] - 1) * spvIndirectParams[0]];
uint gl_InvocationID = gl_GlobalInvocationID.x % 3;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 3, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 3, spvIndirectParams[1] - 1);
spvUnsafeArray<VertexOutput, 3> p;
p[0].pos = gl_in[0].gl_Position;
p[0].uv = gl_in[0].p.uv;
diff --git a/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc b/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc
index 34a1bf4b..f55e47ba 100644
--- a/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc
+++ b/reference/shaders-msl-no-opt/tesc/passthrough-clip-cull.multi-patch.tesc
@@ -63,7 +63,7 @@ kernel void main0(uint3 gl_GlobalInvocationID [[thread_position_in_grid]], devic
device main0_out* gl_out = &spvOut[gl_GlobalInvocationID.x - gl_GlobalInvocationID.x % 4];
device main0_in* gl_in = &spvIn[min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1) * spvIndirectParams[0]];
uint gl_InvocationID = gl_GlobalInvocationID.x % 4;
- uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1]);
+ uint gl_PrimitiveID = min(gl_GlobalInvocationID.x / 4, spvIndirectParams[1] - 1);
gl_out[gl_InvocationID].gl_ClipDistance[0] = gl_in[gl_InvocationID].gl_ClipDistance[0];
gl_out[gl_InvocationID].gl_ClipDistance[1] = gl_in[gl_InvocationID].gl_ClipDistance[1];
gl_out[gl_InvocationID].gl_CullDistance[0] = gl_in[gl_InvocationID].gl_CullDistance[0];