Beispiel #1
0
void FWindow::Linux_VerticalSync(GLint EnableSync)
{
	if(EXTSwapControlSupported)
	{
		SwapIntervalEXT(WindowManager::GetDisplay(), WindowHandle, EnableSync);
	}

	if(MESASwapControlSupported)
	{
		SwapIntervalMESA(EnableSync);
	}

	if(SGISwapControlSupported)
	{
		if(EnableSync < 0)
		{
			EnableSync = 0;
		}
		SwapIntervalSGI(EnableSync);
	}
}
HWND gkDeviceRenderContext::initDevice(ISystemInitInfo& sii)
{
	//////////////////////////////////////////////////////////////////////////
	// create a window
	SetWindow( sii.fWidth, sii.fHeight, false, 0 );
	getRenderer()->SetCurrContent(0,0,0,sii.fWidth, sii.fHeight);

	//////////////////////////////////////////////////////////////////////////
	// create a tmp context
	m_dc = GetDC( m_hWnd );
	PIXELFORMATDESCRIPTOR pfd=
	{
		sizeof(PIXELFORMATDESCRIPTOR),
		1,
		PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
		PFD_DOUBLEBUFFER|PFD_GENERIC_ACCELERATED|PFD_GENERIC_FORMAT,
		PFD_TYPE_RGBA,
		24,
		0,0,0,0,0,0,
		0,
		0,
		0,
		0,0,0,0,
		0,
		0,
		0,
		PFD_MAIN_PLANE,
		0,
		0,0,0
	};

	int pixelFormat = ChoosePixelFormat( m_dc, &pfd );

	if (pixelFormat == 0)
	{
		pixelFormat == 1;
	}

	DescribePixelFormat(m_dc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd );
	SetPixelFormat(m_dc, pixelFormat, &pfd);

	m_mainContext = wglCreateContext( m_dc );
	if (!m_mainContext)
	{
		gkLogError( _T("Win32 Create GL Context Failed.") );
	}
	wglMakeCurrent( m_dc, m_mainContext );

	//////////////////////////////////////////////////////////////////////////
	// get eglextension
	PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)
		wglGetProcAddress( "wglGetExtensionsStringEXT" );

	PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)
		wglGetProcAddress( "wglGetExtensionsStringARB" );

	PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
			wglGetProcAddress( "wglCreateContextAttribsARB" );

	SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)
			wglGetProcAddress( "wglSwapIntervalEXT" );

	PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)
			wglGetProcAddress( "wglGetPixelFormatAttribivARB" );

	if (!CreateContextAttribsARB || !GetExtensionsStringEXT || !GetExtensionsStringARB || !SwapIntervalEXT || !GetPixelFormatAttribivARB)
	{
		gkLogError(_T("Can not Create GL330 device, driver may not support."));
		return NULL;
	}

	// delete tmp context

	wglMakeCurrent( NULL, NULL );
	wglDeleteContext( m_mainContext );
	//////////////////////////////////////////////////////////////////////////
	
	
	
	//////////////////////////////////////////////////////////////////////////
	// config

	 int flags, i = 0, attribs[40];

	 // choose api version
	 attribs[i++] = WGL_CONTEXT_MAJOR_VERSION_ARB;
	 attribs[i++] = 3;
	 attribs[i++] = WGL_CONTEXT_MINOR_VERSION_ARB;
	 attribs[i++] = 2;

	 flags = 0;
	 flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
	 //flags |= WGL_CONTEXT_DEBUG_BIT_ARB;

	 attribs[i++] = WGL_CONTEXT_FLAGS_ARB;
	 attribs[i++] = flags;

	 // core profile or compatibility
	 flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
	 //flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;

	 attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB;
	 attribs[i++] = flags;

	 attribs[i++] = 0;

	 m_dc = GetDC( m_hWnd );
	 m_mainContext = CreateContextAttribsARB( m_dc, NULL, attribs );

	if (!m_mainContext)
	{
		gkLogError( _T("Win32 Create GL Context Failed.") );
	}

	wglMakeCurrent( m_dc, m_mainContext );

	SwapIntervalEXT( 0 );
	SwapBuffers( m_dc );

	return m_hWnd;
}
gkDeviceRenderContext::~gkDeviceRenderContext()
{
	//////////////////////////////////////////////////////////////////////////
	// get eglextension
	PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)
		wglGetProcAddress( "wglGetExtensionsStringEXT" );

	PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)
		wglGetProcAddress( "wglGetExtensionsStringARB" );

	PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)
		wglGetProcAddress( "wglCreateContextAttribsARB" );

	SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)
		wglGetProcAddress( "wglSwapIntervalEXT" );

	PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)
		wglGetProcAddress( "wglGetPixelFormatAttribivARB" );

	// delete tmp context

	wglMakeCurrent( NULL, NULL );
	wglDeleteContext( m_mainContext );

	return;

	int flags, i = 0, attribs[40];

	// choose api version
	attribs[i++] = WGL_CONTEXT_MAJOR_VERSION_ARB;
	attribs[i++] = 3;
	attribs[i++] = WGL_CONTEXT_MINOR_VERSION_ARB;
	attribs[i++] = 2;

	flags = 0;
	flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
	//flags |= WGL_CONTEXT_DEBUG_BIT_ARB;

	attribs[i++] = WGL_CONTEXT_FLAGS_ARB;
	attribs[i++] = flags;

	// core profile or compatibility
	flags = WGL_CONTEXT_CORE_PROFILE_BIT_ARB;
	//flags = WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB;

	attribs[i++] = WGL_CONTEXT_PROFILE_MASK_ARB;
	attribs[i++] = flags;

	attribs[i++] = 0;

	m_dc = GetDC( m_hWnd );
	m_mainContext = CreateContextAttribsARB( m_dc, NULL, attribs );

	if (!m_mainContext)
	{
		gkLogError( _T("Win32 Create GL Context Failed.") );
	}

	wglMakeCurrent( m_dc, m_mainContext );

	SwapIntervalEXT( 0 );
	SwapBuffers( m_dc );
}