Ken Thomases : winemac: Set the ordering of color modes explicitly to reduce chance of picking an odd one .

Alexandre Julliard julliard at winehq.org
Wed Mar 27 15:40:06 CDT 2013


Module: wine
Branch: master
Commit: 81d1bfd65d45c6565bce7effaf54aa4507bcd450
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=81d1bfd65d45c6565bce7effaf54aa4507bcd450

Author: Ken Thomases <ken at codeweavers.com>
Date:   Wed Mar 27 07:01:37 2013 -0500

winemac: Set the ordering of color modes explicitly to reduce chance of picking an odd one.

---

 dlls/winemac.drv/opengl.c |   91 ++++++++++++++++++++++++---------------------
 1 files changed, 49 insertions(+), 42 deletions(-)

diff --git a/dlls/winemac.drv/opengl.c b/dlls/winemac.drv/opengl.c
index 58fd951..8a29d89 100644
--- a/dlls/winemac.drv/opengl.c
+++ b/dlls/winemac.drv/opengl.c
@@ -115,33 +115,55 @@ struct color_mode {
     int     blue_bits, blue_shift;
     GLint   alpha_bits, alpha_shift;
     BOOL    is_float;
+    int     color_ordering;
 };
 
+/* The value of "color_ordering" is somewhat arbitrary.  It incorporates some
+   observations of the behavior of Windows systems, but also subjective judgments
+   about what color formats are more "normal" than others.
+
+   On at least some Windows systems, integer color formats are listed before
+   floating-point formats.  Within the integer formats, higher color bits were
+   usually listed before lower color bits, while for floating-point formats it
+   was the reverse.  However, that leads D3D to select 64-bit integer formats in
+   preference to 32-bit formats when the latter would be sufficient.  It seems
+   that a 32-bit format is much more likely to be normally used in that case.
+
+   Also, there are certain odd color formats supported on the Mac which seem like
+   they would be less appropriate than more common ones.  For instance, the color
+   formats with alpha in a separate byte (e.g. kCGLRGB888A8Bit with R8G8B8 in one
+   32-bit value and A8 in a separate 8-bit value) and the formats with 10-bit RGB
+   components.
+
+   For two color formats which differ only in whether or not they have alpha bits,
+   we use the same ordering.  pixel_format_comparator() gives alpha bits a
+   different weight than color formats.
+ */
 static const struct color_mode color_modes[] = {
-    { kCGLRGB444Bit,        16,     12,     4,  8,      4,  4,      4,  0,      0,  0,  FALSE },
-    { kCGLARGB4444Bit,      16,     16,     4,  8,      4,  4,      4,  0,      4,  12, FALSE },
-    { kCGLRGB444A8Bit,      24,     20,     4,  8,      4,  4,      4,  0,      8,  16, FALSE },
-    { kCGLRGB555Bit,        16,     15,     5,  10,     5,  5,      5,  0,      0,  0,  FALSE },
-    { kCGLARGB1555Bit,      16,     16,     5,  10,     5,  5,      5,  0,      1,  15, FALSE },
-    { kCGLRGB555A8Bit,      24,     23,     5,  10,     5,  5,      5,  0,      8,  16, FALSE },
-    { kCGLRGB565Bit,        16,     16,     5,  11,     6,  5,      5,  0,      0,  0,  FALSE },
-    { kCGLRGB565A8Bit,      24,     24,     5,  11,     6,  5,      5,  0,      8,  16, FALSE },
-    { kCGLRGB888Bit,        32,     24,     8,  16,     8,  8,      8,  0,      0,  0,  FALSE },
-    { kCGLARGB8888Bit,      32,     32,     8,  16,     8,  8,      8,  0,      8,  24, FALSE },
-    { kCGLRGB888A8Bit,      40,     32,     8,  16,     8,  8,      8,  0,      8,  32, FALSE },
-    { kCGLRGB101010Bit,     32,     30,     10, 20,     10, 10,     10, 0,      0,  0,  FALSE },
-    { kCGLARGB2101010Bit,   32,     32,     10, 20,     10, 10,     10, 0,      2,  30, FALSE },
-    { kCGLRGB101010_A8Bit,  40,     38,     10, 20,     10, 10,     10, 0,      8,  32, FALSE },
-    { kCGLRGB121212Bit,     48,     36,     12, 24,     12, 12,     12, 0,      0,  0,  FALSE },
-    { kCGLARGB12121212Bit,  48,     48,     12, 24,     12, 12,     12, 0,      12, 36, FALSE },
-    { kCGLRGB161616Bit,     64,     48,     16, 48,     16, 32,     16, 16,     0,  0,  FALSE },
-    { kCGLRGBA16161616Bit,  64,     64,     16, 48,     16, 32,     16, 16,     16, 0,  FALSE },
-    { kCGLRGBFloat64Bit,    64,     48,     16, 32,     16, 16,     16, 0,      0,  0,  TRUE },
-    { kCGLRGBAFloat64Bit,   64,     64,     16, 48,     16, 32,     16, 16,     16, 0,  TRUE },
-    { kCGLRGBFloat128Bit,   128,    96,     32, 96,     32, 64,     32, 32,     0,  0,  TRUE },
-    { kCGLRGBAFloat128Bit,  128,    128,    32, 96,     32, 64,     32, 32,     32, 0,  TRUE },
-    { kCGLRGBFloat256Bit,   256,    192,    64, 192,    64, 128,    64, 64,     0,  0,  TRUE },
-    { kCGLRGBAFloat256Bit,  256,    256,    64, 192,    64, 128,    64, 64,     64, 0,  TRUE },
+    { kCGLRGB444Bit,        16,     12,     4,  8,      4,  4,      4,  0,      0,  0,  FALSE,  5 },
+    { kCGLARGB4444Bit,      16,     16,     4,  8,      4,  4,      4,  0,      4,  12, FALSE,  5 },
+    { kCGLRGB444A8Bit,      24,     20,     4,  8,      4,  4,      4,  0,      8,  16, FALSE,  10 },
+    { kCGLRGB555Bit,        16,     15,     5,  10,     5,  5,      5,  0,      0,  0,  FALSE,  4 },
+    { kCGLARGB1555Bit,      16,     16,     5,  10,     5,  5,      5,  0,      1,  15, FALSE,  4 },
+    { kCGLRGB555A8Bit,      24,     23,     5,  10,     5,  5,      5,  0,      8,  16, FALSE,  9 },
+    { kCGLRGB565Bit,        16,     16,     5,  11,     6,  5,      5,  0,      0,  0,  FALSE,  3 },
+    { kCGLRGB565A8Bit,      24,     24,     5,  11,     6,  5,      5,  0,      8,  16, FALSE,  8 },
+    { kCGLRGB888Bit,        32,     24,     8,  16,     8,  8,      8,  0,      0,  0,  FALSE,  0 },
+    { kCGLARGB8888Bit,      32,     32,     8,  16,     8,  8,      8,  0,      8,  24, FALSE,  0 },
+    { kCGLRGB888A8Bit,      40,     32,     8,  16,     8,  8,      8,  0,      8,  32, FALSE,  7 },
+    { kCGLRGB101010Bit,     32,     30,     10, 20,     10, 10,     10, 0,      0,  0,  FALSE,  6 },
+    { kCGLARGB2101010Bit,   32,     32,     10, 20,     10, 10,     10, 0,      2,  30, FALSE,  6 },
+    { kCGLRGB101010_A8Bit,  40,     38,     10, 20,     10, 10,     10, 0,      8,  32, FALSE,  11 },
+    { kCGLRGB121212Bit,     48,     36,     12, 24,     12, 12,     12, 0,      0,  0,  FALSE,  2 },
+    { kCGLARGB12121212Bit,  48,     48,     12, 24,     12, 12,     12, 0,      12, 36, FALSE,  2 },
+    { kCGLRGB161616Bit,     64,     48,     16, 48,     16, 32,     16, 16,     0,  0,  FALSE,  1 },
+    { kCGLRGBA16161616Bit,  64,     64,     16, 48,     16, 32,     16, 16,     16, 0,  FALSE,  1 },
+    { kCGLRGBFloat64Bit,    64,     48,     16, 32,     16, 16,     16, 0,      0,  0,  TRUE,   12 },
+    { kCGLRGBAFloat64Bit,   64,     64,     16, 48,     16, 32,     16, 16,     16, 0,  TRUE,   12 },
+    { kCGLRGBFloat128Bit,   128,    96,     32, 96,     32, 64,     32, 32,     0,  0,  TRUE,   13 },
+    { kCGLRGBAFloat128Bit,  128,    128,    32, 96,     32, 64,     32, 32,     32, 0,  TRUE,   13 },
+    { kCGLRGBFloat256Bit,   256,    192,    64, 192,    64, 128,    64, 64,     0,  0,  TRUE,   14 },
+    { kCGLRGBAFloat256Bit,  256,    256,    64, 192,    64, 128,    64, 64,     64, 0,  TRUE,   15 },
 };
 
 
