Adding multisampling to *nix and Windows; also some other pixel format enhancements to Windows
git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@700 7f0cb862-5218-0410-a997-914c9d46530a
This commit is contained in:
parent
735a977bba
commit
4f6e4144b1
@ -1204,3 +1204,6 @@ definitions
|
|||||||
Also added a prompt for user input to highlight a difference betwen GLUT
|
Also added a prompt for user input to highlight a difference betwen GLUT
|
||||||
and "freeglut"
|
and "freeglut"
|
||||||
|
|
||||||
|
(312) Added multisampling support for *nix and Windows; some other pixel
|
||||||
|
format changes for Windows
|
||||||
|
|
||||||
|
@ -135,6 +135,8 @@ XVisualInfo* fgChooseVisual( void )
|
|||||||
ATTRIB_VAL( GLX_AUX_BUFFERS, 3 );
|
ATTRIB_VAL( GLX_AUX_BUFFERS, 3 );
|
||||||
if( fgState.DisplayMode & GLUT_AUX4 )
|
if( fgState.DisplayMode & GLUT_AUX4 )
|
||||||
ATTRIB_VAL( GLX_AUX_BUFFERS, 4 );
|
ATTRIB_VAL( GLX_AUX_BUFFERS, 4 );
|
||||||
|
if ( fgState.DisplayMode & GLUT_MULTISAMPLE )
|
||||||
|
ATTRIB_VAL( GLX_SAMPLES_SGIS, 4 );
|
||||||
|
|
||||||
|
|
||||||
/* Push a null at the end of the list */
|
/* Push a null at the end of the list */
|
||||||
@ -170,10 +172,33 @@ XVisualInfo* fgChooseVisual( void )
|
|||||||
* Setup the pixel format for a Win32 window
|
* Setup the pixel format for a Win32 window
|
||||||
*/
|
*/
|
||||||
#if TARGET_HOST_MS_WINDOWS
|
#if TARGET_HOST_MS_WINDOWS
|
||||||
|
/* WRONG-- FIXME */
|
||||||
|
/* The following include file is available from SGI but is not standard:
|
||||||
|
* #include <GL/wglext.h>
|
||||||
|
* So we copy the necessary parts out of it.
|
||||||
|
*/
|
||||||
|
typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);
|
||||||
|
|
||||||
|
typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
|
||||||
|
|
||||||
|
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||||
|
#define WGL_ACCELERATION_ARB 0x2003
|
||||||
|
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||||
|
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||||
|
#define WGL_COLOR_BITS_ARB 0x2014
|
||||||
|
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||||
|
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||||
|
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||||
|
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||||
|
|
||||||
|
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||||
|
#define WGL_SAMPLES_ARB 0x2042
|
||||||
|
|
||||||
|
|
||||||
GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
|
GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
|
||||||
unsigned char layer_type )
|
unsigned char layer_type )
|
||||||
{
|
{
|
||||||
#ifdef _WIN32_WCE
|
#if defined(_WIN32_WCE)
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
#else
|
#else
|
||||||
PIXELFORMATDESCRIPTOR* ppfd, pfd;
|
PIXELFORMATDESCRIPTOR* ppfd, pfd;
|
||||||
@ -195,15 +220,31 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
|
|||||||
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
|
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
|
||||||
pfd.nVersion = 1;
|
pfd.nVersion = 1;
|
||||||
pfd.dwFlags = flags;
|
pfd.dwFlags = flags;
|
||||||
pfd.iPixelType = PFD_TYPE_RGBA;
|
|
||||||
|
if( fgState.DisplayMode & GLUT_INDEX )
|
||||||
|
{
|
||||||
|
pfd.iPixelType = PFD_TYPE_COLORINDEX;
|
||||||
|
pfd.cRedBits = 0;
|
||||||
|
pfd.cGreenBits = 0;
|
||||||
|
pfd.cBlueBits = 0;
|
||||||
|
pfd.cAlphaBits = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pfd.iPixelType = PFD_TYPE_RGBA;
|
||||||
|
pfd.cRedBits = 8;
|
||||||
|
pfd.cGreenBits = 8;
|
||||||
|
pfd.cBlueBits = 8;
|
||||||
|
if ( fgState.DisplayMode & GLUT_ALPHA )
|
||||||
|
pfd.cAlphaBits = 8;
|
||||||
|
else
|
||||||
|
pfd.cAlphaBits = 0;
|
||||||
|
}
|
||||||
|
|
||||||
pfd.cColorBits = 24;
|
pfd.cColorBits = 24;
|
||||||
pfd.cRedBits = 0;
|
|
||||||
pfd.cRedShift = 0;
|
pfd.cRedShift = 0;
|
||||||
pfd.cGreenBits = 0;
|
|
||||||
pfd.cGreenShift = 0;
|
pfd.cGreenShift = 0;
|
||||||
pfd.cBlueBits = 0;
|
|
||||||
pfd.cBlueShift = 0;
|
pfd.cBlueShift = 0;
|
||||||
pfd.cAlphaBits = 0;
|
|
||||||
pfd.cAlphaShift = 0;
|
pfd.cAlphaShift = 0;
|
||||||
pfd.cAccumBits = 0;
|
pfd.cAccumBits = 0;
|
||||||
pfd.cAccumRedBits = 0;
|
pfd.cAccumRedBits = 0;
|
||||||
@ -238,6 +279,80 @@ GLboolean fgSetupPixelFormat( SFG_Window* window, GLboolean checkOnly,
|
|||||||
ppfd = &pfd;
|
ppfd = &pfd;
|
||||||
|
|
||||||
pixelformat = ChoosePixelFormat( window->Window.Device, ppfd );
|
pixelformat = ChoosePixelFormat( window->Window.Device, ppfd );
|
||||||
|
|
||||||
|
/* windows hack for multismapling */
|
||||||
|
if (fgState.DisplayMode&GLUT_MULTISAMPLE)
|
||||||
|
{
|
||||||
|
PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetEntensionsStringARB=NULL;
|
||||||
|
HGLRC rc, rc_before=wglGetCurrentContext();
|
||||||
|
HWND hWnd;
|
||||||
|
HDC hDC, hDC_before=wglGetCurrentDC();
|
||||||
|
WNDCLASS wndCls;
|
||||||
|
ATOM atom;
|
||||||
|
|
||||||
|
/* create a dummy window */
|
||||||
|
ZeroMemory(&wndCls, sizeof(wndCls));
|
||||||
|
wndCls.lpfnWndProc = DefWindowProc;
|
||||||
|
wndCls.hInstance = fgDisplay.Instance;
|
||||||
|
wndCls.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
|
||||||
|
wndCls.lpszClassName = _T("FREEGLUT_dummy");
|
||||||
|
atom = RegisterClass( &wndCls );
|
||||||
|
|
||||||
|
hWnd=CreateWindow((LPCSTR)atom, _T(""), WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW , 0,0,0,0, 0, 0, fgDisplay.Instance, 0 );
|
||||||
|
hDC=GetDC(hWnd);
|
||||||
|
SetPixelFormat( hDC, pixelformat, ppfd );
|
||||||
|
|
||||||
|
rc = wglCreateContext( hDC );
|
||||||
|
wglMakeCurrent(hDC, rc);
|
||||||
|
|
||||||
|
wglGetEntensionsStringARB=(PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
|
||||||
|
if (wglGetEntensionsStringARB)
|
||||||
|
{
|
||||||
|
const char * pWglExtString=wglGetEntensionsStringARB(hDC);
|
||||||
|
if (pWglExtString)
|
||||||
|
{
|
||||||
|
if (strstr(pWglExtString, "WGL_ARB_multisample"))
|
||||||
|
{
|
||||||
|
int pAttributes[100];
|
||||||
|
int iCounter=0;
|
||||||
|
int iPixelFormat;
|
||||||
|
BOOL bValid;
|
||||||
|
float fAttributes[] = {0,0};
|
||||||
|
UINT numFormats;
|
||||||
|
PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARBProc=NULL;
|
||||||
|
|
||||||
|
wglChoosePixelFormatARBProc=(PFNWGLCHOOSEPIXELFORMATARBPROC)wglGetProcAddress("wglChoosePixelFormatARB");
|
||||||
|
if ( wglChoosePixelFormatARBProc )
|
||||||
|
{
|
||||||
|
pAttributes[iCounter++]=WGL_DRAW_TO_WINDOW_ARB; pAttributes[iCounter++]=GL_TRUE;
|
||||||
|
pAttributes[iCounter++]=WGL_SUPPORT_OPENGL_ARB; pAttributes[iCounter++]=GL_TRUE;
|
||||||
|
pAttributes[iCounter++]=WGL_ACCELERATION_ARB; pAttributes[iCounter++]=WGL_FULL_ACCELERATION_ARB;
|
||||||
|
|
||||||
|
pAttributes[iCounter++]=WGL_COLOR_BITS_ARB; pAttributes[iCounter++]=pfd.cColorBits ;
|
||||||
|
pAttributes[iCounter++]=WGL_ALPHA_BITS_ARB; pAttributes[iCounter++]=pfd.cAlphaBits;
|
||||||
|
pAttributes[iCounter++]=WGL_DEPTH_BITS_ARB; pAttributes[iCounter++]=pfd.cDepthBits;
|
||||||
|
pAttributes[iCounter++]=WGL_STENCIL_BITS_ARB; pAttributes[iCounter++]=pfd.cStencilBits;
|
||||||
|
|
||||||
|
pAttributes[iCounter++]=WGL_DOUBLE_BUFFER_ARB; pAttributes[iCounter++]=(fgState.DisplayMode & GLUT_DOUBLE)!=0;
|
||||||
|
pAttributes[iCounter++]=WGL_SAMPLE_BUFFERS_ARB; pAttributes[iCounter++]=GL_TRUE;
|
||||||
|
pAttributes[iCounter++]=WGL_SAMPLES_ARB; pAttributes[iCounter++]=4;
|
||||||
|
pAttributes[iCounter++]=0; pAttributes[iCounter++]=0; /* terminator */
|
||||||
|
|
||||||
|
bValid = wglChoosePixelFormatARBProc(window->Window.Device,pAttributes,fAttributes,1,&iPixelFormat,&numFormats);
|
||||||
|
|
||||||
|
if (bValid && numFormats>0)
|
||||||
|
pixelformat=iPixelFormat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wglMakeCurrent( hDC_before, rc_before);
|
||||||
|
wglDeleteContext(rc);
|
||||||
|
ReleaseDC(hWnd, hDC);
|
||||||
|
DestroyWindow(hWnd);
|
||||||
|
UnregisterClass(_T("FREEGLUT_dummy"), fgDisplay.Instance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if( pixelformat == 0 )
|
if( pixelformat == 0 )
|
||||||
return GL_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user