1db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca/**************************************************************************
2db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *
3db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * All Rights Reserved.
5db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *
6db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * copy of this software and associated documentation files (the
8db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * "Software"), to deal in the Software without restriction, including
9db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * the following conditions:
13db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *
14db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * The above copyright notice and this permission notice (including the
15db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * next paragraph) shall be included in all copies or substantial portions
16db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * of the Software.
17db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *
18db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca *
26db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca **************************************************************************/
27db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
28aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca#include "pipe/p_format.h"
29aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca#include "pipe/p_defines.h"
30aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca#include "pipe/p_screen.h"
31aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca
32f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol#include "util/u_format.h"
33ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
3459e6e765426a5877db7446e1e34bb7edd3dc1f74Chia-I Wu#include "util/u_memory.h"
3587b04ce59b3ed26988b54ca182fab2e9dce03c38José Fonseca
3631f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca#include "stw_icd.h"
3787b04ce59b3ed26988b54ca182fab2e9dce03c38José Fonseca#include "stw_device.h"
38db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca#include "stw_pixelformat.h"
394489f9efee58f2cba374298f2d43c96e5cd2ff41Michal Krol#include "stw_tls.h"
40db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
41c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
420bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastruct stw_pf_color_info
430bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca{
44aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   enum pipe_format format;
450bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   struct {
460bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char red;
470bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char green;
480bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char blue;
490bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char alpha;
500bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   } bits;
510bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   struct {
520bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char red;
530bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char green;
540bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char blue;
550bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char alpha;
560bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   } shift;
570bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca};
580bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
590bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastruct stw_pf_depth_info
600bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca{
61aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   enum pipe_format format;
620bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   struct {
630bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char depth;
640bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca      unsigned char stencil;
650bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   } bits;
660bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca};
670bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
680bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
695458f8eff6b6212d170fd5862c4fc82659666d22José Fonseca/* NOTE: order matters, since in otherwise equal circumstances the first
70aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca * format listed will get chosen */
71aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca
72aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonsecastatic const struct stw_pf_color_info
730bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastw_pf_color[] = {
74aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   /* no-alpha */
755706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_B8G8R8X8_UNORM,    { 8,  8,  8,  0}, {16,  8,  0,  0} },
765706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_X8R8G8B8_UNORM,    { 8,  8,  8,  0}, { 8, 16, 24,  0} },
775706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_B5G6R5_UNORM,      { 5,  6,  5,  0}, {11,  5,  0,  0} },
78aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   /* alpha */
795706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_B8G8R8A8_UNORM,    { 8,  8,  8,  8}, {16,  8,  0, 24} },
805706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_A8R8G8B8_UNORM,    { 8,  8,  8,  8}, { 8, 16, 24,  0} },
81aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca#if 0
825706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_R10G10B10A2_UNORM, {10, 10, 10,  2}, { 0, 10, 20, 30} },
83aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca#endif
845706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_B5G5R5A1_UNORM,    { 5,  5,  5,  1}, {10,  5,  0, 15} },
855706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_B4G4R4A4_UNORM,    { 4,  4,  4,  4}, {16,  4,  0, 12} }
860bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca};
870bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
889646762261d976d34bee8c8b1dcda9656cec655cJosé Fonsecastatic const struct stw_pf_color_info
899646762261d976d34bee8c8b1dcda9656cec655cJosé Fonsecastw_pf_color_extended[] = {
909646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca    { PIPE_FORMAT_R32G32B32A32_FLOAT, { 32,  32, 32,  32}, { 0,  32, 64, 96} }
919646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca};
92aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca
930bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastatic const struct stw_pf_depth_info
940bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastw_pf_depth_stencil[] = {
95aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   /* pure depth */
965458f8eff6b6212d170fd5862c4fc82659666d22José Fonseca   { PIPE_FORMAT_Z32_UNORM,   {32, 0} },
97aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   { PIPE_FORMAT_X8Z24_UNORM, {24, 0} },
985706d7fcaf3c3238c652593d5669b9f793c6cdceJosé Fonseca   { PIPE_FORMAT_Z24X8_UNORM, {24, 0} },
995458f8eff6b6212d170fd5862c4fc82659666d22José Fonseca   { PIPE_FORMAT_Z16_UNORM,   {16, 0} },
100aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   /* combined depth-stencil */
101866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   { PIPE_FORMAT_Z24_UNORM_S8_UINT, {24, 8} },
102866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie   { PIPE_FORMAT_S8_UINT_Z24_UNORM, {24, 8} }
1030bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca};
1040bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
105aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca
1060bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastatic const boolean
1070bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastw_pf_doublebuffer[] = {
1080bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   FALSE,
1090bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   TRUE,
1100bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca};
1110bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
112aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca
1130bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecaconst unsigned
1140bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonsecastw_pf_multisample[] = {
1150bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   0,
1160bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   4
1170bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca};
1180bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
1190bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
120db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecastatic void
1210a2269703c2398d81d8cde439527f883f6fbc502José Fonsecastw_pixelformat_add(
1220a2269703c2398d81d8cde439527f883f6fbc502José Fonseca   struct stw_device *stw_dev,
1239646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca   boolean extended,
1240bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   const struct stw_pf_color_info *color,
1250bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   const struct stw_pf_depth_info *depth,
12644a996b185c446eab7038a10153db7e7496bf2c9José Fonseca   unsigned accum,
127e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   boolean doublebuffer,
1280bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   unsigned samples )
129db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
130e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   struct stw_pixelformat_info *pfi;
1310a2269703c2398d81d8cde439527f883f6fbc502José Fonseca
1320a2269703c2398d81d8cde439527f883f6fbc502José Fonseca   assert(stw_dev->pixelformat_extended_count < STW_MAX_PIXELFORMATS);
1330a2269703c2398d81d8cde439527f883f6fbc502José Fonseca   if(stw_dev->pixelformat_extended_count >= STW_MAX_PIXELFORMATS)
1340a2269703c2398d81d8cde439527f883f6fbc502José Fonseca      return;
1356fc244c68d3b3a9f89b6f752725e6c768cb08a84José Fonseca
136f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 0) == color->bits.red);
137f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 1) == color->bits.green);
138f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 2) == color->bits.blue);
139f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 3) == color->bits.alpha);
140f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(util_format_get_component_bits(depth->format, UTIL_FORMAT_COLORSPACE_ZS, 0) == depth->bits.depth);
141f5bd93fae2e4f46665eb1f09ca64cb39ff2b8a79Michal Krol   assert(util_format_get_component_bits(depth->format, UTIL_FORMAT_COLORSPACE_ZS, 1) == depth->bits.stencil);
1420a2269703c2398d81d8cde439527f883f6fbc502José Fonseca
143e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi = &stw_dev->pixelformats[stw_dev->pixelformat_extended_count];
1440a2269703c2398d81d8cde439527f883f6fbc502José Fonseca
145e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   memset(pfi, 0, sizeof *pfi);
146e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
147e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.nSize = sizeof pfi->pfd;
148e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.nVersion = 1;
1490a2269703c2398d81d8cde439527f883f6fbc502José Fonseca
150e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.dwFlags = PFD_SUPPORT_OPENGL;
151e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
152e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   /* TODO: also support non-native pixel formats */
1539646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca   if (!extended) {
1549646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca      pfi->pfd.dwFlags |= PFD_DRAW_TO_WINDOW;
1559646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca   }
1564e5ed05b025b9b6a1a6dabba72fce3d918e77044José Fonseca
1574e5ed05b025b9b6a1a6dabba72fce3d918e77044José Fonseca   /* See http://www.opengl.org/pipeline/article/vol003_7/ */
1584e5ed05b025b9b6a1a6dabba72fce3d918e77044José Fonseca   pfi->pfd.dwFlags |= PFD_SUPPORT_COMPOSITION;
1594e5ed05b025b9b6a1a6dabba72fce3d918e77044José Fonseca
160e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   if (doublebuffer)
161e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      pfi->pfd.dwFlags |= PFD_DOUBLEBUFFER | PFD_SWAP_COPY;
162e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
163e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.iPixelType = PFD_TYPE_RGBA;
164e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
165d075cb4fc8c130f2e8f40356e7872fcc7ce3dcd1José Fonseca   pfi->pfd.cColorBits = color->bits.red + color->bits.green + color->bits.blue + color->bits.alpha;
1660bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cRedBits = color->bits.red;
1670bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cRedShift = color->shift.red;
1680bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cGreenBits = color->bits.green;
1690bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cGreenShift = color->shift.green;
1700bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cBlueBits = color->bits.blue;
1710bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cBlueShift = color->shift.blue;
1720bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cAlphaBits = color->bits.alpha;
1730bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cAlphaShift = color->shift.alpha;
17444a996b185c446eab7038a10153db7e7496bf2c9José Fonseca   pfi->pfd.cAccumBits = 4*accum;
17544a996b185c446eab7038a10153db7e7496bf2c9José Fonseca   pfi->pfd.cAccumRedBits = accum;
17644a996b185c446eab7038a10153db7e7496bf2c9José Fonseca   pfi->pfd.cAccumGreenBits = accum;
17744a996b185c446eab7038a10153db7e7496bf2c9José Fonseca   pfi->pfd.cAccumBlueBits = accum;
17844a996b185c446eab7038a10153db7e7496bf2c9José Fonseca   pfi->pfd.cAccumAlphaBits = accum;
1790bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cDepthBits = depth->bits.depth;
1800bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   pfi->pfd.cStencilBits = depth->bits.stencil;
181e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.cAuxBuffers = 0;
182e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.iLayerType = 0;
183e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.bReserved = 0;
184e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.dwLayerMask = 0;
185e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.dwVisibleMask = 0;
186e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   pfi->pfd.dwDamageMask = 0;
187e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
188192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   /*
189192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu    * since state trackers can allocate depth/stencil/accum buffers, we provide
190192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu    * only color buffers here
191192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu    */
192192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   pfi->stvis.buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK;
193192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   if (doublebuffer)
19463df5a464e984af771b3896d05baa258912ac202José Fonseca      pfi->stvis.buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
195192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu
196192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   pfi->stvis.color_format = color->format;
197192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   pfi->stvis.depth_stencil_format = depth->format;
198192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu
199192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   pfi->stvis.accum_format = (accum) ?
200192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu      PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
201192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu
202192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   pfi->stvis.samples = samples;
203192f06adca5e79b4824d92dc41186592ed57f71eChia-I Wu   pfi->stvis.render_buffer = ST_ATTACHMENT_INVALID;
204e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
2050a2269703c2398d81d8cde439527f883f6fbc502José Fonseca   ++stw_dev->pixelformat_extended_count;
2060a2269703c2398d81d8cde439527f883f6fbc502José Fonseca
2070a2269703c2398d81d8cde439527f883f6fbc502José Fonseca   if(!extended) {
2080a2269703c2398d81d8cde439527f883f6fbc502José Fonseca      ++stw_dev->pixelformat_count;
2090a2269703c2398d81d8cde439527f883f6fbc502José Fonseca      assert(stw_dev->pixelformat_count == stw_dev->pixelformat_extended_count);
2100a2269703c2398d81d8cde439527f883f6fbc502José Fonseca   }
2110a2269703c2398d81d8cde439527f883f6fbc502José Fonseca}
212317a7da2c452f35ef627aec6fc4d31406758725dJosé Fonseca
213ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
214ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul/**
215ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul * Add the depth/stencil/accum/ms variants for a particular color format.
216ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul */
217ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paulstatic void
218ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Pauladd_color_format_variants(const struct stw_pf_color_info *color,
219ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul                          boolean extended)
220db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
221aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca   struct pipe_screen *screen = stw_dev->screen;
222ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   unsigned ms, db, ds, acc;
223ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   unsigned bind_flags = PIPE_BIND_RENDER_TARGET;
2240bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca
225ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   if (!extended) {
226ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      bind_flags |= PIPE_BIND_DISPLAY_TARGET;
227ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   }
228aa405a2a77d51a4f807c5c2f63cbc76eb660e489José Fonseca
229ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   if (!screen->is_format_supported(screen, color->format,
230ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul                                    PIPE_TEXTURE_2D, 0, bind_flags)) {
231ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      return;
2320bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   }
233ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
234ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   for (ms = 0; ms < Elements(stw_pf_multisample); ms++) {
235ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      unsigned samples = stw_pf_multisample[ms];
2369646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca
2379646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca      /* FIXME: re-enabled MSAA when we can query it */
238ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      if (samples)
2399646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca         continue;
2409646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca
241ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      for (db = 0; db < Elements(stw_pf_doublebuffer); db++) {
242ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul         unsigned doublebuffer = stw_pf_doublebuffer[db];
2439646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca
244ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul         for (ds = 0; ds < Elements(stw_pf_depth_stencil); ds++) {
245ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul            const struct stw_pf_depth_info *depth = &stw_pf_depth_stencil[ds];
2469646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca
247ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul            if (!screen->is_format_supported(screen, depth->format,
248ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul                                             PIPE_TEXTURE_2D, 0,
249ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul                                             PIPE_BIND_DEPTH_STENCIL)) {
250ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul               continue;
251ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul            }
2529646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca
253ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul            for (acc = 0; acc < 2; acc++) {
254ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul               stw_pixelformat_add(stw_dev, extended, color, depth,
255ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul                                   acc * 16, doublebuffer, samples);
2569646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca            }
2579646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca         }
2589646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca      }
2599646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca   }
260ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul}
261ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
262ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
263ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paulvoid
264ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paulstw_pixelformat_init( void )
265ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul{
266ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   unsigned i;
267ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
268ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   assert( !stw_dev->pixelformat_count );
269ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   assert( !stw_dev->pixelformat_extended_count );
270ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
271ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   /* normal, displayable formats */
272ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   for (i = 0; i < Elements(stw_pf_color); i++) {
273ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      add_color_format_variants(&stw_pf_color[i], FALSE);
274ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   }
275ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul
276ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   /* extended, pbuffer-only formats */
277ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   for (i = 0; i < Elements(stw_pf_color_extended); i++) {
278ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul      add_color_format_variants(&stw_pf_color_extended[i], TRUE);
279ad9455314d9c5cb9b31af22116841ee3e642a55bBrian Paul   }
2809646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca
2810bca413ce9e5aca4ecbf689fd7aa3da44bb73f4dJosé Fonseca   assert( stw_dev->pixelformat_count <= stw_dev->pixelformat_extended_count );
28287b04ce59b3ed26988b54ca182fab2e9dce03c38José Fonseca   assert( stw_dev->pixelformat_extended_count <= STW_MAX_PIXELFORMATS );
283db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
284db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
285db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecauint
28619068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonsecastw_pixelformat_get_count( void )
287db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
28887b04ce59b3ed26988b54ca182fab2e9dce03c38José Fonseca   return stw_dev->pixelformat_count;
289db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
290db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
291db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonsecauint
29219068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonsecastw_pixelformat_get_extended_count( void )
293db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
29487b04ce59b3ed26988b54ca182fab2e9dce03c38José Fonseca   return stw_dev->pixelformat_extended_count;
295db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
296db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
29719068d93c8f0f1d2b8809248266bf6da3dc6abd7José Fonsecaconst struct stw_pixelformat_info *
2980cf554fa9b31dbac1890f496974392001e2df825José Fonsecastw_pixelformat_get_info( int iPixelFormat )
299db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca{
3000cf554fa9b31dbac1890f496974392001e2df825José Fonseca   int index;
3010cf554fa9b31dbac1890f496974392001e2df825José Fonseca
3020cf554fa9b31dbac1890f496974392001e2df825José Fonseca   if (iPixelFormat <= 0) {
3030cf554fa9b31dbac1890f496974392001e2df825José Fonseca      return NULL;
3040cf554fa9b31dbac1890f496974392001e2df825José Fonseca   }
3050cf554fa9b31dbac1890f496974392001e2df825José Fonseca
3060cf554fa9b31dbac1890f496974392001e2df825José Fonseca   index = iPixelFormat - 1;
3070cf554fa9b31dbac1890f496974392001e2df825José Fonseca   if (index >= stw_dev->pixelformat_extended_count) {
3080cf554fa9b31dbac1890f496974392001e2df825José Fonseca      return NULL;
3090cf554fa9b31dbac1890f496974392001e2df825José Fonseca   }
310db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca
31187b04ce59b3ed26988b54ca182fab2e9dce03c38José Fonseca   return &stw_dev->pixelformats[index];
312db19578b52e7f3d6209568e2e0fa7a7107f42cd4José Fonseca}
313c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
314c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
31531f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaLONG APIENTRY
31631f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaDrvDescribePixelFormat(
317c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell   HDC hdc,
31831f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iPixelFormat,
31931f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   ULONG cjpfd,
32031f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   PIXELFORMATDESCRIPTOR *ppfd )
321c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell{
322c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell   uint count;
323e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   const struct stw_pixelformat_info *pfi;
324c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
325c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell   (void) hdc;
326c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
327e6b66210def2c10f703c2a990b9652ea5419ebbeJosé Fonseca   if (!stw_dev)
328e6b66210def2c10f703c2a990b9652ea5419ebbeJosé Fonseca      return 0;
329e6b66210def2c10f703c2a990b9652ea5419ebbeJosé Fonseca
3309646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca   count = stw_pixelformat_get_count();
331c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
332c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell   if (ppfd == NULL)
333c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell      return count;
3340cf554fa9b31dbac1890f496974392001e2df825José Fonseca   if (cjpfd != sizeof( PIXELFORMATDESCRIPTOR ))
335c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell      return 0;
336c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
3370cf554fa9b31dbac1890f496974392001e2df825José Fonseca   pfi = stw_pixelformat_get_info( iPixelFormat );
3380cf554fa9b31dbac1890f496974392001e2df825José Fonseca   if (!pfi) {
3390cf554fa9b31dbac1890f496974392001e2df825José Fonseca      return 0;
3400cf554fa9b31dbac1890f496974392001e2df825José Fonseca   }
341e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca
342e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca   memcpy(ppfd, &pfi->pfd, sizeof( PIXELFORMATDESCRIPTOR ));
343c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
344c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell   return count;
345c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell}
346c3d744f5bbdc24792183a9ee162ebc6cb5f8d1f6Keith Whitwell
34731f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaBOOL APIENTRY
34831f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaDrvDescribeLayerPlane(
34931f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   HDC hdc,
35031f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iPixelFormat,
35131f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iLayerPlane,
35231f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   UINT nBytes,
35331f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   LPLAYERPLANEDESCRIPTOR plpd )
35431f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca{
35531f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   assert(0);
35631f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   return FALSE;
35731f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca}
35831f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca
35931f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonsecaint APIENTRY
36031f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaDrvGetLayerPaletteEntries(
36131f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   HDC hdc,
36231f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iLayerPlane,
36331f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iStart,
36431f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT cEntries,
36531f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   COLORREF *pcr )
36631f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca{
36731f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   assert(0);
36831f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   return 0;
36931f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca}
37031f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca
37131f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonsecaint APIENTRY
37231f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaDrvSetLayerPaletteEntries(
37331f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   HDC hdc,
37431f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iLayerPlane,
37531f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iStart,
37631f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT cEntries,
37731f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   CONST COLORREF *pcr )
37831f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca{
37931f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   assert(0);
38031f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   return 0;
38131f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca}
38231f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca
38331f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaBOOL APIENTRY
38431f1571d1f6e325c16833afbb6e15b61561e5f1fJosé FonsecaDrvRealizeLayerPalette(
38531f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   HDC hdc,
38631f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   INT iLayerPlane,
38731f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   BOOL bRealize )
38831f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca{
38931f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   assert(0);
39031f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca   return FALSE;
39131f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca}
39231f1571d1f6e325c16833afbb6e15b61561e5f1fJosé Fonseca
393906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell/* Only used by the wgl code, but have it here to avoid exporting the
394906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell * pixelformat.h functionality.
395906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell */
396906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwellint stw_pixelformat_choose( HDC hdc,
397906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell                            CONST PIXELFORMATDESCRIPTOR *ppfd )
398906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell{
399906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell   uint count;
400906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell   uint index;
401906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell   uint bestindex;
402906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell   uint bestdelta;
403906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
404906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell   (void) hdc;
405906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
4069646762261d976d34bee8c8b1dcda9656cec655cJosé Fonseca   count = stw_pixelformat_get_extended_count();
4070cf554fa9b31dbac1890f496974392001e2df825José Fonseca   bestindex = 0;
4080dd81ec97b4fd88fa9267f409a115a98344bc2feJosé Fonseca   bestdelta = ~0U;
409906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
4100cf554fa9b31dbac1890f496974392001e2df825José Fonseca   for (index = 1; index <= count; index++) {
411906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell      uint delta = 0;
412e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      const struct stw_pixelformat_info *pfi = stw_pixelformat_get_info( index );
413906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
414906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell      if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) &&
415906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell          !!(ppfd->dwFlags & PFD_DOUBLEBUFFER) !=
416e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca          !!(pfi->pfd.dwFlags & PFD_DOUBLEBUFFER))
417906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         continue;
418906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
419e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      /* FIXME: Take in account individual channel bits */
420e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      if (ppfd->cColorBits != pfi->pfd.cColorBits)
421906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         delta += 8;
422906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
423e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      if (ppfd->cDepthBits != pfi->pfd.cDepthBits)
424906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         delta += 4;
425906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
426e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      if (ppfd->cStencilBits != pfi->pfd.cStencilBits)
427906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         delta += 2;
428906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
429e5d700721b05910f935c873ebb23d23f49961ebfJosé Fonseca      if (ppfd->cAlphaBits != pfi->pfd.cAlphaBits)
430906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         delta++;
431906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
432906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell      if (delta < bestdelta) {
433906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         bestindex = index;
434906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         bestdelta = delta;
435906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell         if (bestdelta == 0)
436906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell            break;
437906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell      }
438906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell   }
439906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell
4400cf554fa9b31dbac1890f496974392001e2df825José Fonseca   return bestindex;
441906230d16e8950004cb5e1deed14c78f7d9f2817Keith Whitwell}
442