Jump to content

  • Log In with Google      Sign In   
  • Create Account

Tocs

Member Since 22 Apr 2005
Offline Last Active Oct 18 2014 09:27 PM

Posts I've Made

In Topic: Creating an OpenGL context on Windows with Glew.

27 June 2014 - 05:46 PM

The wiki says "A forward compatible context must fully remove deprecated features in the version that it returns; you should never actually use this." It's actually bolded on wiki so I took it at face value. Perhaps the wiki is overzealous. It seems like it would be a good idea to not include deprecated features, however I suppose if somewhere down the line features I'm using became deprecated and I asked for the latest context without deprecated features I would suddenly break my program. That seems like a far out case though.

Interestingly enough if I set major to 1 and minor to 0. I get a 3.3 context. I tried updating the drivers, same results.


In Topic: Creating an OpenGL context on Windows with Glew.

26 June 2014 - 05:11 PM

Interesting thought. Alas, 4.3 fails as well.

 

Here's where the code's at now.


void DisplayWindowsError()
{
	LPVOID lpMsgBuf;
	DWORD dw = GetLastError();

	FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |
		FORMAT_MESSAGE_FROM_SYSTEM |
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		dw,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR)&lpMsgBuf,
		0, NULL);

	if (lpMsgBuf)
	{
		std::cout << "Windows Error:" << dw << ": " << (char *)lpMsgBuf << std::endl;
		LocalFree(lpMsgBuf);
	}
	else
	{
		std::cout << "Windows Error:" << dw << ": unknown " << std::hex << dw <<  std::endl;
	}
}

