[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