|
|
|
@ -31,123 +31,33 @@ |
|
|
|
|
#include <malloc.h> |
|
|
|
|
#include <assert.h> |
|
|
|
|
|
|
|
|
|
// array of pixel format attributes we need
|
|
|
|
|
static const int glfwPixelFormatAttribs[] = { |
|
|
|
|
WGL_SUPPORT_OPENGL_ARB, |
|
|
|
|
WGL_DRAW_TO_WINDOW_ARB, |
|
|
|
|
WGL_PIXEL_TYPE_ARB, |
|
|
|
|
WGL_ACCELERATION_ARB, |
|
|
|
|
WGL_RED_BITS_ARB, |
|
|
|
|
WGL_RED_SHIFT_ARB, |
|
|
|
|
WGL_GREEN_BITS_ARB, |
|
|
|
|
WGL_GREEN_SHIFT_ARB, |
|
|
|
|
WGL_BLUE_BITS_ARB, |
|
|
|
|
WGL_BLUE_SHIFT_ARB, |
|
|
|
|
WGL_ALPHA_BITS_ARB, |
|
|
|
|
WGL_ALPHA_SHIFT_ARB, |
|
|
|
|
WGL_DEPTH_BITS_ARB, |
|
|
|
|
WGL_STENCIL_BITS_ARB, |
|
|
|
|
WGL_ACCUM_BITS_ARB, |
|
|
|
|
WGL_ACCUM_RED_BITS_ARB, |
|
|
|
|
WGL_ACCUM_GREEN_BITS_ARB, |
|
|
|
|
WGL_ACCUM_BLUE_BITS_ARB, |
|
|
|
|
WGL_ACCUM_ALPHA_BITS_ARB, |
|
|
|
|
WGL_AUX_BUFFERS_ARB, |
|
|
|
|
WGL_STEREO_ARB, |
|
|
|
|
WGL_DOUBLE_BUFFER_ARB, |
|
|
|
|
// ARB EXT attribs only below this line, see initPixelFormatAttribArry
|
|
|
|
|
WGL_SAMPLES_ARB, |
|
|
|
|
WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, |
|
|
|
|
WGL_COLORSPACE_EXT |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// initialize array attribs with formatattribs available
|
|
|
|
|
// attribs array must be at least of size sizeof(glfwPixelFormatAttribs) / sizeof(glfwPixelFormatAttribs[0])
|
|
|
|
|
// returns number of valid elemets in array
|
|
|
|
|
static int initPixelFormatAttribArry( int* attribs, int api ) |
|
|
|
|
{ |
|
|
|
|
const int numARBEXTAtrribs = 3; // Update this value when adding ARB EXT attribs
|
|
|
|
|
int numAttribs = sizeof(glfwPixelFormatAttribs) / sizeof(glfwPixelFormatAttribs[0]) - numARBEXTAtrribs; |
|
|
|
|
memcpy(attribs, glfwPixelFormatAttribs, sizeof(glfwPixelFormatAttribs)); |
|
|
|
|
|
|
|
|
|
if (_glfw.wgl.ARB_multisample) |
|
|
|
|
{ |
|
|
|
|
attribs[numAttribs++] = WGL_SAMPLES_ARB; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (api == GLFW_OPENGL_API) |
|
|
|
|
{ |
|
|
|
|
if (_glfw.wgl.ARB_framebuffer_sRGB || |
|
|
|
|
_glfw.wgl.EXT_framebuffer_sRGB) |
|
|
|
|
{ |
|
|
|
|
attribs[numAttribs++] = WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (_glfw.wgl.EXT_colorspace) |
|
|
|
|
{ |
|
|
|
|
attribs[numAttribs++] = WGL_COLORSPACE_EXT; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return numAttribs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Returns all formats in glfwPixelFormats attribute of the specified pixel format
|
|
|
|
|
// values should be of size GLFW_PFA_COUNT and on return will hold integer values
|
|
|
|
|
// which can be indexed using glfwEnumPixelFormatAttribs
|
|
|
|
|
// returns 1 on success, 0 on failure
|
|
|
|
|
static int getPixelFormatAttribs(_GLFWwindow* window, int pixelFormat, int numAttribs, int* attribs, int* values ) |
|
|
|
|
{ |
|
|
|
|
assert(_glfw.wgl.ARB_pixel_format); |
|
|
|
|
|
|
|
|
|
if (!_glfw.wgl.GetPixelFormatAttribivARB(window->context.wgl.dc, |
|
|
|
|
pixelFormat, |
|
|
|
|
0, numAttribs, |
|
|
|
|
attribs, values)) |
|
|
|
|
{ |
|
|
|
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, |
|
|
|
|
"WGL: Failed to retrieve pixel format attributes"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int getPixelFormatAttribFromArray( int* attribs, int* values, int attrib ) |
|
|
|
|
// Return the value corresponding to the specified attribute
|
|
|
|
|
//
|
|
|
|
|
static int findPixelFormatAttribValue(const int* attribs, |
|
|
|
|
int attribCount, |
|
|
|
|
const int* values, |
|
|
|
|
int attrib) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
for (i = 0; i < sizeof(glfwPixelFormatAttribs) / sizeof(glfwPixelFormatAttribs[0]); ++i ) |
|
|
|
|
|
|
|
|
|
for (i = 0; i < attribCount; i++) |
|
|
|
|
{ |
|
|
|
|
if ( attribs[i] == attrib ) |
|
|
|
|
if (attribs[i] == attrib) |
|
|
|
|
return values[i]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// error
|
|
|
|
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, |
|
|
|
|
"WGL: Unknown attribute requested from attribute array"); |
|
|
|
|
"WGL: Unknown pixel format attribute requested"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Returns the specified attribute of the specified pixel format
|
|
|
|
|
//
|
|
|
|
|
static int getPixelFormatAttrib(_GLFWwindow* window, int pixelFormat, int attrib) |
|
|
|
|
{ |
|
|
|
|
int value = 0; |
|
|
|
|
|
|
|
|
|
assert(_glfw.wgl.ARB_pixel_format); |
|
|
|
|
|
|
|
|
|
if (!_glfw.wgl.GetPixelFormatAttribivARB(window->context.wgl.dc, |
|
|
|
|
pixelFormat, |
|
|
|
|
0, 1, &attrib, &value)) |
|
|
|
|
{ |
|
|
|
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, |
|
|
|
|
"WGL: Failed to retrieve pixel format attribute"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return value; |
|
|
|
|
#define addAttrib(a) \ |
|
|
|
|
{ \
|
|
|
|
|
assert((size_t) attribCount < sizeof(attribs) / sizeof(attribs[0])); \
|
|
|
|
|
attribs[attribCount++] = a; \
|
|
|
|
|
} |
|
|
|
|
#define findAttribValue(a) \ |
|
|
|
|
findPixelFormatAttribValue(attribs, attribCount, values, a) |
|
|
|
|
|
|
|
|
|
// Return a list of available and usable framebuffer configs
|
|
|
|
|
//
|
|
|
|
@ -157,17 +67,60 @@ static int choosePixelFormat(_GLFWwindow* window, |
|
|
|
|
{ |
|
|
|
|
_GLFWfbconfig* usableConfigs; |
|
|
|
|
const _GLFWfbconfig* closest; |
|
|
|
|
int i, pixelFormat, nativeCount, usableCount, numAttribs, hintPos; |
|
|
|
|
int pfAttribs[sizeof(glfwPixelFormatAttribs) / sizeof(glfwPixelFormatAttribs[0])]; |
|
|
|
|
int pfValues[sizeof(glfwPixelFormatAttribs) / sizeof(glfwPixelFormatAttribs[0])]; |
|
|
|
|
|
|
|
|
|
numAttribs = initPixelFormatAttribArry(pfAttribs, ctxconfig->client); |
|
|
|
|
int i, pixelFormat, nativeCount, usableCount, attribCount; |
|
|
|
|
int attribs[40]; |
|
|
|
|
int values[sizeof(attribs) / sizeof(attribs[0])]; |
|
|
|
|
|
|
|
|
|
if (_glfw.wgl.ARB_pixel_format) |
|
|
|
|
{ |
|
|
|
|
nativeCount = getPixelFormatAttrib(window, |
|
|
|
|
1, |
|
|
|
|
WGL_NUMBER_PIXEL_FORMATS_ARB); |
|
|
|
|
const int attrib = WGL_NUMBER_PIXEL_FORMATS_ARB; |
|
|
|
|
|
|
|
|
|
if (!_glfw.wgl.GetPixelFormatAttribivARB(window->context.wgl.dc, |
|
|
|
|
1, 0, 1, &attrib, &nativeCount)) |
|
|
|
|
{ |
|
|
|
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, |
|
|
|
|
"WGL: Failed to retrieve pixel format attribute"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
attribCount = 0; |
|
|
|
|
|
|
|
|
|
addAttrib(WGL_SUPPORT_OPENGL_ARB); |
|
|
|
|
addAttrib(WGL_DRAW_TO_WINDOW_ARB); |
|
|
|
|
addAttrib(WGL_PIXEL_TYPE_ARB); |
|
|
|
|
addAttrib(WGL_ACCELERATION_ARB); |
|
|
|
|
addAttrib(WGL_RED_BITS_ARB); |
|
|
|
|
addAttrib(WGL_RED_SHIFT_ARB); |
|
|
|
|
addAttrib(WGL_GREEN_BITS_ARB); |
|
|
|
|
addAttrib(WGL_GREEN_SHIFT_ARB); |
|
|
|
|
addAttrib(WGL_BLUE_BITS_ARB); |
|
|
|
|
addAttrib(WGL_BLUE_SHIFT_ARB); |
|
|
|
|
addAttrib(WGL_ALPHA_BITS_ARB); |
|
|
|
|
addAttrib(WGL_ALPHA_SHIFT_ARB); |
|
|
|
|
addAttrib(WGL_DEPTH_BITS_ARB); |
|
|
|
|
addAttrib(WGL_STENCIL_BITS_ARB); |
|
|
|
|
addAttrib(WGL_ACCUM_BITS_ARB); |
|
|
|
|
addAttrib(WGL_ACCUM_RED_BITS_ARB); |
|
|
|
|
addAttrib(WGL_ACCUM_GREEN_BITS_ARB); |
|
|
|
|
addAttrib(WGL_ACCUM_BLUE_BITS_ARB); |
|
|
|
|
addAttrib(WGL_ACCUM_ALPHA_BITS_ARB); |
|
|
|
|
addAttrib(WGL_AUX_BUFFERS_ARB); |
|
|
|
|
addAttrib(WGL_STEREO_ARB); |
|
|
|
|
addAttrib(WGL_DOUBLE_BUFFER_ARB); |
|
|
|
|
|
|
|
|
|
if (_glfw.wgl.ARB_multisample) |
|
|
|
|
addAttrib(WGL_SAMPLES_ARB); |
|
|
|
|
|
|
|
|
|
if (ctxconfig->client == GLFW_OPENGL_API) |
|
|
|
|
{ |
|
|
|
|
if (_glfw.wgl.ARB_framebuffer_sRGB || _glfw.wgl.EXT_framebuffer_sRGB) |
|
|
|
|
addAttrib(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if (_glfw.wgl.EXT_colorspace) |
|
|
|
|
addAttrib(WGL_COLORSPACE_EXT); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -182,62 +135,64 @@ static int choosePixelFormat(_GLFWwindow* window, |
|
|
|
|
|
|
|
|
|
for (i = 0; i < nativeCount; i++) |
|
|
|
|
{ |
|
|
|
|
const int n = i + 1; |
|
|
|
|
_GLFWfbconfig* u = usableConfigs + usableCount; |
|
|
|
|
pixelFormat = i + 1; |
|
|
|
|
|
|
|
|
|
if (_glfw.wgl.ARB_pixel_format) |
|
|
|
|
{ |
|
|
|
|
// Get pixel format attributes through "modern" extension
|
|
|
|
|
getPixelFormatAttribs(window, n, numAttribs, pfAttribs, pfValues ); |
|
|
|
|
hintPos = 0; |
|
|
|
|
|
|
|
|
|
if (!getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_SUPPORT_OPENGL_ARB) || |
|
|
|
|
!getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_DRAW_TO_WINDOW_ARB)) |
|
|
|
|
if (!_glfw.wgl.GetPixelFormatAttribivARB(window->context.wgl.dc, |
|
|
|
|
pixelFormat, 0, |
|
|
|
|
attribCount, |
|
|
|
|
attribs, values)) |
|
|
|
|
{ |
|
|
|
|
continue; |
|
|
|
|
_glfwInputErrorWin32(GLFW_PLATFORM_ERROR, |
|
|
|
|
"WGL: Failed to retrieve pixel format attributes"); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_PIXEL_TYPE_ARB) != |
|
|
|
|
WGL_TYPE_RGBA_ARB ) |
|
|
|
|
if (!findAttribValue(WGL_SUPPORT_OPENGL_ARB) || |
|
|
|
|
!findAttribValue(WGL_DRAW_TO_WINDOW_ARB)) |
|
|
|
|
{ |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_ACCELERATION_ARB) == |
|
|
|
|
WGL_NO_ACCELERATION_ARB ) |
|
|
|
|
{ |
|
|
|
|
if (findAttribValue(WGL_PIXEL_TYPE_ARB) != WGL_TYPE_RGBA_ARB) |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
u->redBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_RED_BITS_ARB); |
|
|
|
|
u->greenBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_GREEN_BITS_ARB); |
|
|
|
|
u->blueBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_BLUE_BITS_ARB); |
|
|
|
|
u->alphaBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_ALPHA_BITS_ARB); |
|
|
|
|
if (findAttribValue(WGL_ACCELERATION_ARB) == WGL_NO_ACCELERATION_ARB) |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
u->redBits = findAttribValue(WGL_RED_BITS_ARB); |
|
|
|
|
u->greenBits = findAttribValue(WGL_GREEN_BITS_ARB); |
|
|
|
|
u->blueBits = findAttribValue(WGL_BLUE_BITS_ARB); |
|
|
|
|
u->alphaBits = findAttribValue(WGL_ALPHA_BITS_ARB); |
|
|
|
|
|
|
|
|
|
u->depthBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_DEPTH_BITS_ARB); |
|
|
|
|
u->stencilBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_STENCIL_BITS_ARB); |
|
|
|
|
u->depthBits = findAttribValue(WGL_DEPTH_BITS_ARB); |
|
|
|
|
u->stencilBits = findAttribValue(WGL_STENCIL_BITS_ARB); |
|
|
|
|
|
|
|
|
|
u->accumRedBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_ACCUM_RED_BITS_ARB); |
|
|
|
|
u->accumGreenBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_ACCUM_GREEN_BITS_ARB); |
|
|
|
|
u->accumBlueBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_ACCUM_BLUE_BITS_ARB); |
|
|
|
|
u->accumAlphaBits = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_ACCUM_ALPHA_BITS_ARB); |
|
|
|
|
u->accumRedBits = findAttribValue(WGL_ACCUM_RED_BITS_ARB); |
|
|
|
|
u->accumGreenBits = findAttribValue(WGL_ACCUM_GREEN_BITS_ARB); |
|
|
|
|
u->accumBlueBits = findAttribValue(WGL_ACCUM_BLUE_BITS_ARB); |
|
|
|
|
u->accumAlphaBits = findAttribValue(WGL_ACCUM_ALPHA_BITS_ARB); |
|
|
|
|
|
|
|
|
|
u->auxBuffers = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_AUX_BUFFERS_ARB); |
|
|
|
|
u->auxBuffers = findAttribValue(WGL_AUX_BUFFERS_ARB); |
|
|
|
|
|
|
|
|
|
if (getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_STEREO_ARB)) |
|
|
|
|
if (findAttribValue(WGL_STEREO_ARB)) |
|
|
|
|
u->stereo = GLFW_TRUE; |
|
|
|
|
if (getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_DOUBLE_BUFFER_ARB)) |
|
|
|
|
if (findAttribValue(WGL_DOUBLE_BUFFER_ARB)) |
|
|
|
|
u->doublebuffer = GLFW_TRUE; |
|
|
|
|
|
|
|
|
|
if (_glfw.wgl.ARB_multisample) |
|
|
|
|
u->samples = getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_SAMPLES_ARB); |
|
|
|
|
u->samples = findAttribValue(WGL_SAMPLES_ARB); |
|
|
|
|
|
|
|
|
|
if (ctxconfig->client == GLFW_OPENGL_API) |
|
|
|
|
{ |
|
|
|
|
if (_glfw.wgl.ARB_framebuffer_sRGB || |
|
|
|
|
_glfw.wgl.EXT_framebuffer_sRGB) |
|
|
|
|
{ |
|
|
|
|
if (getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB)) |
|
|
|
|
if (findAttribValue(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB)) |
|
|
|
|
u->sRGB = GLFW_TRUE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -245,11 +200,8 @@ static int choosePixelFormat(_GLFWwindow* window, |
|
|
|
|
{ |
|
|
|
|
if (_glfw.wgl.EXT_colorspace) |
|
|
|
|
{ |
|
|
|
|
if (getPixelFormatAttribFromArray(pfAttribs, pfValues, WGL_COLORSPACE_EXT) == |
|
|
|
|
WGL_COLORSPACE_SRGB_EXT) |
|
|
|
|
{ |
|
|
|
|
if (findAttribValue(WGL_COLORSPACE_EXT) == WGL_COLORSPACE_SRGB_EXT) |
|
|
|
|
u->sRGB = GLFW_TRUE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -260,7 +212,7 @@ static int choosePixelFormat(_GLFWwindow* window, |
|
|
|
|
PIXELFORMATDESCRIPTOR pfd; |
|
|
|
|
|
|
|
|
|
if (!DescribePixelFormat(window->context.wgl.dc, |
|
|
|
|
n, |
|
|
|
|
pixelFormat, |
|
|
|
|
sizeof(PIXELFORMATDESCRIPTOR), |
|
|
|
|
&pfd)) |
|
|
|
|
{ |
|
|
|
@ -303,7 +255,7 @@ static int choosePixelFormat(_GLFWwindow* window, |
|
|
|
|
u->doublebuffer = GLFW_TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
u->handle = n; |
|
|
|
|
u->handle = pixelFormat; |
|
|
|
|
usableCount++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -332,6 +284,9 @@ static int choosePixelFormat(_GLFWwindow* window, |
|
|
|
|
return pixelFormat; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#undef addAttrib |
|
|
|
|
#undef findAttribValue |
|
|
|
|
|
|
|
|
|
static void makeContextCurrentWGL(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
if (window) |
|
|
|
|