GraphicsContext::GraphicsContext(ContextTarget &target)
	: Target (target)
{
	PIXELFORMATDESCRIPTOR pfd =			// pfd Tells Windows How We Want Things To Be
	{
		sizeof(PIXELFORMATDESCRIPTOR),	// Size Of This Pixel Format Descriptor
		1,								// Version Number
		PFD_DRAW_TO_WINDOW |			// Format Must Support Window
		PFD_SUPPORT_OPENGL |			// Format Must Support OpenGL
		PFD_DOUBLEBUFFER,				// Must Support Double Buffering
		PFD_TYPE_RGBA,					// Request An RGBA Format
		32,								// Select Our Color Depth
		0, 0, 0, 0, 0, 0,				// Color Bits Ignored
		0,								// No Alpha Buffer
		0,								// Shift Bit Ignored
		0,								// No Accumulation Buffer
		0, 0, 0, 0,						// Accumulation Bits Ignored
		24,								// 32Bit Z-Buffer (Depth Buffer)
		8,								// No Stencil Buffer
		0,								// No Auxiliary Buffer
		PFD_MAIN_PLANE,					// Main Drawing Layer
		0,								// Reserved
		0, 0, 0								// Layer Masks Ignored
	};
	PixelFormat = 1;
	if (!(PixelFormat = ChoosePixelFormat (target.GetHDC (), &pfd)))
	{
		DisplayWindowsError();
		cout << "Failed to choose pixel format." << endl;
	}

	if (!SetPixelFormat(target.GetHDC(),PixelFormat, &pfd))
	{
		//DestroyGameWindow (); //Insert Error
		DisplayWindowsError();
		cout << "Failed to set pixel format." << endl;
	}

	HGLRC temp;
	temp = wglCreateContext(target.GetHDC());
	if (!temp)
	{
		//DestroyGameWindow (); //Insert Error
		cout << "Failed to create context" << endl;
		
	}
	DisplayWindowsError();
	if (!wglMakeCurrent(target.GetHDC (), temp))
	{
		//DestroyGameWindow (); 
		cout << "Failed to make current." << endl;
		GLErrorCheck();
	}
	DisplayWindowsError();

	GLenum err = glewInit();

	if (err != GLEW_OK)
	{
		char *error = (char *)glewGetErrorString(err);
		cout << "GLEW INIT FAIL: " << error << endl;
	}

	int contextattribs [] = 
	{
		WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
		WGL_CONTEXT_MINOR_VERSION_ARB, 3,
		WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
#ifdef _DEBUG
		WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB,
#endif
		0
	};

	int pfattribs[] =
	{
		WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
		WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
		WGL_DOUBLE_BUFFER_ARB, GL_TRUE,
		WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
		WGL_COLOR_BITS_ARB, 32,
		WGL_DEPTH_BITS_ARB, 24,
		WGL_STENCIL_BITS_ARB, 8,
		//WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
		0
	};

	if (wglewIsSupported ("WGL_ARB_create_context") == 1)
	{
		unsigned int formatcount;

		if (!wglChoosePixelFormatARB(target.GetHDC(), pfattribs, nullptr, 1, (int *)&PixelFormat, &formatcount))
		{
			std::cout << "Failed to find a matching pixel format" << std::endl;
			DisplayWindowsError();
		}

		if (!SetPixelFormat(target.GetHDC(), PixelFormat, &pfd))
		{
			DisplayWindowsError();
			std::cout << "Failed to set pixelformat" << std::endl;
		}


		hRC = wglCreateContextAttribsARB(Target.GetHDC(), nullptr, contextattribs);
		if (!hRC)
		{
			DisplayWindowsError();
			std::cout << "Failed to create context." << std::endl;
		}
		wglMakeCurrent(nullptr, nullptr);
		DisplayWindowsError();
		wglDeleteContext(temp);
		DisplayWindowsError();
		GLErrorCheck();
		MakeCurrent ();
		
	}
	else
	{
		cout << "Failed to create context again..." << endl;
	}

#ifdef _DEBUG
	glEnable(GL_DEBUG_OUTPUT);
	glDebugMessageCallback(dbgcallback, nullptr);
#endif


	char *shadeversion = (char *)glGetString (GL_SHADING_LANGUAGE_VERSION);
	//GLErrorCheck;
	char *version = (char *)glGetString(GL_VERSION);
	//GLErrorCheck;
	std::cout << "Version: " << version << std::endl << "Shading Version: " << shadeversion << std::endl;

	glViewport (0,0,Target.GetWidth (), Target.GetHeight ());
	GLErrorCheck ();


	SetClearColor (Color(0,0,0,0));
	SetClearDepth(1000.0f);
	//EnableDepthBuffering ();
	//DisableDepthTest ();
	NormalBlending ();

	

	glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); //Doesn't get Abstracted
	GLErrorCheck();



	//glLoadIdentity ();
}
 
Outputs:
Windows Error:0: The operation completed successfully.
Windows Error:0: The operation completed successfully.
Windows Error:3221692565: unknown c0072095
Failed to create context.
 
Maybe my drivers need updating or something...

In Topic: Creating an OpenGL context on Windows with Glew.

26 June 2014 - 02:19 PM

I noticed 3221692565 is 0xC0072095. According to the NVidia create context spec 0x2095 is ERROR_INVALID_VERSION_ARB. So I bumped the version down to 3.3 and it successfully creates a context. Which raises more questions because I should be able to create a 4.2 context. I need a 4.2 context because of shader_storage_buffers and other things.

 

TXFvMiR.png

 

cQfKgGK.png


In Topic: Creating an OpenGL context on Windows with Glew.

26 June 2014 - 01:56 PM

I suppose there isn't really a great reason to not use GLFW. Other than I do my own window creation as well. I have a little UI framework that the context creation hooks into as well. I suppose I could fiddle with GLFW to get it all to work in harmony. But I've been using my own context creation for like a year now, it only recently decided to die on my laptop. Is there any reason I can't use my own context creation? It's part "not invented here" syndrome and part curiosity as to what I'm doing wrong. Perhaps I'll look at GLFW's source for hints.


In Topic: Creating an OpenGL context on Windows with Glew.

26 June 2014 - 01:39 PM

Hmm I placed it into the "contextattribs []" array in the new code. Still getting the same result. Thanks for the help.


PARTNERS