diff --git a/util/test/demos/vk/vk_groupshared.cpp b/util/test/demos/vk/vk_groupshared.cpp index 95311cc39..59b0ae98d 100644 --- a/util/test/demos/vk/vk_groupshared.cpp +++ b/util/test/demos/vk/vk_groupshared.cpp @@ -51,6 +51,8 @@ layout(binding = 1, std430) buffer outdataBuf shared float gsmData[MAX_THREADS]; shared int gsmIntData[MAX_THREADS]; shared int gInt; +shared float gsmSmallArray[MAX_THREADS]; +shared vec3 gsmSmall2DArray[3][MAX_THREADS]; #define IsTest(x) (push.test == x) @@ -266,6 +268,31 @@ void main() GroupMemoryBarrierWithGroupSync(); outval.w = gInt; } + else if (IsTest(13)) + { + // Out of bounds GSM access should not crash + uint idx = gid.x; + uint oneu = (idx+1)/(idx+1); + uint zerou = oneu - 1; + uint idxOOB = idx * 2 + MAX_THREADS * oneu; + + gsmSmallArray[idx] = float(gid.x); + gsmSmall2DArray[zerou][idx].x = float(gid.x); + gsmSmall2DArray[zerou][idx].y = float(gid.x) + 1.0; + gsmSmall2DArray[oneu][idx].x = float(gid.x); + gsmSmall2DArray[oneu][idx].y = float(gid.x) + 1.0; + gsmSmall2DArray[oneu+oneu][idx].x = float(gid.x); + gsmSmall2DArray[oneu+oneu][idx].y = float(gid.x) + 1.0; + + gsmSmallArray[idxOOB] += float(zerou); + gsmSmall2DArray[oneu][idxOOB].x += float(zerou); + gsmSmall2DArray[oneu][idxOOB].y += float(zerou); + + outval.x = gsmSmallArray[idx + zerou]; + outval.y = gsmSmallArray[idx + zerou]; + outval.z = gsmSmall2DArray[oneu][idx + zerou].x; + outval.w = gsmSmall2DArray[oneu][idx + zerou].y; + } outdata[gid.x] = outval; }