intel_screen.c revision 3cce4a1e10361458630511543b7a8a6438544775
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 "xmlpool.h"
3577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
366c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_batchbuffer.h"
3777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffers.h"
386c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_bufmgr.h"
396c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_chipset.h"
4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_fbo.h"
416c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_screen.h"
426c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_tex.h"
4377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
44bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#include "i915_drm.h"
456c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
461ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt#define DRI_CONF_TEXTURE_TILING(def) \
471ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt	DRI_CONF_OPT_BEGIN(texture_tiling, bool, def)		\
481ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt		DRI_CONF_DESC(en, "Enable texture tiling")	\
491ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt	DRI_CONF_OPT_END					\
5077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
52a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
53a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
54e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
55fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
56fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
57fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
58f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
59fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
60fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
61fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
641ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
65a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915
66a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(false)
67a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else
68a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(true)
69a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif
701ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
71b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
72b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
73b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
74b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
75862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, false)
76862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
77862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
78862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt
79a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
80a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
81a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
82acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
83a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
84a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
85a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
8640bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
87f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
8881aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
8981aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
9081aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
9181aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
93a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
94a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
951e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11;
9677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
9777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
9885063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
9977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
10077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = {
10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   { __DRI_TEX_OFFSET },
10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelSetTexOffset,
10477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1066d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
1076d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
1086d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
10966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
1106d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
1116d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
1127c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1137c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
1147c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1157c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1167c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->gen < 4)
1187c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      INTEL_FIREVERTICES(intel);
1197c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1207c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->batch->map != intel->batch->ptr)
1217c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      intel_batchbuffer_flush(intel->batch);
1227c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1237c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1247c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1257c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2FlushInvalidate(__DRIdrawable *drawable)
1267c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1277aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1287aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt
1297aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   intel->using_dri2_swapbuffers = GL_TRUE;
1307aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt
1317c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   intelDRI2Flush(drawable);
1327c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   drawable->validBuffers = GL_FALSE;
13306d228d8b92b7f4031f0596d498c24c4ed952e68Jesse Barnes
13406d228d8b92b7f4031f0596d498c24c4ed952e68Jesse Barnes   intel_update_renderbuffers(intel->driContext, drawable);
1357c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1367c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1377c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1387c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1397c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
1407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2FlushInvalidate,
1417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1427c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
143e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
14477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driReadDrawableExtension,
14577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &intelTexOffsetExtension.base,
1466d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
1477c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
14877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
15077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
15124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean
152d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
15324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
15424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
1551c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
15624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
15724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
15824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
15924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
1601c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
16124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
16242e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul      _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
16324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
16424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
16524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
16624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   return GL_TRUE;
16724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
16877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
16977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
170d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
17177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
17277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
17377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
174904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
1756d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
17677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
17877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
17977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
18077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
18177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
18277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
18477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
18577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
186d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
187d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
18877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  const __GLcontextModes * mesaVis, GLboolean isPixmap)
18977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
190d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
191d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
19277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
19377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;          /* not implemented */
19477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
19577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLboolean swStencil = (mesaVis->stencilBits > 0 &&
19777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                             mesaVis->depthBits != 24);
1984a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
19977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
200d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
202d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      if (!fb)
20377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
20477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2052ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez      _mesa_initialize_window_framebuffer(fb, mesaVis);
20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
207119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
2084a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
209119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
210409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
211119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
2124a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
213119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
215d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      rb = intel_create_renderbuffer(rgbFormat);
216d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base);
21777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
219d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	 rb = intel_create_renderbuffer(rgbFormat);
220d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base);
22177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
22277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
22338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
22438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 if (mesaVis->stencilBits == 8) {
22538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* combined depth/stencil buffer */
22638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthStencilRb
2274a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
22838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* note: bind RB to two attachment points */
229d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base);
230d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base);
23138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 } else {
23238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthRb
2334a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
234d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
23538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 }
23677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
23777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
23877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
23977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
2404a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
241d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
24277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
24377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
24477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
245d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_soft_renderbuffers(fb,
24677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw color */
24777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw depth */
24877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   swStencil, mesaVis->accumRedBits > 0,
24977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw alpha */
25077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE  /* never sw aux */ );
251d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      driDrawPriv->driverPrivate = fb;
25277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
25377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_TRUE;
25477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
25577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
25677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
25777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
258d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
25977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
260d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
261d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
262d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
26377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
26477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
26577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
26677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
26877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,
270d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
27177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
27277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,
274d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
276bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,
277d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg				  __DRIcontext * driContextPriv,
278bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  void *sharedContextPrivate);
27977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis,
282d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
28377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
28477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
285d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
28677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;
28777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
288bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
28919420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
29019420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
29119420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt	 return i915CreateContext(mesaVis, driContextPriv,
292bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
29319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
294bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
295cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie      intelScreen->no_vbo = GL_TRUE;
29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
298bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
299bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
300bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);
301bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
302bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);
303bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   return GL_FALSE;
30477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3067e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean
3077e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtintel_init_bufmgr(intelScreenPrivate *intelScreen)
3087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
309d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
310cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
3117e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
3127e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
3137e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
314827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
3157e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* Otherwise, use the classic buffer manager. */
3167e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
317827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
318827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
319827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      return GL_FALSE;
3207e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
3217e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
322e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences))
323e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = !!num_fences;
324e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   else
325e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = GL_FALSE;
326e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
3277e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   return GL_TRUE;
3287e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
3297e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
330c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
331c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
3328d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
3338d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
334c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver
335c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
336e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
337d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
338c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
339c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreenPrivate *intelScreen;
3403ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
3413ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
3427c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
3433ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
3447c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg       GLX_NONE, GLX_SWAP_UNDEFINED_OML,
3457c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg       GLX_SWAP_EXCHANGE_OML, GLX_SWAP_COPY_OML
3463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
347e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
3483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
3495d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
350c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
351c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
352c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));
353c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
354c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
355c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
356c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
357c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
358c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
359c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
360c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
361c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
362c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
363c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
364c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->drmMinor = psp->drm_version.minor;
365c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
366f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
367c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
368c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
369c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
370c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
3717e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
3727e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
3737e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
374f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   intelScreen->irq_active = 1;
375e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
376c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
377eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
378eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
3793ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
3803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
3813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
38224ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
3833ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
3843ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
38524ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
3863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
3873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
388160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
389160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
390160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
3913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
3925d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
393160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
394160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
395066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
396066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer that has a diffferent number of bits per pixel than the color
397066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer.  This isn't yet supported here.
398160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
399160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
400160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
401160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
402160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
403160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
40473e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick	 stencil_bits[1] = 8;
405160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
40673e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
40773e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick      depth_factor = 2;
40873e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
4095d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
4105d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
4115d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
412160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
4135d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
4145d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
4155d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
4163cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     ARRAY_SIZE(msaa_samples_array),
4173cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     GL_TRUE);
4183ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
4193ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
4203ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
4213ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
4223ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
4233ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
4243ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
4253ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
4263ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
4273ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
4283ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
4293ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
4305d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
431c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
432e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
433e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
434e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
435e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
436e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
437e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
438e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
439e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
440e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
441e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen2		 = intelInitScreen2,
442e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
44339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
44439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
44539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
44639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
44739a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
44839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
44939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
450