AnsweredAssumed Answered

OpenGL Compute shaders stops rendering

Question asked by dutta on Jun 19, 2013

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.

Outcomes