intel_screen.c revision a962c07cc3e5fba3be5c08071bc7abc5d840f138
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
60a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
61e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
64fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
65f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
66fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
67fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
68fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
69fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
70fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
711ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
72a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915
73a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(false)
74a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else
75a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(true)
76a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif
771ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
78b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
79b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
80b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
81b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
82a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
83a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
84a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
85acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
86a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
87a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
88a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
8940bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
90f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
93a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
94b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholtconst GLuint __driNConfigOptions = 10;
9577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
9677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
9785063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
9877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
9977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
10177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Map all the memory regions described by the screen.
10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return GL_TRUE if success, GL_FALSE if error.
10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
10477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtGLboolean
10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelMapScreenRegions(__DRIscreenPrivate * sPriv)
10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (0)
11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_printf("TEX 0x%08x ", intelScreen->tex.handle);
11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (intelScreen->tex.size != 0) {
11277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (drmMap(sPriv->fd,
11377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt		 intelScreen->tex.handle,
11477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt		 intelScreen->tex.size,
11577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt		 (drmAddress *) & intelScreen->tex.map) != 0) {
11677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 intelUnmapScreenRegions(intelScreen);
11777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
11877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
11977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
12077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
12177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   return GL_TRUE;
12277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
12377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
12477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtvoid
12577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUnmapScreenRegions(intelScreenPrivate * intelScreen)
12677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
12777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (intelScreen->tex.map) {
12877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      drmUnmap(intelScreen->tex.map, intelScreen->tex.size);
12977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->tex.map = NULL;
13077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
13177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
13277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
13377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
13477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
13577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelPrintDRIInfo(intelScreenPrivate * intelScreen,
13677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  __DRIscreenPrivate * sPriv, I830DRIPtr gDRIPriv)
13777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
13877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Front size:   0x%x  offset: 0x%x  pitch: %d\n",
13977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->front.size, intelScreen->front.offset,
14046eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg           intelScreen->pitch);
14177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Back size:    0x%x  offset: 0x%x  pitch: %d\n",
14277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->back.size, intelScreen->back.offset,
14346eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg           intelScreen->pitch);
14477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Depth size:   0x%x  offset: 0x%x  pitch: %d\n",
14577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->depth.size, intelScreen->depth.offset,
14646eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg           intelScreen->pitch);
14777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Texture size: 0x%x  offset: 0x%x\n",
14877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           intelScreen->tex.size, intelScreen->tex.offset);
14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "*** Memory : 0x%x\n", gDRIPriv->mem);
15077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
15177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
15277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
15377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
15439e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo AaltonenintelPrintSAREA(const drm_i915_sarea_t * sarea)
15577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
15677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "SAREA: sarea width %d  height %d\n", sarea->width,
15777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->height);
15877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "SAREA: pitch: %d\n", sarea->pitch);
15977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr,
160f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           "SAREA: front offset: 0x%08x  size: 0x%x  handle: 0x%x tiled: %d\n",
16177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->front_offset, sarea->front_size,
162f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           (unsigned) sarea->front_handle, sarea->front_tiled);
16377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr,
164f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           "SAREA: back  offset: 0x%08x  size: 0x%x  handle: 0x%x tiled: %d\n",
16577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->back_offset, sarea->back_size,
166f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           (unsigned) sarea->back_handle, sarea->back_tiled);
167f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie   fprintf(stderr, "SAREA: depth offset: 0x%08x  size: 0x%x  handle: 0x%x tiled: %d\n",
16877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->depth_offset, sarea->depth_size,
169f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie           (unsigned) sarea->depth_handle, sarea->depth_tiled);
17077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   fprintf(stderr, "SAREA: tex   offset: 0x%08x  size: 0x%x  handle: 0x%x\n",
17177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt           sarea->tex_offset, sarea->tex_size, (unsigned) sarea->tex_handle);
17277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
17377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
17477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
17577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
17677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * A number of the screen parameters are obtained/computed from
17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * information in the SAREA.  This function updates those parameters.
17877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
179aae2729aeb3f6eed26e8f7673f47f2b978786bb1Brian Paulstatic void
18077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
18139e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen                           drm_i915_sarea_t * sarea)
18277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->width = sarea->width;
18477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->height = sarea->height;
18546eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg   intelScreen->pitch = sarea->pitch;
18677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
18777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->front.offset = sarea->front_offset;
18877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->front.handle = sarea->front_handle;
18977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->front.size = sarea->front_size;
190f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt   intelScreen->front.tiled = sarea->front_tiled;
19177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
19277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->back.offset = sarea->back_offset;
19377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->back.handle = sarea->back_handle;
19477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->back.size = sarea->back_size;
195f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt   intelScreen->back.tiled = sarea->back_tiled;
19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
19777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->depth.offset = sarea->depth_offset;
19877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->depth.handle = sarea->depth_handle;
19977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->depth.size = sarea->depth_size;
200f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt   intelScreen->depth.tiled = sarea->depth_tiled;
20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
20277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (intelScreen->driScrnPriv->ddx_version.minor >= 9) {
20377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->front.bo_handle = sarea->front_bo_handle;
20477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->back.bo_handle = sarea->back_bo_handle;
20577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->depth.bo_handle = sarea->depth_bo_handle;
20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   } else {
20777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->front.bo_handle = -1;
20877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->back.bo_handle = -1;
20977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelScreen->depth.bo_handle = -1;
21077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
21177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
21277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->tex.offset = sarea->tex_offset;
21377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->logTextureGranularity = sarea->log_tex_granularity;
21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->tex.handle = sarea->tex_handle;
21577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->tex.size = sarea->tex_size;
21677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
21777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (0)
21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelPrintSAREA(sarea);
21977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
22077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
22177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = {
22277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   { __DRI_TEX_OFFSET },
22377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelSetTexOffset,
22477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
22577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2266d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
2276d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
2286d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
22966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
2306d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
2316d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
232e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
23377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driReadDrawableExtension,
23477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driCopySubBufferExtension.base,
23577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driSwapControlExtension.base,
23677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driFrameTrackingExtension.base,
23777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driMediaStreamCounterExtension.base,
23877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &intelTexOffsetExtension.base,
2396d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
24077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
24177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
24277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
24324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean
24424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergintel_get_param(__DRIscreenPrivate *psp, int param, int *value)
24524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
24624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
2471c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
24824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
24924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
25024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
25124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
2521c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
25324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
25442e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul      _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
25524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
25624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
25724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
25824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   return GL_TRUE;
25924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
26077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
26177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
26277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
26377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen;
26477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv;
26539e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen   drm_i915_sarea_t *sarea;
26677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
26877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      fprintf(stderr,
26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt              "\nERROR!  sizeof(I830DRIRec) does not match passed size from device driver\n");
27077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;
27177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
27277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Allocate the private area */
27477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));
27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!intelScreen) {
27677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
27777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;
27877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
27977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* parse information in __driConfigOptions */
28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   driParseOptionInfo(&intelScreen->optionCache,
28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                      __driConfigOptions, __driNConfigOptions);
28277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->driScrnPriv = sPriv;
28477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = (void *) intelScreen;
28539e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen   sarea = (drm_i915_sarea_t *)
2863628185f566e178a12b493fb89abf52b4b281f99Eric Anholt      (((GLubyte *) sPriv->pSAREA) + gDRIPriv->sarea_priv_offset);
2873628185f566e178a12b493fb89abf52b4b281f99Eric Anholt   intelScreen->sarea = sarea;
28877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->deviceID = gDRIPriv->deviceID;
29077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
29177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelUpdateScreenFromSAREA(intelScreen, sarea);
29277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
29377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!intelMapScreenRegions(sPriv)) {
29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      fprintf(stderr, "\nERROR!  mapping regions\n");
29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_free(intelScreen);
29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      sPriv->private = NULL;
29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;
29877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
29977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
30077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (0)
30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv);
30277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreen->drmMinor = sPriv->drm_version.minor;
30477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Determine if IRQs are active? */
3061c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   if (!intel_get_param(sPriv, I915_PARAM_IRQ_ACTIVE,
30724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg			&intelScreen->irq_active))
30824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
30977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
310e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   sPriv->extensions = intelScreenExtensions;
31177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   return GL_TRUE;
31377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
31477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
31777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyScreen(__DRIscreenPrivate * sPriv)
31877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
31977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
32077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
321904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
32277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelUnmapScreenRegions(intelScreen);
3236d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
32677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
32777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
32877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
33077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
33177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
33277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  __DRIdrawablePrivate * driDrawPriv,
33677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  const __GLcontextModes * mesaVis, GLboolean isPixmap)
33777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
33877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
33977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;          /* not implemented */
34077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
34177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
34277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLboolean swStencil = (mesaVis->stencilBits > 0 &&
34377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                             mesaVis->depthBits != 24);
344119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      GLenum rgbFormat;
34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer);
34777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (!intel_fb)
34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis);
35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
353119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
354119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt	 rgbFormat = GL_RGB5;
355119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
356119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt	 rgbFormat = GL_RGB8;
357119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
358119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt	 rgbFormat = GL_RGBA8;
359119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
361f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat);
362f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,
363f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie			     &intel_fb->color_rb[0]->Base);
36477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
366f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie	 intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat);
367f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie
36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt				&intel_fb->color_rb[1]->Base);
37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
37277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
37338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
37438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 if (mesaVis->stencilBits == 8) {
37538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* combined depth/stencil buffer */
37638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthStencilRb
377e131c46b20241737ceba4856dbe01dcca6dd2c03Kristian Høgsberg	       = intel_create_renderbuffer(GL_DEPTH24_STENCIL8_EXT);
37838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* note: bind RB to two attachment points */
37938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,
38038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt				   &depthStencilRb->Base);
38138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL,
38238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt				   &depthStencilRb->Base);
38338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 } else {
38438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthRb
385e131c46b20241737ceba4856dbe01dcca6dd2c03Kristian Høgsberg	       = intel_create_renderbuffer(GL_DEPTH_COMPONENT24);
38638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,
38738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt				   &depthRb->Base);
38838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 }
38977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
39077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
39177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
39277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
393f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie	    = intel_create_renderbuffer(GL_DEPTH_COMPONENT16);
39477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base);
39577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
39677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
39777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      _mesa_add_soft_renderbuffers(&intel_fb->Base,
39977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw color */
40077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw depth */
40177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   swStencil, mesaVis->accumRedBits > 0,
40277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw alpha */
40377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE  /* never sw aux */ );
40477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      driDrawPriv->driverPrivate = (void *) intel_fb;
40577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
40677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_TRUE;
40777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
40877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
40977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
41077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
41177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv)
41277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
413d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   struct intel_framebuffer *intel_fb = driDrawPriv->driverPrivate;
414d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   struct intel_renderbuffer *depth_rb;
415d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   struct intel_renderbuffer *stencil_rb;
416d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
417d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   if (intel_fb) {
418d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (intel_fb->color_rb[0]) {
419d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(intel_fb->color_rb[0], NULL);
420d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
421d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
422d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (intel_fb->color_rb[1]) {
423d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(intel_fb->color_rb[1], NULL);
424d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
425d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
426d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      depth_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH);
427d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (depth_rb) {
428d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(depth_rb, NULL);
429d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
430d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
431d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      stencil_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL);
432d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      if (stencil_rb) {
433d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He         intel_renderbuffer_set_region(stencil_rb, NULL);
434d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He      }
435d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He   }
436d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He
4370f04a1d3f8989b0a391e6dad80abf06ce151d1f1Brian Paul   _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
43877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
43977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
44077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
44177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
44277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Get information about previous buffer swaps.
44377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
44477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic int
44577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo)
44677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
44777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   struct intel_framebuffer *intel_fb;
44877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
44977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if ((dPriv == NULL) || (dPriv->driverPrivate == NULL)
45077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt       || (sInfo == NULL)) {
45177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return -1;
45277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
45377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
45477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intel_fb = dPriv->driverPrivate;
45577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_count = intel_fb->swap_count;
45677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_ust = intel_fb->swap_ust;
45777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_missed_count = intel_fb->swap_missed_count;
45877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
45977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)
46077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      ? driCalculateSwapUsage(dPriv, 0, intel_fb->swap_missed_ust)
46177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      : 0.0;
46277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
46377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   return 0;
46477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
46577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
46677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
46777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
46877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
46977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
47077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
47177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,
47277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   __DRIcontextPrivate * driContextPriv,
47377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
47477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,
47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   __DRIcontextPrivate * driContextPriv,
47777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
478bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,
479bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  __DRIcontextPrivate * driContextPriv,
480bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  void *sharedContextPrivate);
48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
48277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
48377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis,
48477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   __DRIcontextPrivate * driContextPriv,
48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
48677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;
48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
48977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
490bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
49119420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
49219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
49319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt	 return i915CreateContext(mesaVis, driContextPriv,
494bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
49519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
496bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
497cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie      intelScreen->no_vbo = GL_TRUE;
49877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
49977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
500bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
501bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
502bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);
503bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
504bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);
505bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   return GL_FALSE;
50677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
50777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
509e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIconfig **
5106cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian HøgsbergintelFillInModes(__DRIscreenPrivate *psp,
5116cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg		 unsigned pixel_bits, unsigned depth_bits,
51277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                 unsigned stencil_bits, GLboolean have_back_buffer)
51377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
514e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   __DRIconfig **configs;
51577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   __GLcontextModes *m;
51677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   unsigned depth_buffer_factor;
51777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   unsigned back_buffer_factor;
518e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   int i;
51977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
52077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
52177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * support pageflipping at all.
52277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
52377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const GLenum back_buffer_modes[] = {
52477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
52577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   };
52677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5275a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint8_t depth_bits_array[3];
5285a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell   uint8_t stencil_bits_array[3];
529e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t msaa_samples_array[1];
53077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
53177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_bits_array[0] = 0;
53277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_bits_array[1] = depth_bits;
53377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_bits_array[2] = depth_bits;
53477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
53577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Just like with the accumulation buffer, always provide some modes
53677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * with a stencil buffer.  It will be a sw fallback, but some apps won't
53777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * care about that.
53877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
53977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   stencil_bits_array[0] = 0;
54077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   stencil_bits_array[1] = 0;
54177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (depth_bits == 24)
54277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;
54377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
54477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;
54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
546eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
547eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
54877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;
54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   back_buffer_factor = (have_back_buffer) ? 3 : 1;
55077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
55177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (pixel_bits == 16) {
5525d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
5535d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 depth_bits_array, stencil_bits_array,
5545d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 depth_buffer_factor, back_buffer_modes,
5555d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 back_buffer_factor,
5565d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				 msaa_samples_array, 1);
55777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
55877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
5595d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **configs_a8r8g8b8;
5605d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **configs_x8r8g8b8;
5615d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt
5625d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
5635d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_bits_array,
5645d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  stencil_bits_array,
5655d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_buffer_factor,
5665d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_modes,
5675d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_factor,
5685d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  msaa_samples_array, 1);
5695d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV,
5705d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_bits_array,
5715d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  stencil_bits_array,
5725d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  depth_buffer_factor,
5735d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_modes,
5745d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  back_buffer_factor,
5755d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt					  msaa_samples_array, 1);
5765d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      configs = driConcatConfigs(configs_a8r8g8b8, configs_x8r8g8b8);
57777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
57877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
579e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   if (configs == NULL) {
580e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg    fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
58177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt              __LINE__);
58277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return NULL;
58377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
58477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
58577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Mark the visual as slow if there are "fake" stencil bits.
58677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
587e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   for (i = 0; configs[i]; i++) {
588e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg      m = &configs[i]->modes;
58977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {
59077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         m->visualRating = GLX_SLOW_CONFIG;
59177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
59277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
59377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
594e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   return configs;
59577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
59677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5977e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean
5987e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtintel_init_bufmgr(intelScreenPrivate *intelScreen)
5997e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
6007e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   GLboolean gem_disable = getenv("INTEL_NO_GEM") != NULL;
6017e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   int gem_kernel = 0;
6027e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   GLboolean gem_supported;
6037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   struct drm_i915_getparam gp;
6047e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   __DRIscreenPrivate *spriv = intelScreen->driScrnPriv;
605cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
6067e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6077e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
6087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6097e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   gp.param = I915_PARAM_HAS_GEM;
6107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   gp.value = &gem_kernel;
6117e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6127e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   (void) drmCommandWriteRead(spriv->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
6137e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6147e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* If we've got a new enough DDX that's initializing GEM and giving us
6157e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt    * object handles for the shared buffers, use that.
6167e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt    */
6177e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->ttm = GL_FALSE;
6187e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->driScrnPriv->dri2.enabled)
6197e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       gem_supported = GL_TRUE;
6207e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   else if (intelScreen->driScrnPriv->ddx_version.minor >= 9 &&
6217e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt	    gem_kernel &&
6227e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt	    intelScreen->front.bo_handle != -1)
6237e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       gem_supported = GL_TRUE;
6247e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   else
6257e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       gem_supported = GL_FALSE;
6267e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6277e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!gem_disable && gem_supported) {
6287e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
6297e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      if (intelScreen->bufmgr != NULL)
6307e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt	 intelScreen->ttm = GL_TRUE;
6317e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
6327e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* Otherwise, use the classic buffer manager. */
6337e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
6347e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      if (gem_disable) {
635d2f56fe687afb2c259338542971e432dd448671bBrian Paul	 _mesa_warning(NULL, "GEM disabled.  Using classic.");
6367e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      } else {
637d2f56fe687afb2c259338542971e432dd448671bBrian Paul	 _mesa_warning(NULL,
638d2f56fe687afb2c259338542971e432dd448671bBrian Paul                       "Failed to initialize GEM.  Falling back to classic.");
6397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      }
6407e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6417e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      if (intelScreen->tex.size == 0) {
6427e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt	 fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
6437e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt		 __func__, __LINE__);
6447e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt	 return GL_FALSE;
6457e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt      }
6467e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6473628185f566e178a12b493fb89abf52b4b281f99Eric Anholt      intelScreen->bufmgr =
6483628185f566e178a12b493fb89abf52b4b281f99Eric Anholt	 intel_bufmgr_fake_init(spriv->fd,
6493628185f566e178a12b493fb89abf52b4b281f99Eric Anholt				intelScreen->tex.offset,
6503628185f566e178a12b493fb89abf52b4b281f99Eric Anholt				intelScreen->tex.map,
6513628185f566e178a12b493fb89abf52b4b281f99Eric Anholt				intelScreen->tex.size,
6523628185f566e178a12b493fb89abf52b4b281f99Eric Anholt				(unsigned int * volatile)
6533628185f566e178a12b493fb89abf52b4b281f99Eric Anholt				&intelScreen->sarea->last_dispatch);
6547e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
6557e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
656e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences))
657e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = !!num_fences;
658e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   else
659e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = GL_FALSE;
660e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
6617e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   return GL_TRUE;
6627e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
6637e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
66477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
66577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is the driver specific part of the createNewScreen entry point.
6668d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using legacy DRI.
66777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
66877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \todo maybe fold this into intelInitDriver
66977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
67077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return the __GLcontextModes supported by this driver
67177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
672e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp)
67377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
6747e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreenPrivate *intelScreen;
675bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
67677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const __DRIversion ddx_expected = { 1, 5, 0 };
677bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
678bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   static const __DRIversion ddx_expected = { 1, 6, 0 };
679bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
68077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const __DRIversion dri_expected = { 4, 0, 0 };
68177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   static const __DRIversion drm_expected = { 1, 5, 0 };
68277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;
68377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
68477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!driCheckDriDdxDrmVersions2("i915",
68577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   &psp->dri_version, &dri_expected,
68677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   &psp->ddx_version, &ddx_expected,
68777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   &psp->drm_version, &drm_expected)) {
68877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return NULL;
68977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
69077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
69177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   /* Calling driInitExtensions here, with a NULL context pointer,
69277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * does not actually enable the extensions.  It just makes sure
69377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * that all the dispatch offsets for all the extensions that
69477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * *might* be enables are known.  This is needed because the
69577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * dispatch offsets need to be known when _mesa_context_create is
69677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * called, but we can't enable the extensions until we have a
69777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * context pointer.
69877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    *
69977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    * Hello chicken.  Hello egg.  How are you two today?
70077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    */
70160c0f09abb9421de359cd92e094a943d650fc7faKristian Høgsberg   intelInitExtensions(NULL, GL_TRUE);
70260c0f09abb9421de359cd92e094a943d650fc7faKristian Høgsberg
70377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (!intelInitDriver(psp))
70477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt       return NULL;
70577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
706e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
707e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
7087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen = psp->private;
7097e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
7107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
7117e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
712e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   return (const __DRIconfig **)
713e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg       intelFillInModes(psp, dri_priv->cpp * 8,
714e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			(dri_priv->cpp == 2) ? 16 : 24,
715e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg			(dri_priv->cpp == 2) ? 0  : 8, 1);
71677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
71777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
71877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstruct intel_context *intelScreenContext(intelScreenPrivate *intelScreen)
71977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
72077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  /*
72177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   * This should probably change to have the screen allocate a dummy
72277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   * context at screen creation. For now just use the current context.
72377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   */
72477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
72577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  GET_CURRENT_CONTEXT(ctx);
72677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  if (ctx == NULL) {
72777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt     _mesa_problem(NULL, "No current context in intelScreenContext\n");
72877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt     return NULL;
72977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  }
73077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt  return intel_context(ctx);
73177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
73277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
733c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
734c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
7358d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
7368d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
737c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver
738c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
739e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
740e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp)
741c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
742c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreenPrivate *intelScreen;
7433ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
7443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
7453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't
7463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt    * support pageflipping at all.
7473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt    */
7483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
7493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
7503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
751e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
7523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
7535d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
754c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
755c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Calling driInitExtensions here, with a NULL context pointer,
756c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * does not actually enable the extensions.  It just makes sure
757c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * that all the dispatch offsets for all the extensions that
758c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * *might* be enables are known.  This is needed because the
759c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * dispatch offsets need to be known when _mesa_context_create is
760c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * called, but we can't enable the extensions until we have a
761c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * context pointer.
762c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    *
763c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    * Hello chicken.  Hello egg.  How are you two today?
764c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg    */
76560c0f09abb9421de359cd92e094a943d650fc7faKristian Høgsberg   intelInitExtensions(NULL, GL_TRUE);
766c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
767c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
768c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));
769c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
770c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
771c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
772c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
773c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
774c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
775c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
776c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
777c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
778c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
779c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
780c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->drmMinor = psp->drm_version.minor;
781c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
782f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
783c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
784c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
785c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
786c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
7877e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
7887e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
7897e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
790f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   intelScreen->irq_active = 1;
791e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
792c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
7933ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[0] = 0;
7943ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[0] = 0;
7953ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[1] = 16;
7963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[1] = 0;
7973ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[2] = 24;
7983ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[2] = 0;
7993ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   depth_bits[3] = 24;
8003ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   stencil_bits[3] = 8;
8013ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
802eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
803eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
8043ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
8053ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
8063ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
80724ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
8083ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
8093ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
81024ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
8113ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
8123ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
813160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
814160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
815160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
8163ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
8175d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
818160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
819160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
820160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      /* With DRI2 right now, GetBuffers always returns a depth/stencil buffer
821160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       * with the same cpp as the drawable.  So we can't support depth cpp !=
822160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       * color cpp currently.
823160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
824160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
825160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
826160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
827160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
828160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_factor = 2;
829160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
830160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
831160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
832160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[2] = 24;
833160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[2] = 8;
8345d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt
835160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_factor = 3;
836160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
8375d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
8385d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
8395d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
840160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
8415d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
8425d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
8435d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
8445d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(msaa_samples_array));
8453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
8463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
8473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
8483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
8493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
8503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
8513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
8523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
8533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
8543ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
8553ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
8563ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
8575d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
858c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
859e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
860e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
861e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen		 = intelInitScreen,
862e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
863e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
864e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
865e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
866e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
867e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .SwapBuffers		 = intelSwapBuffers,
868e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
869e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
870e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .GetSwapInfo		 = intelGetSwapInfo,
871e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .GetDrawableMSC	 = driDrawableGetMSC32,
872e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .WaitForMSC		 = driWaitForMSC32,
873e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CopySubBuffer	 = intelCopySubBuffer,
874e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
875e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen2		 = intelInitScreen2,
876e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
877