intel_screen.c revision 06d1472ffa0648efa9374fa227894fbf0b0be054
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) \ 501ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt DRI_CONF_OPT_BEGIN(texture_tiling, bool, def) \ 511ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt DRI_CONF_DESC(en, "Enable texture tiling") \ 521ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt DRI_CONF_OPT_END \ 5377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] = 55a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_BEGIN 56a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_PERFORMANCE 57e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) 58fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, 59fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt * DRI_CONF_BO_REUSE_ALL 60fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt */ 61f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1") 62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_BEGIN(en, "Buffer object reuse") 63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(0, "Disable buffer object reuse") 64fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects") 65fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_END 66fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_OPT_END 671ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 68a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915 69a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt DRI_CONF_TEXTURE_TILING(false) 70a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else 71a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt DRI_CONF_TEXTURE_TILING(true) 72a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif 731ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 74b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_BEGIN(early_z, bool, false) 75b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") 76b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_END 77b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt 78862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_BEGIN(fragment_shader, bool, false) 79862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.") 80862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_END 81862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt 82a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 83a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_QUALITY 84a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 85acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 86a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 87a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_DEBUG 88a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_NO_RAST(false) 8940bc2748c2781600c748e546160bcc2aab637825Eric Anholt DRI_CONF_ALWAYS_FLUSH_BATCH(false) 90f3687284c12f34268172b9c60e2effd697162129Eric Anholt DRI_CONF_ALWAYS_FLUSH_CACHE(false) 9181aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt 9281aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false) 9381aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.") 9481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_END 95a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 96a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 97a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 981e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11; 9977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 10185063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = { 10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt { __DRI_TEX_OFFSET }, 10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelSetTexOffset, 10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 1096d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 1106d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 1116d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 11266175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 1136d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 1146d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 1157c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 1167c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable) 1177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 1187c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg struct intel_context *intel = drawable->driContextPriv->driverPrivate; 1197c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1207c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg if (intel->gen < 4) 1217c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg INTEL_FIREVERTICES(intel); 1227c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1237c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg if (intel->batch->map != intel->batch->ptr) 1247c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intel_batchbuffer_flush(intel->batch); 1257c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 1267c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1277c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 12861d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco JerezintelDRI2Invalidate(__DRIdrawable *drawable) 1297c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 1307aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt struct intel_context *intel = drawable->driContextPriv->driverPrivate; 1317aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt 1327aed23c36288c2b343073d6d06ca0ea167805cd3Eric Anholt intel->using_dri2_swapbuffers = GL_TRUE; 13361d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez dri2InvalidateDrawable(drawable); 1347c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 1357c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1367c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = { 1377c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 1387c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush, 13961d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez intelDRI2Invalidate, 1407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}; 1417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 142c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 143c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_name(__DRIcontext *context, 144c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int width, int height, int format, 145c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int name, int pitch, void *loaderPrivate) 146c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 147c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 148c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_context *intel = context->driverPrivate; 149c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int cpp; 150c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 151c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 152c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 153c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 154c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 155c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg switch (format) { 156c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 157c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_RGB565; 158c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGB; 159c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 160c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 161c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 162c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 163c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGB; 164c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 165c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 166c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 167c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 168c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGBA; 169c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 170c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 171c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg default: 172c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg free(image); 173c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 174c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 175c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 176c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 177c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 178c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 179c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->region = intel_region_alloc_for_handle(intel, cpp, width, height, 180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg pitch, name, "image"); 181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image->region == NULL) { 182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 183c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 188c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context, 191c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int renderbuffer, void *loaderPrivate) 192c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_context *intel = context->driverPrivate; 195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct gl_renderbuffer *rb; 196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_renderbuffer *irb; 197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 198d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer); 199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (!rb) { 200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg _mesa_error(&intel->ctx, 201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); 202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg irb = intel_renderbuffer(rb); 206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 209c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 210c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = rb->InternalFormat; 211c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = rb->Format; 212c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = rb->DataType; 213c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 214c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_region_reference(&image->region, irb->region); 215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void 220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image) 221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 222c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_region_release(&image->region); 223c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 224c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 225c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 226c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = { 227c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg { __DRI_IMAGE, __DRI_IMAGE_VERSION }, 228c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_name, 229c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_renderbuffer, 230c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_destroy_image, 231c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}; 232c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 233e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 23477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driReadDrawableExtension, 23577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &intelTexOffsetExtension.base, 2366d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 2377c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg &intelFlushExtension.base, 238c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg &intelImageExtension.base, 23977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 24077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 24177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 24224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean 243d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value) 24424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 24524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 2461c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 24724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 24824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 24924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 25024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 2511c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 25224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 25342e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 25424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_FALSE; 25524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 25624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 25724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_TRUE; 25824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 25977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 26077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 2612d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData) 2622d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{ 2632d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg} 2642d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 2652d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void 266d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv) 26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 2685777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen = sPriv->private; 26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 270904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 2716d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 27277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2732d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg /* Some regions may still have references to them at this point, so 2742d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * flush the hash table to prevent _mesa_DeleteHashTable() from 2752d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * complaining about the hash not being empty; */ 2762d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL); 2772d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_DeleteHashTable(intelScreen->named_regions); 2782d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 27977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = NULL; 28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 28277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 28577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 28677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 28777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 288d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv, 289d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable * driDrawPriv, 29077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt const __GLcontextModes * mesaVis, GLboolean isPixmap) 29177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 292d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct intel_renderbuffer *rb; 293d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (isPixmap) { 29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; /* not implemented */ 29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 29877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLboolean swStencil = (mesaVis->stencilBits > 0 && 29977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt mesaVis->depthBits != 24); 3004a253431abf43a0638afb43605b44a8742b72a60Brian Paul gl_format rgbFormat; 30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 302d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer); 30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 304d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg if (!fb) 30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 30677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 3072ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez _mesa_initialize_window_framebuffer(fb, mesaVis); 30877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 309119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt if (mesaVis->redBits == 5) 3104a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_RGB565; 311119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else if (mesaVis->alphaBits == 0) 312409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul rgbFormat = MESA_FORMAT_XRGB8888; 313119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else 3144a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_ARGB8888; 315119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 31677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* setup the hardware-based renderbuffers */ 317d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 318d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base); 31977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (mesaVis->doubleBufferMode) { 321d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 322d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base); 32377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->depthBits == 24) { 32638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->stencilBits == 8) { 32738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt /* combined depth/stencil buffer */ 32838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt struct intel_renderbuffer *depthStencilRb 3294a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_S8_Z24); 33038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt /* note: bind RB to two attachment points */ 331d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base); 332d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base); 33338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt } else { 33438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt struct intel_renderbuffer *depthRb 3354a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_X8_Z24); 336d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); 33738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt } 33877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 33977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else if (mesaVis->depthBits == 16) { 34077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* just 16-bit depth buffer, no hw stencil */ 34177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_renderbuffer *depthRb 3424a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_Z16); 343d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); 34477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* now add any/all software-based renderbuffers we may need */ 347d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_add_soft_renderbuffers(fb, 34877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw color */ 34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw depth */ 35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt swStencil, mesaVis->accumRedBits > 0, 35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw alpha */ 35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE /* never sw aux */ ); 353d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg driDrawPriv->driverPrivate = fb; 35477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 35577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 35677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 35777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 35877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 35977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 360d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv) 36177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 362d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = driDrawPriv->driverPrivate; 363d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 364d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_reference_framebuffer(&fb, NULL); 36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 36677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 36777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis, 372d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 37377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate); 37477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 37577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis, 376d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 37777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate); 378bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis, 379d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 380bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt void *sharedContextPrivate); 38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 38277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 38377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis, 384d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 38577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 38677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 387d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *sPriv = driContextPriv->driScreenPriv; 3885777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen = sPriv->private; 38977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 390bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 39119420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 39219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (!IS_965(intelScreen->deviceID)) { 39319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt return i915CreateContext(mesaVis, driContextPriv, 394bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt sharedContextPrivate); 39519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt } 396bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 397cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie intelScreen->no_vbo = GL_TRUE; 39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate); 39977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 400bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 401bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt if (IS_965(intelScreen->deviceID)) 402bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate); 403bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 404bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID); 405bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt return GL_FALSE; 40677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 40777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean 4095777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen) 4107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 411d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *spriv = intelScreen->driScrnPriv; 412cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 4137e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 4147e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL; 4157e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 416827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 4177e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt /* Otherwise, use the classic buffer manager. */ 4187e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 419827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 420827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 421827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt return GL_FALSE; 4227e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 4237e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 424e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences)) 425e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt intelScreen->kernel_exec_fencing = !!num_fences; 426e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt else 427e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt intelScreen->kernel_exec_fencing = GL_FALSE; 428e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 42906d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); 43006d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt 4312d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg intelScreen->named_regions = _mesa_NewHashTable(); 4322d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 4337e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_TRUE; 4347e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 4357e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 436c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 437c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 4388d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 4398d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 440c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver 441c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 442e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 443d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp) 444c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 4455777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen; 4463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_format[3]; 4473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_type[3]; 4487c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 4493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt static const GLenum back_buffer_modes[] = { 4506bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 4513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt }; 452e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 4533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt int color; 4545d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs = NULL; 455c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 456c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 4575777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg intelScreen = CALLOC(sizeof *intelScreen); 458c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 459c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 460c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg return GL_FALSE; 461c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 462c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 463c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 464c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 465c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 466c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 467c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg psp->private = (void *) intelScreen; 468c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 469f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg /* Determine chipset ID */ 470c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID, 471c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg &intelScreen->deviceID)) 472c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg return GL_FALSE; 473c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 4747e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!intel_init_bufmgr(intelScreen)) 4757e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_FALSE; 4767e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 477e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 478c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 479eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 480eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 4813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_format[0] = GL_RGB; 4823ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 4833ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 48424ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[1] = GL_BGR; 4853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 4863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 48724ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[2] = GL_BGRA; 4883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 4893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 490160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[0] = 0; 491160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[0] = 0; 492160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 493bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate a rich set of useful configs that do not include an 494bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 495bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 4963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 4975d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **new_configs; 498160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt int depth_factor; 499160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 500066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil 501066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer that has a diffferent number of bits per pixel than the color 502066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer. This isn't yet supported here. 503160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt */ 504160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 505160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 16; 506160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 507160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } else { 508160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 24; 50973e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick stencil_bits[1] = 8; 510160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } 51173e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 51273e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick depth_factor = 2; 51373e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 5145d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt new_configs = driCreateConfigs(fb_format[color], fb_type[color], 5155d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits, 5165d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits, 517160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor, 5185d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 5195d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(back_buffer_modes), 5205d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 5213cce4a1e10361458630511543b7a8a6438544775Ian Romanick ARRAY_SIZE(msaa_samples_array), 522bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick GL_FALSE); 523bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (configs == NULL) 524bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = new_configs; 525bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick else 526bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = driConcatConfigs(configs, new_configs); 527bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 528bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 529bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate the minimum possible set of configs that include an 530bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 531bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 532bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 533bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick __DRIconfig **new_configs; 534bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 535bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 536bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 16; 537bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 0; 538bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } else { 539bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 24; 540bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 8; 541bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 542bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 543bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick new_configs = driCreateConfigs(fb_format[color], fb_type[color], 544bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits, stencil_bits, 1, 545bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick back_buffer_modes + 1, 1, 546bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick msaa_samples_array, 1, 5473cce4a1e10361458630511543b7a8a6438544775Ian Romanick GL_TRUE); 5483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) 5493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = new_configs; 5503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt else 5513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = driConcatConfigs(configs, new_configs); 5523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 5533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 5543ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) { 5553ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 5563ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt __LINE__); 5573ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt return NULL; 5583ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 5593ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 5605d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt return (const __DRIconfig **)configs; 561c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 562e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 563e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 564e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 565e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 566e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 567e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 568e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 569e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 570e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 571e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .InitScreen2 = intelInitScreen2, 572e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 57339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg 57439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */ 57539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = { 57639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driCoreExtension.base, 57739a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driDRI2Extension.base, 57839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg NULL 57939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg}; 580