This seems a bit odd, but when I upgraded to the 13.4 driver to be able to utilize compute shaders, I noticed a weird thing. The following code will perform the computation as it should, however the rendering that comes after doesn't.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
...
// enable compute shader program and set variables
...
glDispatchCompute(1, 1, 1);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
...
// enable vertex-tessellation-geometry shader and set variables
// bind buffers
...
glDrawElements(GL_PATCHES, 36, GL_UNSIGNED_INT, (GLvoid*)0);
SwapBuffers(this->hdc);
|
|
If I decide to put the glClear after I run glDispatchCompute, the rending and computation works fine. Also, If I completely remove the glDispatchCompute, the rendering also works fine, which must mean that no state switch, texture bind or the like is what's causing the problem. I know that the computation is running even though the rendering isn't, since the compute shader updates a texture which the rendering uses, so I can see that the texture is being updated (which is just what the compute shader is doing).
I'm using an HD5970, on Windows 7 with Catalyst version 13.4.
Thanks in advance.
Edit: Just got myself a new rig with a brand new HD7970 and the bug is there for this model aswell. There is a slight difference however, since if I call glFinish() after my glDispatchCompute(), everything works just fine. The glMemoryBarrier() however doesn't seem to do its thing properly. I think this might be the same thing which caused yours3lf's graphics card driver to crash. So just for clarification:
This works:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDispatchCompute(512/16,512/16, 1);
glFinish(); // glFlush() has the same effect
glBindBuffer(GL_ARRAY_BUFFER, this->cubeVBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->cubeIBuffer);
glDrawElements(GL_PATCHES, 36, GL_UNSIGNED_INT, (GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
And this works too:
glDispatchCompute(512/16,512/16, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, this->cubeVBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->cubeIBuffer);
glDrawElements(GL_PATCHES, 36, GL_UNSIGNED_INT, (GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
But this doesn't:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDispatchCompute(512/16,512/16, 1);
glMemoryBarrier(GL_ALL_BARRIER_BITS);
glBindBuffer(GL_ARRAY_BUFFER, this->cubeVBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->cubeIBuffer);
glDrawElements(GL_PATCHES, 36, GL_UNSIGNED_INT, (GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
So it looks like I've either misunderstood the meaning of glMemoryBarrier(), or glMemoryBarrier() doesn't behave as expected.