@@ -837,25 +859,10 @@ static CFComparisonResult pixel_format_comparator(const void *val1, const void *
     if (!pf1.accelerated && pf2.accelerated)
         return kCFCompareGreaterThan;
 
-    /* Integer color modes before floating-point. */
-    if (!color_modes[pf1.color_mode].is_float && color_modes[pf2.color_mode].is_float)
-        return kCFCompareLessThan;
-    if (color_modes[pf1.color_mode].is_float && !color_modes[pf2.color_mode].is_float)
-        return kCFCompareGreaterThan;
-
-    /* For integer color modes, higher color bits before lower.  For floating-point mode,
-       the reverse. */
-    if (color_modes[pf1.color_mode].color_bits - color_modes[pf1.color_mode].alpha_bits >
-        color_modes[pf2.color_mode].color_bits - color_modes[pf2.color_mode].alpha_bits)
-        return color_modes[pf1.color_mode].is_float ? kCFCompareGreaterThan : kCFCompareLessThan;
-    if (color_modes[pf1.color_mode].color_bits - color_modes[pf1.color_mode].alpha_bits <
-        color_modes[pf2.color_mode].color_bits - color_modes[pf2.color_mode].alpha_bits)
-        return color_modes[pf1.color_mode].is_float ? kCFCompareLessThan : kCFCompareGreaterThan;
-
-    /* Mac-ism: in the rare case that color bits are equal but bpp are not, prefer fewer bpp. */
-    if (color_modes[pf1.color_mode].bits_per_pixel < color_modes[pf2.color_mode].bits_per_pixel)
+    /* Explicit color mode ordering. */
+    if (color_modes[pf1.color_mode].color_ordering < color_modes[pf2.color_mode].color_ordering)
         return kCFCompareLessThan;
-    if (color_modes[pf1.color_mode].bits_per_pixel > color_modes[pf2.color_mode].bits_per_pixel)
+    if (color_modes[pf1.color_mode].color_ordering > color_modes[pf2.color_mode].color_ordering)
         return kCFCompareGreaterThan;
 
     /* Non-pbuffer-capable before pbuffer-capable. */




More information about the wine-cvs mailing list