| #!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 |