winemac: Set the ordering of color modes explicitly to reduce chance of picking an odd one.
This commit is contained in:
parent
484cf761fc
commit
81d1bfd65d
|
@ -115,33 +115,55 @@ struct color_mode {
|
||||||
int blue_bits, blue_shift;
|
int blue_bits, blue_shift;
|
||||||
GLint alpha_bits, alpha_shift;
|
GLint alpha_bits, alpha_shift;
|
||||||
BOOL is_float;
|
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[] = {
|
static const struct color_mode color_modes[] = {
|
||||||
{ kCGLRGB444Bit, 16, 12, 4, 8, 4, 4, 4, 0, 0, 0, FALSE },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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 },
|
{ 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)
|
if (!pf1.accelerated && pf2.accelerated)
|
||||||
return kCFCompareGreaterThan;
|
return kCFCompareGreaterThan;
|
||||||
|
|
||||||
/* Integer color modes before floating-point. */
|
/* Explicit color mode ordering. */
|
||||||
if (!color_modes[pf1.color_mode].is_float && color_modes[pf2.color_mode].is_float)
|
if (color_modes[pf1.color_mode].color_ordering < color_modes[pf2.color_mode].color_ordering)
|
||||||
return kCFCompareLessThan;
|
return kCFCompareLessThan;
|
||||||
if (color_modes[pf1.color_mode].is_float && !color_modes[pf2.color_mode].is_float)
|
if (color_modes[pf1.color_mode].color_ordering > color_modes[pf2.color_mode].color_ordering)
|
||||||
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)
|
|
||||||
return kCFCompareLessThan;
|
|
||||||
if (color_modes[pf1.color_mode].bits_per_pixel > color_modes[pf2.color_mode].bits_per_pixel)
|
|
||||||
return kCFCompareGreaterThan;
|
return kCFCompareGreaterThan;
|
||||||
|
|
||||||
/* Non-pbuffer-capable before pbuffer-capable. */
|
/* Non-pbuffer-capable before pbuffer-capable. */
|
||||||
|
|
Loading…
Reference in New Issue