update: WGL
This commit is contained in:
parent
0daef92522
commit
2e395dce26
@ -14,22 +14,8 @@
|
||||
#ifndef OSGVIEWER_GRAPHICSHANDLEWIN32
|
||||
#define OSGVIEWER_GRAPHICSHANDLEWIN32 1
|
||||
|
||||
#include <osgViewer/Export>
|
||||
|
||||
// Fallback if not correctly detected in CMake macro
|
||||
#ifndef _WIN32_WINNT
|
||||
//#define _WIN32_WINNT 0x0A00 // Windows 10
|
||||
//#define _WIN32_WINNT 0x0603 // Windows 8.1
|
||||
//#define _WIN32_WINNT 0x0602 // Windows 8
|
||||
//#define _WIN32_WINNT 0x0601 // Windows 7
|
||||
//#define _WIN32_WINNT 0x0600 // Windows Server 2008
|
||||
//#define _WIN32_WINNT 0x0600 // Windows Vista
|
||||
//#define _WIN32_WINNT 0x0502 // Windows Server 2003 with SP1, Windows XP with SP2
|
||||
//#define _WIN32_WINNT 0x0501 // Windows Server 2003, Windows XP
|
||||
#define _WIN32_WINNT 0x0500 // Windows NT
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include "Win32GWUtils"
|
||||
#include <osgViewer/Export>
|
||||
|
||||
namespace osgViewer
|
||||
{
|
||||
@ -109,62 +95,4 @@ namespace osgViewer
|
||||
#endif
|
||||
}
|
||||
|
||||
// Definitions required to create an OpenGL pixel format, from the WGL_ARB_pixel_format specification document.
|
||||
// See http://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt
|
||||
|
||||
#ifndef WGL_ARB_pixel_format
|
||||
#define WGL_ARB_pixel_format 1
|
||||
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
#define WGL_DRAW_TO_BITMAP_ARB 0x2002
|
||||
#define WGL_ACCELERATION_ARB 0x2003
|
||||
#define WGL_NEED_PALETTE_ARB 0x2004
|
||||
#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
|
||||
#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
|
||||
#define WGL_SWAP_METHOD_ARB 0x2007
|
||||
#define WGL_NUMBER_OVERLAYS_ARB 0x2008
|
||||
#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
|
||||
#define WGL_TRANSPARENT_ARB 0x200A
|
||||
#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
|
||||
#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
|
||||
#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
|
||||
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
|
||||
#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
|
||||
#define WGL_SHARE_DEPTH_ARB 0x200C
|
||||
#define WGL_SHARE_STENCIL_ARB 0x200D
|
||||
#define WGL_SHARE_ACCUM_ARB 0x200E
|
||||
#define WGL_SUPPORT_GDI_ARB 0x200F
|
||||
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||
#define WGL_STEREO_ARB 0x2012
|
||||
#define WGL_PIXEL_TYPE_ARB 0x2013
|
||||
#define WGL_COLOR_BITS_ARB 0x2014
|
||||
#define WGL_RED_BITS_ARB 0x2015
|
||||
#define WGL_RED_SHIFT_ARB 0x2016
|
||||
#define WGL_GREEN_BITS_ARB 0x2017
|
||||
#define WGL_GREEN_SHIFT_ARB 0x2018
|
||||
#define WGL_BLUE_BITS_ARB 0x2019
|
||||
#define WGL_BLUE_SHIFT_ARB 0x201A
|
||||
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||
#define WGL_ALPHA_SHIFT_ARB 0x201C
|
||||
#define WGL_ACCUM_BITS_ARB 0x201D
|
||||
#define WGL_ACCUM_RED_BITS_ARB 0x201E
|
||||
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
|
||||
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
|
||||
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
|
||||
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||
#define WGL_AUX_BUFFERS_ARB 0x2024
|
||||
#define WGL_NO_ACCELERATION_ARB 0x2025
|
||||
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
|
||||
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||
#define WGL_SWAP_EXCHANGE_ARB 0x2028
|
||||
#define WGL_SWAP_COPY_ARB 0x2029
|
||||
#define WGL_SWAP_UNDEFINED_ARB 0x202A
|
||||
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -91,6 +91,8 @@ IF(WIN32 AND NOT ANDROID)
|
||||
SET(LIB_COMMON_FILES ${LIB_COMMON_FILES}
|
||||
GraphicsWindowWin32.cpp
|
||||
PixelBufferWin32.cpp
|
||||
Win32GWUtils.cpp
|
||||
Win32GWUtils
|
||||
)
|
||||
ENDIF()
|
||||
ELSE()
|
||||
|
@ -27,9 +27,9 @@
|
||||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "Win32GWUtils"
|
||||
#include "windowsx.h"
|
||||
|
||||
#define MOUSEEVENTF_FROMTOUCH 0xFF515700
|
||||
|
||||
@ -186,93 +186,6 @@ static osg::ApplicationUsageProxy GraphicsWindowWin32_e0(osg::ApplicationUsage::
|
||||
using namespace EGL;
|
||||
#else
|
||||
using namespace WGL;
|
||||
//
|
||||
// Defines from the WGL_ARB_pixel_format specification document
|
||||
// See http://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt
|
||||
//
|
||||
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
#define WGL_DRAW_TO_BITMAP_ARB 0x2002
|
||||
#define WGL_ACCELERATION_ARB 0x2003
|
||||
#define WGL_NEED_PALETTE_ARB 0x2004
|
||||
#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
|
||||
#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
|
||||
#define WGL_SWAP_METHOD_ARB 0x2007
|
||||
#define WGL_NUMBER_OVERLAYS_ARB 0x2008
|
||||
#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
|
||||
#define WGL_TRANSPARENT_ARB 0x200A
|
||||
#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
|
||||
#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
|
||||
#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
|
||||
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
|
||||
#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
|
||||
#define WGL_SHARE_DEPTH_ARB 0x200C
|
||||
#define WGL_SHARE_STENCIL_ARB 0x200D
|
||||
#define WGL_SHARE_ACCUM_ARB 0x200E
|
||||
#define WGL_SUPPORT_GDI_ARB 0x200F
|
||||
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||
#define WGL_STEREO_ARB 0x2012
|
||||
#define WGL_PIXEL_TYPE_ARB 0x2013
|
||||
#define WGL_COLOR_BITS_ARB 0x2014
|
||||
#define WGL_RED_BITS_ARB 0x2015
|
||||
#define WGL_RED_SHIFT_ARB 0x2016
|
||||
#define WGL_GREEN_BITS_ARB 0x2017
|
||||
#define WGL_GREEN_SHIFT_ARB 0x2018
|
||||
#define WGL_BLUE_BITS_ARB 0x2019
|
||||
#define WGL_BLUE_SHIFT_ARB 0x201A
|
||||
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||
#define WGL_ALPHA_SHIFT_ARB 0x201C
|
||||
#define WGL_ACCUM_BITS_ARB 0x201D
|
||||
#define WGL_ACCUM_RED_BITS_ARB 0x201E
|
||||
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
|
||||
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
|
||||
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
|
||||
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||
#define WGL_AUX_BUFFERS_ARB 0x2024
|
||||
#define WGL_NO_ACCELERATION_ARB 0x2025
|
||||
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
|
||||
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||
#define WGL_SWAP_EXCHANGE_ARB 0x2028
|
||||
#define WGL_SWAP_COPY_ARB 0x2029
|
||||
#define WGL_SWAP_UNDEFINED_ARB 0x202A
|
||||
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
|
||||
#ifndef WGL_ARB_create_context
|
||||
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
|
||||
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
|
||||
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
|
||||
#define WGL_CONTEXT_FLAGS_ARB 0x2094
|
||||
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||
#define ERROR_INVALID_VERSION_ARB 0x2095
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_create_context
|
||||
#define WGL_ARB_create_context 1
|
||||
#ifdef WGL_WGLEXT_PROTOTYPES
|
||||
extern HGLRC WINAPI wglCreateContextAttribsARB (HDC, HGLRC, const int *);
|
||||
#endif /* WGL_WGLEXT_PROTOTYPES */
|
||||
typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
|
||||
#endif
|
||||
|
||||
//
|
||||
// Entry points used from the WGL extensions
|
||||
//
|
||||
// BOOL wglChoosePixelFormatARB(HDC hdc,
|
||||
// const int *piAttribIList,
|
||||
// const FLOAT *pfAttribFList,
|
||||
// UINT nMaxFormats,
|
||||
// int *piFormats,
|
||||
// UINT *nNumFormats);
|
||||
//
|
||||
|
||||
typedef bool (WINAPI * WGLChoosePixelFormatARB) ( HDC, const int *, const float *, unsigned int, int *, unsigned int * );
|
||||
#endif
|
||||
|
||||
//
|
||||
@ -1655,6 +1568,64 @@ bool GraphicsWindowWin32::setPixelFormat()
|
||||
|
||||
#else
|
||||
|
||||
static void PreparePixelFormatSpecifications(const osg::GraphicsContext::Traits& traits,
|
||||
XGLIntegerAttributes& attributes,
|
||||
bool allowSwapExchangeARB)
|
||||
{
|
||||
attributes.begin();
|
||||
|
||||
attributes.enable(WGL_DRAW_TO_WINDOW_ARB);
|
||||
attributes.enable(WGL_SUPPORT_OPENGL_ARB);
|
||||
|
||||
attributes.set(WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB);
|
||||
attributes.set(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB);
|
||||
|
||||
attributes.set(WGL_COLOR_BITS_ARB, traits.red + traits.green + traits.blue);
|
||||
attributes.set(WGL_RED_BITS_ARB, traits.red);
|
||||
attributes.set(WGL_GREEN_BITS_ARB, traits.green);
|
||||
attributes.set(WGL_BLUE_BITS_ARB, traits.blue);
|
||||
attributes.set(WGL_DEPTH_BITS_ARB, traits.depth);
|
||||
|
||||
if(traits.doubleBuffer)
|
||||
{
|
||||
attributes.enable(WGL_DOUBLE_BUFFER_ARB);
|
||||
|
||||
switch(traits.swapMethod)
|
||||
{
|
||||
case osg::DisplaySettings::SWAP_COPY:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_COPY_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_EXCHANGE:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_UNDEFINED:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_UNDEFINED_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_DEFAULT:
|
||||
// Wojtek Lewandowski 2010-09-28:
|
||||
// Keep backward compatibility if no method is selected via traits
|
||||
// and let wglSwapExchangeARB flag select swap method.
|
||||
// However, I would rather remove this flag because its
|
||||
// now redundant to Traits::swapMethod and it looks like
|
||||
// WGL_SWAP_EXCHANGE_ARB is the GL default when no WGL_SWAP attrib is given.
|
||||
// To be precise: At least on Windows 7 and Nvidia it seems to be a default.
|
||||
if(allowSwapExchangeARB)
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(traits.alpha) attributes.set(WGL_ALPHA_BITS_ARB, traits.alpha);
|
||||
if(traits.stencil) attributes.set(WGL_STENCIL_BITS_ARB, traits.stencil);
|
||||
if(traits.sampleBuffers) attributes.set(WGL_SAMPLE_BUFFERS_ARB, traits.sampleBuffers);
|
||||
if(traits.samples) attributes.set(WGL_SAMPLES_ARB, traits.samples);
|
||||
|
||||
if(traits.quadBufferStereo) attributes.enable(WGL_STEREO_ARB);
|
||||
|
||||
attributes.end();
|
||||
}
|
||||
|
||||
|
||||
static int ChooseMatchingPixelFormat( HDC hdc, int screenNum, const XGLIntegerAttributes& formatSpecifications ,osg::GraphicsContext::Traits* _traits)
|
||||
{
|
||||
//
|
||||
@ -1722,7 +1693,7 @@ static int ChooseMatchingPixelFormat( HDC hdc, int screenNum, const XGLIntegerAt
|
||||
|
||||
bool GraphicsWindowWin32::setPixelFormat()
|
||||
{
|
||||
Win32WindowingSystem::OpenGLContext openGLContext;
|
||||
OpenGLContext openGLContext;
|
||||
if (!Win32WindowingSystem::getInterface()->getSampleOpenGLContext(openGLContext, _hdc, _screenOriginX, _screenOriginY)) return false;
|
||||
|
||||
//
|
||||
@ -1800,7 +1771,7 @@ HGLRC GraphicsWindowWin32::createContextImplementation()
|
||||
OSG_NOTIFY( osg::INFO ) << "GL3: context flags: " << _traits->glContextFlags << std::endl;
|
||||
OSG_NOTIFY( osg::INFO ) << "GL3: profile: " << _traits->glContextProfileMask << std::endl;
|
||||
|
||||
Win32WindowingSystem::OpenGLContext openGLContext;
|
||||
OpenGLContext openGLContext;
|
||||
if( !Win32WindowingSystem::getInterface()->getSampleOpenGLContext( openGLContext, _hdc, _screenOriginX, _screenOriginY ) )
|
||||
{
|
||||
reportErrorForScreen( "GL3: Can't create sample context.",
|
||||
@ -3066,33 +3037,6 @@ LRESULT GraphicsWindowWin32::handleNativeWindowingEvent( HWND hwnd, UINT uMsg, W
|
||||
::CallWindowProc(_windowProcedure, hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// Class responsible for registering the Win32 Windowing System interface
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
#if 0
|
||||
struct RegisterWindowingSystemInterfaceProxy
|
||||
{
|
||||
RegisterWindowingSystemInterfaceProxy()
|
||||
{
|
||||
osg::GraphicsContext::setWindowingSystemInterface(Win32WindowingSystem::getInterface());
|
||||
}
|
||||
|
||||
~RegisterWindowingSystemInterfaceProxy()
|
||||
{
|
||||
if (osg::Referenced::getDeleteHandler())
|
||||
{
|
||||
osg::Referenced::getDeleteHandler()->setNumFramesToRetainObjects(0);
|
||||
osg::Referenced::getDeleteHandler()->flushAll();
|
||||
}
|
||||
|
||||
osg::GraphicsContext::setWindowingSystemInterface(0);
|
||||
}
|
||||
};
|
||||
|
||||
static RegisterWindowingSystemInterfaceProxy createWindowingSystemInterfaceProxy;
|
||||
#endif
|
||||
|
||||
} // namespace OsgViewer
|
||||
|
||||
|
||||
|
@ -14,8 +14,8 @@
|
||||
* These elements are licensed under OSGPL as above, with Copyright (C) 2001-2004 Don Burns.
|
||||
*/
|
||||
|
||||
#if defined(OSG_USE_EGL)
|
||||
#else
|
||||
#if !defined(OSG_USE_EGL)
|
||||
#include "Win32GWUtils"
|
||||
#include <osgViewer/api/Win32/PixelBufferWin32>
|
||||
#include <osgViewer/api/Win32/GraphicsWindowWin32>
|
||||
#include <osg/TextureRectangle>
|
||||
@ -23,135 +23,6 @@
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <sstream>
|
||||
#include <windowsx.h>
|
||||
|
||||
#ifndef WGL_ARB_pbuffer
|
||||
#define WGL_ARB_pbuffer 1
|
||||
DECLARE_HANDLE(HPBUFFERARB);
|
||||
#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
|
||||
#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
|
||||
#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
|
||||
#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
|
||||
#define WGL_PBUFFER_LARGEST_ARB 0x2033
|
||||
#define WGL_PBUFFER_WIDTH_ARB 0x2034
|
||||
#define WGL_PBUFFER_HEIGHT_ARB 0x2035
|
||||
#define WGL_PBUFFER_LOST_ARB 0x2036
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_pixel_format
|
||||
#define WGL_ARB_pixel_format 1
|
||||
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
#define WGL_DRAW_TO_BITMAP_ARB 0x2002
|
||||
#define WGL_ACCELERATION_ARB 0x2003
|
||||
#define WGL_NEED_PALETTE_ARB 0x2004
|
||||
#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
|
||||
#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
|
||||
#define WGL_SWAP_METHOD_ARB 0x2007
|
||||
#define WGL_NUMBER_OVERLAYS_ARB 0x2008
|
||||
#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
|
||||
#define WGL_TRANSPARENT_ARB 0x200A
|
||||
#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
|
||||
#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
|
||||
#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
|
||||
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
|
||||
#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
|
||||
#define WGL_SHARE_DEPTH_ARB 0x200C
|
||||
#define WGL_SHARE_STENCIL_ARB 0x200D
|
||||
#define WGL_SHARE_ACCUM_ARB 0x200E
|
||||
#define WGL_SUPPORT_GDI_ARB 0x200F
|
||||
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||
#define WGL_STEREO_ARB 0x2012
|
||||
#define WGL_PIXEL_TYPE_ARB 0x2013
|
||||
#define WGL_COLOR_BITS_ARB 0x2014
|
||||
#define WGL_RED_BITS_ARB 0x2015
|
||||
#define WGL_RED_SHIFT_ARB 0x2016
|
||||
#define WGL_GREEN_BITS_ARB 0x2017
|
||||
#define WGL_GREEN_SHIFT_ARB 0x2018
|
||||
#define WGL_BLUE_BITS_ARB 0x2019
|
||||
#define WGL_BLUE_SHIFT_ARB 0x201A
|
||||
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||
#define WGL_ALPHA_SHIFT_ARB 0x201C
|
||||
#define WGL_ACCUM_BITS_ARB 0x201D
|
||||
#define WGL_ACCUM_RED_BITS_ARB 0x201E
|
||||
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
|
||||
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
|
||||
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
|
||||
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||
#define WGL_AUX_BUFFERS_ARB 0x2024
|
||||
#define WGL_NO_ACCELERATION_ARB 0x2025
|
||||
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
|
||||
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||
#define WGL_SWAP_EXCHANGE_ARB 0x2028
|
||||
#define WGL_SWAP_COPY_ARB 0x2029
|
||||
#define WGL_SWAP_UNDEFINED_ARB 0x202A
|
||||
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_render_texture
|
||||
#define WGL_ARB_render_texture 1
|
||||
#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
|
||||
#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
|
||||
#define WGL_TEXTURE_FORMAT_ARB 0x2072
|
||||
#define WGL_TEXTURE_TARGET_ARB 0x2073
|
||||
#define WGL_MIPMAP_TEXTURE_ARB 0x2074
|
||||
#define WGL_TEXTURE_RGB_ARB 0x2075
|
||||
#define WGL_TEXTURE_RGBA_ARB 0x2076
|
||||
#define WGL_NO_TEXTURE_ARB 0x2077
|
||||
#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
|
||||
#define WGL_TEXTURE_1D_ARB 0x2079
|
||||
#define WGL_TEXTURE_2D_ARB 0x207A
|
||||
#define WGL_MIPMAP_LEVEL_ARB 0x207B
|
||||
#define WGL_CUBE_MAP_FACE_ARB 0x207C
|
||||
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
|
||||
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
|
||||
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
|
||||
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
|
||||
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
|
||||
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
|
||||
#define WGL_FRONT_LEFT_ARB 0x2083
|
||||
#define WGL_FRONT_RIGHT_ARB 0x2084
|
||||
#define WGL_BACK_LEFT_ARB 0x2085
|
||||
#define WGL_BACK_RIGHT_ARB 0x2086
|
||||
#define WGL_AUX0_ARB 0x2087
|
||||
#define WGL_AUX1_ARB 0x2088
|
||||
#define WGL_AUX2_ARB 0x2089
|
||||
#define WGL_AUX3_ARB 0x208A
|
||||
#define WGL_AUX4_ARB 0x208B
|
||||
#define WGL_AUX5_ARB 0x208C
|
||||
#define WGL_AUX6_ARB 0x208D
|
||||
#define WGL_AUX7_ARB 0x208E
|
||||
#define WGL_AUX8_ARB 0x208F
|
||||
#define WGL_AUX9_ARB 0x2090
|
||||
#endif
|
||||
|
||||
#ifndef WGL_NV_render_depth_texture
|
||||
#define WGL_NV_render_depth_texture 1
|
||||
#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
|
||||
#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
|
||||
#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
|
||||
#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
|
||||
#define WGL_DEPTH_COMPONENT_NV 0x20A7
|
||||
#endif
|
||||
|
||||
#ifndef WGL_NV_render_texture_rectangle
|
||||
#define WGL_NV_render_texture_rectangle 1
|
||||
#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
|
||||
#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
|
||||
#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
|
||||
#endif
|
||||
|
||||
#ifndef WGL_SAMPLE_BUFFERS_ARB
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#endif
|
||||
#ifndef WGL_SAMPLES_ARB
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
#ifndef _OSGVIEWER_WIN32GWUtils_H_
|
||||
#define _OSGVIEWER_WIN32GWUtils_H_
|
||||
#ifndef _OSGVIEWER_WIN32GWUTILS_H_
|
||||
#define _OSGVIEWER_WIN32GWUTILS_H_
|
||||
|
||||
#if defined(OSG_USE_EGL)
|
||||
#include <EGL/egl.h>
|
||||
@ -7,6 +7,21 @@
|
||||
#include <EGL/eglext.h>
|
||||
#endif
|
||||
|
||||
// Fallback if not correctly detected in CMake macro
|
||||
#ifndef _WIN32_WINNT
|
||||
//#define _WIN32_WINNT 0x0A00 // Windows 10
|
||||
//#define _WIN32_WINNT 0x0603 // Windows 8.1
|
||||
//#define _WIN32_WINNT 0x0602 // Windows 8
|
||||
//#define _WIN32_WINNT 0x0601 // Windows 7
|
||||
//#define _WIN32_WINNT 0x0600 // Windows Server 2008
|
||||
//#define _WIN32_WINNT 0x0600 // Windows Vista
|
||||
//#define _WIN32_WINNT 0x0502 // Windows Server 2003 with SP1, Windows XP with SP2
|
||||
//#define _WIN32_WINNT 0x0501 // Windows Server 2003, Windows XP
|
||||
#define _WIN32_WINNT 0x0500 // Windows NT
|
||||
#endif
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
#include <osg/GraphicsContext>
|
||||
|
||||
namespace osgViewer {
|
||||
@ -150,7 +165,172 @@ namespace osgViewer {
|
||||
};
|
||||
} // end of namespace WGL
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#if !defined(OSG_USE_EGL)
|
||||
//
|
||||
// Defines from the WGL_ARB_pixel_format specification document
|
||||
// See http://www.opengl.org/registry/specs/ARB/wgl_pixel_format.txt
|
||||
//
|
||||
#ifndef WGL_ARB_pixel_format
|
||||
#define WGL_ARB_pixel_format 1
|
||||
#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
|
||||
#define WGL_DRAW_TO_WINDOW_ARB 0x2001
|
||||
#define WGL_DRAW_TO_BITMAP_ARB 0x2002
|
||||
#define WGL_ACCELERATION_ARB 0x2003
|
||||
#define WGL_NEED_PALETTE_ARB 0x2004
|
||||
#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
|
||||
#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
|
||||
#define WGL_SWAP_METHOD_ARB 0x2007
|
||||
#define WGL_NUMBER_OVERLAYS_ARB 0x2008
|
||||
#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
|
||||
#define WGL_TRANSPARENT_ARB 0x200A
|
||||
#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
|
||||
#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
|
||||
#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
|
||||
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
|
||||
#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
|
||||
#define WGL_SHARE_DEPTH_ARB 0x200C
|
||||
#define WGL_SHARE_STENCIL_ARB 0x200D
|
||||
#define WGL_SHARE_ACCUM_ARB 0x200E
|
||||
#define WGL_SUPPORT_GDI_ARB 0x200F
|
||||
#define WGL_SUPPORT_OPENGL_ARB 0x2010
|
||||
#define WGL_DOUBLE_BUFFER_ARB 0x2011
|
||||
#define WGL_STEREO_ARB 0x2012
|
||||
#define WGL_PIXEL_TYPE_ARB 0x2013
|
||||
#define WGL_COLOR_BITS_ARB 0x2014
|
||||
#define WGL_RED_BITS_ARB 0x2015
|
||||
#define WGL_RED_SHIFT_ARB 0x2016
|
||||
#define WGL_GREEN_BITS_ARB 0x2017
|
||||
#define WGL_GREEN_SHIFT_ARB 0x2018
|
||||
#define WGL_BLUE_BITS_ARB 0x2019
|
||||
#define WGL_BLUE_SHIFT_ARB 0x201A
|
||||
#define WGL_ALPHA_BITS_ARB 0x201B
|
||||
#define WGL_ALPHA_SHIFT_ARB 0x201C
|
||||
#define WGL_ACCUM_BITS_ARB 0x201D
|
||||
#define WGL_ACCUM_RED_BITS_ARB 0x201E
|
||||
#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
|
||||
#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
|
||||
#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
|
||||
#define WGL_DEPTH_BITS_ARB 0x2022
|
||||
#define WGL_STENCIL_BITS_ARB 0x2023
|
||||
#define WGL_AUX_BUFFERS_ARB 0x2024
|
||||
#define WGL_NO_ACCELERATION_ARB 0x2025
|
||||
#define WGL_GENERIC_ACCELERATION_ARB 0x2026
|
||||
#define WGL_FULL_ACCELERATION_ARB 0x2027
|
||||
#define WGL_SWAP_EXCHANGE_ARB 0x2028
|
||||
#define WGL_SWAP_COPY_ARB 0x2029
|
||||
#define WGL_SWAP_UNDEFINED_ARB 0x202A
|
||||
#define WGL_TYPE_RGBA_ARB 0x202B
|
||||
#define WGL_TYPE_COLORINDEX_ARB 0x202C
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_render_texture
|
||||
#define WGL_ARB_render_texture 1
|
||||
#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
|
||||
#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
|
||||
#define WGL_TEXTURE_FORMAT_ARB 0x2072
|
||||
#define WGL_TEXTURE_TARGET_ARB 0x2073
|
||||
#define WGL_MIPMAP_TEXTURE_ARB 0x2074
|
||||
#define WGL_TEXTURE_RGB_ARB 0x2075
|
||||
#define WGL_TEXTURE_RGBA_ARB 0x2076
|
||||
#define WGL_NO_TEXTURE_ARB 0x2077
|
||||
#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
|
||||
#define WGL_TEXTURE_1D_ARB 0x2079
|
||||
#define WGL_TEXTURE_2D_ARB 0x207A
|
||||
#define WGL_MIPMAP_LEVEL_ARB 0x207B
|
||||
#define WGL_CUBE_MAP_FACE_ARB 0x207C
|
||||
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
|
||||
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
|
||||
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
|
||||
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
|
||||
#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
|
||||
#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
|
||||
#define WGL_FRONT_LEFT_ARB 0x2083
|
||||
#define WGL_FRONT_RIGHT_ARB 0x2084
|
||||
#define WGL_BACK_LEFT_ARB 0x2085
|
||||
#define WGL_BACK_RIGHT_ARB 0x2086
|
||||
#define WGL_AUX0_ARB 0x2087
|
||||
#define WGL_AUX1_ARB 0x2088
|
||||
#define WGL_AUX2_ARB 0x2089
|
||||
#define WGL_AUX3_ARB 0x208A
|
||||
#define WGL_AUX4_ARB 0x208B
|
||||
#define WGL_AUX5_ARB 0x208C
|
||||
#define WGL_AUX6_ARB 0x208D
|
||||
#define WGL_AUX7_ARB 0x208E
|
||||
#define WGL_AUX8_ARB 0x208F
|
||||
#define WGL_AUX9_ARB 0x2090
|
||||
#endif
|
||||
|
||||
#ifndef WGL_NV_render_depth_texture
|
||||
#define WGL_NV_render_depth_texture 1
|
||||
#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
|
||||
#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
|
||||
#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
|
||||
#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
|
||||
#define WGL_DEPTH_COMPONENT_NV 0x20A7
|
||||
#endif
|
||||
|
||||
#ifndef WGL_NV_render_texture_rectangle
|
||||
#define WGL_NV_render_texture_rectangle 1
|
||||
#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
|
||||
#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
|
||||
#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
|
||||
#endif
|
||||
|
||||
#ifndef WGL_SAMPLE_BUFFERS_ARB
|
||||
#define WGL_SAMPLE_BUFFERS_ARB 0x2041
|
||||
#endif
|
||||
#ifndef WGL_SAMPLES_ARB
|
||||
#define WGL_SAMPLES_ARB 0x2042
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_create_context
|
||||
#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
|
||||
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
|
||||
#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
|
||||
#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
|
||||
#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
|
||||
#define WGL_CONTEXT_FLAGS_ARB 0x2094
|
||||
#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
|
||||
#define ERROR_INVALID_VERSION_ARB 0x2095
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_pbuffer
|
||||
#define WGL_ARB_pbuffer 1
|
||||
DECLARE_HANDLE(HPBUFFERARB);
|
||||
#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
|
||||
#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
|
||||
#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
|
||||
#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
|
||||
#define WGL_PBUFFER_LARGEST_ARB 0x2033
|
||||
#define WGL_PBUFFER_WIDTH_ARB 0x2034
|
||||
#define WGL_PBUFFER_HEIGHT_ARB 0x2035
|
||||
#define WGL_PBUFFER_LOST_ARB 0x2036
|
||||
#endif
|
||||
|
||||
#ifndef WGL_ARB_create_context
|
||||
#define WGL_ARB_create_context 1
|
||||
#ifdef WGL_WGLEXT_PROTOTYPES
|
||||
extern HGLRC WINAPI wglCreateContextAttribsARB(HDC, HGLRC, const int *);
|
||||
#endif /* WGL_WGLEXT_PROTOTYPES */
|
||||
typedef HGLRC(WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int *attribList);
|
||||
#endif
|
||||
|
||||
//
|
||||
// Entry points used from the WGL extensions
|
||||
//
|
||||
// BOOL wglChoosePixelFormatARB(HDC hdc,
|
||||
// const int *piAttribIList,
|
||||
// const FLOAT *pfAttribFList,
|
||||
// UINT nMaxFormats,
|
||||
// int *piFormats,
|
||||
// UINT *nNumFormats);
|
||||
//
|
||||
|
||||
typedef bool (WINAPI * WGLChoosePixelFormatARB) (HDC, const int *, const float *, unsigned int, int *, unsigned int *);
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,5 +1,4 @@
|
||||
#include <osg/GLExtensions>
|
||||
#include <windowsx.h>
|
||||
|
||||
#include "Win32GWUtils"
|
||||
#include <vector>
|
||||
@ -307,153 +306,154 @@ void preparePixelFormatSpecifications(const osg::GraphicsContext::Traits& traits
|
||||
|
||||
// *** WGL Implementation
|
||||
|
||||
namespace WGL {
|
||||
namespace WGL {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// WGL::OpenGLContext implementation
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// WGL::OpenGLContext implementation
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
OpenGLContext::OpenGLContext()
|
||||
: _previousHdc(0),
|
||||
_previousHglrc(0),
|
||||
_hwnd(0),
|
||||
_hdc(0),
|
||||
_hglrc(0),
|
||||
_restorePreviousOnExit(false)
|
||||
{}
|
||||
OpenGLContext::OpenGLContext()
|
||||
: _previousHdc(0),
|
||||
_previousHglrc(0),
|
||||
_hwnd(0),
|
||||
_hdc(0),
|
||||
_hglrc(0),
|
||||
_restorePreviousOnExit(false)
|
||||
{}
|
||||
|
||||
OpenGLContext::OpenGLContext(HWND hwnd, HDC hdc, HGLRC hglrc)
|
||||
: _previousHdc(0),
|
||||
_previousHglrc(0),
|
||||
_hwnd(hwnd),
|
||||
_hdc(hdc),
|
||||
_hglrc(hglrc),
|
||||
_restorePreviousOnExit(false)
|
||||
{}
|
||||
OpenGLContext::OpenGLContext(HWND hwnd, HDC hdc, HGLRC hglrc)
|
||||
: _previousHdc(0),
|
||||
_previousHglrc(0),
|
||||
_hwnd(hwnd),
|
||||
_hdc(hdc),
|
||||
_hglrc(hglrc),
|
||||
_restorePreviousOnExit(false)
|
||||
{}
|
||||
|
||||
OpenGLContext::~OpenGLContext()
|
||||
{
|
||||
if (_restorePreviousOnExit && _previousHglrc != _hglrc && !::wglMakeCurrent(_previousHdc, _previousHglrc))
|
||||
{
|
||||
reportError("Win32WindowingSystem::OpenGLContext() - Unable to restore current OpenGL rendering context", ::GetLastError());
|
||||
}
|
||||
if (_hglrc)
|
||||
{
|
||||
::wglMakeCurrent(_hdc, NULL);
|
||||
::wglDeleteContext(_hglrc);
|
||||
_hglrc = 0;
|
||||
}
|
||||
_previousHdc = 0;
|
||||
_previousHglrc = 0;
|
||||
|
||||
if (_hdc)
|
||||
{
|
||||
::ReleaseDC(_hwnd, _hdc);
|
||||
_hdc = 0;
|
||||
}
|
||||
|
||||
if (_hwnd)
|
||||
{
|
||||
::DestroyWindow(_hwnd);
|
||||
_hwnd = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void OpenGLContext::set(HWND hwnd, HDC hdc, HGLRC hglrc)
|
||||
{
|
||||
_hwnd = hwnd;
|
||||
_hdc = hdc;
|
||||
_hglrc = hglrc;
|
||||
}
|
||||
|
||||
void OpenGLContext::clear()
|
||||
{
|
||||
_hwnd = 0;
|
||||
_hdc = 0;
|
||||
_hglrc = 0;
|
||||
}
|
||||
|
||||
HDC OpenGLContext::deviceContext()
|
||||
{
|
||||
return _hdc;
|
||||
}
|
||||
|
||||
bool OpenGLContext::makeCurrent(HDC restoreOnHdc, bool restorePreviousOnExit)
|
||||
{
|
||||
if (_hdc == 0 || _hglrc == 0) return false;
|
||||
|
||||
_previousHglrc = restorePreviousOnExit ? ::wglGetCurrentContext() : 0;
|
||||
_previousHdc = restoreOnHdc;
|
||||
|
||||
if (_hglrc == _previousHglrc) return true;
|
||||
|
||||
if (!::wglMakeCurrent(_hdc, _hglrc))
|
||||
{
|
||||
reportError("Win32WindowingSystem::OpenGLContext() - Unable to set current OpenGL rendering context", ::GetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
_restorePreviousOnExit = restorePreviousOnExit;
|
||||
}
|
||||
|
||||
void preparePixelFormatSpecifications(const osg::GraphicsContext::Traits& traits,
|
||||
XGLIntegerAttributes& attributes,
|
||||
bool allowSwapExchangeARB)
|
||||
{
|
||||
attributes.begin();
|
||||
|
||||
attributes.enable(WGL_DRAW_TO_WINDOW_ARB);
|
||||
attributes.enable(WGL_SUPPORT_OPENGL_ARB);
|
||||
|
||||
attributes.set(WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB);
|
||||
attributes.set(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB);
|
||||
|
||||
attributes.set(WGL_COLOR_BITS_ARB, traits.red + traits.green + traits.blue);
|
||||
attributes.set(WGL_RED_BITS_ARB, traits.red);
|
||||
attributes.set(WGL_GREEN_BITS_ARB, traits.green);
|
||||
attributes.set(WGL_BLUE_BITS_ARB, traits.blue);
|
||||
attributes.set(WGL_DEPTH_BITS_ARB, traits.depth);
|
||||
|
||||
if (traits.doubleBuffer)
|
||||
{
|
||||
attributes.enable(WGL_DOUBLE_BUFFER_ARB);
|
||||
|
||||
switch (traits.swapMethod)
|
||||
OpenGLContext::~OpenGLContext()
|
||||
{
|
||||
case osg::DisplaySettings::SWAP_COPY:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_COPY_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_EXCHANGE:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_UNDEFINED:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_UNDEFINED_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_DEFAULT:
|
||||
// Wojtek Lewandowski 2010-09-28:
|
||||
// Keep backward compatibility if no method is selected via traits
|
||||
// and let wglSwapExchangeARB flag select swap method.
|
||||
// However, I would rather remove this flag because its
|
||||
// now redundant to Traits::swapMethod and it looks like
|
||||
// WGL_SWAP_EXCHANGE_ARB is the GL default when no WGL_SWAP attrib is given.
|
||||
// To be precise: At least on Windows 7 and Nvidia it seems to be a default.
|
||||
if (allowSwapExchangeARB)
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB);
|
||||
break;
|
||||
if(_restorePreviousOnExit && _previousHglrc != _hglrc && !::wglMakeCurrent(_previousHdc, _previousHglrc))
|
||||
{
|
||||
reportError("Win32WindowingSystem::OpenGLContext() - Unable to restore current OpenGL rendering context", ::GetLastError());
|
||||
}
|
||||
if(_hglrc)
|
||||
{
|
||||
::wglMakeCurrent(_hdc, NULL);
|
||||
::wglDeleteContext(_hglrc);
|
||||
_hglrc = 0;
|
||||
}
|
||||
_previousHdc = 0;
|
||||
_previousHglrc = 0;
|
||||
|
||||
if(_hdc)
|
||||
{
|
||||
::ReleaseDC(_hwnd, _hdc);
|
||||
_hdc = 0;
|
||||
}
|
||||
|
||||
if(_hwnd)
|
||||
{
|
||||
::DestroyWindow(_hwnd);
|
||||
_hwnd = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (traits.alpha) attributes.set(WGL_ALPHA_BITS_ARB, traits.alpha);
|
||||
if (traits.stencil) attributes.set(WGL_STENCIL_BITS_ARB, traits.stencil);
|
||||
if (traits.sampleBuffers) attributes.set(WGL_SAMPLE_BUFFERS_ARB, traits.sampleBuffers);
|
||||
if (traits.samples) attributes.set(WGL_SAMPLES_ARB, traits.samples);
|
||||
void OpenGLContext::set(HWND hwnd, HDC hdc, HGLRC hglrc)
|
||||
{
|
||||
_hwnd = hwnd;
|
||||
_hdc = hdc;
|
||||
_hglrc = hglrc;
|
||||
}
|
||||
|
||||
if (traits.quadBufferStereo) attributes.enable(WGL_STEREO_ARB);
|
||||
void OpenGLContext::clear()
|
||||
{
|
||||
_hwnd = 0;
|
||||
_hdc = 0;
|
||||
_hglrc = 0;
|
||||
}
|
||||
|
||||
attributes.end();
|
||||
}
|
||||
HDC OpenGLContext::deviceContext()
|
||||
{
|
||||
return _hdc;
|
||||
}
|
||||
|
||||
bool OpenGLContext::makeCurrent(HDC restoreOnHdc, bool restorePreviousOnExit)
|
||||
{
|
||||
if(_hdc == 0 || _hglrc == 0) return false;
|
||||
|
||||
_previousHglrc = restorePreviousOnExit ? ::wglGetCurrentContext() : 0;
|
||||
_previousHdc = restoreOnHdc;
|
||||
|
||||
if(_hglrc == _previousHglrc) return true;
|
||||
|
||||
if(!::wglMakeCurrent(_hdc, _hglrc))
|
||||
{
|
||||
reportError("Win32WindowingSystem::OpenGLContext() - Unable to set current OpenGL rendering context", ::GetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
_restorePreviousOnExit = restorePreviousOnExit;
|
||||
return true;
|
||||
}
|
||||
|
||||
void preparePixelFormatSpecifications(const osg::GraphicsContext::Traits& traits,
|
||||
XGLIntegerAttributes& attributes,
|
||||
bool allowSwapExchangeARB)
|
||||
{
|
||||
attributes.begin();
|
||||
|
||||
attributes.enable(WGL_DRAW_TO_WINDOW_ARB);
|
||||
attributes.enable(WGL_SUPPORT_OPENGL_ARB);
|
||||
|
||||
attributes.set(WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB);
|
||||
attributes.set(WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB);
|
||||
|
||||
attributes.set(WGL_COLOR_BITS_ARB, traits.red + traits.green + traits.blue);
|
||||
attributes.set(WGL_RED_BITS_ARB, traits.red);
|
||||
attributes.set(WGL_GREEN_BITS_ARB, traits.green);
|
||||
attributes.set(WGL_BLUE_BITS_ARB, traits.blue);
|
||||
attributes.set(WGL_DEPTH_BITS_ARB, traits.depth);
|
||||
|
||||
if(traits.doubleBuffer)
|
||||
{
|
||||
attributes.enable(WGL_DOUBLE_BUFFER_ARB);
|
||||
|
||||
switch(traits.swapMethod)
|
||||
{
|
||||
case osg::DisplaySettings::SWAP_COPY:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_COPY_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_EXCHANGE:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_UNDEFINED:
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_UNDEFINED_ARB);
|
||||
break;
|
||||
case osg::DisplaySettings::SWAP_DEFAULT:
|
||||
// Wojtek Lewandowski 2010-09-28:
|
||||
// Keep backward compatibility if no method is selected via traits
|
||||
// and let wglSwapExchangeARB flag select swap method.
|
||||
// However, I would rather remove this flag because its
|
||||
// now redundant to Traits::swapMethod and it looks like
|
||||
// WGL_SWAP_EXCHANGE_ARB is the GL default when no WGL_SWAP attrib is given.
|
||||
// To be precise: At least on Windows 7 and Nvidia it seems to be a default.
|
||||
if(allowSwapExchangeARB)
|
||||
attributes.set(WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(traits.alpha) attributes.set(WGL_ALPHA_BITS_ARB, traits.alpha);
|
||||
if(traits.stencil) attributes.set(WGL_STENCIL_BITS_ARB, traits.stencil);
|
||||
if(traits.sampleBuffers) attributes.set(WGL_SAMPLE_BUFFERS_ARB, traits.sampleBuffers);
|
||||
if(traits.samples) attributes.set(WGL_SAMPLES_ARB, traits.samples);
|
||||
|
||||
if(traits.quadBufferStereo) attributes.enable(WGL_STEREO_ARB);
|
||||
|
||||
attributes.end();
|
||||
}
|
||||
} // end of namespace WGL
|
||||
#endif // OSG_USE_EGL
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user