1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_format.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_format.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_icd.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_device.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_pixelformat.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "stw_tls.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct stw_pf_color_info
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char red;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char green;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char blue;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char alpha;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } bits;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char red;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char green;
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char blue;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char alpha;
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } shift;
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct stw_pf_depth_info
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_format format;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char depth;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned char stencil;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } bits;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* NOTE: order matters, since in otherwise equal circumstances the first
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format listed will get chosen */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct stw_pf_color_info
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pf_color[] = {
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* no-alpha */
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B8G8R8X8_UNORM,    { 8,  8,  8,  0}, {16,  8,  0,  0} },
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_X8R8G8B8_UNORM,    { 8,  8,  8,  0}, { 8, 16, 24,  0} },
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B5G6R5_UNORM,      { 5,  6,  5,  0}, {11,  5,  0,  0} },
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* alpha */
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B8G8R8A8_UNORM,    { 8,  8,  8,  8}, {16,  8,  0, 24} },
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_A8R8G8B8_UNORM,    { 8,  8,  8,  8}, { 8, 16, 24,  0} },
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_R10G10B10A2_UNORM, {10, 10, 10,  2}, { 0, 10, 20, 30} },
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B5G5R5A1_UNORM,    { 5,  5,  5,  1}, {10,  5,  0, 15} },
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_B4G4R4A4_UNORM,    { 4,  4,  4,  4}, {16,  4,  0, 12} }
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct stw_pf_color_info
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pf_color_extended[] = {
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    { PIPE_FORMAT_R32G32B32A32_FLOAT, { 32,  32, 32,  32}, { 0,  32, 64, 96} }
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct stw_pf_depth_info
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pf_depth_stencil[] = {
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* pure depth */
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_Z32_UNORM,   {32, 0} },
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_X8Z24_UNORM, {24, 0} },
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_Z24X8_UNORM, {24, 0} },
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_Z16_UNORM,   {16, 0} },
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* combined depth-stencil */
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_Z24_UNORM_S8_UINT, {24, 8} },
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   { PIPE_FORMAT_S8_UINT_Z24_UNORM, {24, 8} }
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const boolean
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pf_doublebuffer[] = {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FALSE,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TRUE,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst unsigned
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pf_multisample[] = {
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   0,
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   4
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pixelformat_add(
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct stw_device *stw_dev,
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean extended,
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct stw_pf_color_info *color,
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct stw_pf_depth_info *depth,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned accum,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean doublebuffer,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned samples )
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct stw_pixelformat_info *pfi;
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(stw_dev->pixelformat_extended_count < STW_MAX_PIXELFORMATS);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(stw_dev->pixelformat_extended_count >= STW_MAX_PIXELFORMATS)
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 0) == color->bits.red);
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 1) == color->bits.green);
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 2) == color->bits.blue);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(util_format_get_component_bits(color->format, UTIL_FORMAT_COLORSPACE_RGB, 3) == color->bits.alpha);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(util_format_get_component_bits(depth->format, UTIL_FORMAT_COLORSPACE_ZS, 0) == depth->bits.depth);
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(util_format_get_component_bits(depth->format, UTIL_FORMAT_COLORSPACE_ZS, 1) == depth->bits.stencil);
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi = &stw_dev->pixelformats[stw_dev->pixelformat_extended_count];
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(pfi, 0, sizeof *pfi);
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.nSize = sizeof pfi->pfd;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.nVersion = 1;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.dwFlags = PFD_SUPPORT_OPENGL;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* TODO: also support non-native pixel formats */
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!extended) {
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pfi->pfd.dwFlags |= PFD_DRAW_TO_WINDOW;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* See http://www.opengl.org/pipeline/article/vol003_7/ */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.dwFlags |= PFD_SUPPORT_COMPOSITION;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (doublebuffer)
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pfi->pfd.dwFlags |= PFD_DOUBLEBUFFER | PFD_SWAP_COPY;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.iPixelType = PFD_TYPE_RGBA;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cColorBits = color->bits.red + color->bits.green + color->bits.blue + color->bits.alpha;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cRedBits = color->bits.red;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cRedShift = color->shift.red;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cGreenBits = color->bits.green;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cGreenShift = color->shift.green;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cBlueBits = color->bits.blue;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cBlueShift = color->shift.blue;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAlphaBits = color->bits.alpha;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAlphaShift = color->shift.alpha;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAccumBits = 4*accum;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAccumRedBits = accum;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAccumGreenBits = accum;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAccumBlueBits = accum;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAccumAlphaBits = accum;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cDepthBits = depth->bits.depth;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cStencilBits = depth->bits.stencil;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.cAuxBuffers = 0;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.iLayerType = 0;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.bReserved = 0;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.dwLayerMask = 0;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.dwVisibleMask = 0;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->pfd.dwDamageMask = 0;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /*
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * since state trackers can allocate depth/stencil/accum buffers, we provide
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * only color buffers here
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->stvis.buffer_mask = ST_ATTACHMENT_FRONT_LEFT_MASK;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (doublebuffer)
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pfi->stvis.buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->stvis.color_format = color->format;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->stvis.depth_stencil_format = depth->format;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->stvis.accum_format = (accum) ?
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->stvis.samples = samples;
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi->stvis.render_buffer = ST_ATTACHMENT_INVALID;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++stw_dev->pixelformat_extended_count;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(!extended) {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++stw_dev->pixelformat_count;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(stw_dev->pixelformat_count == stw_dev->pixelformat_extended_count);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Add the depth/stencil/accum/ms variants for a particular color format.
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgadd_color_format_variants(const struct stw_pf_color_info *color,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          boolean extended)
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *screen = stw_dev->screen;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned ms, db, ds, acc;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned bind_flags = PIPE_BIND_RENDER_TARGET;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!extended) {
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bind_flags |= PIPE_BIND_DISPLAY_TARGET;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!screen->is_format_supported(screen, color->format,
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    PIPE_TEXTURE_2D, 0, bind_flags)) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (ms = 0; ms < Elements(stw_pf_multisample); ms++) {
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned samples = stw_pf_multisample[ms];
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* FIXME: re-enabled MSAA when we can query it */
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (samples)
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (db = 0; db < Elements(stw_pf_doublebuffer); db++) {
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned doublebuffer = stw_pf_doublebuffer[db];
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (ds = 0; ds < Elements(stw_pf_depth_stencil); ds++) {
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            const struct stw_pf_depth_info *depth = &stw_pf_depth_stencil[ds];
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (!screen->is_format_supported(screen, depth->format,
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_TEXTURE_2D, 0,
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_BIND_DEPTH_STENCIL)) {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               continue;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (acc = 0; acc < 2; acc++) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               stw_pixelformat_add(stw_dev, extended, color, depth,
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                   acc * 16, doublebuffer, samples);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pixelformat_init( void )
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( !stw_dev->pixelformat_count );
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( !stw_dev->pixelformat_extended_count );
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* normal, displayable formats */
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < Elements(stw_pf_color); i++) {
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      add_color_format_variants(&stw_pf_color[i], FALSE);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* extended, pbuffer-only formats */
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < Elements(stw_pf_color_extended); i++) {
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      add_color_format_variants(&stw_pf_color_extended[i], TRUE);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( stw_dev->pixelformat_count <= stw_dev->pixelformat_extended_count );
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert( stw_dev->pixelformat_extended_count <= STW_MAX_PIXELFORMATS );
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pixelformat_get_count( void )
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return stw_dev->pixelformat_count;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pixelformat_get_extended_count( void )
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return stw_dev->pixelformat_extended_count;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct stw_pixelformat_info *
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstw_pixelformat_get_info( int iPixelFormat )
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int index;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (iPixelFormat <= 0) {
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   index = iPixelFormat - 1;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= stw_dev->pixelformat_extended_count) {
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &stw_dev->pixelformats[index];
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLONG APIENTRY
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDrvDescribePixelFormat(
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HDC hdc,
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iPixelFormat,
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ULONG cjpfd,
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PIXELFORMATDESCRIPTOR *ppfd )
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint count;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct stw_pixelformat_info *pfi;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) hdc;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!stw_dev)
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   count = stw_pixelformat_get_count();
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ppfd == NULL)
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return count;
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cjpfd != sizeof( PIXELFORMATDESCRIPTOR ))
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pfi = stw_pixelformat_get_info( iPixelFormat );
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!pfi) {
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memcpy(ppfd, &pfi->pfd, sizeof( PIXELFORMATDESCRIPTOR ));
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return count;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBOOL APIENTRY
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDrvDescribeLayerPlane(
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HDC hdc,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iPixelFormat,
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iLayerPlane,
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   UINT nBytes,
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LPLAYERPLANEDESCRIPTOR plpd )
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(0);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint APIENTRY
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDrvGetLayerPaletteEntries(
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HDC hdc,
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iLayerPlane,
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iStart,
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT cEntries,
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   COLORREF *pcr )
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(0);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint APIENTRY
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDrvSetLayerPaletteEntries(
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HDC hdc,
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iLayerPlane,
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iStart,
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT cEntries,
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CONST COLORREF *pcr )
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(0);
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBOOL APIENTRY
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDrvRealizeLayerPalette(
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   HDC hdc,
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INT iLayerPlane,
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BOOL bRealize )
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(0);
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Only used by the wgl code, but have it here to avoid exporting the
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pixelformat.h functionality.
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint stw_pixelformat_choose( HDC hdc,
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            CONST PIXELFORMATDESCRIPTOR *ppfd )
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint count;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint index;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint bestindex;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint bestdelta;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) hdc;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   count = stw_pixelformat_get_extended_count();
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bestindex = 0;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bestdelta = ~0U;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (index = 1; index <= count; index++) {
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint delta = 0;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct stw_pixelformat_info *pfi = stw_pixelformat_get_info( index );
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) &&
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          !!(ppfd->dwFlags & PFD_DOUBLEBUFFER) !=
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          !!(pfi->pfd.dwFlags & PFD_DOUBLEBUFFER))
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* FIXME: Take in account individual channel bits */
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ppfd->cColorBits != pfi->pfd.cColorBits)
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         delta += 8;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ppfd->cDepthBits != pfi->pfd.cDepthBits)
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         delta += 4;
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ppfd->cStencilBits != pfi->pfd.cStencilBits)
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         delta += 2;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ppfd->cAlphaBits != pfi->pfd.cAlphaBits)
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         delta++;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (delta < bestdelta) {
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bestindex = index;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bestdelta = delta;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (bestdelta == 0)
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return bestindex;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
442