intel_screen.c revision 249817e92839d9ecdd78360eb3a856724df504c4
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"
3614aff23e1b4d52d5e10a3aeb65c3f4c783498a35Brian Paul#include "main/version.h"
37d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h"
386c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h"
4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h"
4177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
43a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
44a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
45e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
46fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
47fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
48fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
49f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
50fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
51fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
52fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
53fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
54fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
551ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
568e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_BEGIN(texture_tiling, bool, true)
578e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt	 DRI_CONF_DESC(en, "Enable texture tiling")
588e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_END
591ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
60d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt      DRI_CONF_OPT_BEGIN(hiz, bool, true)
61d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt	 DRI_CONF_DESC(en, "Enable Hierarchical Z on gen6+")
62d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt      DRI_CONF_OPT_END
63d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt
64b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
65b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
66b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
67b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
68a58514cc9c5cc5867f9140700462c5ac5749550dEric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, true)
69862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
70862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
71862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt
72a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
73a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
74a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
75acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
76a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
77a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
78a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
7940bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
80f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
81642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt     DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false)
8281aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
8381aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
8481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
8581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
86c6abde211fa875f90e59e3709720cfe394669069Eric Anholt
87c6abde211fa875f90e59e3709720cfe394669069Eric Anholt      DRI_CONF_OPT_BEGIN(shader_precompile, bool, false)
88c6abde211fa875f90e59e3709720cfe394669069Eric Anholt	 DRI_CONF_DESC(en, "Perform code generation at shader link time.")
89c6abde211fa875f90e59e3709720cfe394669069Eric Anholt      DRI_CONF_OPT_END
90a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
93d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholtconst GLuint __driNConfigOptions = 14;
9477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
95df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h"
96df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h"
97df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h"
98df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h"
99df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h"
100da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace#include "intel_mipmap_tree.h"
101df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h"
102df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h"
103df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h"
104df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt
105df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h"
106df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt
10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE
10885063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */
11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
111252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkevoid
112252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkeaub_dump_bmp(struct gl_context *ctx)
113252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke{
114252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke   struct gl_framebuffer *fb = ctx->DrawBuffer;
115252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
116252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke   for (int i = 0; i < fb->_NumColorDrawBuffers; i++) {
117252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      struct intel_renderbuffer *irb =
118252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 intel_renderbuffer(fb->_ColorDrawBuffers[i]);
119252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
120252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      if (irb && irb->mt) {
121252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 enum aub_dump_bmp_format format;
122252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
123252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 switch (irb->Base.Base.Format) {
124252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 case MESA_FORMAT_ARGB8888:
125252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 case MESA_FORMAT_XRGB8888:
126252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	    format = AUB_DUMP_BMP_FORMAT_ARGB_8888;
127252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	    break;
128252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 default:
129252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	    continue;
130252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 }
131252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
132252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke	 drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo,
133252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->draw_x,
134252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->draw_y,
135252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->Base.Base.Width,
136252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->Base.Base.Height,
137252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       format,
138252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->mt->region->pitch *
139252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       irb->mt->region->cpp,
140252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke				       0);
141252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      }
142252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke   }
143252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke}
144252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke
1456d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
1466d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
1476d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
14866175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
1496d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
1506d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
1517c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1527c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
1537c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
154dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt   GET_CURRENT_CONTEXT(ctx);
155dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt   struct intel_context *intel = intel_context(ctx);
156ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   if (intel == NULL)
157ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat      return;
1587c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
159ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   if (intel->gen < 4)
160ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat      INTEL_FIREVERTICES(intel);
1617c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
162ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   intel->need_throttle = true;
163e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg
164ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat   if (intel->batch.used)
165ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat      intel_batchbuffer_flush(intel);
1660247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt
1670247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt   if (INTEL_DEBUG & DEBUG_AUB) {
168252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke      aub_dump_bmp(ctx);
1690247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt   }
1707c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1717c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1727c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1737c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1747c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
175e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg    dri2InvalidateDrawable,
1767c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1777c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
178c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
1799ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen,
180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int width, int height, int format,
181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int name, int pitch, void *loaderPrivate)
182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
183875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis    struct intel_screen *intelScreen = screen->driverPrivate;
184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    __DRIimage *image;
185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    int cpp;
186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image = CALLOC(sizeof *image);
188c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image == NULL)
189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	return NULL;
190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
191249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira    image->dri_format = format;
192249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira
193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    switch (format) {
194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_RGB565:
195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_RGB565;
196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
198c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_XRGB8888:
200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_XRGB8888;
201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_ARGB8888:
205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_ARGB8888;
206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGBA;
207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
2099fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu    case __DRI_IMAGE_FORMAT_ABGR8888:
2109fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->format = MESA_FORMAT_RGBA8888_REV;
2119fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->internal_format = GL_RGBA;
2129fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->data_type = GL_UNSIGNED_BYTE;
2139fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       break;
214c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    default:
215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       free(image);
216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->data = loaderPrivate;
220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    cpp = _mesa_get_format_bytes(image->format);
221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
2229ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg    image->region = intel_region_alloc_for_handle(intelScreen,
2239087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg						  cpp, width, height,
224c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg						  pitch, name, "image");
225c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image->region == NULL) {
226c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       FREE(image);
227c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
228c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
229c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
230c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    return image;
231c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
232c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
233c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
234c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context,
235c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg				     int renderbuffer, void *loaderPrivate)
236c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
237c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   __DRIimage *image;
238c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_context *intel = context->driverPrivate;
239c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct gl_renderbuffer *rb;
240c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_renderbuffer *irb;
241c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
242d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg   rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer);
243c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (!rb) {
244c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      _mesa_error(&intel->ctx,
245c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg		  GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
246c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
247c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   }
248c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
249c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   irb = intel_renderbuffer(rb);
250c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image = CALLOC(sizeof *image);
251c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (image == NULL)
252c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
253c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
254c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->internal_format = rb->InternalFormat;
255c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->format = rb->Format;
256f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul   image->data_type = GL_UNSIGNED_BYTE;
257c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data = loaderPrivate;
258da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace   intel_region_reference(&image->region, irb->mt->region);
259c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
260249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   switch (image->format) {
261249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_RGB565:
262249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_RGB565;
263249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
264249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_XRGB8888:
265249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
266249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
267249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_ARGB8888:
268249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
269249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
270249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   case MESA_FORMAT_RGBA8888_REV:
271249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      image->dri_format = __DRI_IMAGE_FORMAT_ABGR8888;
272249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira      break;
273249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   }
274249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira
275c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   return image;
276c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
277c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
278c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void
279c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image)
280c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
281c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_region_release(&image->region);
282c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    FREE(image);
283c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
284c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
285f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage *
286f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen,
287f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   int width, int height, int format,
288f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   unsigned int use,
289f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg		   void *loaderPrivate)
290f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{
291f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   __DRIimage *image;
292875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = screen->driverPrivate;
293e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   uint32_t tiling;
294f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   int cpp;
295f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
296e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   tiling = I915_TILING_X;
297e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   if (use & __DRI_IMAGE_USE_CURSOR) {
298e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      if (width != 64 || height != 64)
299e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg	 return NULL;
300e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      tiling = I915_TILING_NONE;
301e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg   }
302e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg
303f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image = CALLOC(sizeof *image);
304f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   if (image == NULL)
305f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
306f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
3078de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes   image->dri_format = format;
3088de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes
309f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   switch (format) {
310f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_FORMAT_RGB565:
311f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->format = MESA_FORMAT_RGB565;
312f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->internal_format = GL_RGB;
313f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->data_type = GL_UNSIGNED_BYTE;
314f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      break;
315f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_FORMAT_XRGB8888:
316f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->format = MESA_FORMAT_XRGB8888;
317f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->internal_format = GL_RGB;
318f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->data_type = GL_UNSIGNED_BYTE;
319f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      break;
320f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_FORMAT_ARGB8888:
321f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->format = MESA_FORMAT_ARGB8888;
322f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->internal_format = GL_RGBA;
323f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      image->data_type = GL_UNSIGNED_BYTE;
324f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      break;
3259fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu    case __DRI_IMAGE_FORMAT_ABGR8888:
3269fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->format = MESA_FORMAT_RGBA8888_REV;
3279fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->internal_format = GL_RGBA;
3289fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       image->data_type = GL_UNSIGNED_BYTE;
3299fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu       break;
330f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   default:
331f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      free(image);
332f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
333f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
334f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
335f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image->data = loaderPrivate;
336f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   cpp = _mesa_get_format_bytes(image->format);
337f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
338f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   image->region =
339e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg      intel_region_alloc(intelScreen, tiling,
3402e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke			 cpp, width, height, true);
341f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   if (image->region == NULL) {
342f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      FREE(image);
343f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return NULL;
344f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
345f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
346f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   return image;
347f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg}
348f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
349f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean
350f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value)
351f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{
352f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   switch (attrib) {
353f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_STRIDE:
354f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      *value = image->region->pitch * image->region->cpp;
3552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
356f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_HANDLE:
3578004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt      *value = image->region->bo->handle;
3582e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
359f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   case __DRI_IMAGE_ATTRIB_NAME:
360f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg      return intel_region_flink(image->region, (uint32_t *) value);
3618de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes   case __DRI_IMAGE_ATTRIB_FORMAT:
362fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira      *value = image->dri_format;
363fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira      return true;
364f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   default:
3652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
366f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg   }
367f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg}
368f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg
3693af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage *
3703af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
3713af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{
3723af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   __DRIimage *image;
3733af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3743af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image = CALLOC(sizeof *image);
3753af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   if (image == NULL)
3763af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      return NULL;
3773af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3783af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   intel_region_reference(&image->region, orig_image->region);
3793af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   if (image->region == NULL) {
3803af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      FREE(image);
3813af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke      return NULL;
3823af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   }
3833af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3843af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->internal_format = orig_image->internal_format;
385249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira   image->dri_format      = orig_image->dri_format;
3863af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->format          = orig_image->format;
3873af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->data_type       = orig_image->data_type;
3883af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   image->data            = loaderPrivate;
3893af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
3903af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke   return image;
3913af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke}
3923af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke
393221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergstatic GLboolean
394221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergintel_validate_usage(__DRIimage *image, unsigned int use)
395221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg{
396221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg   if (use & __DRI_IMAGE_USE_CURSOR) {
397221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg      if (image->region->width != 64 || image->region->height != 64)
398221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg	 return GL_FALSE;
399221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg   }
400221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg
401221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg   return GL_TRUE;
402221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg}
403221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg
404c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = {
4050beed7f072e2a8127c7c02dfc39fb37053d96b22Jesse Barnes    { __DRI_IMAGE, 3 },
406c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_name,
407c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_renderbuffer,
408c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_destroy_image,
409f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg    intel_create_image,
4103af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke    intel_query_image,
411221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg    intel_dup_image,
412221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg    intel_validate_usage
413c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg};
414c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
415e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
4166d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
4177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
418c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    &intelImageExtension.base,
419234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    &dri2ConfigQueryExtension.base,
42077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
42177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
42277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4232e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
424d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
42524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
42624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
4271c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
42824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
429f33d100fa71cecfb163dd91cd56b9a2788a43c22Eric Anholt   memset(&gp, 0, sizeof(gp));
43024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
43124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
43224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
4331c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
43424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
435f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt      if (ret != -EINVAL)
436f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt	 _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
4372e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
43824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
43924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
4402e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
44124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
44277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4432e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
444900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param)
445900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{
446900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   int value = 0;
447900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   return intel_get_param(psp, param, &value) && value;
448900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson}
449900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson
45077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
4512d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData)
4522d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{
4532d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg}
4542d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
4552d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void
456d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
45777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
458875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = sPriv->driverPrivate;
45977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
460904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
4616d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
46277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4632d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   /* Some regions may still have references to them at this point, so
4642d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * flush the hash table to prevent _mesa_DeleteHashTable() from
4652d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * complaining about the hash not being empty; */
4662d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL);
4672d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_DeleteHashTable(intelScreen->named_regions);
4682d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
46977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
470875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   sPriv->driverPrivate = NULL;
47177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
47277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
47577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
47777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
478d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
479d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
480d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg                  const struct gl_config * mesaVis, GLboolean isPixmap)
48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
482d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
483875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *screen = (struct intel_screen*) driScrnPriv->driverPrivate;
484d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
4862e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;          /* not implemented */
48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
4894a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
49077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
491d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
49277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
493d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      if (!fb)
4942e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	 return false;
49577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4962ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez      _mesa_initialize_window_framebuffer(fb, mesaVis);
49777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
498119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
4994a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
500119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
501409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
502119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
5034a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
504119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
50577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
506d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      rb = intel_create_renderbuffer(rgbFormat);
5079f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base);
50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
50977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
510d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	 rb = intel_create_renderbuffer(rgbFormat);
5119f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base);
51277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
51377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
514f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      /*
515f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       * Assert here that the gl_config has an expected depth/stencil bit
516f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(),
517f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       * which constructs the advertised configs.)
518f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace       */
51938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
520800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 assert(mesaVis->stencilBits == 8);
521aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace
522aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	 if (screen->hw_has_separate_stencil
523aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     && screen->dri2_has_hiz != INTEL_DRI2_HAS_HIZ_FALSE) {
524aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    /*
525aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * Request a separate stencil buffer even if we do not yet know if
526aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * the screen supports it. (See comments for
527aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * enum intel_dri2_has_hiz).
528aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     */
529aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    rb = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
5309f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
531aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    rb = intel_create_renderbuffer(MESA_FORMAT_S8);
5329f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base);
533aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	 } else {
534aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    /*
535aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * Use combined depth/stencil. Note that the renderbuffer is
536aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     * attached to two attachment points.
537aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	     */
538aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	    rb = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
5399f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
5409f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base);
541aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace	 }
54277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
54377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
544f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace	 assert(mesaVis->stencilBits == 0);
54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
54677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
5474a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
5489f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base.Base);
54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
550f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      else {
551f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace	 assert(mesaVis->depthBits == 0);
552f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace	 assert(mesaVis->stencilBits == 0);
553f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace      }
55477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
55577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
556d0dc75c000d5af92648c7de901756400672b8447Brian Paul      _swrast_add_soft_renderbuffers(fb,
557d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     false, /* never sw color */
558d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     false, /* never sw depth */
559d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     false, /* never sw stencil */
560d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     mesaVis->accumRedBits > 0,
561d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     false, /* never sw alpha */
562d0dc75c000d5af92648c7de901756400672b8447Brian Paul                                     false  /* never sw aux */ );
563d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      driDrawPriv->driverPrivate = fb;
56477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return true;
56677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
56777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
56877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
56977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
570d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
57177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
572d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
573d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
574d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
57577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
57677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
57777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
57877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
57977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
58077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
5812e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
5822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis,
5832e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  __DRIcontext *driContextPriv,
5842e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  void *sharedContextPrivate);
5852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke
5862e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
5872e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api,
5882e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  const struct gl_config *mesaVis,
5892e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  __DRIcontext *driContextPriv,
5902e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		  void *sharedContextPrivate);
5912e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool
5922e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api,
5932e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         const struct gl_config *mesaVis,
5942e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke	         __DRIcontext *driContextPriv,
5952e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke		 void *sharedContextPrivate);
59677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
59777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
598a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api,
599d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg		   const struct gl_config * mesaVis,
600d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
601e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned major_version,
602e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned minor_version,
603e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   uint32_t flags,
604e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick		   unsigned *error,
60577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
60677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
607d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
608875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = sPriv->driverPrivate;
60935cdd7b6dbc763fe57bf466def0a4257ca09beb8Eric Anholt   bool success = false;
61077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
611bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
61219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
61319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
614e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick	 success = i915CreateContext(api, mesaVis, driContextPriv,
615e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick				     sharedContextPrivate);
61619420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
617bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
6182e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      intelScreen->no_vbo = true;
619e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      success = i830CreateContext(mesaVis, driContextPriv,
620e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick				  sharedContextPrivate);
62177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
622bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
623bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
624e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      success = brwCreateContext(api, mesaVis,
625e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick			      driContextPriv,
626e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick			      sharedContextPrivate);
627bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
628e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
629e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   if (success) {
630e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      struct gl_context *ctx =
631e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick	 (struct gl_context *) driContextPriv->driverPrivate;
632e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
633e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      _mesa_compute_version(ctx);
634e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      if (ctx->VersionMajor > major_version
635e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick	  || (ctx->VersionMajor == major_version
636e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick	      && ctx->VersionMinor >= minor_version)) {
637e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick	 *error = __DRI_CTX_ERROR_BAD_VERSION;
638e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick	 return true;
639e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      }
640e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
641e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      intelDestroyContext(driContextPriv);
642e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   } else {
643e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      *error = __DRI_CTX_ERROR_NO_MEMORY;
644e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick      fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID);
645e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick   }
646e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick
6472e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return false;
64877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
64977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
6502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool
6515777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen)
6527e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
653d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
654cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
6557e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
6562222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
6577e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
658827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
6597e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
660827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
661827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
6622e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
6637e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
6647e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
665bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) ||
666bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt       num_fences == 0) {
667bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt      fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__);
6682e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
669bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   }
670e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
67106d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt   drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
67206d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt
6732d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   intelScreen->named_regions = _mesa_NewHashTable();
6742d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
675900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   intelScreen->relaxed_relocations = 0;
676900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson   intelScreen->relaxed_relocations |=
677900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson      intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0;
678900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson
6792e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke   return true;
6807e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
6817e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
682c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
6836b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable
6846b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL.
6856b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace *
6866b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid
6876b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL
6886b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored.
6896b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */
6906b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void
6916b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen)
6926b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{
6936b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   const char *s = getenv("INTEL_SEPARATE_STENCIL");
6946b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   if (!s) {
6956b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      return;
6966b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("0", s, 2)) {
6976b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      screen->hw_has_separate_stencil = false;
6986b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else if (!strncmp("1", s, 2)) {
6996b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      screen->hw_has_separate_stencil = true;
7006b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   } else {
7016b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace      fprintf(stderr,
7026b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has "
7036b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace	      "invalid value and is ignored", s);
7046b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   }
7056b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace}
7066b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
707f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterstatic bool
708f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterintel_detect_swizzling(struct intel_screen *screen)
709f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter{
710f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   drm_intel_bo *buffer;
711f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   unsigned long flags = 0;
712f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   unsigned long aligned_pitch;
713f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   uint32_t tiling = I915_TILING_X;
714f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   uint32_t swizzle_mode = 0;
715f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
716f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test",
717f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter				     64, 64, 4,
718f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter				     &tiling, &aligned_pitch, flags);
719f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   if (buffer == NULL)
720f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter      return false;
721f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
722f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   drm_intel_bo_get_tiling(buffer, &tiling, &swizzle_mode);
723f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   drm_intel_bo_unreference(buffer);
724f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
725f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   if (swizzle_mode == I915_BIT_6_SWIZZLE_NONE)
726f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter      return false;
727f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   else
728f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter      return true;
729f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter}
730f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
7316b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/**
732c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
7338d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
7348d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
735d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver
736c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
737e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
738d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
739c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
7405777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen;
7413ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
7423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
7435efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   unsigned int api_mask;
7447c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
7453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
7466bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
7473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
748e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
7493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
7505d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
751c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
752c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
7535777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   intelScreen = CALLOC(sizeof *intelScreen);
754c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
755c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
7562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      return false;
757c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
758c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
759c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
760c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
761c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
762c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
763875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   psp->driverPrivate = (void *) intelScreen;
764c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
7652222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt   if (!intel_init_bufmgr(intelScreen))
7662222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt       return false;
767c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
7682222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt   intelScreen->deviceID = drm_intel_bufmgr_gem_get_devid(intelScreen->bufmgr);
7694ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt
770cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt   intelScreen->kernel_has_gen7_sol_reset =
771cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt      intel_get_boolean(intelScreen->driScrnPriv,
772cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt			I915_PARAM_HAS_GEN7_SOL_RESET);
773cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt
77489a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke   if (IS_GEN7(intelScreen->deviceID)) {
77589a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke      intelScreen->gen = 7;
77689a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke   } else if (IS_GEN6(intelScreen->deviceID)) {
7777363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 6;
7787363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_GEN5(intelScreen->deviceID)) {
7797363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 5;
7807363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_965(intelScreen->deviceID)) {
7817363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 4;
7827363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else if (IS_9XX(intelScreen->deviceID)) {
7837363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 3;
7847363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   } else {
7857363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg      intelScreen->gen = 2;
7867363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg   }
7877363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg
788e5411d8fdc6a7dda18d82746b84197ef83ee0a13Chad Versace   intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6;
7896b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7;
7906b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intelScreen->dri2_has_hiz = INTEL_DRI2_HAS_HIZ_UNKNOWN;
7916b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
792249fc7056104113633215106ac085b505d8dc161Eric Anholt   int has_llc = 0;
793249fc7056104113633215106ac085b505d8dc161Eric Anholt   bool success = intel_get_param(intelScreen->driScrnPriv, I915_PARAM_HAS_LLC,
794249fc7056104113633215106ac085b505d8dc161Eric Anholt				  &has_llc);
795249fc7056104113633215106ac085b505d8dc161Eric Anholt   if (success && has_llc)
796249fc7056104113633215106ac085b505d8dc161Eric Anholt      intelScreen->hw_has_llc = true;
797249fc7056104113633215106ac085b505d8dc161Eric Anholt   else if (!success && intelScreen->gen >= 6)
798249fc7056104113633215106ac085b505d8dc161Eric Anholt      intelScreen->hw_has_llc = true;
7997def293204977c41ea35198af147f743a31b1889Eugeni Dodonov
8006b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace   intel_override_separate_stencil(intelScreen);
8016b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace
8025efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask = (1 << __DRI_API_OPENGL);
8035efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1
8045efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask |= (1 << __DRI_API_GLES);
8055efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif
8065efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2
8075efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   api_mask |= (1 << __DRI_API_GLES2);
8085efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif
8095efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg
8105efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg   if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID))
8115efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg      psp->api_mask = api_mask;
8125efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg
813f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter   intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
814f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter
815e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
816c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
817eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
818eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
8193ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
8203ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
8213ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
82224ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
8233ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
8243ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
82524ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
8263ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
8273ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
828160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
829160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
830160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
831bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate a rich set of useful configs that do not include an
832bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
833bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
8343ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
8355d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
836160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
837160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
838066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
839066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer that has a diffferent number of bits per pixel than the color
840066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer.  This isn't yet supported here.
841160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
842160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
843160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
844160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
845160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
846160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
84773e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick	 stencil_bits[1] = 8;
848160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
84973e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
85073e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick      depth_factor = 2;
85173e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
8525d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
8535d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
8545d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
855160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
8565d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
8575d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
8585d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
8593cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     ARRAY_SIZE(msaa_samples_array),
8602e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke				     false);
861bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (configs == NULL)
862bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = new_configs;
863bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      else
864bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = driConcatConfigs(configs, new_configs);
865bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   }
866bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
867bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate the minimum possible set of configs that include an
868bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
869bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
870bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
871bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      __DRIconfig **new_configs;
872bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
873bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
874bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 16;
875bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 0;
876bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      } else {
877bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 24;
878bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 8;
879bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      }
880bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
881bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
882bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     depth_bits, stencil_bits, 1,
883bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     back_buffer_modes + 1, 1,
884bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     msaa_samples_array, 1,
8852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke				     true);
8863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
8873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
8883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
8893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
8903ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
8913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
8923ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
8933ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
8943ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
8953ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
8963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
8973ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
8985d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
899c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
900e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
9012adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer {
9022adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   __DRIbuffer base;
9032adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_region *region;
9042adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke};
9052adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
90679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace/**
90779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \brief Get tiling format for a DRI buffer.
90879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *
90979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \param attachment is the buffer's attachmet point, such as
91079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *        __DRI_BUFFER_DEPTH.
91179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \param out_tiling is the returned tiling format for buffer.
91279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \return false if attachment is unrecognized or is incompatible with screen.
91379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */
91479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versacestatic bool
91579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versaceintel_get_dri_buffer_tiling(struct intel_screen *screen,
91679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                            uint32_t attachment,
91779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                            uint32_t *out_tiling)
91879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace{
91979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   if (screen->gen < 4) {
92079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      *out_tiling = I915_TILING_X;
92179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      return true;
92279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   }
92379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace
92479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   switch (attachment) {
92579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_DEPTH:
92679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_DEPTH_STENCIL:
92779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_HIZ:
92879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      *out_tiling = I915_TILING_Y;
92979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      return true;
93079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_ACCUM:
93179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_FRONT_LEFT:
93279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_FRONT_RIGHT:
93379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_BACK_LEFT:
93479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_BACK_RIGHT:
93579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_FAKE_FRONT_LEFT:
93679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_FAKE_FRONT_RIGHT:
93779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      *out_tiling = I915_TILING_X;
93879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      return true;
93979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   case __DRI_BUFFER_STENCIL:
94079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      /* The stencil buffer is W tiled. However, we request from the kernel
94179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace       * a non-tiled buffer because the GTT is incapable of W fencing.
94279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace       */
94379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      *out_tiling = I915_TILING_NONE;
94479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      return true;
94579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   default:
94679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      if(unlikely(INTEL_DEBUG & DEBUG_DRI)) {
94779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace	 fprintf(stderr, "error: %s: unrecognized DRI buffer attachment 0x%x\n",
94879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace	         __FUNCTION__, attachment);
94979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      }
95079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace       return false;
95179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   }
95279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace}
95379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace
9542adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer *
9552adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen,
9562adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke		    unsigned attachment, unsigned format,
9572adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke		    int width, int height)
9582adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{
9592adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_buffer *intelBuffer;
960875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis   struct intel_screen *intelScreen = screen->driverPrivate;
96179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace
9625dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg   uint32_t tiling;
96379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   uint32_t region_width;
96479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   uint32_t region_height;
96579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   uint32_t region_cpp;
96679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace
96779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   bool ok = true;
96879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace
96979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   ok = intel_get_dri_buffer_tiling(intelScreen, attachment, &tiling);
97079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   if (!ok)
97179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      return NULL;
9722adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
9732adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer = CALLOC(sizeof *intelBuffer);
9742adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   if (intelBuffer == NULL)
9752adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke      return NULL;
9762adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
97779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   if (attachment == __DRI_BUFFER_STENCIL) {
978a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry      /* Stencil buffers use W tiling, a tiling format that the DRM functions
979a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * don't properly account for.  Therefore, when we allocate a stencil
980a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * buffer that is private to Mesa (see intel_miptree_create), we round
981a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * the height and width up to the next multiple of the tile size (64x64)
982a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * and then ask DRM to allocate an untiled buffer.  Consequently, the
983a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * height and the width stored in the stencil buffer's region structure
984a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * are always multiples of 64, even if the stencil buffer itself is
985a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * smaller.
986a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       *
987a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * To avoid inconsistencies between how we represent private buffers and
988a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * buffers shared with the window system, round up the height and width
989a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry       * for window system buffers too.
99079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace       */
99179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      region_width = ALIGN(width, 64);
992a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry      region_height = ALIGN(height, 64);
99379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   } else {
99479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      region_width = width;
99579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace      region_height = height;
99679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   }
9975dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg
998a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry   region_cpp = format / 8;
999a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry
100079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace   intelBuffer->region = intel_region_alloc(intelScreen,
100179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                                            tiling,
100279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                                            region_cpp,
100379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                                            region_width,
100479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                                            region_height,
100579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace                                            true);
10062adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10072adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   if (intelBuffer->region == NULL) {
10082adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke	   FREE(intelBuffer);
10092adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke	   return NULL;
10102adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   }
10112adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10122adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intel_region_flink(intelBuffer->region, &intelBuffer->base.name);
10132adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10142adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.attachment = attachment;
10152adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.cpp = intelBuffer->region->cpp;
10162adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intelBuffer->base.pitch =
10172adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke         intelBuffer->region->pitch * intelBuffer->region->cpp;
10182adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10192adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   return &intelBuffer->base;
10202adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}
10212adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10222adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void
10232adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer)
10242adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{
10252adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer;
10262adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10272adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   intel_region_release(&intelBuffer->region);
10282adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   free(intelBuffer);
10292adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}
10302adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
10312adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke
1032e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
10337192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis   .InitScreen		 = intelInitScreen2,
1034e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
1035e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
1036e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
1037e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
1038e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
1039e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
1040e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
10412adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   .AllocateBuffer       = intelAllocateBuffer,
10422adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke   .ReleaseBuffer        = intelReleaseBuffer
1043e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
104439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
104539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
104639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
104739a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
104839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
104939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
105039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
1051