intel_screen.c revision 7192c37294964b3f6e1551469f161593ec8f851d
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
28f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt#include <errno.h>
29ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
32ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h"
332d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h"
34d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h"
3545a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h"
366c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
3777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h"
3877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h"
3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
41a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
42a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
43e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
44fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
45fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
46fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
47f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
48fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
49fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
50fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
51fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
52fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
531ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
548e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_BEGIN(texture_tiling, bool, true)
558e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt	 DRI_CONF_DESC(en, "Enable texture tiling")
568e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_END
571ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
58b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
59b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
60b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
61b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
62a58514cc9c5cc5867f9140700462c5ac5749550dEric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, true)
63862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
64862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
65862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt
66a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
67a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
68a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
69acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
70a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
71a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
72a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
7340bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
74f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
7581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
7681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
7781aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
7881aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
79a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
80a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
81a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
821e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11;
8377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
84df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h"
85df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h"
86df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h"
87df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h"
88df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h"
89df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h"
90df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h"
91df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h"
92df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt
93df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h"
94df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt
9577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
9685063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
9777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
9877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
996d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
1006d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
1016d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
10266175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
1036d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
1046d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
1057c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1067c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
1077c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
108dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt   GET_CURRENT_CONTEXT(ctx);
109dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt   struct intel_context *intel = intel_context(ctx);
1107c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1117c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->gen < 4)
1127c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      INTEL_FIREVERTICES(intel);
1137c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1142e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   intel->need_throttle = true;
115e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg
1168d68a90e225d831a395ba788e425cb717eec1f9aChris Wilson   if (intel->batch.used)
1178d68a90e225d831a395ba788e425cb717eec1f9aChris Wilson      intel_batchbuffer_flush(intel);
1187c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1197c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1207c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1217c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1227c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
123e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg    dri2InvalidateDrawable,
1247c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1257c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
126c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
1279ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen,
128c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int width, int height, int format,
129c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int name, int pitch, void *loaderPrivate)
130c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
1319ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg    struct intel_screen *intelScreen = screen->private;
132c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    __DRIimage *image;
133c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    int cpp;
134c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
135c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image = CALLOC(sizeof *image);
136c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image == NULL)
137c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	return NULL;
138c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
139c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    switch (format) {
140c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_RGB565:
141c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_RGB565;
142c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
143c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
144c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
145c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_XRGB8888:
146c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_XRGB8888;
147c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
148c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
149c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
150c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_ARGB8888:
151c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_ARGB8888;
152c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGBA;
153c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
154c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
1559fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu    case __DRI_IMAGE_FORMAT_ABGR8888:
1569fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->format = MESA_FORMAT_RGBA8888_REV;
1579fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->internal_format = GL_RGBA;
1589fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->data_type = GL_UNSIGNED_BYTE;
1599fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       break;
160c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    default:
161c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       free(image);
162c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
163c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
164c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
165c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->data = loaderPrivate;
166c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    cpp = _mesa_get_format_bytes(image->format);
167c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
1689ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg    image->region = intel_region_alloc_for_handle(intelScreen,
1699087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg						  cpp, width, height,
170c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg						  pitch, name, "image");
171c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image->region == NULL) {
172c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       FREE(image);
173c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
174c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
175c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
176c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    return image;
177c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
178c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
179c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context,
181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg				     int renderbuffer, void *loaderPrivate)
182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
183c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   __DRIimage *image;
184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_context *intel = context->driverPrivate;
185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct gl_renderbuffer *rb;
186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_renderbuffer *irb;
187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
188d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg   rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer);
189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (!rb) {
190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      _mesa_error(&intel->ctx,
191c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg		  GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
192c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   }
194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   irb = intel_renderbuffer(rb);
196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image = CALLOC(sizeof *image);
197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (image == NULL)
198c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->internal_format = rb->InternalFormat;
201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->format = rb->Format;
202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data_type = rb->DataType;
203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data = loaderPrivate;
204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   intel_region_reference(&image->region, irb->region);
205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   return image;
207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
209c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void
210c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image)
211c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
212c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_region_release(&image->region);
213c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    FREE(image);
214c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
216f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage *
217f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen,
218f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   int width, int height, int format,
219f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   unsigned int use,
220f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   void *loaderPrivate)
221f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{
222f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   __DRIimage *image;
223f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   struct intel_screen *intelScreen = screen->private;
224e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   uint32_t tiling;
225f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   int cpp;
226f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
227e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   tiling = I915_TILING_X;
228e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   if (use & __DRI_IMAGE_USE_CURSOR) {
229e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      if (width != 64 || height != 64)
230e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg	 return NULL;
231e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      tiling = I915_TILING_NONE;
232e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   }
233e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg
234f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image = CALLOC(sizeof *image);
235f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   if (image == NULL)
236f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
237f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
238f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   switch (format) {
239f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_FORMAT_RGB565:
240f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->format = MESA_FORMAT_RGB565;
241f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->internal_format = GL_RGB;
242f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->data_type = GL_UNSIGNED_BYTE;
243f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      break;
244f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_FORMAT_XRGB8888:
245f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->format = MESA_FORMAT_XRGB8888;
246f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->internal_format = GL_RGB;
247f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->data_type = GL_UNSIGNED_BYTE;
248f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      break;
249f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_FORMAT_ARGB8888:
250f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->format = MESA_FORMAT_ARGB8888;
251f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->internal_format = GL_RGBA;
252f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->data_type = GL_UNSIGNED_BYTE;
253f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      break;
2549fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu    case __DRI_IMAGE_FORMAT_ABGR8888:
2559fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->format = MESA_FORMAT_RGBA8888_REV;
2569fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->internal_format = GL_RGBA;
2579fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->data_type = GL_UNSIGNED_BYTE;
2589fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       break;
259f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   default:
260f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      free(image);
261f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
262f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
263f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
264f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image->data = loaderPrivate;
265f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   cpp = _mesa_get_format_bytes(image->format);
266f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
267f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image->region =
268e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      intel_region_alloc(intelScreen, tiling,
2692e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke			 cpp, width, height, true);
270f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   if (image->region == NULL) {
271f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      FREE(image);
272f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
273f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
274f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
275f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   return image;
276f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg}
277f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
278f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean
279f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value)
280f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{
281f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   switch (attrib) {
282f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_STRIDE:
283f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      *value = image->region->pitch * image->region->cpp;
2842e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
285f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_HANDLE:
2868004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt      *value = image->region->bo->handle;
2872e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
288f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_NAME:
289f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return intel_region_flink(image->region, (uint32_t *) value);
290f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   default:
2912e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
292f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
293f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg}
294f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
2953af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage *
2963af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
2973af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{
2983af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   __DRIimage *image;
2993af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3003af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image = CALLOC(sizeof *image);
3013af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   if (image == NULL)
3023af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      return NULL;
3033af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3043af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   intel_region_reference(&image->region, orig_image->region);
3053af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   if (image->region == NULL) {
3063af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      FREE(image);
3073af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      return NULL;
3083af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   }
3093af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3103af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->internal_format = orig_image->internal_format;
3113af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->format          = orig_image->format;
3123af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->data_type       = orig_image->data_type;
3133af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->data            = loaderPrivate;
3143af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3153af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   return image;
3163af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke}
3173af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
318c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = {
319c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
320c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_name,
321c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_renderbuffer,
322c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_destroy_image,
323f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg    intel_create_image,
3243af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke    intel_query_image,
3253af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke    intel_dup_image
326c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg};
327c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
328e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
3296d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
3307c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
331c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    &intelImageExtension.base,
332234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    &dri2ConfigQueryExtension.base,
33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
337d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
33824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
33924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
3401c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
34124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
34224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
34324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
34424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
3451c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
34624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
347f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt      if (ret != -EINVAL)
348f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt	 _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
3492e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
35024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
35124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
3522e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
35324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
35477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
356900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param)
357900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{
358900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   int value = 0;
359900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   return intel_get_param(psp, param, &value) && value;
360900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson}
361900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson
36277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
3632d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData)
3642d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{
3652d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg}
3662d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
3672d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void
368d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
3705777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
372904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
3736d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
37477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3752d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   /* Some regions may still have references to them at this point, so
3762d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * flush the hash table to prevent _mesa_DeleteHashTable() from
3772d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * complaining about the hash not being empty; */
3782d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL);
3792d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_DeleteHashTable(intelScreen->named_regions);
3802d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
38277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
38377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
38477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
38577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
38677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
38777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
38877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
38977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
390d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
391d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
392d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg                  const struct gl_config * mesaVis, GLboolean isPixmap)
39377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
394d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
395aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace   struct intel_screen *screen = (struct intel_screen*) driScrnPriv->private;
396d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
39777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
3982e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;          /* not implemented */
39977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
40077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
4014a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
40277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
403d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
40477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
405d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      if (!fb)
4062e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	 return false;
40777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4082ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez      _mesa_initialize_window_framebuffer(fb, mesaVis);
40977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
410119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
4114a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
412119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
413409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
414119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
4154a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
416119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
41777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
418d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      rb = intel_create_renderbuffer(rgbFormat);
419d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base);
42077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
42177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
422d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	 rb = intel_create_renderbuffer(rgbFormat);
423d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base);
42477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
42577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
426f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      /*
427f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       * Assert here that the gl_config has an expected depth/stencil bit
428f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(),
429f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       * which constructs the advertised configs.)
430f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       */
43138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
432800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 assert(mesaVis->stencilBits == 8);
433aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace
434aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	 if (screen->hw_has_separate_stencil
435aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     && screen->dri2_has_hiz != INTEL_DRI2_HAS_HIZ_FALSE) {
436aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    /*
437aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * Request a separate stencil buffer even if we do not yet know if
438aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * the screen supports it. (See comments for
439aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * enum intel_dri2_has_hiz).
440aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     */
441aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    rb = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
442aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base);
443aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    rb = intel_create_renderbuffer(MESA_FORMAT_S8);
444aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base);
445aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	 } else {
446aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    /*
447aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * Use combined depth/stencil. Note that the renderbuffer is
448aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * attached to two attachment points.
449aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     */
450aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    rb = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
451aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base);
452aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base);
453aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	 }
45477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
45577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
456f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace	 assert(mesaVis->stencilBits == 0);
45777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
45877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
4594a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
460d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
46177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
462f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      else {
463f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace	 assert(mesaVis->depthBits == 0);
464f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace	 assert(mesaVis->stencilBits == 0);
465f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      }
46677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
46777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
468d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_soft_renderbuffers(fb,
4692e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke                                   false, /* never sw color */
4702e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke                                   false, /* never sw depth */
4712e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke                                   false, /* never sw stencil */
472f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace                                   mesaVis->accumRedBits > 0,
4732e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke                                   false, /* never sw alpha */
4742e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke                                   false  /* never sw aux */ );
475d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      driDrawPriv->driverPrivate = fb;
47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4772e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
47877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
47977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
48077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
482d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
48377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
484d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
485d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
486d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
48977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
49077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
49177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
49277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
4932e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
4942e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis,
4952e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  __DRIcontext *driContextPriv,
4962e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  void *sharedContextPrivate);
4972e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke
4982e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
4992e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api,
5002e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  const struct gl_config *mesaVis,
5012e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  __DRIcontext *driContextPriv,
5022e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  void *sharedContextPrivate);
5032e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
5042e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api,
5052e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         const struct gl_config *mesaVis,
5062e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         __DRIcontext *driContextPriv,
5072e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		 void *sharedContextPrivate);
50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
50977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
510a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api,
511d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		   const struct gl_config * mesaVis,
512d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
51377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
51477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
515d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
5165777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
51777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
518bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
51919420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
52019420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
5214b69100bdcf26dbb5be4d600b7ca5f5cdf6e8f20Kristian Høgsberg	 return i915CreateContext(api, mesaVis, driContextPriv,
522bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
52319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
524bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
5252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      intelScreen->no_vbo = true;
52677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
52777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
528bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
529bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
5304b69100bdcf26dbb5be4d600b7ca5f5cdf6e8f20Kristian Høgsberg      return brwCreateContext(api, mesaVis,
5314b69100bdcf26dbb5be4d600b7ca5f5cdf6e8f20Kristian Høgsberg			      driContextPriv, sharedContextPrivate);
532bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
5334ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID);
5342e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return false;
53577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
53677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5372e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
5385777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen)
5397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
540d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
541cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
5427e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
5434ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   intelScreen->no_hw = (getenv("INTEL_NO_HW") != NULL ||
5444ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt			 getenv("INTEL_DEVID_OVERRIDE") != NULL);
5457e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
546827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
5477e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
548827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
549827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
5502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
5517e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
5527e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
553bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) ||
554bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt       num_fences == 0) {
555bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt      fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__);
5562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
557bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   }
558e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
55906d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt   drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
56006d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt
5612d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   intelScreen->named_regions = _mesa_NewHashTable();
5622d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
563900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   intelScreen->relaxed_relocations = 0;
564900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   intelScreen->relaxed_relocations |=
565900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson      intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0;
566900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson
5672e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
5687e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
5697e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
570c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
5716b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_hiz with environment variable INTEL_HIZ.
5726b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace *
5736b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_HIZ are "0" and "1". If an invalid valid value is
5746b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * encountered, a warning is emitted and INTEL_HIZ is ignored.
5756b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */
5766b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void
5776b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_hiz(struct intel_screen *intel)
5786b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{
5796b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   const char *s = getenv("INTEL_HIZ");
5806b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   if (!s) {
5816b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      return;
5826b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("0", s, 2)) {
5836b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      intel->hw_has_hiz = false;
5846b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("1", s, 2)) {
5856b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      intel->hw_has_hiz = true;
5866b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else {
5876b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      fprintf(stderr,
5886b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "warning: env variable INTEL_HIZ=\"%s\" has invalid value "
5896b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "and is ignored", s);
5906b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   }
5916b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace}
5926b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
5936b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/**
5946b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable
5956b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL.
5966b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace *
5976b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid
5986b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL
5996b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored.
6006b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */
6016b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void
6026b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen)
6036b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{
6046b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   const char *s = getenv("INTEL_SEPARATE_STENCIL");
6056b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   if (!s) {
6066b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      return;
6076b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("0", s, 2)) {
6086b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      screen->hw_has_separate_stencil = false;
6096b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("1", s, 2)) {
6106b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      screen->hw_has_separate_stencil = true;
6116b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else {
6126b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      fprintf(stderr,
6136b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has "
6146b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "invalid value and is ignored", s);
6156b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   }
6166b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace}
6176b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
6186b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/**
619c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
6208d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
6218d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
622d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver
623c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
624e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
625d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
626c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
6275777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen;
6283ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
6293ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
6305efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   unsigned int api_mask;
6314ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   char *devid_override;
6327c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
6333ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
6346bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
6353ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
636e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
6373ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
6385d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
639c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
640c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
6415777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   intelScreen = CALLOC(sizeof *intelScreen);
642c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
643c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
6442e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
645c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
646c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
647c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
648c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
649c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
650c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
651c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
652c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
653f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
654c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
655c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
6562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
657c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
6584ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   /* Allow an override of the device ID for the purpose of making the
6594ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt    * driver produce dumps for debugging of new chipset enablement.
6604ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt    * This implies INTEL_NO_HW, to avoid programming your actual GPU
6614ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt    * incorrectly.
6624ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt    */
6634ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   devid_override = getenv("INTEL_DEVID_OVERRIDE");
6644ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   if (devid_override) {
6654ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt      intelScreen->deviceID = strtod(devid_override, NULL);
6664ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt   }
6674ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt
66889a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke   if (IS_GEN7(intelScreen->deviceID)) {
66989a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke      intelScreen->gen = 7;
67089a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke   } else if (IS_GEN6(intelScreen->deviceID)) {
6717363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 6;
6727363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_GEN5(intelScreen->deviceID)) {
6737363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 5;
6747363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_965(intelScreen->deviceID)) {
6757363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 4;
6767363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_9XX(intelScreen->deviceID)) {
6777363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 3;
6787363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else {
6797363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 2;
6807363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   }
6817363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg
6826b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   /*
6836b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace    * FIXME: The hiz and separate stencil fields need updating once the
6846b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace    * FIXME: features are completely implemented for a given chipset.
6856b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace    */
6866b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->hw_has_separate_stencil = intelScreen->gen >= 7;
6876b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7;
6886b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->hw_has_hiz = false;
6896b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->dri2_has_hiz = INTEL_DRI2_HAS_HIZ_UNKNOWN;
6906b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
6916b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intel_override_hiz(intelScreen);
6926b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intel_override_separate_stencil(intelScreen);
6936b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
6945efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask = (1 << __DRI_API_OPENGL);
6955efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1
6965efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask |= (1 << __DRI_API_GLES);
6975efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif
6985efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2
6995efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask |= (1 << __DRI_API_GLES2);
7005efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif
7015efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg
7025efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID))
7035efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg      psp->api_mask = api_mask;
7045efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg
7057e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
7062e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke       return false;
7077e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
708e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
709c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
710eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
711eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
7123ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
7133ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
7143ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
71524ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
7163ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
7173ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
71824ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
7193ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
7203ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
721160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
722160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
723160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
724bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate a rich set of useful configs that do not include an
725bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
726bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
7273ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
7285d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
729160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
730160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
731066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
732066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer that has a diffferent number of bits per pixel than the color
733066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer.  This isn't yet supported here.
734160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
735160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
736160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
737160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
738160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
739160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
74073e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick	 stencil_bits[1] = 8;
741160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
74273e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
74373e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick      depth_factor = 2;
74473e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
7455d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
7465d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
7475d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
748160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
7495d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
7505d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
7515d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
7523cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     ARRAY_SIZE(msaa_samples_array),
7532e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke				     false);
754bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (configs == NULL)
755bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = new_configs;
756bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      else
757bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = driConcatConfigs(configs, new_configs);
758bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   }
759bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
760bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate the minimum possible set of configs that include an
761bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
762bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
763bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
764bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      __DRIconfig **new_configs;
765bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
766bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
767bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 16;
768bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 0;
769bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      } else {
770bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 24;
771bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 8;
772bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      }
773bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
774bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
775bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     depth_bits, stencil_bits, 1,
776bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     back_buffer_modes + 1, 1,
777bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     msaa_samples_array, 1,
7782e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke				     true);
7793ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
7803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
7813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
7823ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
7833ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
7843ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
7853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
7863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
7873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
7883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
7893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
7903ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
7915d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
792c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
793e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
7942adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer {
7952adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   __DRIbuffer base;
7962adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_region *region;
7972adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke};
7982adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
7992adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer *
8002adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen,
8012adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke		    unsigned attachment, unsigned format,
8022adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke		    int width, int height)
8032adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{
8042adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_buffer *intelBuffer;
8052adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_screen *intelScreen = screen->private;
8065dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg   uint32_t tiling;
8072adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8082adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer = CALLOC(sizeof *intelBuffer);
8092adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   if (intelBuffer == NULL)
8102adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke      return NULL;
8112adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8125dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg   if ((attachment == __DRI_BUFFER_DEPTH ||
8135dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg	attachment == __DRI_BUFFER_STENCIL ||
8145dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg	attachment == __DRI_BUFFER_DEPTH_STENCIL) &&
8155dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg       intelScreen->gen >= 4)
8165dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg      tiling = I915_TILING_Y;
8175dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg   else
8185dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg      tiling = I915_TILING_X;
8195dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg
8205dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg   intelBuffer->region = intel_region_alloc(intelScreen, tiling,
8212e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke					    format / 8, width, height, true);
8222adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8232adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   if (intelBuffer->region == NULL) {
8242adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke	   FREE(intelBuffer);
8252adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke	   return NULL;
8262adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   }
8272adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8282adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intel_region_flink(intelBuffer->region, &intelBuffer->base.name);
8292adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8302adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.attachment = attachment;
8312adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.cpp = intelBuffer->region->cpp;
8322adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.pitch =
8332adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke         intelBuffer->region->pitch * intelBuffer->region->cpp;
8342adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8352adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   return &intelBuffer->base;
8362adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}
8372adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8382adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void
8392adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
8402adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{
8412adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer;
8422adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8432adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intel_region_release(&intelBuffer->region);
8442adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   free(intelBuffer);
8452adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}
8462adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
8472adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
848e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
8497192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis   .InitScreen		 = intelInitScreen2,
850e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
851e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
852e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
853e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
854e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
855e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
856e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
8572adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   .AllocateBuffer       = intelAllocateBuffer,
8582adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   .ReleaseBuffer        = intelReleaseBuffer
859e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
86039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
86139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
86239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
86339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
86439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
86539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
86639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
867