[Mesa-users] some weird issue related to glDrawElements

Brian Paul brianp at vmware.com
Wed Sep 19 12:30:43 UTC 2018


On 09/19/2018 06:23 AM, Gianluca Natale wrote:
> Hi,
> 
> I’m new to this forum, but not to OpenGL and graphics.
> 
> I used to develop graphics (OpenGL) on Win for many years.
> 
> Recently I had to port my application to Linux, and there started many 
> graphic issues.
> 
> Specifically, I’m using a VM Linux (CentOS 6.6) on a Pc.
> 
> When I check the OpenGL implementation in my application, this is what 
> it returns:
> 
> Vendor        :     VMware, Inc.
> 
> Renderer    :     Gallium 0.4 on llvmpipe (LLVM 3.6, 256 bits)
> 
> Version       :     2.1 Mesa 11.0.7
> 
> So, yes, on that VM Linux, it is using a software emulation (correct? 
> I’ve read that LLVM is a software emulation).

Yes, llvmpipe is software rendering.  I've tested our vmware 
hardware-accelerated driver on CentOS 7.1.  I've never tried CentOS 6.6.


> 
> The issue that I’m experiencing is about using glDrawElements in 
> selection mode (glRenderMode(GL_SELECT)).
> 
> I could narrow down the issue till a very simple case, whose behavior I 
> cannot explain.
> 
> In detail, this is the sample code I’m calling:
> 
> GLfloat faceNodes[12];
> 
> faceNodes[ 0] =  0.1; faceNodes[ 1] =  0.1; faceNodes[ 2] = 0.0; // index 0
> 
> faceNodes[ 3] = -0.1; faceNodes[ 4] =  0.1; faceNodes[ 5] = 0.0; // index 1
> 
> faceNodes[ 6] = -0.1; faceNodes[ 7] = -0.1; faceNodes[ 8] = 0.0; // index 2
> 
> faceNodes[ 9] =  0.1; faceNodes[10] = -0.1; faceNodes[11] = 0.0; // index 3
> 
> glVertexPointer(3, GL_FLOAT, 0, faceNodes);
> 
> GLuint auxTriaIndices[6];
> 
> auxTriaIndices[0] = 0;
> 
> auxTriaIndices[1] = 1;
> 
> auxTriaIndices[2] = 2;
> 
> auxTriaIndices[3] = 2;
> 
> auxTriaIndices[4] = 3;
> 
> auxTriaIndices[5] = 0;
> 
> glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, auxTriaIndices);
> 
> In GL_RENDER mode this code works fine. It renders a square made by 2 
> triangles (a top-left triangle, and a bottom-right triangle which share 
> the diagonal of the square).
> 
> But when I’m in GL_SELECT mode, only the top-left triangle is picked. No 
> OpenGL hit record triggered when I move my mouse onto the bottom-right 
> triangle.
> 
> You’ve noticed that I’m using pure OpenGL 1.1 implementation, i.e. no 
> VBO. But that should not be a problem (and in fact it renders correctly).
> 
> Furthermore, I tried to swap the indices of the 2 triangles in 
> auxTriaIndices (i.e. from (0,1,2,2,3,0) to (2,3,0,0,1,2)), but it still 
> picks the top-left triangle, and not the bottom-right.
> In short, it seems to me that it works like if I called:
> glDrawArrays(GL_TRIANGLES, 0, 6);
> 
> In fact it seems to ignore the second triangle (i.e. vertices 3,4,5 in 
> the list ‘faceNode’, as nodes 4 and 5 are undefined), and only taking 
> into count the first triangle.
> 
> As a further confirmation, I tried to add 2 additional vertices to 
> ‘faceNode’. And it now selects as the second triangle the one defined by 
> the vertices 3,4,5 in the list ‘faceNode’, regardless of the indices I 
> pass to glDrawElements.
> How is that possible, as I’m using glDrawElements, in which I pass a 
> list of indices?
> 
> And also, whay should it work in GL_RENDER mode, but not in GL_SELECT mode?
> BTW, above code works fine on Win, both using direct graphic board (an 
> nVidia graphic card) or by software emulation (Microsoft GDI, which 
> means OpenGL 1.1).
> 
> Any idea what might be wrong?

It's probably a but in llvmpipe, or more likely, the state tracker.  Few 
people use selection mode and there's little test coverage of it 
(though, the OpenGL select.c conformance test passes w/ llvmpipe - I 
just tried it).


> 
> My code seems correct. Or not?

Do you have a complete program I could run/test?  Ideally GLUT-based?

-Brian


More information about the mesa-users mailing list