int main(int argc, char const * argv[])
{
GLuint cs = glCreateShader(GL_COMPUTE_SHADER);
GLchar const * css[] = {
"#version 430 core\n"
"\n"
"layout(local_size_x=16, local_size_y=16) in;\n"
"\n"
"uniform usampler2D tex;\n"
"layout(binding = 0) buffer Output {\n"
" uint output[16][16];\n"
"};\n"
"\n"
"void main()\n"
"{\n"
" uint x = gl_LocalInvocationID.x;\n"
" uint y = gl_LocalInvocationID.y;\n"
" output[y][x] = texelFetch(tex, ivec2(x, y), 0).x;\n"
"}\n"
};
glShaderSource(cs, PDK_ARRAY_SIZE(css), css, 0);
glCompileShader(cs);
GLuint pgm = glCreateProgram();
glAttachShader(pgm, cs);
glLinkProgram(pgm);
glUseProgram(pgm);
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, 16, 16);
GLuint texels[16][16] = { 0 };
for (int height = 0; height < 16; ++height) {
for (int width = 0; width < 16; ++width) {
texels[height][width] = width + height * 16;
}
}
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 16, 16, GL_RED_INTEGER, GL_UNSIGNED_INT, texels);
GLuint ssbo;
glGenBuffers(1, &ssbo);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
GLuint output[16][16] = { 0 };
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof output, output, GL_STREAM_DRAW);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo);
glDispatchCompute(1, 1, 1);
glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof output, output);
if (memcmp(output, texels, sizeof output)) {
printf("ERROR: texture read failed\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}