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