\$22

Image of the Day Submit

IOTD | Top Screenshots

glClear locks system

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

14 replies to this topic

#1Seabolt  Members

Posted 10 April 2011 - 05:24 PM

Hey guys, I'm reposting this since the last one didn't get many replies and I'm at my wits end.

So basically I am working on an EXTREMELY basic OpenGL program. All i want it to do is clear the screen blue going through my pipeline. Now I have my HDC and HGLRC all set up and not NULL. Glew doesn't throw any errors, Set and ChoosePixelFormat have no problems, and wglCreateContext and wglMakeCurrent both work without throwing any errors. But when the game starts calling glClear, the entire game freezes up. The message pump is still running, and if I step through it, I'm still receiving WM_PAINT messages. The system will still respond, but its really slow, like ten to forty-five seconds slow. I'm posting all relevant code

This is my window set up

// Create a window
WNDCLASSEX wcex;
wcex.cbSize			= sizeof(WNDCLASSEX);
wcex.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wcex.lpfnWndProc	= (WNDPROC)MainWndProc;
wcex.cbClsExtra		= 0;
wcex.cbWndExtra		= 0;
wcex.hInstance		= hInstance;
wcex.hIcon			= NULL;
wcex.hbrBackground	= NULL;
wcex.lpszClassName	= TEXT("Thunderclad Engine"); // Should be unique
wcex.hIconSm		= NULL;

// Select window styles
UINT unStyle,unStyleX;
unStyleX = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// Window Extended Style
unStyle = WS_OVERLAPPEDWINDOW;

// Describe our window placement
WINDOWPLACEMENT wndPlacement;
wndPlacement.length = sizeof(WINDOWPLACEMENT);
wndPlacement.ptMaxPosition.x = 0;
wndPlacement.ptMaxPosition.y = 0;
wndPlacement.ptMinPosition.x = 0;
wndPlacement.ptMinPosition.y = 0;
wndPlacement.rcNormalPosition.bottom = g_nWindowHeight;
wndPlacement.rcNormalPosition.left = 0;
wndPlacement.rcNormalPosition.top = 0;
wndPlacement.rcNormalPosition.right = g_nWindowWidth;


Here's where I create the window

// First we must register the class
assert( RegisterClassEx( in_wndClassDescription ) != 0 );

RECT windowRect;								// Grabs Rectangle Upper Left / Lower Right Values
windowRect.left=(long)0;						// Set Left Value To 0
windowRect.right=(long)in_nWindowWidth;			// Set Right Value To Requested Width
windowRect.top=(long)0;							// Set Top Value To 0
windowRect.bottom=(long)in_nWindowHeight;		// Set Bottom Value To Requested Height

// Get a pixel perfect window
AdjustWindowRectEx( &windowRect, in_unWindowStyle, FALSE, in_unWindowExStyle );

// Then we must create the window from the data provided;
out_handleWindow = CreateWindowEx( in_unWindowExStyle,
in_wndClassDescription->lpszClassName,
in_szProgramName,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | in_unWindowStyle,
0,
0,
in_nWindowWidth,
in_nWindowHeight,
NULL,
NULL,
in_handleCurrentInstance,
NULL );

assert( out_handleWindow != NULL );

// Show the window and start updating it
ShowWindow( out_handleWindow, SW_SHOW );
UpdateWindow( out_handleWindow );



Here's where I init the device


//////////////////////////////////////////////////////////////////////////
// Platform Specific Initialization (Windows)
#if USING_WINDOWS

// Store the HWND
m_handleWindowHandle = programWindow->GetWindowHandle();

// Do a NULL check if we are in Debug
ASSERT_NULL( m_handleWindowHandle );

// Get the Device Context
m_handleDeviceContext = GetDC( m_handleWindowHandle );

// Null check the DC
ASSERT_NULL( m_handleDeviceContext );

//////////////////////////////////////////////////////////////////////////
// Set the pixel format
m_tPixelFormat.nSize		= sizeof( PIXELFORMATDESCRIPTOR );	// Size of the PFD
m_tPixelFormat.nVersion		= 1;								// Set the version number
m_tPixelFormat.dwFlags		= ( PFD_DRAW_TO_WINDOW |			// Set the formats
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER );
m_tPixelFormat.iPixelType	= PFD_TYPE_RGBA;					// Set the color format
m_tPixelFormat.cColorBits	= 32;								// Set the color depth
m_tPixelFormat.cDepthBits	= 32;								// Set the depth buffer depth
m_tPixelFormat.cStencilBits = 0;								// Set the stencil buffer depth
m_tPixelFormat.iLayerType	= PFD_MAIN_PLANE;					// Set the layer for the app

// See if there is a pixel format that will match our requests
int nPixelFormat = 0;
ASSERT_FALSE( nPixelFormat = ChoosePixelFormat( m_handleDeviceContext,
&m_tPixelFormat ) );

