intel_screen.c revision 06d1472ffa0648efa9374fa227894fbf0b0be054
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"
322d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h"
33d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h"
346c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
3577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h"
3677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h"
3777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
386c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_batchbuffer.h"
3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffers.h"
406c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_bufmgr.h"
416c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_chipset.h"
4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_fbo.h"
436c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_screen.h"
446c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_tex.h"
45c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg#include "intel_regions.h"
4677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#include "i915_drm.h"
486c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
491ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt#define DRI_CONF_TEXTURE_TILING(def) \
501ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt	DRI_CONF_OPT_BEGIN(texture_tiling, bool, def)		\
511ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt		DRI_CONF_DESC(en, "Enable texture tiling")	\
521ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt	DRI_CONF_OPT_END					\
5377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
55a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
56a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
57e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
58fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
59fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
60fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
61f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
64fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
65fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
66fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
671ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
68a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915
69a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(false)
70a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else
71a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt     DRI_CONF_TEXTURE_TILING(true)
72a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif
731ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
74b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
75b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
76b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
77b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
78862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, false)
79862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
80862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
81862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric 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)
9181aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
9281aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
9381aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
9481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
95a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
96a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
97a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
981e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11;
9977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
10185063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
10477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = {
10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   { __DRI_TEX_OFFSET },
10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelSetTexOffset,
10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1096d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
1106d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
1116d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
11266175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
1136d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
1146d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
1157c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1167c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
1177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1187c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1197c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1207c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->gen < 4)
1217c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      INTEL_FIREVERTICES(intel);
1227c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1237c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->batch->map != intel->batch->ptr)
1247c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      intel_batchbuffer_flush(intel->batch);
1257c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1267c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1277c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
12861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco JerezintelDRI2Invalidate(__DRIdrawable *drawable)
1297c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1307aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1317aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt
1327aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   intel->using_dri2_swapbuffers = GL_TRUE;
13361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez   dri2InvalidateDrawable(drawable);
1347c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1357c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1367c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1377c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1387c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
13961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez    intelDRI2Invalidate,
1407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
142c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
143c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_name(__DRIcontext *context,
144c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int width, int height, int format,
145c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int name, int pitch, void *loaderPrivate)
146c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
147c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    __DRIimage *image;
148c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    struct intel_context *intel = context->driverPrivate;
149c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    int cpp;
150c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
151c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image = CALLOC(sizeof *image);
152c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image == NULL)
153c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	return NULL;
154c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
155c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    switch (format) {
156c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_RGB565:
157c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_RGB565;
158c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
159c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
160c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
161c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_XRGB8888:
162c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_XRGB8888;
163c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
164c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
165c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
166c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_ARGB8888:
167c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_ARGB8888;
168c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGBA;
169c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
170c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
171c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    default:
172c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       free(image);
173c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
174c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
175c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
176c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->data = loaderPrivate;
177c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    cpp = _mesa_get_format_bytes(image->format);
178c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
179c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->region = intel_region_alloc_for_handle(intel, cpp, width, height,
180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg						  pitch, name, "image");
181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image->region == NULL) {
182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       FREE(image);
183c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    return image;
187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
188c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context,
191c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg				     int renderbuffer, void *loaderPrivate)
192c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   __DRIimage *image;
194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_context *intel = context->driverPrivate;
195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct gl_renderbuffer *rb;
196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_renderbuffer *irb;
197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
198d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg   rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer);
199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (!rb) {
200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      _mesa_error(&intel->ctx,
201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg		  GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   }
204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   irb = intel_renderbuffer(rb);
206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image = CALLOC(sizeof *image);
207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (image == NULL)
208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
209c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
210c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->internal_format = rb->InternalFormat;
211c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->format = rb->Format;
212c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data_type = rb->DataType;
213c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data = loaderPrivate;
214c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   intel_region_reference(&image->region, irb->region);
215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   return image;
217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void
220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image)
221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
222c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_region_release(&image->region);
223c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    FREE(image);
224c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
225c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
226c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = {
227c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
228c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_name,
229c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_renderbuffer,
230c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_destroy_image,
231c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg};
232c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
233e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
23477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driReadDrawableExtension,
23577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &intelTexOffsetExtension.base,
2366d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
2377c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
238c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    &intelImageExtension.base,
23977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
24077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
24177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
24224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean
243d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
24424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
24524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
2461c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
24724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
24824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
24924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
25024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
2511c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
25224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
25342e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul      _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
25424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
25524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
25624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
25724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   return GL_TRUE;
25824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
25977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
26077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
2612d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData)
2622d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{
2632d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg}
2642d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
2652d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void
266d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
2685777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
270904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
2716d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
27277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2732d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   /* Some regions may still have references to them at this point, so
2742d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * flush the hash table to prevent _mesa_DeleteHashTable() from
2752d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * complaining about the hash not being empty; */
2762d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL);
2772d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_DeleteHashTable(intelScreen->named_regions);
2782d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
27977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
28277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
28577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
28677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
28777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
288d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
289d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
29077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  const __GLcontextModes * mesaVis, GLboolean isPixmap)
29177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
292d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
293d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;          /* not implemented */
29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
29877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLboolean swStencil = (mesaVis->stencilBits > 0 &&
29977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                             mesaVis->depthBits != 24);
3004a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
302d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
304d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      if (!fb)
30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
30677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3072ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez      _mesa_initialize_window_framebuffer(fb, mesaVis);
30877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
309119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
3104a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
311119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
312409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
313119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
3144a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
315119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
31677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
317d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      rb = intel_create_renderbuffer(rgbFormat);
318d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base);
31977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
321d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	 rb = intel_create_renderbuffer(rgbFormat);
322d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base);
32377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
32638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 if (mesaVis->stencilBits == 8) {
32738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* combined depth/stencil buffer */
32838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthStencilRb
3294a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
33038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* note: bind RB to two attachment points */
331d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base);
332d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base);
33338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 } else {
33438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthRb
3354a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
336d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
33738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 }
33877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
33977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
34077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
34177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
3424a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
343d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
34477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
347d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_soft_renderbuffers(fb,
34877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw color */
34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw depth */
35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   swStencil, mesaVis->accumRedBits > 0,
35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw alpha */
35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE  /* never sw aux */ );
353d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      driDrawPriv->driverPrivate = fb;
35477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_TRUE;
35677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
35777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
35877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
360d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
36177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
362d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
363d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
364d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
36677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,
372d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
37377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
37477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
37577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,
376d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
37777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
378bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,
379d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg				  __DRIcontext * driContextPriv,
380bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  void *sharedContextPrivate);
38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
38277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
38377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis,
384d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
38577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
38677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
387d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
3885777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
38977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
390bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
39119420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
39219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
39319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt	 return i915CreateContext(mesaVis, driContextPriv,
394bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
39519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
396bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
397cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie      intelScreen->no_vbo = GL_TRUE;
39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
39977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
400bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
401bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
402bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);
403bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
404bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);
405bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   return GL_FALSE;
40677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
40777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean
4095777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen)
4107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
411d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
412cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
4137e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
4147e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
4157e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
416827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
4177e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* Otherwise, use the classic buffer manager. */
4187e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
419827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
420827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
421827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      return GL_FALSE;
4227e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
4237e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
424e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences))
425e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = !!num_fences;
426e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   else
427e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = GL_FALSE;
428e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
42906d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt   drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
43006d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt
4312d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   intelScreen->named_regions = _mesa_NewHashTable();
4322d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
4337e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   return GL_TRUE;
4347e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
4357e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
436c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
437c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
4388d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
4398d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
440c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver
441c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
442e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
443d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
444c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
4455777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen;
4463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
4473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
4487c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
4493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
4506bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
4513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
452e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
4533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
4545d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
455c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
456c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
4575777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   intelScreen = CALLOC(sizeof *intelScreen);
458c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
459c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
460c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
461c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
462c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
463c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
464c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
465c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
466c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
467c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
468c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
469f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
470c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
471c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
472c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
473c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
4747e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
4757e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
4767e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
477e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
478c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
479eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
480eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
4813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
4823ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
4833ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
48424ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
4853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
4863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
48724ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
4883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
4893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
490160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
491160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
492160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
493bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate a rich set of useful configs that do not include an
494bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
495bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
4963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
4975d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
498160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
499160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
500066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
501066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer that has a diffferent number of bits per pixel than the color
502066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer.  This isn't yet supported here.
503160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
504160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
505160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
506160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
507160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
508160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
50973e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick	 stencil_bits[1] = 8;
510160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
51173e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
51273e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick      depth_factor = 2;
51373e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
5145d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
5155d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
5165d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
517160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
5185d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
5195d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
5205d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
5213cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     ARRAY_SIZE(msaa_samples_array),
522bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     GL_FALSE);
523bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (configs == NULL)
524bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = new_configs;
525bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      else
526bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = driConcatConfigs(configs, new_configs);
527bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   }
528bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
529bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate the minimum possible set of configs that include an
530bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
531bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
532bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
533bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      __DRIconfig **new_configs;
534bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
535bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
536bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 16;
537bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 0;
538bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      } else {
539bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 24;
540bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 8;
541bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      }
542bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
543bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
544bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     depth_bits, stencil_bits, 1,
545bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     back_buffer_modes + 1, 1,
546bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     msaa_samples_array, 1,
5473cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     GL_TRUE);
5483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
5493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
5503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
5513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
5523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
5533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
5543ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
5553ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
5563ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
5573ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
5583ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
5593ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
5605d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
561c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
562e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
563e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
564e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
565e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
566e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
567e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
568e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
569e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
570e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
571e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen2		 = intelInitScreen2,
572e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
57339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
57439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
57539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
57639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
57739a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
57839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
57939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
580