diff options
author | Lukas Taparauskas <lukas.taparauskas@unity3d.com> | 2021-04-29 21:01:26 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-29 21:01:26 +0300 |
commit | 72a2ec4c1b56ce233e0da97a36f87af98927256c (patch) | |
tree | 6ec325a51ddfb3b42c7d5442475f6d1e001cfa5d /reference/shaders-msl-no-opt | |
parent | 995c7981cc3ec0cbd1e5a07321cfdee3d1219524 (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')
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]; |