cancel
Showing results for 
Search instead for 
Did you mean: 

Archives Discussions

dutta
Adept II

OpenGL Compute shaders stops rendering

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.

0 Likes