xref: /aosp_15_r20/external/OpenCL-CTS/test_conformance/vulkan/shaders/image2D.comp (revision 6467f958c7de8070b317fc65bcb0f6472e388d82)
1#version 450
2#extension GL_ARB_separate_shader_objects : enable
3#extension GL_EXT_shader_explicit_arithmetic_types_int32   : enable
4
5#define MAX_2D_IMAGES               5
6#define MAX_2D_IMAGE_MIP_LEVELS     11
7#define MAX_2D_IMAGE_DESCRIPTORS    MAX_2D_IMAGES * MAX_2D_IMAGE_MIP_LEVELS
8
9layout(binding = 0) buffer Params
10{
11    uint32_t numImage2DDescriptors;
12};
13layout(binding = 1, rgba32f ) uniform image2D image2DList[ MAX_2D_IMAGE_DESCRIPTORS ];
14layout(local_size_x = 32, local_size_y = 32) in;
15void main() {
16    uvec3 numThreads = gl_NumWorkGroups * gl_WorkGroupSize;
17    for (uint32_t image2DIdx = 0; image2DIdx < numImage2DDescriptors; image2DIdx++) {
18        ivec2 imageDim = imageSize(image2DList[image2DIdx]);
19        uint32_t heightBy2 = imageDim.y / 2;
20        for (uint32_t row = gl_GlobalInvocationID.y; row < heightBy2; row += numThreads.y) {
21            for (uint32_t col = gl_GlobalInvocationID.x; col < imageDim.x; col += numThreads.x) {
22                ivec2 coordsA = ivec2(col, row);
23                ivec2 coordsB = ivec2(col, imageDim.y - row - 1);
24                vec4 dataA = imageLoad(image2DList[image2DIdx], coordsA);
25                vec4 dataB = imageLoad(image2DList[image2DIdx], coordsB);
26                imageStore(image2DList[image2DIdx], coordsA, dataB);
27                imageStore(image2DList[image2DIdx], coordsB, dataA);
28            }
29        }
30    }
31}