intel_screen.c revision 234286c0f8b7d30ed49223c648d4c73c1a517ab3
177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**************************************************************************
277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * All Rights Reserved.
577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * copy of this software and associated documentation files (the
877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * "Software"), to deal in the Software without restriction, including
977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * without limitation the rights to use, copy, modify, merge, publish,
1077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to
1177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * permit persons to whom the Software is furnished to do so, subject to
1277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * the following conditions:
1377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
1477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * The above copyright notice and this permission notice (including the
1577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * next paragraph) shall be included in all copies or substantial portions
1677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * of the Software.
1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt *
2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt **************************************************************************/
2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
28ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
29ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h"
30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h"
31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h"
322d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h"
33d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h"
346c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
3577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h"
3677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h"
3777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
386c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_batchbuffer.h"
3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffers.h"
406c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_bufmgr.h"
416c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_chipset.h"
4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_fbo.h"
436c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_screen.h"
446c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_tex.h"
45c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg#include "intel_regions.h"
4677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
47bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#include "i915_drm.h"
486c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul
491ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt#define DRI_CONF_TEXTURE_TILING(def) \
5077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
5177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] =
52a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_BEGIN
53a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_PERFORMANCE
54e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes      DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
55fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
56fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       * DRI_CONF_BO_REUSE_ALL
57fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt       */
58f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie      DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
59fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
60fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
61fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt	 DRI_CONF_DESC_END
63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt      DRI_CONF_OPT_END
641ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
658e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_BEGIN(texture_tiling, bool, true)
668e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt	 DRI_CONF_DESC(en, "Enable texture tiling")
678e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt      DRI_CONF_OPT_END
681ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt
69b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_BEGIN(early_z, bool, false)
70b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt	 DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
71b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt      DRI_CONF_OPT_END
72b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt
73862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_BEGIN(fragment_shader, bool, false)
74862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt	 DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
75862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt      DRI_CONF_OPT_END
76862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt
77a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
78a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_QUALITY
79a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt      DRI_CONF_FORCE_S3TC_ENABLE(false)
80acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer      DRI_CONF_ALLOW_LARGE_TEXTURES(2)
81a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
82a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_DEBUG
83a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt     DRI_CONF_NO_RAST(false)
8440bc2748c2781600c748e546160bcc2aab637825Eric Anholt     DRI_CONF_ALWAYS_FLUSH_BATCH(false)
85f3687284c12f34268172b9c60e2effd697162129Eric Anholt     DRI_CONF_ALWAYS_FLUSH_CACHE(false)
8681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt
8781aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false)
8881aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt	 DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.")
8981aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt      DRI_CONF_OPT_END
90a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt   DRI_CONF_SECTION_END
91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END;
92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt
931e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11;
9477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric 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{
1087c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1097c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1107c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->gen < 4)
1117c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      INTEL_FIREVERTICES(intel);
1127c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1137c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->batch->map != intel->batch->ptr)
1147c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      intel_batchbuffer_flush(intel->batch);
1157c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1167c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
11861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco JerezintelDRI2Invalidate(__DRIdrawable *drawable)
1197c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1207aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1217aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt
1227aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   intel->using_dri2_swapbuffers = GL_TRUE;
12361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez   dri2InvalidateDrawable(drawable);
1247c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1257c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1267c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1277c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1287c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
12961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez    intelDRI2Invalidate,
1307c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1317c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
132c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
133c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_name(__DRIcontext *context,
134c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int width, int height, int format,
135c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int name, int pitch, void *loaderPrivate)
136c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
137c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    __DRIimage *image;
138c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    struct intel_context *intel = context->driverPrivate;
139c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    int cpp;
140c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
141c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image = CALLOC(sizeof *image);
142c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image == NULL)
143c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	return NULL;
144c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
145c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    switch (format) {
146c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_RGB565:
147c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_RGB565;
148c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
149c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
150c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
151c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_XRGB8888:
152c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_XRGB8888;
153c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
154c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
155c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
156c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_ARGB8888:
157c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_ARGB8888;
158c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGBA;
159c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
160c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
161c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    default:
162c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       free(image);
163c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
164c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
165c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
166c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->data = loaderPrivate;
167c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    cpp = _mesa_get_format_bytes(image->format);
168c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
169c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->region = intel_region_alloc_for_handle(intel, 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
216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = {
217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_name,
219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_renderbuffer,
220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_destroy_image,
221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg};
222c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
223e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
22477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driReadDrawableExtension,
2256d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
2267c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
227c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    &intelImageExtension.base,
228234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes    &dri2ConfigQueryExtension.base,
22977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
23077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
23177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
23224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean
233d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
23424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
23524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
2361c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
23724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
23824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
23924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
24024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
2411c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
24224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
24342e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul      _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
24424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
24524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
24624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
24724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   return GL_TRUE;
24824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
24977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
25077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
2512d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData)
2522d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{
2532d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg}
2542d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
2552d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void
256d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
25777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
2585777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
25977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
260904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
2616d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
26277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2632d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   /* Some regions may still have references to them at this point, so
2642d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * flush the hash table to prevent _mesa_DeleteHashTable() from
2652d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * complaining about the hash not being empty; */
2662d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL);
2672d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_DeleteHashTable(intelScreen->named_regions);
2682d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
27077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
27177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
27277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
27677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
27777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
278d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
279d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  const __GLcontextModes * mesaVis, GLboolean isPixmap)
28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
282d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
283d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
28477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
28577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;          /* not implemented */
28677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
28777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
28877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLboolean swStencil = (mesaVis->stencilBits > 0 &&
28977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                             mesaVis->depthBits != 24);
2904a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
29177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
292d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
29377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
294d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      if (!fb)
29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2972ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez      _mesa_initialize_window_framebuffer(fb, mesaVis);
29877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
299119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
3004a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
301119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
302409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
303119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
3044a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
305119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
30677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
307d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      rb = intel_create_renderbuffer(rgbFormat);
308d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base);
30977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
311d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	 rb = intel_create_renderbuffer(rgbFormat);
312d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base);
31377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
31477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
316800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 assert(mesaVis->stencilBits == 8);
317800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 /* combined depth/stencil buffer */
318800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 struct intel_renderbuffer *depthStencilRb
319800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	    = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
320800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 /* note: bind RB to two attachment points */
321800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base);
322800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt	 _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base);
32377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
32577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
32677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
3274a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
328d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
32977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
33077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
33177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
332d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_soft_renderbuffers(fb,
33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw color */
33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw depth */
33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   swStencil, mesaVis->accumRedBits > 0,
33677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw alpha */
33777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE  /* never sw aux */ );
338d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      driDrawPriv->driverPrivate = fb;
33977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_TRUE;
34177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
34277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
34377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
345d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
347d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
348d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
349d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
35377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
35477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
35577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
35677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,
357d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
35877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
35977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,
361d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
36277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
363bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,
364d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg				  __DRIcontext * driContextPriv,
365bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  void *sharedContextPrivate);
36677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis,
369d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
372d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
3735777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
37477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
375bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
37619420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
37719420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
37819420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt	 return i915CreateContext(mesaVis, driContextPriv,
379bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
38019420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
381bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
382cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie      intelScreen->no_vbo = GL_TRUE;
38377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
38477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
385bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
386bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
387bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);
388bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
389bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);
390bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   return GL_FALSE;
39177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
39277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3937e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean
3945777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen)
3957e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
396d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
397cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
3987e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
3997e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
4007e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
401827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
4027e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* Otherwise, use the classic buffer manager. */
4037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
404827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
405827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
406827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      return GL_FALSE;
4077e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
4087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
409bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) ||
410bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt       num_fences == 0) {
411bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt      fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__);
412bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt      return GL_FALSE;
413bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt   }
414e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
41506d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt   drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
41606d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt
4172d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   intelScreen->named_regions = _mesa_NewHashTable();
4182d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
4197e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   return GL_TRUE;
4207e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
4217e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
422c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
423c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
4248d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
4258d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
426c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver
427c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
428e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
429d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
430c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
4315777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen;
4323ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
4333ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
4347c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
4353ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
4366bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
4373ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
438e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
4393ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
4405d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
441c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
442c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
4435777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   intelScreen = CALLOC(sizeof *intelScreen);
444c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
445c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
446c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
447c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
448c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
449c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
450c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
451c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
452c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
453c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
454c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
455f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
456c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
457c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
458c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
459c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
4607e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
4617e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
4627e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
463e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
464c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
465eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
466eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
4673ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
4683ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
4693ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
47024ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
4713ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
4723ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
47324ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
4743ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
4753ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
476160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
477160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
478160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
479bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate a rich set of useful configs that do not include an
480bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
481bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
4823ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
4835d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
484160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
485160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
486066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
487066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer that has a diffferent number of bits per pixel than the color
488066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer.  This isn't yet supported here.
489160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
490160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
491160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
492160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
493160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
494160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
49573e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick	 stencil_bits[1] = 8;
496160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
49773e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
49873e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick      depth_factor = 2;
49973e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
5005d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
5015d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
5025d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
503160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
5045d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
5055d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
5065d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
5073cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     ARRAY_SIZE(msaa_samples_array),
508bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     GL_FALSE);
509bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (configs == NULL)
510bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = new_configs;
511bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      else
512bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = driConcatConfigs(configs, new_configs);
513bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   }
514bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
515bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate the minimum possible set of configs that include an
516bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
517bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
518bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
519bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      __DRIconfig **new_configs;
520bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
521bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
522bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 16;
523bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 0;
524bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      } else {
525bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 24;
526bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 8;
527bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      }
528bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
529bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
530bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     depth_bits, stencil_bits, 1,
531bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     back_buffer_modes + 1, 1,
532bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     msaa_samples_array, 1,
5333cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     GL_TRUE);
5343ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
5353ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
5363ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
5373ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
5383ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
5393ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
5403ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
5413ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
5423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
5433ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
5443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
5453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
5465d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
547c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
548e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
549e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
550e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
551e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
552e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
553e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
554e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
555e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
556e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
557e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen2		 = intelInitScreen2,
558e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
55939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
56039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
56139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
56239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
56339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
56439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
56539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
566