Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


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.

  • You cannot reply to this topic
14 replies to this topic

#1 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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.hCursor		= (HCURSOR)LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= NULL; 
	wcex.lpszMenuName	= 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

Sponsor:

#2 harveypekar   Members   -  Reputation: 218

Like
0Likes
Like

Posted 10 April 2011 - 05:37 PM

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

#3 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#4 GothSeiDank   Members   -  Reputation: 156

Like
0Likes
Like

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/

#5 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#6 GothSeiDank   Members   -  Reputation: 156

Like
0Likes
Like

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,
            	WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
            	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/

#7 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#8 GothSeiDank   Members   -  Reputation: 156

Like
0Likes
Like

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/

#9 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#10 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#11 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#12 haegarr   Crossbones+   -  Reputation: 5384

Like
1Likes
Like

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.

#13 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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

#14 dpadam450   Members   -  Reputation: 1193

Like
0Likes
Like

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.

#15 Seabolt   Members   -  Reputation: 751

Like
0Likes
Like

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.



PARTNERS