ASSERT_FALSE( SetPixelFormat( m_handleDeviceContext,
nPixelFormat,
&m_tPixelFormat ) );
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// So far so good... Now we try to create our RenderContext (HRC)
HGLRC tempContext = wglCreateContext( m_handleDeviceContext );
ASSERT_NULL( tempContext );

// See if the tempContext will work
ASSERT_FALSE( wglMakeCurrent( m_handleDeviceContext, tempContext ) );

GLenum error = glewInit();
if( error != GLEW_OK )
{
fprintf(stderr, "Error: %s\n", glewGetErrorString(error));
}

if( wglewIsSupported( "WGL_ARB_create_context" ) == 1 )
{
// Define our attributes for using OpenGL 3.0 and forward
int attribs[] = {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,//we want a 3.0 context
WGL_CONTEXT_MINOR_VERSION_ARB, 0,
//and it shall be forward compatible so that we can only use up to date functionality
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
0}; //zero indicates the end of the array

m_handleGLRenderContext = wglCreateContextAttribsARB( m_handleDeviceContext, 0, attribs );
ASSERT_NULL( m_handleGLRenderContext );
ASSERT_FALSE( wglMakeCurrent( NULL, NULL ) );
ASSERT_FALSE( wglDeleteContext( tempContext ) );
ASSERT_FALSE( wglMakeCurrent( m_handleDeviceContext, m_handleGLRenderContext ) );
}
else
{
m_handleGLRenderContext = tempContext;
}
//////////////////////////////////////////////////////////////////////////
#endif

Resize( programWindow->GetWindowWidth(), programWindow->GetWindowHeight() )


Here's where I init the renderer


glEnable(GL_DEPTH_TEST);						// Enable depth testing
glDepthFunc( GL_LEQUAL );						// Reject anything less than or equal to the current depth
glClearDepth( 1.0f );							// We clear to full depth
glClearStencil( 0 );							// We clear the stencil buffer to false
glCullFace(GL_FRONT);							// Enable culling
glClearColor(0.5f, 0.5f, 1.0f, 1.0f);			// The color to clear the background to


And lastly here's my WndProc

switch( unMessage )
{
case WM_SIZE:
// Resize the window
CDeviceManager::GetInstance()->Resize( LOWORD( lParam ),
HIWORD( lParam ) );
break;
case WM_PAINT:
if( CGame::GetInstance()->IsGameActive() )
{
CGame::GetInstance()->Render();
}
break;
case WM_CLOSE:
// Free up resources if the red x is pressed
CGame::GetInstance()->Destroy();
CDeviceManager::GetInstance()->Destroy();
g_cWindow.Destroy();

break;
default:
return DefWindowProc( handleWindow,
unMessage,
wParam,
lParam );


Please guys, I'm at my wits end on this.

Also if I press close, when it registers about minute later, I do see the clear color for just a second :/

Perception is when one imagination clashes with another

#2harveypekar  Members

Posted 10 April 2011 - 05:37 PM

Run it through gDEBuggegr (free). Does it give you any warnings/errors?

#3Seabolt  Members

Posted 10 April 2011 - 06:05 PM

I didn't get any warnings or errors, though my FPS was 4.8... :/ How is that possible?
Perception is when one imagination clashes with another

#4GothSeiDank  Members

Posted 10 April 2011 - 06:13 PM

Hmm, do you require any specific Version of OpenGL?
But SFML or SDL or even GLUT might give you a better start into the OpenGL World. If you need to use a specific Version Context, you can download SFML 2, which let's you choose one. If not, download SFML 1.6. It is extreme easy to use OpenGL with SFML and you don't have to manage all this Windows Stuff.
It also makes your code platform independent to a certain degree.

Besides that:

An application returns zero if it processes this message.

You must return zero if you handle WM_PAINT.
http://msdn.microsof...v=vs.85%29.aspx

That's what I meant with the Windows Stuff .

edit:
SFML Window:

// Earlier in the class-definition:
sf::RenderWindow* m_window;

sf::ContextSettings context;
context.AntialiasingLevel = m_settings.fsaa;
context.DepthBits     	= m_settings.bpp;
context.MajorVersion  	= 3;
context.MinorVersion  	= 3;
context.StencilBits   	= 24;

m_window = new sf::RenderWindow(sf::VideoMode(static_cast<unsigned int>(m_settings.width), static_cast<unsigned int>(m_settings.height),
m_settings.bpp), m_settings.caption, flags, context);


If you say "pls", because it is shorter than "please", I will say "no", because it is shorter than "yes"
http://nightlight2d.de/

#5Seabolt  Members

Posted 10 April 2011 - 06:20 PM

@NicoG

I don't require any specific version or anything like that, this is mostly just educational. I just got a job where we use OpenGL for rendering and I've been a DirectX guy for awhile now, so I'm trying to get more intimate with OpenGL So I want to try and implement this without using someone else's code, though it seems almost impossible to avoid using GLUT and GLEW... :/

But thanks for that info! It didn't fix anything, but still, thanks!

Perception is when one imagination clashes with another

#6GothSeiDank  Members

Posted 10 April 2011 - 06:29 PM

Why do you want to avoid GLew?
Do you really want to write a hundred lines of Codes with wglGetProcAdress?
GLew is a fine lib and I don't want to live without it anymore as an OpenGL Programmer. Trust me.

Just download SFML 2 and create the Context as I showed you. If you want to have a 3.x Core Profile, so older Functions don't work do this:
Go to WglContext.cpp and go to line 252:
Change the Attributes to this:
        	int attributes[] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, mySettings.MajorVersion,
WGL_CONTEXT_MINOR_VERSION_ARB, mySettings.MinorVersion,
0, 0
};


