Sign in to follow this  
Prune

OpenGL Primitive restart vs multi-draw calls?

Recommended Posts

Is primitive restart faster than glMultiDraw{Elements|Arrays|ArraysBaseVertex}? I assume the multi-draw calls loop in the driver. However, I read this in the 3.3 spec: "Because client enable/disable no longer exists in OpenGL 3.1, the PRIMITIVE RESTART state has become server state, unlike the Nvidia extension where it is client state." Does server state indicate this is completely handled by the GPU? Thus there won't be multiple synchronization points and it's really a single call by the driver? BTW, I've been unable to get the multidraw to work right with element buffers. I thought that, as with glDrawElements, the indices are treated as offsets if an element buffer object is used. Thus, if I have a VBO with cube vertices, and and element buffer bound, then glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, 0); should give me the same result as GLsizei counts[] = {4, 4, 4, 4, 4, 4}; GLuint offsets[] = {0, 4, 8, 12, 16, 20}; glMultiDrawElements(GL_QUADS, counts, GL_UNSIGNED_INT, (const GLvoid **)offsets, 6); However, I get nonsense rendering from the latter. How do I get it to work with VBOs? (or I might not bother if restart primitive is faster) [Edited by - Prune on April 26, 2010 4:09:12 PM]

Share this post


Link to post
Share on other sites
So hasn't anyone used both methods, or have some idea whether either one is CPU-based by the driver, or actually happens on the GPU? I need the fastest way to draw multiple meshes.

Share this post


Link to post
Share on other sites
Personally no I have not used these methods, but are you sure that this is worth worrying about? Unless you're sure that OpenGL api calls are your bottleneck (which I guess is pretty unlikely). And even if it was, I don't think there's too much you can do about it.

Also why do you think you need to use Primitive Restarts? Unless you are using triangle strips (which I think aren't even in favor that much anymore), I wouldn't think Primitive Restart would be of any use to you. If you're just using glQuads, you can just put all of your quads in a list, so I don't understand where you think you need primitive restarts. (Maybe I am wrong though).

This just sounds like a non-issue to me, which is probably why you're not getting much response, because nobody else is worrying about it.

Hope that helps.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this