Jump to content
  • Advertisement
Sign in to follow this  
Geometrian

OpenGL OpenGL Errors

This topic is 3050 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I use PyOpenGL. Recently, it seems to not be reporting OpenGL errors. I created the brief following test file, which doesn't throw errors for me, but does for everybody else:
import OpenGL, logging
logging.basicConfig()
OpenGL.ERROR_CHECKING = True
OpenGL.ERROR_LOGGING = True
##OpenGL.FULL_LOGGING = True
OpenGL.ERROR_ON_COPY = True
from OpenGL.GL import *
from OpenGL.GLU import *
import sys,os
import pygame
from pygame.locals import *
pygame.init()

Screen = (800,600)
pygame.display.set_mode(Screen,OPENGL|DOUBLEBUF)
    
def quit(): pygame.quit(); sys.exit()

def GetInput():
    for event in pygame.event.get():
        if event.type == QUIT: quit()
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE: quit()
def Draw():
    glLoadIdentity()

    glViewport(0,0,-800,-600)

##    glBegin(GL_QUADS)
##    glClear(GL_DEPTH_BUFFER_BIT)
##    glEnd()
    
    pygame.display.flip()
def main():
    Clock = pygame.time.Clock()
    while True:
        GetInput()
        Draw()
        Clock.tick(60)
##        Clock.tick()
##        print "fps: %f" % round(Clock.get_fps(),2)
if __name__ == '__main__': main()
Just to make sure that the error really was in PyOpenGL, I created the following C++ OpenGL application from a basic example, found here: (adding a check error and a glViewport(0,0,-800,-600) statement:
//
// GLSAMPLE.CPP
//  by Blaine Hodge
//

// Includes

#include <windows.h>
#include <gl/gl.h>

// Function Declarations

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);

// WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
				   LPSTR lpCmdLine, int iCmdShow)
{
	WNDCLASS wc;
	HWND hWnd;
	HDC hDC;
	HGLRC hRC;
	MSG msg;
	BOOL quit = FALSE;
	float theta = 0.0f;
	
	// register window class
	wc.style = CS_OWNDC;
	wc.lpfnWndProc = WndProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	wc.hCursor = LoadCursor( NULL, IDC_ARROW );
	wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
	wc.lpszMenuName = NULL;
	wc.lpszClassName = "GLSample";
	RegisterClass( &wc );
	
	// create main window
	hWnd = CreateWindow( 
		"GLSample", "OpenGL Sample", 
		WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
		0, 0, 256, 256,
		NULL, NULL, hInstance, NULL );
	
	// enable OpenGL for the window
	EnableOpenGL( hWnd, &hDC, &hRC );
	
	// program main loop
	while ( !quit )
	{
		
		// check for messages
		if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )  )
		{
			
			// handle or dispatch messages
			if ( msg.message == WM_QUIT ) 
			{
				quit = TRUE;
			} 
			else 
			{
				TranslateMessage( &msg );
				DispatchMessage( &msg );
			}
			
		} 
		else 
		{
			
			// OpenGL animation code goes here
			
			glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
			glClear( GL_COLOR_BUFFER_BIT );
			glViewport(0,0,-800,-600);
			GLenum output = glGetError();
			
			glPushMatrix();
			glRotatef( theta, 0.0f, 0.0f, 1.0f );
			glBegin( GL_TRIANGLES );
			glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );
			glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
			glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );
			glEnd();
			glPopMatrix();
			
			SwapBuffers( hDC );
			
			theta += 1.0f;
			
		}
		
	}
	
	// shutdown OpenGL
	DisableOpenGL( hWnd, hDC, hRC );
	
	// destroy the window explicitly
	DestroyWindow( hWnd );
	
	return msg.wParam;
	
}

// Window Procedure

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	
	switch (message)
	{
		
	case WM_CREATE:
		return 0;
		
	case WM_CLOSE:
		PostQuitMessage( 0 );
		return 0;
		
	case WM_DESTROY:
		return 0;
		
	case WM_KEYDOWN:
		switch ( wParam )
		{
			
		case VK_ESCAPE:
			PostQuitMessage(0);
			return 0;
			
		}
		return 0;
	
	default:
		return DefWindowProc( hWnd, message, wParam, lParam );
			
	}
	
}

// Enable OpenGL

void EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC)
{
	PIXELFORMATDESCRIPTOR pfd;
	int format;
	
	// get the device context (DC)
	*hDC = GetDC( hWnd );
	
	// set the pixel format for the DC
	ZeroMemory( &pfd, sizeof( pfd ) );
	pfd.nSize = sizeof( pfd );
	pfd.nVersion = 1;
	pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
	pfd.iPixelType = PFD_TYPE_RGBA;
	pfd.cColorBits = 24;
	pfd.cDepthBits = 16;
	pfd.iLayerType = PFD_MAIN_PLANE;
	format = ChoosePixelFormat( *hDC, &pfd );
	SetPixelFormat( *hDC, format, &pfd );
	
	// create and enable the render context (RC)
	*hRC = wglCreateContext( *hDC );
	wglMakeCurrent( *hDC, *hRC );
	
}

// Disable OpenGL

void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)
{
	wglMakeCurrent( NULL, NULL );
	wglDeleteContext( hRC );
	ReleaseDC( hWnd, hDC );
}
Using a simple breakpoint to check "output" returns the number 1244832 the first time it's called and then 0's on subsequent frames. I'm very unfamiliar with OpenGL in C/C++ environments, but I'm fairly certain these results mean OpenGL's error checking is not working. I'm not sure why this would be. My best guess would be that I somehow have disabled my card's OpenGL error reporting. I seem to remember an option for it somewhere in my card's control panel--but I cannot seem to find it. Of course, I could be going in the completely wrong direction, in which case, I hope you can enlighten me. Ideas/help/comments? Thanks a lot, -Geometrian

Share this post


Link to post
Share on other sites
Advertisement
That sounds very bizarre. I've never heard of being able to disable error reporting on a gpu, but I don't know for sure if that is possible or not.

Not sure I can explain your error code, I've never seen a code like that. Typical GL error codes I think are around ~1280, never seen anything that is 7 digits.

My only idea is to maybe try to pass your error code to gluErrorString? That might give more information:


const GLubyte* gluErrorString(GLenum errorCode);

"-Returns a pointer to a descriptive string that corresponds to the OpenGL or GLU error number passed in errorCode."

Wish I had a better explanation.

Share this post


Link to post
Share on other sites
I think the 7-digit think may have been just a debugging fluke. I tried:

const GLubyte *output1 = gluErrorString(glGetError());
glViewport(0,0,-800,-600);
const GLubyte *output2 = gluErrorString(glGetError());

On the first frame, both output1 and output2 are weird strings of apparently random characters. On the second and subsequent frames, each return a no error.

Hmmmmmm . . .

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!