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}