intel_screen.c revision 8e7a8d65931a650534e0f5c4e0d8118cd6f7636e
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
9977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = {
10077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   { __DRI_TEX_OFFSET },
10177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   intelSetTexOffset,
10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
1046d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = {
1056d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION },
1066d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg   intelSetTexBuffer,
10766175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt   intelSetTexBuffer2,
1086d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg};
1096d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg
1107c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
1117c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable)
1127c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1137c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1147c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1157c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->gen < 4)
1167c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      INTEL_FIREVERTICES(intel);
1177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1187c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg   if (intel->batch->map != intel->batch->ptr)
1197c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg      intel_batchbuffer_flush(intel->batch);
1207c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1217c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1227c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void
12361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco JerezintelDRI2Invalidate(__DRIdrawable *drawable)
1247c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{
1257aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   struct intel_context *intel = drawable->driContextPriv->driverPrivate;
1267aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt
1277aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt   intel->using_dri2_swapbuffers = GL_TRUE;
12861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez   dri2InvalidateDrawable(drawable);
1297c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}
1307c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
1317c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = {
1327c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    { __DRI2_FLUSH, __DRI2_FLUSH_VERSION },
1337c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    intelDRI2Flush,
13461d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez    intelDRI2Invalidate,
1357c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg};
1367c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
137c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
138c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_name(__DRIcontext *context,
139c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int width, int height, int format,
140c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg			     int name, int pitch, void *loaderPrivate)
141c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
142c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    __DRIimage *image;
143c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    struct intel_context *intel = context->driverPrivate;
144c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    int cpp;
145c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
146c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image = CALLOC(sizeof *image);
147c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image == NULL)
148c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg	return NULL;
149c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
150c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    switch (format) {
151c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_RGB565:
152c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_RGB565;
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_XRGB8888:
157c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_XRGB8888;
158c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGB;
159c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
160c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
161c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    case __DRI_IMAGE_FORMAT_ARGB8888:
162c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->format = MESA_FORMAT_ARGB8888;
163c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->internal_format = GL_RGBA;
164c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       image->data_type = GL_UNSIGNED_BYTE;
165c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       break;
166c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    default:
167c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       free(image);
168c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
169c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
170c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
171c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->data = loaderPrivate;
172c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    cpp = _mesa_get_format_bytes(image->format);
173c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
174c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    image->region = intel_region_alloc_for_handle(intel, cpp, width, height,
175c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg						  pitch, name, "image");
176c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    if (image->region == NULL) {
177c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       FREE(image);
178c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg       return NULL;
179c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    }
180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    return image;
182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
183c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage *
185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context,
186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg				     int renderbuffer, void *loaderPrivate)
187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
188c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   __DRIimage *image;
189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_context *intel = context->driverPrivate;
190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct gl_renderbuffer *rb;
191c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   struct intel_renderbuffer *irb;
192c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
193d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg   rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer);
194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (!rb) {
195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      _mesa_error(&intel->ctx,
196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg		  GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
198c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   }
199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   irb = intel_renderbuffer(rb);
201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image = CALLOC(sizeof *image);
202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   if (image == NULL)
203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg      return NULL;
204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->internal_format = rb->InternalFormat;
206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->format = rb->Format;
207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data_type = rb->DataType;
208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   image->data = loaderPrivate;
209c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   intel_region_reference(&image->region, irb->region);
210c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
211c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg   return image;
212c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
213c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
214c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void
215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image)
216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{
217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_region_release(&image->region);
218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    FREE(image);
219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}
220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = {
222c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    { __DRI_IMAGE, __DRI_IMAGE_VERSION },
223c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_name,
224c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_create_image_from_renderbuffer,
225c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    intel_destroy_image,
226c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg};
227c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg
228e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = {
22977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &driReadDrawableExtension,
23077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    &intelTexOffsetExtension.base,
2316d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg    &intelTexBufferExtension.base,
2327c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg    &intelFlushExtension.base,
233c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg    &intelImageExtension.base,
23477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt    NULL
23577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt};
23677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
23724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean
238d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value)
23924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{
24024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   int ret;
2411c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   struct drm_i915_getparam gp;
24224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
24324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.param = param;
24424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   gp.value = value;
24524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
2461c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane   ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
24724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   if (ret) {
24842e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul      _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
24924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg      return GL_FALSE;
25024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   }
25124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg
25224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg   return GL_TRUE;
25324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg}
25477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
25577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
2562d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData)
2572d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{
2582d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg}
2592d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
2602d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void
261d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv)
26277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
2635777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
26477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
265904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt   dri_bufmgr_destroy(intelScreen->bufmgr);
2666d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt   driDestroyOptionInfo(&intelScreen->optionCache);
26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
2682d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   /* Some regions may still have references to them at this point, so
2692d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * flush the hash table to prevent _mesa_DeleteHashTable() from
2702d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg    * complaining about the hash not being empty; */
2712d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL);
2722d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   _mesa_DeleteHashTable(intelScreen->named_regions);
2732d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
27477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   FREE(intelScreen);
27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   sPriv->private = NULL;
27677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
27777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
27977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/**
28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window.
28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
28277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
283d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv,
284d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                  __DRIdrawable * driDrawPriv,
28577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                  const __GLcontextModes * mesaVis, GLboolean isPixmap)
28677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
287d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg   struct intel_renderbuffer *rb;
288d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
28977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   if (isPixmap) {
29077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_FALSE;          /* not implemented */
29177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
29277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   else {
29377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      GLboolean swStencil = (mesaVis->stencilBits > 0 &&
29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                             mesaVis->depthBits != 24);
2954a253431abf43a0638afb43605b44a8742b72a60Brian Paul      gl_format rgbFormat;
29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
297d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
29877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
299d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      if (!fb)
30077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt	 return GL_FALSE;
30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
3022ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez      _mesa_initialize_window_framebuffer(fb, mesaVis);
30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
304119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      if (mesaVis->redBits == 5)
3054a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_RGB565;
306119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else if (mesaVis->alphaBits == 0)
307409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul	 rgbFormat = MESA_FORMAT_XRGB8888;
308119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt      else
3094a253431abf43a0638afb43605b44a8742b72a60Brian Paul	 rgbFormat = MESA_FORMAT_ARGB8888;
310119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt
31177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* setup the hardware-based renderbuffers */
312d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      rb = intel_create_renderbuffer(rgbFormat);
313d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base);
31477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
31577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      if (mesaVis->doubleBufferMode) {
316d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	 rb = intel_create_renderbuffer(rgbFormat);
317d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base);
31877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
31977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
32038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt      if (mesaVis->depthBits == 24) {
32138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 if (mesaVis->stencilBits == 8) {
32238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* combined depth/stencil buffer */
32338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthStencilRb
3244a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
32538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    /* note: bind RB to two attachment points */
326d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base);
327d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base);
32838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 } else {
32938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	    struct intel_renderbuffer *depthRb
3304a253431abf43a0638afb43605b44a8742b72a60Brian Paul	       = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
331d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg	    _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
33238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt	 }
33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      else if (mesaVis->depthBits == 16) {
33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         /* just 16-bit depth buffer, no hw stencil */
33677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt         struct intel_renderbuffer *depthRb
3374a253431abf43a0638afb43605b44a8742b72a60Brian Paul	    = intel_create_renderbuffer(MESA_FORMAT_Z16);
338d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
33977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      }
34077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
34177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      /* now add any/all software-based renderbuffers we may need */
342d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      _mesa_add_soft_renderbuffers(fb,
34377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw color */
34477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw depth */
34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   swStencil, mesaVis->accumRedBits > 0,
34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE, /* never sw alpha */
34777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   GL_FALSE  /* never sw aux */ );
348d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg      driDrawPriv->driverPrivate = fb;
34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return GL_TRUE;
35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
35377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
35477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void
355d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv)
35677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
357d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
358d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg
359d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg    _mesa_reference_framebuffer(&fb, NULL);
36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
36177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
36277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an
36377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext
36477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions.
36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */
36677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,
367d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,
371d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                                   __DRIcontext * driContextPriv,
37277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                                   void *sharedContextPrivate);
373bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,
374d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg				  __DRIcontext * driContextPriv,
375bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  void *sharedContextPrivate);
37677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
37777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean
37877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis,
379d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg                   __DRIcontext * driContextPriv,
38077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt                   void *sharedContextPrivate)
38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{
382d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *sPriv = driContextPriv->driScreenPriv;
3835777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen = sPriv->private;
38477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
385bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915
38619420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt   if (IS_9XX(intelScreen->deviceID)) {
38719420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      if (!IS_965(intelScreen->deviceID)) {
38819420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt	 return i915CreateContext(mesaVis, driContextPriv,
389bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt				  sharedContextPrivate);
39019420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt      }
391bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   } else {
392cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie      intelScreen->no_vbo = GL_TRUE;
39377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
39477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt   }
395bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else
396bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   if (IS_965(intelScreen->deviceID))
397bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);
398bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif
399bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);
400bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt   return GL_FALSE;
40177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}
40277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt
4037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean
4045777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen)
4057e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{
406d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg   __DRIscreen *spriv = intelScreen->driScrnPriv;
407cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt   int num_fences = 0;
4087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
4097e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL;
4107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
411827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt   intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ);
4127e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   /* Otherwise, use the classic buffer manager. */
4137e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (intelScreen->bufmgr == NULL) {
414827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
415827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt	      __func__, __LINE__);
416827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt      return GL_FALSE;
4177e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   }
4187e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
419e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences))
420e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = !!num_fences;
421e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt   else
422e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt      intelScreen->kernel_exec_fencing = GL_FALSE;
423e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt
42406d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt   drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr);
42506d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt
4262d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg   intelScreen->named_regions = _mesa_NewHashTable();
4272d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg
4287e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   return GL_TRUE;
4297e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt}
4307e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
431c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/**
432c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point.
4338d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2.
4348d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul *
435c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver
436c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */
437e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const
438d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp)
439c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{
4405777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   struct intel_screen *intelScreen;
4413ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_format[3];
4423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   GLenum fb_type[3];
4437c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg
4443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   static const GLenum back_buffer_modes[] = {
4456bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick       GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML
4463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   };
447e13593678f62941db06b7ae1a21b81c643371659Brian Paul   uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1];
4483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   int color;
4495d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   __DRIconfig **configs = NULL;
450c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
451c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* Allocate the private area */
4525777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg   intelScreen = CALLOC(sizeof *intelScreen);
453c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intelScreen) {
454c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      fprintf(stderr, "\nERROR!  Allocating private area failed\n");
455c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
456c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   }
457c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   /* parse information in __driConfigOptions */
458c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   driParseOptionInfo(&intelScreen->optionCache,
459c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg                      __driConfigOptions, __driNConfigOptions);
460c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
461c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   intelScreen->driScrnPriv = psp;
462c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   psp->private = (void *) intelScreen;
463c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
464f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg   /* Determine chipset ID */
465c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,
466c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg			&intelScreen->deviceID))
467c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg      return GL_FALSE;
468c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
4697e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt   if (!intel_init_bufmgr(intelScreen))
4707e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt       return GL_FALSE;
4717e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt
472e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   psp->extensions = intelScreenExtensions;
473c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg
474eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer   msaa_samples_array[0] = 0;
475eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer
4763ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_format[0] = GL_RGB;
4773ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[0] = GL_UNSIGNED_SHORT_5_6_5;
4783ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
47924ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[1] = GL_BGR;
4803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV;
4813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
48224ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt   fb_format[2] = GL_BGRA;
4833ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV;
4843ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
485160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   depth_bits[0] = 0;
486160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt   stencil_bits[0] = 0;
487160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
488bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate a rich set of useful configs that do not include an
489bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
490bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
4913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
4925d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      __DRIconfig **new_configs;
493160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      int depth_factor;
494160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt
495066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick      /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
496066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer that has a diffferent number of bits per pixel than the color
497066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick       * buffer.  This isn't yet supported here.
498160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt       */
499160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
500160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 16;
501160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 stencil_bits[1] = 0;
502160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      } else {
503160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt	 depth_bits[1] = 24;
50473e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick	 stencil_bits[1] = 8;
505160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt      }
50673e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
50773e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick      depth_factor = 2;
50873e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick
5095d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
5105d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     depth_bits,
5115d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     stencil_bits,
512160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt				     depth_factor,
5135d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     back_buffer_modes,
5145d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     ARRAY_SIZE(back_buffer_modes),
5155d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt				     msaa_samples_array,
5163cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     ARRAY_SIZE(msaa_samples_array),
517bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     GL_FALSE);
518bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (configs == NULL)
519bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = new_configs;
520bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      else
521bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 configs = driConcatConfigs(configs, new_configs);
522bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   }
523bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
524bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   /* Generate the minimum possible set of configs that include an
525bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    * accumulation buffer.
526bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick    */
527bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick   for (color = 0; color < ARRAY_SIZE(fb_format); color++) {
528bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      __DRIconfig **new_configs;
529bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
530bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) {
531bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 16;
532bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 0;
533bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      } else {
534bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 depth_bits[0] = 24;
535bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick	 stencil_bits[0] = 8;
536bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      }
537bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick
538bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick      new_configs = driCreateConfigs(fb_format[color], fb_type[color],
539bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     depth_bits, stencil_bits, 1,
540bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     back_buffer_modes + 1, 1,
541bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick				     msaa_samples_array, 1,
5423cce4a1e10361458630511543b7a8a6438544775Ian Romanick				     GL_TRUE);
5433ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      if (configs == NULL)
5443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = new_configs;
5453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      else
5463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt	 configs = driConcatConfigs(configs, new_configs);
5473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
5483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
5493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   if (configs == NULL) {
5503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
5513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt              __LINE__);
5523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt      return NULL;
5533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt   }
5543ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt
5555d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt   return (const __DRIconfig **)configs;
556c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg}
557e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg
558e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = {
559e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyScreen	 = intelDestroyScreen,
560e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateContext	 = intelCreateContext,
561e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyContext	 = intelDestroyContext,
562e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .CreateBuffer	 = intelCreateBuffer,
563e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .DestroyBuffer	 = intelDestroyBuffer,
564e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .MakeCurrent		 = intelMakeCurrent,
565e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .UnbindContext	 = intelUnbindContext,
566e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg   .InitScreen2		 = intelInitScreen2,
567e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg};
56839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg
56939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */
57039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = {
57139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driCoreExtension.base,
57239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    &driDRI2Extension.base,
57339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg    NULL
57439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg};
575