# Copyright 2018 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.

[compute shader]
#version 430

layout(set = 0, binding = 0) buffer block0 {
  float data_set0_binding0[3];
};

layout(set = 1, binding = 2) buffer block1 {
  float data_set1_binding2[3];
};

layout(set = 2, binding = 1) buffer block2 {
  float data_set2_binding1[3];
};

layout(set = 2, binding = 3) buffer block3 {
  float data_set2_binding3[3];
};

void main() {
  const uint index = gl_WorkGroupID.x;
  data_set0_binding0[index] = data_set0_binding0[index] + 1.0f;
  data_set1_binding2[index] = data_set2_binding1[index] -
                              data_set1_binding2[index];
  data_set2_binding1[index] = 10.0f * data_set2_binding3[index] +
                              data_set2_binding1[index];
  data_set2_binding3[index] = 30.0f * data_set2_binding3[index];
}

[test]
ssbo 0:0 subdata vec3  0  1.0  2.0  3.0
ssbo 1:2 subdata vec3  0  4.0  5.0  6.0
ssbo 2:1 subdata vec3  0 21.0 22.0 23.0
ssbo 2:3 subdata vec3  0  0.7  0.8  0.9
compute 3 1 1

probe ssbo vec3 0:0 0 ~=  2.0  3.0  4.0
probe ssbo vec3 1:2 0 ~= 17.0 17.0 17.0
probe ssbo vec3 2:1 0 ~= 28.0 30.0 32.0
probe ssbo vec3 2:3 0 ~= 21.0 24.0 27.0
