Details

[Home]

Issue of the Implementation # D0092

Brief

Invocation of the interfaces glLighti, glLightf, glLightiv, glLightfv between glBegin and glEnd does not generate GL_INVALID_OPERATION error

Detailed Description

The standard states: "GL_INVALID_OPERATION is generated if glLight is executed between the execution of glBegin and the corresponding execution of glEnd.", but invocation of the interface glLighti, glLightf, glLightiv, glLightfv between glBegin and glEnd does not generate GL_INVALID_OPERATION error.

Problem location(s) in the standard

Linux Standard Base Desktop Specification 3.2, Chapter 7. Libraries, 7.1.2.1 Interfaces for OpenGL that refers OpenGL-1.2.1 (see also http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml)

Example

#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>

typedef struct _TGLWindow
{
    Display *dpy;
    GLXContext cx;
    XVisualInfo *vi;
    Window win;
    GLXWindow  glxWin;
    GLXFBConfig *fbConfigs;
    int width;
    int height;
} TGLWindow;

static int tSingleBuffer_1_2[] = {GLX_RGBA,
                                    GLX_RED_SIZE,       1,
                                    GLX_GREEN_SIZE,     1,
                                    GLX_BLUE_SIZE,      1,
                                    None};
static int tDoubleBuffer_1_2[] = {GLX_RGBA,
                                    GLX_DOUBLEBUFFER,
                                    GLX_RED_SIZE,       1,
                                    GLX_GREEN_SIZE,     1,
                                    GLX_BLUE_SIZE,      1,
                                    None};


static Bool WaitForNotify(Display *d, XEvent *e, char *arg) {
    if (e->type == CreateNotify)
    {
        printf("Window was successfully created.");
    }
    return (e->type == MapNotify) && (e->xmap.window == (Window)arg);
}
TGLWindow tWnd;

int main() {
    int errBase = 0;
    int evtBase = 0;
    tWnd.dpy = NULL;
    tWnd.vi = NULL;
    tWnd.fbConfigs = NULL;
    tWnd.cx = 0;
    tWnd.height = 600;
    tWnd.width = 800;
    
    /* get a connection */
    tWnd.dpy = XOpenDisplay(0);

    if (!tWnd.dpy)
    {
        printf ("XOpenDisplay () returned NULL.");
        return -1;
    }
    if (glXQueryExtension(tWnd.dpy, &errBase, &evtBase) == GL_FALSE)
    {
        printf("The GLX extension is not supported by the server.");
        printf("error base is %d, event base is %d.", errBase, evtBase);
        return -1;
    }

    Colormap cmap;
    XSetWindowAttributes swa;
    XEvent event;
    int *attrList = tSingleBuffer_1_2;
    tWnd.vi = glXChooseVisual(tWnd.dpy, DefaultScreen(tWnd.dpy), attrList);
    if (tWnd.vi == NULL)
    {
        printf("glXChooseVisual() returned NULL");
        return -1;
    }

    /* create a GLX context */
    tWnd.cx = glXCreateContext(tWnd.dpy, tWnd.vi, 0, GL_TRUE);

    /* create a color map */
    cmap = XCreateColormap(tWnd.dpy, RootWindow(tWnd.dpy, tWnd.vi->screen),
                tWnd.vi->visual, AllocNone);

    /* create a window */
    swa.colormap = cmap;
    swa.border_pixel = 0;
    swa.event_mask = StructureNotifyMask;
    tWnd.win = XCreateWindow(tWnd.dpy, RootWindow(tWnd.dpy, tWnd.vi->screen), 0,
                          0, tWnd.width, tWnd.height,
                          0, tWnd.vi->depth, InputOutput,tWnd.vi->visual,
                          CWBorderPixel|CWColormap|CWEventMask,
                          &swa);
    XMapWindow(tWnd.dpy, tWnd.win);
    XIfEvent(tWnd.dpy, &event, WaitForNotify, (char*)tWnd.win);

    /* connect the context to the window */
    glXMakeCurrent(tWnd.dpy, tWnd.win, tWnd.cx);
    
    
    glBegin (GL_TRIANGLES);
    
    glLighti (GL_LIGHT0, GL_SPOT_EXPONENT, 10);
    
    glEnd ();
    
    GLenum err = glGetError ();
    
    if (err != GL_INVALID_OPERATION)
    {
        printf ("GL_INVALID_OPERATION(%d) error was not generated, "
            "glGetError() returned %d.", GL_INVALID_OPERATION, err);
    }
    else
    {
        printf ("GL_INVALID_OPERATION was generated, the interface works "
            "correctly.");
    }

    return 1;
}

Component

Mesa 6.4

Accepted

Mesa Bugzilla – Bug 17408

Status

Fixed in Mesa 7.2

[Home]