Shader:
#version 430
layout(local_size_x=128) in;
layout(r32f, location = 0) uniform imageBuffer data;
shared float local[256];
void main() {
int N = imageSize(data);
int index = int(gl_GlobalInvocationID);
int localindex = int(gl_LocalInvocationIndex);
local[localindex] = localindex;
local[localindex+128] = localindex+128;
groupMemoryBarrier();
imageStore(data, index, vec4(local[localindex]));
imageStore(data, index+128, vec4(local[localindex+128]));
}
code:
std::vector<float> data(256);
std::fill(data.begin(), data.end(), -1.0f);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_TEXTURE_BUFFER, buffer);
glBufferData(GL_TEXTURE_BUFFER, sizeof(float)*data.size(), 0, GL_STATIC_DRAW);
GLuint buffer_texture;
glGenTextures(1, &buffer_texture);
glBindTexture(GL_TEXTURE_BUFFER, buffer_texture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, buffer);
glBindImageTexture(0, buffer_texture, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32F);
glUseProgram(test_program);
glUniform1i(0, 0);
glDispatchCompute(1, 1, 1);
glGetBufferSubData(GL_TEXTURE_BUFFER, 0, sizeof(float)*data.size(), &data[0]);
for(size_t i = 0;i<data.size();i+=1)
{
if(i%16==0) std::cout << std::endl;
std::cout << std::setw(4) << data[i] << ' ';
}
std::cout << std::endl;
U2hhZGVyOgogICAgICAgICN2ZXJzaW9uIDQzMAogICAgICAgIGxheW91dChsb2NhbF9zaXplX3g9MTI4KSBpbjsKICAgICAgICAKICAgICAgICBsYXlvdXQocjMyZiwgbG9jYXRpb24gPSAwKSB1bmlmb3JtIGltYWdlQnVmZmVyIGRhdGE7CiAgICAgICAgCiAgICAgICAgc2hhcmVkIGZsb2F0IGxvY2FsWzI1Nl07CiAgICAgICAgdm9pZCBtYWluKCkgewogICAgICAgICAgIGludCBOID0gaW1hZ2VTaXplKGRhdGEpOwogICAgICAgICAgIGludCBpbmRleCA9IGludChnbF9HbG9iYWxJbnZvY2F0aW9uSUQpOwogICAgICAgICAgIGludCBsb2NhbGluZGV4ID0gaW50KGdsX0xvY2FsSW52b2NhdGlvbkluZGV4KTsKCiAgICAgICAgICAgbG9jYWxbbG9jYWxpbmRleF0gPSBsb2NhbGluZGV4OwogICAgICAgICAgIGxvY2FsW2xvY2FsaW5kZXgrMTI4XSA9IGxvY2FsaW5kZXgrMTI4OwoKICAgICAgICAgICBncm91cE1lbW9yeUJhcnJpZXIoKTsKICAgICAgICAgICBpbWFnZVN0b3JlKGRhdGEsIGluZGV4LCB2ZWM0KGxvY2FsW2xvY2FsaW5kZXhdKSk7CiAgICAgICAgICAgaW1hZ2VTdG9yZShkYXRhLCBpbmRleCsxMjgsIHZlYzQobG9jYWxbbG9jYWxpbmRleCsxMjhdKSk7CiAgICAgICAgfQoKY29kZToKCiAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZGF0YSgyNTYpOwogICAgc3RkOjpmaWxsKGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgLTEuMGYpOwoKICAgIEdMdWludCBidWZmZXI7CiAgICAKICAgIGdsR2VuQnVmZmVycygxLCAmYnVmZmVyKTsKICAgIGdsQmluZEJ1ZmZlcihHTF9URVhUVVJFX0JVRkZFUiwgYnVmZmVyKTsKICAgIGdsQnVmZmVyRGF0YShHTF9URVhUVVJFX0JVRkZFUiwgc2l6ZW9mKGZsb2F0KSpkYXRhLnNpemUoKSwgMCwgR0xfU1RBVElDX0RSQVcpOyAgICAgICAgICAgICAgICAgIAoKICAgIEdMdWludCBidWZmZXJfdGV4dHVyZTsKICAgIAogICAgZ2xHZW5UZXh0dXJlcygxLCAmYnVmZmVyX3RleHR1cmUpOwogICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0JVRkZFUiwgYnVmZmVyX3RleHR1cmUpOwogICAgZ2xUZXhCdWZmZXIoR0xfVEVYVFVSRV9CVUZGRVIsIEdMX1IzMkYsIGJ1ZmZlcik7CgogICAgZ2xCaW5kSW1hZ2VUZXh0dXJlKDAsIGJ1ZmZlcl90ZXh0dXJlLCAwLCBHTF9GQUxTRSwgMCwgR0xfUkVBRF9XUklURSwgR0xfUjMyRik7CiAgICAKICAgIGdsVXNlUHJvZ3JhbSh0ZXN0X3Byb2dyYW0pOwogICAgZ2xVbmlmb3JtMWkoMCwgMCk7CgogICAgZ2xEaXNwYXRjaENvbXB1dGUoMSwgMSwgMSk7CiAgICAKICAgIGdsR2V0QnVmZmVyU3ViRGF0YShHTF9URVhUVVJFX0JVRkZFUiwgMCwgc2l6ZW9mKGZsb2F0KSpkYXRhLnNpemUoKSwgJmRhdGFbMF0pOwogICAgCiAgICBmb3Ioc2l6ZV90IGkgPSAwO2k8ZGF0YS5zaXplKCk7aSs9MSkKICAgIHsKICAgICAgICBpZihpJTE2PT0wKSBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OnNldHcoNCkgPDwgZGF0YVtpXSA8PCAnICc7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOw==