#!amber # Copyright 2019 The Amber Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. SHADER compute buffer_overrun GLSL #version 430 // Only one invocation per workgroup. layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; layout(set = 0, binding = 0) buffer BlockUint { uint data[]; } ssbo_uint; layout(set = 0, binding = 1) buffer BlockInt { int data[]; } ssbo_int; void main() { uint upper_bound = ssbo_uint.data[0]; uint ui; for (ui = 0; ui < upper_bound; ++ui) { ssbo_uint.data[ui]++; } int int_lower = ssbo_int.data[0]; int int_upper = ssbo_int.data[1]; int i; for (i = int_lower; i < int_upper; ++i) { ssbo_int.data[i]++; } } END BUFFER buf_uint DATA_TYPE uint32 DATA 10000 0 0 0 END BUFFER buf_int DATA_TYPE int32 DATA -5 10 0 0 0 END PIPELINE compute pipeline ATTACH buffer_overrun SHADER_OPTIMIZATION buffer_overrun --graphics-robust-access END BIND BUFFER buf_uint AS storage DESCRIPTOR_SET 0 BINDING 0 BIND BUFFER buf_int AS storage DESCRIPTOR_SET 0 BINDING 1 END # Only one workgroup. Having only one invocation execute ensures # there are no race conditions. RUN pipeline 1 1 1 # In the unsigned int index case: # The first 4 entries are incremented, as expected. # Beyond that, the remaining indices are clamped to the upper # bound of the length of the array, minus 1. EXPECT buf_uint IDX 0 EQ 10001 1 1 9997 # In the signed int index case: # # Index 0 is incremented 6 times, for i values -5, -4, -3, -2, -1, 0 # since negative indices are clamped to 0. # So initial value -5 + 6 --> 1 # Indices 1, 2, 3 are incremented once each. # Index 4 is incremented 6 times, for i values 4, 5, 6, 7, 8, 9 EXPECT buf_int IDX 0 EQ 1 11 1 1 6