瀏覽代碼

Cleanup

Related to #1381.
Camilla Löwy 6 年之前
父節點
當前提交
3d748cf530
共有 1 個文件被更改,包括 102 次插入147 次删除
  1. 102 147
      src/wgl_context.c

+ 102 - 147
src/wgl_context.c

@@ -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)