1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009, VMware, Inc.
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 VMWARE 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 * Author: Keith Whitwell <keithw@vmware.com>
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Jakob Bornecrantz <wallbraker@gmail.com>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "utils.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xmlpool.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "dri_screen.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_screen.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_format.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/st_gl_api.h" /* for st_gl_api_create */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MSAA_VISUAL_MAX_SAMPLES 8
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef false
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPUBLIC const char __driConfigOptions[] =
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DRI_CONF_BEGIN
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI_CONF_SECTION_PERFORMANCE
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI_CONF_SECTION_END
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI_CONF_SECTION_QUALITY
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*       DRI_CONF_FORCE_S3TC_ENABLE(false) */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_ALLOW_LARGE_TEXTURES(1)
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_PP_CELSHADE(0)
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_PP_NORED(0)
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_PP_NOGREEN(0)
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_PP_NOBLUE(0)
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_PP_JIMENEZMLAA(0, 0, 32)
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_PP_JIMENEZMLAA_COLOR(0, 0, 32)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI_CONF_SECTION_END
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI_CONF_SECTION_DEBUG
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false)
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DRI_CONF_SECTION_END
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DRI_CONF_END;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define false 0
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const uint __driNConfigOptions = 10;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const __DRIconfig **
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_fill_in_modes(struct dri_screen *screen,
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  unsigned pixel_bits)
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIconfig **configs = NULL;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIconfig **configs_r5g6b5 = NULL;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIconfig **configs_a8r8g8b8 = NULL;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIconfig **configs_x8r8g8b8 = NULL;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t depth_bits_array[5];
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t stencil_bits_array[5];
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t msaa_samples_array[MSAA_VISUAL_MAX_SAMPLES];
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned depth_buffer_factor;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned back_buffer_factor;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned msaa_samples_factor, msaa_samples_max;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_screen *p_screen = screen->base.screen;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean pf_r5g6b5, pf_a8r8g8b8, pf_x8r8g8b8;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean pf_z16, pf_x8z24, pf_z24x8, pf_s8z24, pf_z24s8, pf_z32;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const GLenum back_buffer_modes[] = {
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   };
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depth_bits_array[0] = 0;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stencil_bits_array[0] = 0;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   depth_buffer_factor = 1;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   msaa_samples_max = (screen->st_api->feature_mask & ST_API_FEATURE_MS_VISUALS)
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? MSAA_VISUAL_MAX_SAMPLES : 1;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_x8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24X8_UNORM,
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					    PIPE_TEXTURE_2D, 0,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            PIPE_BIND_DEPTH_STENCIL);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_z24x8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_X8Z24_UNORM,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					    PIPE_TEXTURE_2D, 0,
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            PIPE_BIND_DEPTH_STENCIL);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_s8z24 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z24_UNORM_S8_UINT,
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					    PIPE_TEXTURE_2D, 0,
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            PIPE_BIND_DEPTH_STENCIL);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_z24s8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_S8_UINT_Z24_UNORM,
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					    PIPE_TEXTURE_2D, 0,
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                            PIPE_BIND_DEPTH_STENCIL);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_a8r8g8b8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8A8_UNORM,
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       PIPE_TEXTURE_2D, 0,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               PIPE_BIND_RENDER_TARGET);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_x8r8g8b8 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8X8_UNORM,
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       PIPE_TEXTURE_2D, 0,
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                               PIPE_BIND_RENDER_TARGET);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pf_r5g6b5 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_B5G6R5_UNORM,
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					     PIPE_TEXTURE_2D, 0,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_BIND_RENDER_TARGET);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* We can only get a 16 or 32 bit depth buffer with getBuffersWithFormat */
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dri_with_format(screen->sPriv)) {
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pf_z16 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z16_UNORM,
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_TEXTURE_2D, 0,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_BIND_DEPTH_STENCIL);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pf_z32 = p_screen->is_format_supported(p_screen, PIPE_FORMAT_Z32_UNORM,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_TEXTURE_2D, 0,
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PIPE_BIND_DEPTH_STENCIL);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pf_z16 = FALSE;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pf_z32 = FALSE;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_z16) {
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth_bits_array[depth_buffer_factor] = 16;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stencil_bits_array[depth_buffer_factor++] = 0;
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_x8z24 || pf_z24x8) {
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth_bits_array[depth_buffer_factor] = 24;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stencil_bits_array[depth_buffer_factor++] = 0;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->d_depth_bits_last = pf_x8z24;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_s8z24 || pf_z24s8) {
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth_bits_array[depth_buffer_factor] = 24;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stencil_bits_array[depth_buffer_factor++] = 8;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->sd_depth_bits_last = pf_s8z24;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_z32) {
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      depth_bits_array[depth_buffer_factor] = 32;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stencil_bits_array[depth_buffer_factor++] = 0;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   msaa_samples_array[0] = 0;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   back_buffer_factor = 3;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Also test for color multisample support - just assume it'll work
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * for all depth buffers.
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_r5g6b5) {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      msaa_samples_factor = 1;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 2; i <= msaa_samples_max; i++) {
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B5G6R5_UNORM,
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   PIPE_TEXTURE_2D, i,
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   PIPE_BIND_RENDER_TARGET)) {
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            msaa_samples_array[msaa_samples_factor] = i;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            msaa_samples_factor++;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs_r5g6b5 = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        depth_bits_array, stencil_bits_array,
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        depth_buffer_factor, back_buffer_modes,
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        back_buffer_factor,
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        msaa_samples_array, msaa_samples_factor,
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                        GL_TRUE);
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_a8r8g8b8) {
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      msaa_samples_factor = 1;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 2; i <= msaa_samples_max; i++) {
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8A8_UNORM,
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   PIPE_TEXTURE_2D, i,
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   PIPE_BIND_RENDER_TARGET)) {
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            msaa_samples_array[msaa_samples_factor] = i;
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            msaa_samples_factor++;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          depth_bits_array,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          stencil_bits_array,
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          depth_buffer_factor,
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          back_buffer_modes,
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          back_buffer_factor,
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          msaa_samples_array,
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          msaa_samples_factor,
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          GL_TRUE);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pf_x8r8g8b8) {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      msaa_samples_factor = 1;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 2; i <= msaa_samples_max; i++) {
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (p_screen->is_format_supported(p_screen, PIPE_FORMAT_B8G8R8X8_UNORM,
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						   PIPE_TEXTURE_2D, i,
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                   PIPE_BIND_RENDER_TARGET)) {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            msaa_samples_array[msaa_samples_factor] = i;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            msaa_samples_factor++;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          depth_bits_array,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          stencil_bits_array,
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          depth_buffer_factor,
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          back_buffer_modes,
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          back_buffer_factor,
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          msaa_samples_array,
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          msaa_samples_factor,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          GL_TRUE);
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pixel_bits == 16) {
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs = configs_r5g6b5;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs = driConcatConfigs(configs, configs_a8r8g8b8);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs = driConcatConfigs(configs, configs_x8r8g8b8);
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs = configs_a8r8g8b8;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs = driConcatConfigs(configs, configs_x8r8g8b8);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      configs = driConcatConfigs(configs, configs_r5g6b5);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (configs == NULL) {
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf("%s: driCreateConfigs failed\n", __FUNCTION__);
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (const __DRIconfig **)configs;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Roughly the converse of dri_fill_in_modes.
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_fill_st_visual(struct st_visual *stvis, struct dri_screen *screen,
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const struct gl_config *mode)
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(stvis, 0, sizeof(*stvis));
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!mode)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stvis->samples = mode->samples;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mode->redBits == 8) {
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mode->alphaBits == 8)
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stvis->color_format = PIPE_FORMAT_B8G8R8A8_UNORM;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stvis->color_format = PIPE_FORMAT_B8G8R8X8_UNORM;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->color_format = PIPE_FORMAT_B5G6R5_UNORM;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode->depthBits) {
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0:
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->depth_stencil_format = PIPE_FORMAT_NONE;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 16:
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->depth_stencil_format = PIPE_FORMAT_Z16_UNORM;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 24:
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mode->stencilBits == 0) {
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 stvis->depth_stencil_format = (screen->d_depth_bits_last) ?
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          PIPE_FORMAT_Z24X8_UNORM:
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          PIPE_FORMAT_X8Z24_UNORM;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 stvis->depth_stencil_format = (screen->sd_depth_bits_last) ?
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          PIPE_FORMAT_Z24_UNORM_S8_UINT:
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          PIPE_FORMAT_S8_UINT_Z24_UNORM;
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 32:
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->depth_stencil_format = PIPE_FORMAT_Z32_UNORM;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stvis->accum_format = (mode->haveAccumBuffer) ?
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      PIPE_FORMAT_R16G16B16A16_SNORM : PIPE_FORMAT_NONE;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stvis->buffer_mask |= ST_ATTACHMENT_FRONT_LEFT_MASK;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stvis->render_buffer = ST_ATTACHMENT_FRONT_LEFT;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mode->doubleBufferMode) {
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->buffer_mask |= ST_ATTACHMENT_BACK_LEFT_MASK;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->render_buffer = ST_ATTACHMENT_BACK_LEFT;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mode->stereoMode) {
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->buffer_mask |= ST_ATTACHMENT_FRONT_RIGHT_MASK;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (mode->doubleBufferMode)
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         stvis->buffer_mask |= ST_ATTACHMENT_BACK_RIGHT_MASK;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mode->haveDepthBuffer || mode->haveStencilBuffer)
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stvis->buffer_mask |= ST_ATTACHMENT_DEPTH_STENCIL_MASK;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* let the state tracker allocate the accum buffer */
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_get_egl_image(struct st_manager *smapi,
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  void *egl_image,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct st_egl_image *stimg)
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri_screen *screen = (struct dri_screen *)smapi;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __DRIimage *img = NULL;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->lookup_egl_image) {
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      img = screen->lookup_egl_image(screen, egl_image);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!img)
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stimg->texture = NULL;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pipe_resource_reference(&stimg->texture, img->texture);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stimg->level = img->level;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   stimg->layer = img->layer;
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_get_param(struct st_manager *smapi,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              enum st_manager_param param)
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri_screen *screen = (struct dri_screen *)smapi;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(param) {
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ST_MANAGER_BROKEN_INVALIDATE:
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return screen->broken_invalidate;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_destroy_option_cache(struct dri_screen * screen)
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->optionCache.info) {
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < (1 << screen->optionCache.tableSize); ++i) {
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FREE(screen->optionCache.info[i].name);
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FREE(screen->optionCache.info[i].ranges);
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(screen->optionCache.info);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(screen->optionCache.values);
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_destroy_screen_helper(struct dri_screen * screen)
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->st_api && screen->st_api->destroy)
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->st_api->destroy(screen->st_api);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (screen->base.screen)
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->base.screen->destroy(screen->base.screen);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri_destroy_option_cache(screen);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_destroy_screen(__DRIscreen * sPriv)
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct dri_screen *screen = dri_screen(sPriv);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dri_destroy_screen_helper(screen);
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FREE(screen);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sPriv->driverPrivate = NULL;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sPriv->extensions = NULL;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst __DRIconfig **
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdri_init_screen_helper(struct dri_screen *screen,
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       struct pipe_screen *pscreen,
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       unsigned pixel_bits)
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->base.screen = pscreen;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!screen->base.screen) {
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf("%s: failed to create pipe_screen\n", __FUNCTION__);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->base.get_egl_image = dri_get_egl_image;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->base.get_param = dri_get_param;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   screen->st_api = st_gl_api_create();
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!screen->st_api)
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if(pscreen->get_param(pscreen, PIPE_CAP_NPOT_TEXTURES))
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->target = PIPE_TEXTURE_2D;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      screen->target = PIPE_TEXTURE_RECT;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   driParseOptionInfo(&screen->optionCache,
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      __driConfigOptions, __driNConfigOptions);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dri_fill_in_modes(screen, pixel_bits);
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=3 ts=8 sts=3 expandtab: */
421