intel_screen.c revision 7c50d29f7ced3d60e52ee0146d982b49ea421de2
177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**************************************************************************
277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * All Rights Reserved.
577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * copy of this software and associated documentation files (the
877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * "Software"), to deal in the Software without restriction, including
977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * without limitation the rights to use, copy, modify, merge, publish,
1077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to
1177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * permit persons to whom the Software is furnished to do so, subject to
1277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * the following conditions:
1377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
1477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * The above copyright notice and this permission notice (including the
1577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * next paragraph) shall be included in all copies or substantial portions
1677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * of the Software.
1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt **************************************************************************/
2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
29ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h"
326c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
3377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h"
3477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "vblank.h"
3577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h"
3677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
376c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_batchbuffer.h"
3877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffers.h"
396c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_bufmgr.h"
406c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_chipset.h"
414006c5e4526a1cdb910500764590e39d32750967Brian Paul#include "intel_extensions.h"
4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_fbo.h"
436c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_regions.h"
446fcebbe719eab1f8e292c8dcd6c3e898b0f8d261Brian Paul#include "intel_swapbuffers.h"
456c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_screen.h"
466c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_span.h"
476c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_tex.h"
4877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
49bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#include "i915_drm.h"
5077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "i830_dri.h"
516c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
521ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt#define DRI_CONF_TEXTURE_TILING(def) \
531ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt	DRI_CONF_OPT_BEGIN(texture_tiling, bool, def)		\
541ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt		DRI_CONF_DESC(en, "Enable texture tiling")	\
551ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt	DRI_CONF_OPT_END					\
5677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
58a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
59a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
60e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
61fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
64f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
65fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
66fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
67fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
68fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
69fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
701ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
71a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915
72a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(false)
73a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else
74a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(true)
75a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif
761ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
77b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
78b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
79b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
80b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
81862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, false)
82862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
83862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
84862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt
85a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
86a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
87a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
88acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
89a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
90a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
9240bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
93f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
9481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
9581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
9681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
9781aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
98a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
99a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
100a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
1011e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11;
10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
10485063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Map all the memory regions described by the screen.
10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return GL_TRUE if success, GL_FALSE if error.
11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtGLboolean
11277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelMapScreenRegions(__DRIscreenPrivate * sPriv)
11377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
11477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
11577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
11677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (0)
11777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_printf("TEX 0x%08x ", intelScreen->tex.handle);
11877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (intelScreen->tex.size != 0) {
11977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (drmMap(sPriv->fd,
12077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt		 intelScreen->tex.handle,
12177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt		 intelScreen->tex.size,
12277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt		 (drmAddress *) & intelScreen->tex.map) != 0) {
12377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 intelUnmapScreenRegions(intelScreen);
12477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
12577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
12677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
12777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
12877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   return GL_TRUE;
12977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
13077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
13177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtvoid
13277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUnmapScreenRegions(intelScreenPrivate * intelScreen)
13377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
13477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (intelScreen->tex.map) {
13577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      drmUnmap(intelScreen->tex.map, intelScreen->tex.size);
13677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->tex.map = NULL;
13777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
13877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
13977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
14077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
14177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
14277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelPrintDRIInfo(intelScreenPrivate * intelScreen,
14377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  __DRIscreenPrivate * sPriv, I830DRIPtr gDRIPriv)
14477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
14577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Front size:   0x%x  offset: 0x%x  pitch: %d\n",
14677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->front.size, intelScreen->front.offset,
14746eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg           intelScreen->pitch);
14877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Back size:    0x%x  offset: 0x%x  pitch: %d\n",
14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->back.size, intelScreen->back.offset,
15046eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg           intelScreen->pitch);
15177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Depth size:   0x%x  offset: 0x%x  pitch: %d\n",
15277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->depth.size, intelScreen->depth.offset,
15346eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg           intelScreen->pitch);
15477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Texture size: 0x%x  offset: 0x%x\n",
15577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->tex.size, intelScreen->tex.offset);
15677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Memory : 0x%x\n", gDRIPriv->mem);
15777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
15877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
15977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
16077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
16139e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo AaltonenintelPrintSAREA(const drm_i915_sarea_t * sarea)
16277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
16377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "SAREA: sarea width %d  height %d\n", sarea->width,
16477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->height);
16577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "SAREA: pitch: %d\n", sarea->pitch);
16677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr,
167f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           "SAREA: front offset: 0x%08x  size: 0x%x  handle: 0x%x tiled: %d\n",
16877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->front_offset, sarea->front_size,
169f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           (unsigned) sarea->front_handle, sarea->front_tiled);
17077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr,
171f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           "SAREA: back  offset: 0x%08x  size: 0x%x  handle: 0x%x tiled: %d\n",
17277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->back_offset, sarea->back_size,
173f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           (unsigned) sarea->back_handle, sarea->back_tiled);
174f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie   fprintf(stderr, "SAREA: depth offset: 0x%08x  size: 0x%x  handle: 0x%x tiled: %d\n",
17577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->depth_offset, sarea->depth_size,
176f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           (unsigned) sarea->depth_handle, sarea->depth_tiled);
17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "SAREA: tex   offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
17877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->tex_offset, sarea->tex_size, (unsigned) sarea->tex_handle);
17977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
18077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
18177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
18277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * A number of the screen parameters are obtained/computed from
18477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * information in the SAREA.  This function updates those parameters.
18577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
186aae2729aeb3f6eed26e8f7673f47f2b978786bb1Brian Paulstatic void
18777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
18839e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen                           drm_i915_sarea_t * sarea)
18977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
19077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->width = sarea->width;
19177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->height = sarea->height;
19246eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg   intelScreen->pitch = sarea->pitch;
19377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
19477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->front.offset = sarea->front_offset;
19577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->front.handle = sarea->front_handle;
19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->front.size = sarea->front_size;
197f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt   intelScreen->front.tiled = sarea->front_tiled;
19877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
19977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->back.offset = sarea->back_offset;
20077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->back.handle = sarea->back_handle;
20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->back.size = sarea->back_size;
202f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt   intelScreen->back.tiled = sarea->back_tiled;
20377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
20477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->depth.offset = sarea->depth_offset;
20577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->depth.handle = sarea->depth_handle;
20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->depth.size = sarea->depth_size;
207f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt   intelScreen->depth.tiled = sarea->depth_tiled;
20877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
20977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (intelScreen->driScrnPriv->ddx_version.minor >= 9) {
21077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->front.bo_handle = sarea->front_bo_handle;
21177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->back.bo_handle = sarea->back_bo_handle;
21277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->depth.bo_handle = sarea->depth_bo_handle;
21377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   } else {
21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->front.bo_handle = -1;
21577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->back.bo_handle = -1;
21677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->depth.bo_handle = -1;
21777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
21977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->tex.offset = sarea->tex_offset;
22077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->logTextureGranularity = sarea->log_tex_granularity;
22177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->tex.handle = sarea->tex_handle;
22277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->tex.size = sarea->tex_size;
22377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
22477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (0)
22577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelPrintSAREA(sarea);
22677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
22777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
22877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = {
22977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   { __DRI_TEX_OFFSET },
23077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelSetTexOffset,
23177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
23277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2336d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
2346d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
2356d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
23666175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
2376d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
2386d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
2397c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
2407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
2417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
2427c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
2437c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
2447c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->gen < 4)
2457c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      INTEL_FIREVERTICES(intel);
2467c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
2477c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->batch->map != intel->batch->ptr)
2487c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      intel_batchbuffer_flush(intel->batch);
2497c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
2507c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
2517c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
2527c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2FlushInvalidate(__DRIdrawable *drawable)
2537c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
2547c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   intelDRI2Flush(drawable);
2557c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   drawable->validBuffers = GL_FALSE;
2567c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
2577c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
2587c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
2597c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
2607c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
2617c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2FlushInvalidate,
2627c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
2637c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
264e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
26577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driReadDrawableExtension,
26677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driCopySubBufferExtension.base,
26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driSwapControlExtension.base,
26877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driFrameTrackingExtension.base,
26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driMediaStreamCounterExtension.base,
27077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &intelTexOffsetExtension.base,
2716d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
2727c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
27377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
27477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean
27724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergintel_get_param(__DRIscreenPrivate *psp, int param, int *value)
27824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
27924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
2801c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
28124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
28224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
28324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
28424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
2851c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
28624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
28742e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul      _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
28824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
28924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
29024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
29124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   return GL_TRUE;
29224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
29377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen;
29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv;
29839e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen   drm_i915_sarea_t *sarea;
29977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
30077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      fprintf(stderr,
30277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt              "\nERROR!  sizeof(I830DRIRec) does not match passed size from device driver\n");
30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;
30477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
30677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Allocate the private area */
30777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));
30877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!intelScreen) {
30977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
31077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;
31177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
31277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* parse information in __driConfigOptions */
31377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   driParseOptionInfo(&intelScreen->optionCache,
31477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                      __driConfigOptions, __driNConfigOptions);
31577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->driScrnPriv = sPriv;
31777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = (void *) intelScreen;
31839e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen   sarea = (drm_i915_sarea_t *)
3193628185f566e178a12b493fb89abf52b4b281f99Eric Anholt      (((GLubyte *) sPriv->pSAREA) + gDRIPriv->sarea_priv_offset);
3203628185f566e178a12b493fb89abf52b4b281f99Eric Anholt   intelScreen->sarea = sarea;
32177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->deviceID = gDRIPriv->deviceID;
32377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelUpdateScreenFromSAREA(intelScreen, sarea);
32577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!intelMapScreenRegions(sPriv)) {
32777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      fprintf(stderr, "\nERROR!  mapping regions\n");
32877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_free(intelScreen);
32977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      sPriv->private = NULL;
33077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;
33177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
33277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (0)
33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv);
33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
33677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->drmMinor = sPriv->drm_version.minor;
33777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
33877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Determine if IRQs are active? */
3391c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   if (!intel_get_param(sPriv, I915_PARAM_IRQ_ACTIVE,
34024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg			&intelScreen->irq_active))
34124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
34277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
343e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   sPriv->extensions = intelScreenExtensions;
34477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   return GL_TRUE;
34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
34777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyScreen(__DRIscreenPrivate * sPriv)
35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
35377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
354904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
35577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelUnmapScreenRegions(intelScreen);
3566d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
35777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
35977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
36177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
36477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
36677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
36777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  __DRIdrawablePrivate * driDrawPriv,
36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  const __GLcontextModes * mesaVis, GLboolean isPixmap)
37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
37277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;          /* not implemented */
37377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
37477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
37577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLboolean swStencil = (mesaVis->stencilBits > 0 &&
37677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                             mesaVis->depthBits != 24);
3774a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
37877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
37977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer);
38077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (!intel_fb)
38277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
38377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
38477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis);
38577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
386119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
3874a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
388119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
389409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
390119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
3914a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
392119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
39377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
394f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat);
395f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,
396f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie			     &intel_fb->color_rb[0]->Base);
39777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
399f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie	 intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat);
400f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie
40177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
40277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt				&intel_fb->color_rb[1]->Base);
40377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
40477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
40577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
40638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
40738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 if (mesaVis->stencilBits == 8) {
40838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* combined depth/stencil buffer */
40938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthStencilRb
4104a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
41138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* note: bind RB to two attachment points */
41238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,
41338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt				   &depthStencilRb->Base);
41438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL,
41538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt				   &depthStencilRb->Base);
41638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 } else {
41738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthRb
4184a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
41938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,
42038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt				   &depthRb->Base);
42138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 }
42277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
42377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
42477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
42577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
4264a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
42777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base);
42877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
42977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
43077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
43177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_add_soft_renderbuffers(&intel_fb->Base,
43277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw color */
43377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw depth */
43477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   swStencil, mesaVis->accumRedBits > 0,
43577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw alpha */
43677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE  /* never sw aux */ );
43777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      driDrawPriv->driverPrivate = (void *) intel_fb;
43877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
43977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_TRUE;
44077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
44177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
44277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
44377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
44477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv)
44577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
446d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   struct intel_framebuffer *intel_fb = driDrawPriv->driverPrivate;
447d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   struct intel_renderbuffer *depth_rb;
448d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   struct intel_renderbuffer *stencil_rb;
449d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
450d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   if (intel_fb) {
451d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (intel_fb->color_rb[0]) {
452d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(intel_fb->color_rb[0], NULL);
453d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
454d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
455d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (intel_fb->color_rb[1]) {
456d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(intel_fb->color_rb[1], NULL);
457d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
458d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
459d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      depth_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH);
460d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (depth_rb) {
461d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(depth_rb, NULL);
462d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
463d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
464d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      stencil_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL);
465d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (stencil_rb) {
466d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(stencil_rb, NULL);
467d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
468d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   }
469d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
4700f04a1d3f8989b0a391e6dad80abf06ce151d1f1Brian Paul   _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
47177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
47277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
47577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Get information about previous buffer swaps.
47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
47777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic int
47877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo)
47977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
48077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   struct intel_framebuffer *intel_fb;
48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
48277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if ((dPriv == NULL) || (dPriv->driverPrivate == NULL)
48377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt       || (sInfo == NULL)) {
48477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return -1;
48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
48677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intel_fb = dPriv->driverPrivate;
48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_count = intel_fb->swap_count;
48977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_ust = intel_fb->swap_ust;
49077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_missed_count = intel_fb->swap_missed_count;
49177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
49277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)
49377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      ? driCalculateSwapUsage(dPriv, 0, intel_fb->swap_missed_ust)
49477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      : 0.0;
49577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
49677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   return 0;
49777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
49877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
49977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
50077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
50177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
50277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
50377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
50477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,
50577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   __DRIcontextPrivate * driContextPriv,
50677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
50777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,
50977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   __DRIcontextPrivate * driContextPriv,
51077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
511bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,
512bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  __DRIcontextPrivate * driContextPriv,
513bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  void *sharedContextPrivate);
51477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
51577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
51677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis,
51777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   __DRIcontextPrivate * driContextPriv,
51877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
51977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
52077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
52177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
52277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
523bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
52419420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
52519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
52619420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt	 return i915CreateContext(mesaVis, driContextPriv,
527bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
52819420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
529bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
530cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie      intelScreen->no_vbo = GL_TRUE;
53177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
53277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
533bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
534bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
535bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);
536bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
537bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);
538bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   return GL_FALSE;
53977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
54077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
54177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
542e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIconfig **
5436cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian HøgsbergintelFillInModes(__DRIscreenPrivate *psp,
5446cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg		 unsigned pixel_bits, unsigned depth_bits,
54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                 unsigned stencil_bits, GLboolean have_back_buffer)
54677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
547e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   __DRIconfig **configs;
54877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   __GLcontextModes *m;
54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   unsigned depth_buffer_factor;
55077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   unsigned back_buffer_factor;
551e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   int i;
55277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
55377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const GLenum back_buffer_modes[] = {
5547c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg       GLX_NONE, GLX_SWAP_UNDEFINED_OML,
5557c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg       GLX_SWAP_EXCHANGE_OML, GLX_SWAP_COPY_OML
55677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   };
55777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5585a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint8_t depth_bits_array[3];
5595a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint8_t stencil_bits_array[3];
560e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t msaa_samples_array[1];
56177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
56277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_bits_array[0] = 0;
56377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_bits_array[1] = depth_bits;
56477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_bits_array[2] = depth_bits;
56577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
56677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Just like with the accumulation buffer, always provide some modes
56777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * with a stencil buffer.  It will be a sw fallback, but some apps won't
56877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * care about that.
56977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
57077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   stencil_bits_array[0] = 0;
57177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   stencil_bits_array[1] = 0;
57277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (depth_bits == 24)
57377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
57477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
57577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
57677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
577eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
578eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
57977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
58077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   back_buffer_factor = (have_back_buffer) ? 3 : 1;
58177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
58277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (pixel_bits == 16) {
5835d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
5845d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 depth_bits_array, stencil_bits_array,
5855d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 depth_buffer_factor, back_buffer_modes,
5865d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 back_buffer_factor,
5875d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 msaa_samples_array, 1);
58877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
58977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
5905d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **configs_a8r8g8b8;
5915d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **configs_x8r8g8b8;
5925d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt
5935d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
5945d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_bits_array,
5955d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  stencil_bits_array,
5965d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_buffer_factor,
5975d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_modes,
5985d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_factor,
5995d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  msaa_samples_array, 1);
6005d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV,
6015d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_bits_array,
6025d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  stencil_bits_array,
6035d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_buffer_factor,
6045d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_modes,
6055d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_factor,
6065d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  msaa_samples_array, 1);
6075d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs = driConcatConfigs(configs_a8r8g8b8, configs_x8r8g8b8);
60877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
60977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
610e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   if (configs == NULL) {
611e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
61277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt              __LINE__);
61377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return NULL;
61477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
61577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
61677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Mark the visual as slow if there are "fake" stencil bits.
61777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
618e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   for (i = 0; configs[i]; i++) {
619e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg      m = &configs[i]->modes;
62077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {
62177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         m->visualRating = GLX_SLOW_CONFIG;
62277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
62377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
62477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
625e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   return configs;
62677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
62777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6287e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean
6297e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtintel_init_bufmgr(intelScreenPrivate *intelScreen)
6307e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
6317e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   int gem_kernel = 0;
6327e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   struct drm_i915_getparam gp;
6337e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   __DRIscreenPrivate *spriv = intelScreen->driScrnPriv;
634cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
6357e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6367e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
6377e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6387e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   gp.param = I915_PARAM_HAS_GEM;
6397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   gp.value = &gem_kernel;
6407e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6417e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   (void) drmCommandWriteRead(spriv->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
6427e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6437e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* If we've got a new enough DDX that's initializing GEM and giving us
6447e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt    * object handles for the shared buffers, use that.
6457e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt    */
6465727147f894137f194d8efc7adb81b80a9b5acd7Eric Anholt   if (!intelScreen->driScrnPriv->dri2.enabled &&
6475727147f894137f194d8efc7adb81b80a9b5acd7Eric Anholt       intelScreen->driScrnPriv->ddx_version.minor < 9) {
648827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing GEM.\n",
649827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
650827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      return GL_FALSE;
6517e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
652827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt
653827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
6547e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* Otherwise, use the classic buffer manager. */
6557e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
656827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
657827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
658827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      return GL_FALSE;
6597e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
6607e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
661e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences))
662e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = !!num_fences;
663e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   else
664e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = GL_FALSE;
665e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
6667e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   return GL_TRUE;
6677e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
6687e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
66977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
67077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is the driver specific part of the createNewScreen entry point.
6718d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using legacy DRI.
67277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
67377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \todo maybe fold this into intelInitDriver
67477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
67577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return the __GLcontextModes supported by this driver
67677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
677e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp)
67877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
6797e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreenPrivate *intelScreen;
680bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
68177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const __DRIversion ddx_expected = { 1, 5, 0 };
682bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
683bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   static const __DRIversion ddx_expected = { 1, 6, 0 };
684bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
68577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const __DRIversion dri_expected = { 4, 0, 0 };
68677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const __DRIversion drm_expected = { 1, 5, 0 };
68777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;
68877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
68977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!driCheckDriDdxDrmVersions2("i915",
69077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   &psp->dri_version, &dri_expected,
69177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   &psp->ddx_version, &ddx_expected,
69277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   &psp->drm_version, &drm_expected)) {
69377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return NULL;
69477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
69577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
69677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!intelInitDriver(psp))
69777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt       return NULL;
69877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
699e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
700e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
7017e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen = psp->private;
7027e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
7037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
7047e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
705e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   return (const __DRIconfig **)
706e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg       intelFillInModes(psp, dri_priv->cpp * 8,
707e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			(dri_priv->cpp == 2) ? 16 : 24,
708e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			(dri_priv->cpp == 2) ? 0  : 8, 1);
70977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
71077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
71177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstruct intel_context *intelScreenContext(intelScreenPrivate *intelScreen)
71277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
71377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  /*
71477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   * This should probably change to have the screen allocate a dummy
71577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   * context at screen creation. For now just use the current context.
71677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   */
71777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
71877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  GET_CURRENT_CONTEXT(ctx);
71977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  if (ctx == NULL) {
72077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt     _mesa_problem(NULL, "No current context in intelScreenContext\n");
72177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt     return NULL;
72277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  }
72377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  return intel_context(ctx);
72477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
72577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
726c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
727c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
7288d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
7298d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
730c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver
731c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
732e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
733e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp)
734c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
735c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreenPrivate *intelScreen;
7363ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
7373ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
7387c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
7393ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
7407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg       GLX_NONE, GLX_SWAP_UNDEFINED_OML,
7417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg       GLX_SWAP_EXCHANGE_OML, GLX_SWAP_COPY_OML
7423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
743e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
7443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
7455d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
746c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
747c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
748c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));
749c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
750c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
751c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
752c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
753c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
754c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
755c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
756c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
757c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
758c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
759c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
760c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->drmMinor = psp->drm_version.minor;
761c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
762f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
763c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
764c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
765c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
766c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
7677e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
7687e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
7697e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
770f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   intelScreen->irq_active = 1;
771e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
772c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
7733ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[0] = 0;
7743ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[0] = 0;
7753ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[1] = 16;
7763ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[1] = 0;
7773ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[2] = 24;
7783ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[2] = 0;
7793ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[3] = 24;
7803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[3] = 8;
7813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
782eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
783eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
7843ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
7853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
7863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
78724ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
7883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
7893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
79024ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
7913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
7923ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
793160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
794160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
795160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
7963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
7975d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
798160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
799160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
800160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      /* With DRI2 right now, GetBuffers always returns a depth/stencil buffer
801160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       * with the same cpp as the drawable.  So we can't support depth cpp !=
802160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       * color cpp currently.
803160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
804160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
805160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
806160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
807160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
808160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_factor = 2;
809160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
810160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
811160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
812160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[2] = 24;
813160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[2] = 8;
8145d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt
815160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_factor = 3;
816160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
8175d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
8185d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
8195d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
820160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
8215d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
8225d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
8235d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
8245d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(msaa_samples_array));
8253ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
8263ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
8273ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
8283ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
8293ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
8303ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
8313ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
8323ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
8333ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
8343ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
8353ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
8363ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
8375d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
838c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
839e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
840e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
841e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen		 = intelInitScreen,
842e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
843e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
844e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
845e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
846e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
847e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .SwapBuffers		 = intelSwapBuffers,
848e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
849e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
850e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .GetSwapInfo		 = intelGetSwapInfo,
851e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .GetDrawableMSC	 = driDrawableGetMSC32,
852e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .WaitForMSC		 = driWaitForMSC32,
853e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CopySubBuffer	 = intelCopySubBuffer,
854e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
855e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen2		 = intelInitScreen2,
856e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
857