#!amber
# Copyright 2021 Google LLC.
# Copyright 2021 The Khronos Group Inc.
#
# 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
#
#     http://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.

# Matrix 3x3 inverse precision test 16bit

DEVICE_EXTENSION VK_KHR_storage_buffer_storage_class
DEVICE_EXTENSION VK_KHR_16bit_storage
DEVICE_FEATURE   Float16Int8Features.shaderFloat16

SHADER compute compute_shader GLSL
#version 450
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable

const int NUMMATRICES = 10;

layout(set = 0, binding = 0) buffer block0
{
  mat3 matIns[NUMMATRICES];
};

layout(set = 0, binding = 1) buffer block1
{
  mat3 invOutM[NUMMATRICES];
};

void main()
{
  for (int ndx = 0; ndx < NUMMATRICES; ndx++)
  {
    f16mat3 matIn_16    = f16mat3(matIns[ndx]);
    f16mat3 matInv_16   = inverse(matIn_16);

    f16mat3 transMat_16 = f16mat3(vec3(matIn_16[0][0], matIn_16[1][0], matIn_16[2][0]),
                                  vec3(matIn_16[0][1], matIn_16[1][1], matIn_16[2][1]),
                                  vec3(matIn_16[0][2], matIn_16[1][2], matIn_16[2][2]));

    for (int row = 0; row < 3; row++)
    {
      for (int col = 0; col < 3; col++)
      {
        invOutM[ndx][row][col] = uintBitsToFloat(packFloat2x16(f16vec2(matInv_16[row][col], -1.0)));
      }
    }
  }
}
END

BUFFER bufIn DATA_TYPE mat3x3<float> DATA
    1.0                   5.0                   3.0
    2.0                   4.0                   7.0
    4.0                   6.0                   2.0

    1.0                   0.0                   1.0
    0.0                   0.0                   1.0
    1.0                   1.0                   1.0

   -0.00400161743164062  -2.900390625         -41
   -0.419921875           0.00490188598632812  -0.016998291015625
   -0.7001953125          0.00500106811523438  -0.00259971618652344

   -0.140000000596046     0.00109999999403954  -0.399999976158142
  -32                     1.80000007152557     -0.046000003814697
    5                     0.00500000035390258 -27

   -4.0234375             1.2275390625         21.125
    5.73828125           90.5625              -60.4375
   -2.1484375            -1.27734375           -1.951171875

    1.71191406           -6.6796875             3.72460938
    4.828125              0.152832031           0.327636719
   -0.126586914           1.70605469            0.860351562

   24.171875              2.798828125           0.82958984375
   -9.703125              1.1630859375        -17.46875
   -1.3828125            -4.83984375            3.56640625

   -1.615234375           5.9296875             1.181640625
    1.7802734375         19.1875                4.7578125
   52.8125               -1.1171875             1.1513671875

    3.17578125           -2.3984375             4.12890625
    1.3818359375          5.53125               1.8154296875
  -16.40625              -1.8486328125          0.95263671875

    1.615234375           0.62890625            2.73828125
   -0.9716796875        -18.828125              3.509765625
   -8.015625              3.5703125             5.98046875
END

BUFFER bufOut DATA_TYPE mat3x3<float> SIZE 10 FILL 0.0

PIPELINE compute pipeline
  ATTACH compute_shader

  BIND BUFFER bufIn AS storage DESCRIPTOR_SET 0 BINDING 0
  BIND BUFFER bufOut AS storage DESCRIPTOR_SET 0 BINDING 1
END

RUN pipeline 1 1 1
EXPECT bufOut IDX   0 TOLERANCE 0.00000762939453125 EQ -0.0078562144190073  -0.00782368611544371 -0.00782512966543436 -0.00782518088817596 -0.00785453896969557 -0.00785134267061949 -0.0078532500192523  -0.00782443396747112 -0.00785379111766815
EXPECT bufOut IDX  48 TOLERANCE 0.00000762939453125 EQ -0.00782680511474609 -0.00785732269287109 -0.007843017578125   -0.00785732269287109 -0.007843017578125   -0.00782680511474609 -0.007843017578125   -0.00782680511474609 -0.007843017578125
EXPECT bufOut IDX  96 TOLERANCE 0.00000762939453125 EQ -0.00784752238541842 -0.00782798510044813 -0.00785871222615242 -0.0078544681891799  -0.0078347260132432  -0.00786453858017921 -0.00785158388316631 -0.00786159280687571 -0.00783040374517441
EXPECT bufOut IDX 144 TOLERANCE 0.00000762939453125 EQ -0.00785949360579252 -0.00781868956983089 -0.00782319065183401 -0.00786344427615404 -0.0078260563313961  -0.00782713387161493 -0.00785725098103285 -0.00781663320958614 -0.00785203743726015
EXPECT bufOut IDX 192 TOLERANCE 0.00000762939453125 EQ -0.00785310473293066 -0.00784990470856428 -0.00785593315958977 -0.00782180111855268 -0.00782043673098087 -0.0078520905226469  -0.00782219227403402 -0.00784830655902624 -0.00785365328192711
EXPECT bufOut IDX 240 TOLERANCE 0.00000762939453125 EQ -0.00785053987056017 -0.00782458204776049 -0.00785305164754391 -0.00785365793853998 -0.00782210659235716 -0.00782508961856365 -0.0078240754082799  -0.00785269215703011 -0.00782596692442894
EXPECT bufOut IDX 288 TOLERANCE 0.00000762939453125 EQ -0.00782249309122562 -0.00782015733420849 -0.00782187841832638 -0.00785263068974018 -0.00785313174128532 -0.00785532407462597 -0.00785235036164522 -0.00785354617983103 -0.00785256922245026
EXPECT bufOut IDX 336 TOLERANCE 0.00000762939453125 EQ -0.00782382301986217 -0.00785266328603029 -0.00782157573848963 -0.00782686658203602 -0.00785550847649574 -0.00782235898077488 -0.0078593110665679  -0.00782712083309889 -0.00785486306995153
EXPECT bufOut IDX 384 TOLERANCE 0.00000762939453125 EQ -0.00782125908881426 -0.00785109400749207 -0.0078533822670579  -0.00785357225686312 -0.00782414898276329 -0.00784495379775763 -0.00782443396747112 -0.0078235175460577  -0.00782245025038719
EXPECT bufOut IDX 432 TOLERANCE 0.00000762939453125 EQ -0.00782448425889015 -0.00785084161907434 -0.00785383861511946 -0.00782214943319559 -0.00785311032086611 -0.00782076641917229 -0.00782483350485563 -0.0078211622312665  -0.00782250612974167