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