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