That's a bit dirty hack and you need to comment out some other deprecated functions (fixed functions like glMatrixMode) inside SFML 2, but then it works. They don't support core profiles yet though.
For me, it works .

But you could also just use GLUT, which is a fine Tool for quick programming.

So I want to try and implement this without using someone else's code, though it seems almost impossible to avoid using GLUT and GLEW... :/

Yeah, but such thing as a window, is really no task to make a drama of. ^^ Be productive and don't reinvent the Wheel.
If you say "pls", because it is shorter than "please", I will say "no", because it is shorter than "yes"
http://nightlight2d.de/

#7Seabolt  Members

Posted 10 April 2011 - 06:38 PM

Haha I understand what you mean by not reinventing the wheel, and of course I don't want to write a hundred lines of code to do what GLEW does, but that doesn't mean I don't want to learn what I can do or how these things work. I'm not doing this to be productive or to get a studio up and off the ground, I'm doing this to learn something new. if I use something like SFML, yes I can have things working faster, but I defeat the whole point of me tackling this thing in the first place. I'm only asking for help here because it seems like everything is saying its ok but the program is far from. I'm not trying to be disrespectful, but this is just what I'm trying to accomplish
Perception is when one imagination clashes with another

#8GothSeiDank  Members

Posted 10 April 2011 - 06:40 PM

Did you have a look here?:
http://www.opengl.or..._OpenGL_Context
If you say "pls", because it is shorter than "please", I will say "no", because it is shorter than "yes"
http://nightlight2d.de/

#9Seabolt  Members

Posted 10 April 2011 - 07:07 PM

I've seen tons like that, but that one has some new info in it. I never heard that I had to delete my window and re create it when using the dummy context. Thanks

Perception is when one imagination clashes with another

#10Seabolt  Members

Posted 10 April 2011 - 07:46 PM

Redid my init to match their specs and I still have the same problem. Sigh.
Perception is when one imagination clashes with another

#11Seabolt  Members

Posted 10 April 2011 - 08:00 PM

Fixed it by adding glFlush after I swap buffers. Anyone have any idea why that works?
Perception is when one imagination clashes with another

#12haegarr  Members

Posted 11 April 2011 - 01:20 AM

The only explanation I have is this one:

Render commands that are send to OpenGL are not executed immediately but enqueued and executed later. When you send a command that will alter a resource that is still locked by a previous command, then blocking will occur. Perhaps the current backbuffer is such a resource w.r.t. glClear. Now, glFlush instructs OpenGL to execute all pending commands as quick as possible. Therefore it is meaningful to send a glFlush (but not a glFinish in this case) before swapping buffers.

However, even without glFlush I would expect OpenGL to do its job, even if perhaps not at as performant as possible.

#13Seabolt  Members

Posted 11 April 2011 - 07:43 PM

Right, and that's why I'm trying to eliminate the glFlush() call.

What do you mean by w.r.t glClear() though?

Sorry I've never heard that acronym.

I do believe that somewhere the call is being blocked because when I run the program through glDEBugger I get some where in the tens of thousands of calls to the context in a frame, when all I call is two gl functions. Something is up there, I just can't seem to figure out what is eating all of those calls.

Perception is when one imagination clashes with another

Posted 12 April 2011 - 10:39 AM

WHere is your winMain that translates messages? I could give you a more basic gl framework for you to use.

And I never render on WM_PAINT, I always render.

#15Seabolt  Members

Posted 12 April 2011 - 09:26 PM


// Start the message loop
MSG msg;
while( CGame::GetInstance()->IsGameActive() )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
if( msg.message == WM_QUIT )
{
break;
}

TranslateMessage( &msg );
DispatchMessage( &msg );
}
else if( CGame::GetInstance()->IsGameActive() )
{
CGame::GetInstance()->Update();
CGame::GetInstance()->Render();
}
}



Perception is when one imagination clashes with another

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.