intel_screen.c revision 249817e92839d9ecdd78360eb3a856724df504c4
177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/************************************************************************** 277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * All Rights Reserved. 577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * copy of this software and associated documentation files (the 877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * "Software"), to deal in the Software without restriction, including 977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * without limitation the rights to use, copy, modify, merge, publish, 1077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to 1177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * permit persons to whom the Software is furnished to do so, subject to 1277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * the following conditions: 1377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 1477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * The above copyright notice and this permission notice (including the 1577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * next paragraph) shall be included in all copies or substantial portions 1677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * of the Software. 1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt **************************************************************************/ 2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt#include <errno.h> 29ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h" 31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 32ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h" 332d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h" 34d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h" 3545a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h" 3614aff23e1b4d52d5e10a3aeb65c3f4c783498a35Brian Paul#include "main/version.h" 37d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h" 386c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul 3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h" 4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h" 4177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] = 43a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_BEGIN 44a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_PERFORMANCE 45e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) 46fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, 47fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt * DRI_CONF_BO_REUSE_ALL 48fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt */ 49f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1") 50fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_BEGIN(en, "Buffer object reuse") 51fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(0, "Disable buffer object reuse") 52fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects") 53fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_END 54fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_OPT_END 551ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 568e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_OPT_BEGIN(texture_tiling, bool, true) 578e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_DESC(en, "Enable texture tiling") 588e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_OPT_END 591ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 60d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt DRI_CONF_OPT_BEGIN(hiz, bool, true) 61d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt DRI_CONF_DESC(en, "Enable Hierarchical Z on gen6+") 62d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt DRI_CONF_OPT_END 63d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt 64b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_BEGIN(early_z, bool, false) 65b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") 66b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_END 67b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt 68a58514cc9c5cc5867f9140700462c5ac5749550dEric Anholt DRI_CONF_OPT_BEGIN(fragment_shader, bool, true) 69862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.") 70862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_END 71862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt 72a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 73a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_QUALITY 74a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 75acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 76a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 77a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_DEBUG 78a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_NO_RAST(false) 7940bc2748c2781600c748e546160bcc2aab637825Eric Anholt DRI_CONF_ALWAYS_FLUSH_BATCH(false) 80f3687284c12f34268172b9c60e2effd697162129Eric Anholt DRI_CONF_ALWAYS_FLUSH_CACHE(false) 81642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false) 8281aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt 8381aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false) 8481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.") 8581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_END 86c6abde211fa875f90e59e3709720cfe394669069Eric Anholt 87c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_BEGIN(shader_precompile, bool, false) 88c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_DESC(en, "Perform code generation at shader link time.") 89c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_END 90a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 93d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholtconst GLuint __driNConfigOptions = 14; 9477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 95df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h" 96df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h" 97df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h" 98df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h" 99df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h" 100da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace#include "intel_mipmap_tree.h" 101df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h" 102df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h" 103df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h" 104df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 105df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h" 106df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 10885063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 111252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkevoid 112252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkeaub_dump_bmp(struct gl_context *ctx) 113252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke{ 114252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke struct gl_framebuffer *fb = ctx->DrawBuffer; 115252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 116252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke for (int i = 0; i < fb->_NumColorDrawBuffers; i++) { 117252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke struct intel_renderbuffer *irb = 118252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke intel_renderbuffer(fb->_ColorDrawBuffers[i]); 119252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 120252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke if (irb && irb->mt) { 121252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke enum aub_dump_bmp_format format; 122252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 123252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke switch (irb->Base.Base.Format) { 124252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke case MESA_FORMAT_ARGB8888: 125252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke case MESA_FORMAT_XRGB8888: 126252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke format = AUB_DUMP_BMP_FORMAT_ARGB_8888; 127252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke break; 128252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke default: 129252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke continue; 130252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 131252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 132252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo, 133252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->draw_x, 134252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->draw_y, 135252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->Base.Base.Width, 136252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->Base.Base.Height, 137252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke format, 138252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->mt->region->pitch * 139252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->mt->region->cpp, 140252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 0); 141252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 142252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 143252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke} 144252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 1456d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 1466d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 1476d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 14866175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 1496d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 1506d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 1517c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 1527c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable) 1537c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 154dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt GET_CURRENT_CONTEXT(ctx); 155dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt struct intel_context *intel = intel_context(ctx); 156ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel == NULL) 157ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat return; 1587c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 159ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->gen < 4) 160ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat INTEL_FIREVERTICES(intel); 1617c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 162ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel->need_throttle = true; 163e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg 164ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->batch.used) 165ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel_batchbuffer_flush(intel); 1660247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt 1670247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt if (INTEL_DEBUG & DEBUG_AUB) { 168252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke aub_dump_bmp(ctx); 1690247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt } 1707c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 1717c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1727c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = { 1737c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 1747c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush, 175e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg dri2InvalidateDrawable, 1767c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}; 1777c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 178c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 1799ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen, 180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int width, int height, int format, 181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int name, int pitch, void *loaderPrivate) 182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 183875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int cpp; 186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 188c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 191249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = format; 192249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira 193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg switch (format) { 194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_RGB565; 196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGB; 197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 198c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGB; 202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGBA; 207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 2099fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu case __DRI_IMAGE_FORMAT_ABGR8888: 2109fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->format = MESA_FORMAT_RGBA8888_REV; 2119fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->internal_format = GL_RGBA; 2129fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->data_type = GL_UNSIGNED_BYTE; 2139fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu break; 214c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg default: 215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg free(image); 216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 2229ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg image->region = intel_region_alloc_for_handle(intelScreen, 2239087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg cpp, width, height, 224c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg pitch, name, "image"); 225c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image->region == NULL) { 226c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 227c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 228c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 229c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 230c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 231c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 232c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 233c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 234c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context, 235c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int renderbuffer, void *loaderPrivate) 236c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 237c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 238c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_context *intel = context->driverPrivate; 239c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct gl_renderbuffer *rb; 240c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_renderbuffer *irb; 241c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 242d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer); 243c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (!rb) { 244c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg _mesa_error(&intel->ctx, 245c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); 246c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 247c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 248c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 249c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg irb = intel_renderbuffer(rb); 250c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 251c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 252c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 253c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 254c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = rb->InternalFormat; 255c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = rb->Format; 256f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul image->data_type = GL_UNSIGNED_BYTE; 257c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 258da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace intel_region_reference(&image->region, irb->mt->region); 259c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 260249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira switch (image->format) { 261249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_RGB565: 262249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_RGB565; 263249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 264249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_XRGB8888: 265249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_XRGB8888; 266249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 267249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_ARGB8888: 268249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_ARGB8888; 269249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 270249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_RGBA8888_REV: 271249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_ABGR8888; 272249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 273249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira } 274249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira 275c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 276c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 277c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 278c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void 279c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image) 280c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 281c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_region_release(&image->region); 282c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 283c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 284c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 285f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage * 286f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen, 287f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int width, int height, int format, 288f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg unsigned int use, 289f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg void *loaderPrivate) 290f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 291f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg __DRIimage *image; 292875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 293e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg uint32_t tiling; 294f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int cpp; 295f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 296e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_X; 297e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 298e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (width != 64 || height != 64) 299e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg return NULL; 300e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_NONE; 301e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg } 302e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg 303f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image = CALLOC(sizeof *image); 304f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg if (image == NULL) 305f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 306f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 3078de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes image->dri_format = format; 3088de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 309f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg switch (format) { 310f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 311f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->format = MESA_FORMAT_RGB565; 312f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->internal_format = GL_RGB; 313f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 314f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg break; 315f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 316f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 317f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->internal_format = GL_RGB; 318f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 319f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg break; 320f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 321f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 322f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->internal_format = GL_RGBA; 323f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 324f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg break; 3259fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu case __DRI_IMAGE_FORMAT_ABGR8888: 3269fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->format = MESA_FORMAT_RGBA8888_REV; 3279fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->internal_format = GL_RGBA; 3289fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->data_type = GL_UNSIGNED_BYTE; 3299fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu break; 330f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg default: 331f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg free(image); 332f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 333f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 334f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 335f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data = loaderPrivate; 336f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 337f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 338f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->region = 339e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg intel_region_alloc(intelScreen, tiling, 3402e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke cpp, width, height, true); 341f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg if (image->region == NULL) { 342f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg FREE(image); 343f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 344f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 345f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 346f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return image; 347f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 348f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 349f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean 350f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value) 351f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 352f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg switch (attrib) { 353f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_STRIDE: 354f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg *value = image->region->pitch * image->region->cpp; 3552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 356f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_HANDLE: 3578004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt *value = image->region->bo->handle; 3582e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 359f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_NAME: 360f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return intel_region_flink(image->region, (uint32_t *) value); 3618de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_ATTRIB_FORMAT: 362fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira *value = image->dri_format; 363fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira return true; 364f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg default: 3652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 366f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 367f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 368f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 3693af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage * 3703af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate) 3713af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{ 3723af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke __DRIimage *image; 3733af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3743af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image = CALLOC(sizeof *image); 3753af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image == NULL) 3763af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 3773af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3783af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_region_reference(&image->region, orig_image->region); 3793af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image->region == NULL) { 3803af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke FREE(image); 3813af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 3823af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke } 3833af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3843af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->internal_format = orig_image->internal_format; 385249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = orig_image->dri_format; 3863af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->format = orig_image->format; 3873af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->data_type = orig_image->data_type; 3883af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->data = loaderPrivate; 3893af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3903af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return image; 3913af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke} 3923af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 393221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergstatic GLboolean 394221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergintel_validate_usage(__DRIimage *image, unsigned int use) 395221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg{ 396221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 397221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (image->region->width != 64 || image->region->height != 64) 398221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_FALSE; 399221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg } 400221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 401221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_TRUE; 402221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg} 403221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 404c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = { 4050beed7f072e2a8127c7c02dfc39fb37053d96b22Jesse Barnes { __DRI_IMAGE, 3 }, 406c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_name, 407c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_renderbuffer, 408c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_destroy_image, 409f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg intel_create_image, 4103af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_query_image, 411221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg intel_dup_image, 412221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg intel_validate_usage 413c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}; 414c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 415e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 4166d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 4177c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg &intelFlushExtension.base, 418c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg &intelImageExtension.base, 419234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes &dri2ConfigQueryExtension.base, 42077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 42177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 42277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4232e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 424d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value) 42524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 42624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 4271c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 42824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 429f33d100fa71cecfb163dd91cd56b9a2788a43c22Eric Anholt memset(&gp, 0, sizeof(gp)); 43024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 43124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 43224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 4331c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 43424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 435f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt if (ret != -EINVAL) 436f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 4372e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 43824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 43924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 4402e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 44124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 44277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4432e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 444900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param) 445900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{ 446900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson int value = 0; 447900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson return intel_get_param(psp, param, &value) && value; 448900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson} 449900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 45077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 4512d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData) 4522d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{ 4532d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg} 4542d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 4552d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void 456d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv) 45777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 458875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 45977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 460904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 4616d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 46277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4632d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg /* Some regions may still have references to them at this point, so 4642d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * flush the hash table to prevent _mesa_DeleteHashTable() from 4652d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * complaining about the hash not being empty; */ 4662d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL); 4672d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_DeleteHashTable(intelScreen->named_regions); 4682d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 46977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 470875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis sPriv->driverPrivate = NULL; 47177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 47277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 47377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 47477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 47577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 47777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 478d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv, 479d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable * driDrawPriv, 480d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, GLboolean isPixmap) 48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 482d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct intel_renderbuffer *rb; 483875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *screen = (struct intel_screen*) driScrnPriv->driverPrivate; 484d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (isPixmap) { 4862e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; /* not implemented */ 48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 4894a253431abf43a0638afb43605b44a8742b72a60Brian Paul gl_format rgbFormat; 49077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 491d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer); 49277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 493d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg if (!fb) 4942e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 49577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4962ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez _mesa_initialize_window_framebuffer(fb, mesaVis); 49777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 498119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt if (mesaVis->redBits == 5) 4994a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_RGB565; 500119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else if (mesaVis->alphaBits == 0) 501409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul rgbFormat = MESA_FORMAT_XRGB8888; 502119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else 5034a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_ARGB8888; 504119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 50577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* setup the hardware-based renderbuffers */ 506d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 5079f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base); 50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 50977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (mesaVis->doubleBufferMode) { 510d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 5119f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base); 51277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 51377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 514f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace /* 515f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace * Assert here that the gl_config has an expected depth/stencil bit 516f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(), 517f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace * which constructs the advertised configs.) 518f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace */ 51938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->depthBits == 24) { 520800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt assert(mesaVis->stencilBits == 8); 521aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace 522aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace if (screen->hw_has_separate_stencil 523aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace && screen->dri2_has_hiz != INTEL_DRI2_HAS_HIZ_FALSE) { 524aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace /* 525aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * Request a separate stencil buffer even if we do not yet know if 526aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * the screen supports it. (See comments for 527aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * enum intel_dri2_has_hiz). 528aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace */ 529aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace rb = intel_create_renderbuffer(MESA_FORMAT_X8_Z24); 5309f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 531aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace rb = intel_create_renderbuffer(MESA_FORMAT_S8); 5329f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 533aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace } else { 534aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace /* 535aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * Use combined depth/stencil. Note that the renderbuffer is 536aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * attached to two attachment points. 537aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace */ 538aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace rb = intel_create_renderbuffer(MESA_FORMAT_S8_Z24); 5399f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 5409f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 541aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace } 54277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 54377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else if (mesaVis->depthBits == 16) { 544f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace assert(mesaVis->stencilBits == 0); 54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* just 16-bit depth buffer, no hw stencil */ 54677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_renderbuffer *depthRb 5474a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_Z16); 5489f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base.Base); 54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 550f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace else { 551f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace assert(mesaVis->depthBits == 0); 552f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace assert(mesaVis->stencilBits == 0); 553f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace } 55477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 55577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* now add any/all software-based renderbuffers we may need */ 556d0dc75c000d5af92648c7de901756400672b8447Brian Paul _swrast_add_soft_renderbuffers(fb, 557d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw color */ 558d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw depth */ 559d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw stencil */ 560d0dc75c000d5af92648c7de901756400672b8447Brian Paul mesaVis->accumRedBits > 0, 561d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw alpha */ 562d0dc75c000d5af92648c7de901756400672b8447Brian Paul false /* never sw aux */ ); 563d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg driDrawPriv->driverPrivate = fb; 56477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 56677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 56777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 56877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 56977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 570d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv) 57177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 572d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = driDrawPriv->driverPrivate; 573d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 574d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_reference_framebuffer(&fb, NULL); 57577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 57677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 57777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 57877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 57977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 58077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 5812e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 5822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis, 5832e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 5842e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 5852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke 5862e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 5872e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api, 5882e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 5892e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 5902e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 5912e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 5922e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api, 5932e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 5942e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 5952e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 59677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 59777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 598a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api, 599d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, 600d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 601e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned major_version, 602e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned minor_version, 603e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick uint32_t flags, 604e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned *error, 60577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 60677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 607d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *sPriv = driContextPriv->driScreenPriv; 608875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 60935cdd7b6dbc763fe57bf466def0a4257ca09beb8Eric Anholt bool success = false; 61077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 611bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 61219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 61319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (!IS_965(intelScreen->deviceID)) { 614e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = i915CreateContext(api, mesaVis, driContextPriv, 615e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 61619420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt } 617bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 6182e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke intelScreen->no_vbo = true; 619e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = i830CreateContext(mesaVis, driContextPriv, 620e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 62177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 622bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 623bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt if (IS_965(intelScreen->deviceID)) 624e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = brwCreateContext(api, mesaVis, 625e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick driContextPriv, 626e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 627bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 628e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 629e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (success) { 630e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick struct gl_context *ctx = 631e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick (struct gl_context *) driContextPriv->driverPrivate; 632e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 633e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick _mesa_compute_version(ctx); 634e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (ctx->VersionMajor > major_version 635e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick || (ctx->VersionMajor == major_version 636e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick && ctx->VersionMinor >= minor_version)) { 637e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_BAD_VERSION; 638e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick return true; 639e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 640e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 641e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick intelDestroyContext(driContextPriv); 642e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } else { 643e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 644e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID); 645e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 646e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 6472e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 64877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 64977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 6515777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen) 6527e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 653d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *spriv = intelScreen->driScrnPriv; 654cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 6557e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6562222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL; 6577e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 658827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 6597e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 660827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 661827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 6622e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 6637e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6647e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 665bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) || 666bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt num_fences == 0) { 667bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__); 6682e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 669bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt } 670e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 67106d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); 67206d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt 6732d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg intelScreen->named_regions = _mesa_NewHashTable(); 6742d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 675900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations = 0; 676900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations |= 677900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0; 678900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 6792e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 6807e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 6817e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 682c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 6836b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable 6846b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL. 6856b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * 6866b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid 6876b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL 6886b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored. 6896b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */ 6906b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void 6916b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen) 6926b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{ 6936b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace const char *s = getenv("INTEL_SEPARATE_STENCIL"); 6946b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace if (!s) { 6956b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace return; 6966b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("0", s, 2)) { 6976b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = false; 6986b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("1", s, 2)) { 6996b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = true; 7006b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else { 7016b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace fprintf(stderr, 7026b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has " 7036b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "invalid value and is ignored", s); 7046b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } 7056b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace} 7066b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 707f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterstatic bool 708f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterintel_detect_swizzling(struct intel_screen *screen) 709f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter{ 710f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo *buffer; 711f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter unsigned long flags = 0; 712f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter unsigned long aligned_pitch; 713f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter uint32_t tiling = I915_TILING_X; 714f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter uint32_t swizzle_mode = 0; 715f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 716f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test", 717f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 64, 64, 4, 718f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter &tiling, &aligned_pitch, flags); 719f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter if (buffer == NULL) 720f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return false; 721f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 722f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo_get_tiling(buffer, &tiling, &swizzle_mode); 723f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo_unreference(buffer); 724f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 725f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter if (swizzle_mode == I915_BIT_6_SWIZZLE_NONE) 726f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return false; 727f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter else 728f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return true; 729f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter} 730f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 7316b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/** 732c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 7338d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 7348d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 735d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver 736c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 737e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 738d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp) 739c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 7405777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen; 7413ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_format[3]; 7423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_type[3]; 7435efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg unsigned int api_mask; 7447c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 7453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt static const GLenum back_buffer_modes[] = { 7466bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 7473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt }; 748e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 7493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt int color; 7505d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs = NULL; 751c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 752c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 7535777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg intelScreen = CALLOC(sizeof *intelScreen); 754c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 755c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 7562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 757c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 758c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 759c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 760c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 761c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 762c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 763875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis psp->driverPrivate = (void *) intelScreen; 764c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7652222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt if (!intel_init_bufmgr(intelScreen)) 7662222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt return false; 767c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7682222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt intelScreen->deviceID = drm_intel_bufmgr_gem_get_devid(intelScreen->bufmgr); 7694ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt 770cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intelScreen->kernel_has_gen7_sol_reset = 771cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intel_get_boolean(intelScreen->driScrnPriv, 772cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt I915_PARAM_HAS_GEN7_SOL_RESET); 773cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt 77489a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke if (IS_GEN7(intelScreen->deviceID)) { 77589a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke intelScreen->gen = 7; 77689a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke } else if (IS_GEN6(intelScreen->deviceID)) { 7777363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 6; 7787363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_GEN5(intelScreen->deviceID)) { 7797363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 5; 7807363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_965(intelScreen->deviceID)) { 7817363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 4; 7827363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_9XX(intelScreen->deviceID)) { 7837363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 3; 7847363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else { 7857363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 2; 7867363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } 7877363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg 788e5411d8fdc6a7dda18d82746b84197ef83ee0a13Chad Versace intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6; 7896b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7; 7906b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intelScreen->dri2_has_hiz = INTEL_DRI2_HAS_HIZ_UNKNOWN; 7916b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 792249fc7056104113633215106ac085b505d8dc161Eric Anholt int has_llc = 0; 793249fc7056104113633215106ac085b505d8dc161Eric Anholt bool success = intel_get_param(intelScreen->driScrnPriv, I915_PARAM_HAS_LLC, 794249fc7056104113633215106ac085b505d8dc161Eric Anholt &has_llc); 795249fc7056104113633215106ac085b505d8dc161Eric Anholt if (success && has_llc) 796249fc7056104113633215106ac085b505d8dc161Eric Anholt intelScreen->hw_has_llc = true; 797249fc7056104113633215106ac085b505d8dc161Eric Anholt else if (!success && intelScreen->gen >= 6) 798249fc7056104113633215106ac085b505d8dc161Eric Anholt intelScreen->hw_has_llc = true; 7997def293204977c41ea35198af147f743a31b1889Eugeni Dodonov 8006b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel_override_separate_stencil(intelScreen); 8016b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 8025efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask = (1 << __DRI_API_OPENGL); 8035efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1 8045efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES); 8055efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 8065efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2 8075efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES2); 8085efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 8095efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 8105efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID)) 8115efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg psp->api_mask = api_mask; 8125efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 813f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen); 814f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 815e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 816c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 817eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 818eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 8193ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_format[0] = GL_RGB; 8203ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 8213ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 82224ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[1] = GL_BGR; 8233ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 8243ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 82524ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[2] = GL_BGRA; 8263ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 8273ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 828160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[0] = 0; 829160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[0] = 0; 830160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 831bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate a rich set of useful configs that do not include an 832bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 833bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 8343ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 8355d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **new_configs; 836160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt int depth_factor; 837160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 838066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil 839066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer that has a diffferent number of bits per pixel than the color 840066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer. This isn't yet supported here. 841160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt */ 842160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 843160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 16; 844160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 845160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } else { 846160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 24; 84773e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick stencil_bits[1] = 8; 848160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } 84973e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 85073e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick depth_factor = 2; 85173e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 8525d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt new_configs = driCreateConfigs(fb_format[color], fb_type[color], 8535d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits, 8545d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits, 855160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor, 8565d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 8575d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(back_buffer_modes), 8585d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 8593cce4a1e10361458630511543b7a8a6438544775Ian Romanick ARRAY_SIZE(msaa_samples_array), 8602e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke false); 861bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (configs == NULL) 862bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = new_configs; 863bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick else 864bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = driConcatConfigs(configs, new_configs); 865bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 866bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 867bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate the minimum possible set of configs that include an 868bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 869bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 870bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 871bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick __DRIconfig **new_configs; 872bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 873bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 874bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 16; 875bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 0; 876bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } else { 877bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 24; 878bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 8; 879bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 880bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 881bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick new_configs = driCreateConfigs(fb_format[color], fb_type[color], 882bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits, stencil_bits, 1, 883bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick back_buffer_modes + 1, 1, 884bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick msaa_samples_array, 1, 8852e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke true); 8863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) 8873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = new_configs; 8883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt else 8893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = driConcatConfigs(configs, new_configs); 8903ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8923ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) { 8933ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 8943ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt __LINE__); 8953ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt return NULL; 8963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8973ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8985d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt return (const __DRIconfig **)configs; 899c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 900e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9012adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer { 9022adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke __DRIbuffer base; 9032adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_region *region; 9042adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}; 9052adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 90679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace/** 90779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \brief Get tiling format for a DRI buffer. 90879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * 90979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \param attachment is the buffer's attachmet point, such as 91079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * __DRI_BUFFER_DEPTH. 91179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \param out_tiling is the returned tiling format for buffer. 91279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \return false if attachment is unrecognized or is incompatible with screen. 91379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */ 91479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versacestatic bool 91579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versaceintel_get_dri_buffer_tiling(struct intel_screen *screen, 91679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t attachment, 91779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t *out_tiling) 91879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace{ 91979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if (screen->gen < 4) { 92079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_X; 92179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 92279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 92379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 92479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace switch (attachment) { 92579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_DEPTH: 92679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_DEPTH_STENCIL: 92779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_HIZ: 92879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_Y; 92979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 93079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_ACCUM: 93179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FRONT_LEFT: 93279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FRONT_RIGHT: 93379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_BACK_LEFT: 93479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_BACK_RIGHT: 93579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FAKE_FRONT_LEFT: 93679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FAKE_FRONT_RIGHT: 93779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_X; 93879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 93979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_STENCIL: 94079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace /* The stencil buffer is W tiled. However, we request from the kernel 94179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * a non-tiled buffer because the GTT is incapable of W fencing. 94279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */ 94379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_NONE; 94479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 94579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace default: 94679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if(unlikely(INTEL_DEBUG & DEBUG_DRI)) { 94779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace fprintf(stderr, "error: %s: unrecognized DRI buffer attachment 0x%x\n", 94879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace __FUNCTION__, attachment); 94979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 95079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return false; 95179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 95279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace} 95379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 9542adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer * 9552adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen, 9562adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke unsigned attachment, unsigned format, 9572adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke int width, int height) 9582adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 9592adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer; 960875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 96179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 9625dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg uint32_t tiling; 96379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t region_width; 96479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t region_height; 96579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t region_cpp; 96679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 96779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace bool ok = true; 96879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 96979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace ok = intel_get_dri_buffer_tiling(intelScreen, attachment, &tiling); 97079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if (!ok) 97179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return NULL; 9722adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9732adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer = CALLOC(sizeof *intelBuffer); 9742adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer == NULL) 9752adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 9762adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 97779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if (attachment == __DRI_BUFFER_STENCIL) { 978a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry /* Stencil buffers use W tiling, a tiling format that the DRM functions 979a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * don't properly account for. Therefore, when we allocate a stencil 980a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * buffer that is private to Mesa (see intel_miptree_create), we round 981a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * the height and width up to the next multiple of the tile size (64x64) 982a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * and then ask DRM to allocate an untiled buffer. Consequently, the 983a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * height and the width stored in the stencil buffer's region structure 984a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * are always multiples of 64, even if the stencil buffer itself is 985a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * smaller. 986a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * 987a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * To avoid inconsistencies between how we represent private buffers and 988a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * buffers shared with the window system, round up the height and width 989a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry * for window system buffers too. 99079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */ 99179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_width = ALIGN(width, 64); 992a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry region_height = ALIGN(height, 64); 99379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } else { 99479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_width = width; 99579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_height = height; 99679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 9975dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg 998a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry region_cpp = format / 8; 999a27c7d80afc3160a0face4b8781bf921229bc3ccPaul Berry 100079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace intelBuffer->region = intel_region_alloc(intelScreen, 100179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace tiling, 100279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_cpp, 100379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_width, 100479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_height, 100579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace true); 10062adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10072adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer->region == NULL) { 10082adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke FREE(intelBuffer); 10092adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 10102adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke } 10112adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10122adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_flink(intelBuffer->region, &intelBuffer->base.name); 10132adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10142adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.attachment = attachment; 10152adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.cpp = intelBuffer->region->cpp; 10162adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.pitch = 10172adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->region->pitch * intelBuffer->region->cpp; 10182adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10192adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return &intelBuffer->base; 10202adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 10212adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10222adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void 10232adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) 10242adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 10252adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer; 10262adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10272adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_release(&intelBuffer->region); 10282adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke free(intelBuffer); 10292adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 10302adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10312adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 1032e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 10337192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis .InitScreen = intelInitScreen2, 1034e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 1035e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 1036e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 1037e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 1038e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 1039e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 1040e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 10412adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .AllocateBuffer = intelAllocateBuffer, 10422adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .ReleaseBuffer = intelReleaseBuffer 1043e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 104439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg 104539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */ 104639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = { 104739a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driCoreExtension.base, 104839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driDRI2Extension.base, 104939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg NULL 105039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg}; 1051