intel_screen.c revision 8c94f6bbd80908fd2cae8e27fe78c429e54a78b8
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) 82040894391a2cf85035c6ad85f3f85c6efb23324bKenneth Graunke DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED(false) 8381aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt 8481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false) 8581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.") 8681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_END 87c6abde211fa875f90e59e3709720cfe394669069Eric Anholt 88c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_BEGIN(shader_precompile, bool, false) 89c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_DESC(en, "Perform code generation at shader link time.") 90c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_END 91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 93a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 94040894391a2cf85035c6ad85f3f85c6efb23324bKenneth Graunkeconst GLuint __driNConfigOptions = 15; 9577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 96df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h" 97df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h" 98df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h" 99df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h" 100df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h" 101da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace#include "intel_mipmap_tree.h" 102df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h" 103df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h" 104df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h" 105df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 106df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h" 107df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 10985063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 112252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkevoid 113252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkeaub_dump_bmp(struct gl_context *ctx) 114252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke{ 115252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke struct gl_framebuffer *fb = ctx->DrawBuffer; 116252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 117252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke for (int i = 0; i < fb->_NumColorDrawBuffers; i++) { 118252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke struct intel_renderbuffer *irb = 119252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke intel_renderbuffer(fb->_ColorDrawBuffers[i]); 120252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 121252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke if (irb && irb->mt) { 122252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke enum aub_dump_bmp_format format; 123252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 124252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke switch (irb->Base.Base.Format) { 125252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke case MESA_FORMAT_ARGB8888: 126252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke case MESA_FORMAT_XRGB8888: 127252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke format = AUB_DUMP_BMP_FORMAT_ARGB_8888; 128252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke break; 129252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke default: 130252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke continue; 131252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 132252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 133252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo, 134252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->draw_x, 135252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->draw_y, 136252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->Base.Base.Width, 137252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->Base.Base.Height, 138252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke format, 139252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->mt->region->pitch * 140252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->mt->region->cpp, 141252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 0); 142252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 143252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 144252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke} 145252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 1466d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 1476d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 1486d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 14966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 1506d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 1516d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 1527c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 1537c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable) 1547c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 155dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt GET_CURRENT_CONTEXT(ctx); 156dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt struct intel_context *intel = intel_context(ctx); 157ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel == NULL) 158ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat return; 1597c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 160ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->gen < 4) 161ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat INTEL_FIREVERTICES(intel); 1627c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 163ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel->need_throttle = true; 164e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg 165ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->batch.used) 166ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel_batchbuffer_flush(intel); 1670247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt 1680247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt if (INTEL_DEBUG & DEBUG_AUB) { 169252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke aub_dump_bmp(ctx); 1700247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt } 1717c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 1727c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1737c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = { 1747c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 1757c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush, 176e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg dri2InvalidateDrawable, 1777c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}; 1787c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 179c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 1801bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergintel_allocate_image(int dri_format, void *loaderPrivate) 181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 183c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 1881bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg image->dri_format = dri_format; 18995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = 0; 190249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira 1911bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg switch (dri_format) { 192c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_RGB565; 194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 198c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 2019fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu case __DRI_IMAGE_FORMAT_ABGR8888: 2029fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->format = MESA_FORMAT_RGBA8888_REV; 2039fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu break; 204fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley case __DRI_IMAGE_FORMAT_XBGR8888: 205fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley image->format = MESA_FORMAT_RGBX8888_REV; 206fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley break; 20744a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case __DRI_IMAGE_FORMAT_R8: 20844a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->format = MESA_FORMAT_R8; 20944a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 21044a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case __DRI_IMAGE_FORMAT_GR88: 21144a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->format = MESA_FORMAT_GR88; 21244a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 21344a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case __DRI_IMAGE_FORMAT_NONE: 21444a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->format = MESA_FORMAT_NONE; 21544a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg default: 217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg free(image); 218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 221454fc07ddefe2b750d78c94e8d52a11a8741c42fKristian Høgsberg image->internal_format = _mesa_get_format_base_format(image->format); 222c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 223c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 2241bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg return image; 2251bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg} 2261bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg 2271bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergstatic __DRIimage * 2281bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen, 2291bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg int width, int height, int format, 2301bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg int name, int pitch, void *loaderPrivate) 2311bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg{ 2321bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg struct intel_screen *intelScreen = screen->driverPrivate; 2331bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg __DRIimage *image; 2341bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg int cpp; 2351bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg 2361bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg image = intel_allocate_image(format, loaderPrivate); 237636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg if (image->format == MESA_FORMAT_NONE) 238636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg cpp = 0; 239636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg else 240636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 2419ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg image->region = intel_region_alloc_for_handle(intelScreen, 2429087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg cpp, width, height, 243c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg pitch, name, "image"); 244c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image->region == NULL) { 245c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 246c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 247c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 248c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 249c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 250c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 251c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 252c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 253c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context, 254c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int renderbuffer, void *loaderPrivate) 255c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 256c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 257c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_context *intel = context->driverPrivate; 258c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct gl_renderbuffer *rb; 259c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_renderbuffer *irb; 260c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 261d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer); 262c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (!rb) { 263c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg _mesa_error(&intel->ctx, 264c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); 265c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 266c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 267c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 268c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg irb = intel_renderbuffer(rb); 269c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 270c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 271c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 272c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 273c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = rb->InternalFormat; 274c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = rb->Format; 27595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = 0; 276c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 277da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace intel_region_reference(&image->region, irb->mt->region); 278c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 279249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira switch (image->format) { 280249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_RGB565: 281249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_RGB565; 282249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 283249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_XRGB8888: 284249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_XRGB8888; 285249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 286249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_ARGB8888: 287249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_ARGB8888; 288249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 289249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_RGBA8888_REV: 290249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_ABGR8888; 291249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 29244a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case MESA_FORMAT_R8: 29344a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->dri_format = __DRI_IMAGE_FORMAT_R8; 29444a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 29544a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case MESA_FORMAT_RG88: 29644a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->dri_format = __DRI_IMAGE_FORMAT_GR88; 29744a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 298249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira } 299249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira 300c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 301c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 302c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 303c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void 304c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image) 305c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 306c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_region_release(&image->region); 307c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 308c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 309c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 310f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage * 311f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen, 312f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int width, int height, int format, 313f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg unsigned int use, 314f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg void *loaderPrivate) 315f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 316f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg __DRIimage *image; 317875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 318e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg uint32_t tiling; 319f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int cpp; 320f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 321e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_X; 322e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 323e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (width != 64 || height != 64) 324e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg return NULL; 325e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_NONE; 326e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg } 327e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg 3284fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg /* We only support write for cursor drm images */ 3294fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg if ((use & __DRI_IMAGE_USE_WRITE) && 3304fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg use != (__DRI_IMAGE_USE_WRITE | __DRI_IMAGE_USE_CURSOR)) 3314fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return NULL; 3324fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 3331bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg image = intel_allocate_image(format, loaderPrivate); 3344fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg image->usage = use; 335f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 336f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->region = 3371bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg intel_region_alloc(intelScreen, tiling, cpp, width, height, true); 338f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg if (image->region == NULL) { 339f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg FREE(image); 340f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 341f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 342f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 343f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return image; 344f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 345f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 346f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean 347f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value) 348f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 349f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg switch (attrib) { 350f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_STRIDE: 351f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg *value = image->region->pitch * image->region->cpp; 3522e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 353f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_HANDLE: 3548004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt *value = image->region->bo->handle; 3552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 356f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_NAME: 357f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return intel_region_flink(image->region, (uint32_t *) value); 3588de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_ATTRIB_FORMAT: 359fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira *value = image->dri_format; 360fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira return true; 36144f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case __DRI_IMAGE_ATTRIB_WIDTH: 36244f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg *value = image->region->width; 36344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return true; 36444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case __DRI_IMAGE_ATTRIB_HEIGHT: 36544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg *value = image->region->height; 36644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return true; 36744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg default: 3682e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 369f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 370f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 371f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 3723af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage * 3733af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate) 3743af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{ 3753af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke __DRIimage *image; 3763af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3773af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image = CALLOC(sizeof *image); 3783af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image == NULL) 3793af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 3803af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3813af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_region_reference(&image->region, orig_image->region); 3823af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image->region == NULL) { 3833af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke FREE(image); 3843af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 3853af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke } 3863af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3873af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->internal_format = orig_image->internal_format; 3884fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg image->usage = orig_image->usage; 389249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = orig_image->dri_format; 3903af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->format = orig_image->format; 39195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = orig_image->offset; 3923af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->data = loaderPrivate; 3933af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3943af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return image; 3953af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke} 3963af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 397221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergstatic GLboolean 398221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergintel_validate_usage(__DRIimage *image, unsigned int use) 399221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg{ 400221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 401221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (image->region->width != 64 || image->region->height != 64) 402221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_FALSE; 403221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg } 404221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 4054fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg /* We only support write for cursor drm images */ 4064fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg if ((use & __DRI_IMAGE_USE_WRITE) && 4074fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg use != (__DRI_IMAGE_USE_WRITE | __DRI_IMAGE_USE_CURSOR)) 4084fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return GL_FALSE; 4094fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 410221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_TRUE; 411221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg} 412221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 4134fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsbergstatic int 4144fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsbergintel_image_write(__DRIimage *image, const void *buf, size_t count) 4154fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg{ 4164fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg if (image->region->map_refcount) 4174fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return -1; 4184fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg if (!(image->usage & __DRI_IMAGE_USE_WRITE)) 4194fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return -1; 4204fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 4214fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg drm_intel_bo_map(image->region->bo, true); 4224fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg memcpy(image->region->bo->virtual, buf, count); 4234fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg drm_intel_bo_unmap(image->region->bo); 4244fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 4254fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg return 0; 4264fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg} 4274fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg 42895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsbergstatic __DRIimage * 42995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsbergintel_create_sub_image(__DRIimage *parent, 43095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg int width, int height, int dri_format, 43195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg int offset, int pitch, void *loaderPrivate) 43295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg{ 43395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg __DRIimage *image; 43495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg int cpp; 43595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg uint32_t mask_x, mask_y; 43695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 43795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image = intel_allocate_image(dri_format, loaderPrivate); 43895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 43995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg if (offset + height * cpp * pitch > parent->region->bo->size) { 44095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds"); 44195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg FREE(image); 44295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg return NULL; 44395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg } 44495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 44595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region = calloc(sizeof(*image->region), 1); 44695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg if (image->region == NULL) { 44795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg FREE(image); 44895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg return NULL; 44995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg } 45095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 45195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->cpp = _mesa_get_format_bytes(image->format); 45295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->width = width; 45395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->height = height; 45495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->pitch = pitch; 45595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->refcount = 1; 45695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->bo = parent->region->bo; 45795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg drm_intel_bo_reference(image->region->bo); 45895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->tiling = parent->region->tiling; 45995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->screen = parent->region->screen; 46095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = offset; 46195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 46295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg intel_region_get_tile_masks(image->region, &mask_x, &mask_y); 46395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg if (offset & mask_x) 46495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg _mesa_warning(NULL, 46595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg "intel_create_sub_image: offset not on tile boundary"); 46695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 46795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg return image; 46895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg} 46995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 470c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = { 47195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg { __DRI_IMAGE, 5 }, 472c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_name, 473c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_renderbuffer, 474c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_destroy_image, 475f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg intel_create_image, 4763af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_query_image, 477221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg intel_dup_image, 4784fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg intel_validate_usage, 47995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg intel_image_write, 48095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg intel_create_sub_image 481c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}; 482c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 483e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 4846d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 4857c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg &intelFlushExtension.base, 486c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg &intelImageExtension.base, 487234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes &dri2ConfigQueryExtension.base, 48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 48977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 49077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4912e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 492d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value) 49324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 49424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 4951c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 49624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 497f33d100fa71cecfb163dd91cd56b9a2788a43c22Eric Anholt memset(&gp, 0, sizeof(gp)); 49824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 49924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 50024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 5011c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 50224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 503f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt if (ret != -EINVAL) 504f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 5052e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 50624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 50724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 5082e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 50924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 51077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5112e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 512900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param) 513900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{ 514900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson int value = 0; 515900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson return intel_get_param(psp, param, &value) && value; 516900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson} 517900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 51877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 5192d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData) 5202d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{ 5212d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg} 5222d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 5232d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void 524d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv) 52577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 526875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 52777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 528904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 5296d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 53077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5312d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg /* Some regions may still have references to them at this point, so 5322d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * flush the hash table to prevent _mesa_DeleteHashTable() from 5332d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * complaining about the hash not being empty; */ 5342d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL); 5352d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_DeleteHashTable(intelScreen->named_regions); 5362d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 53777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 538875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis sPriv->driverPrivate = NULL; 53977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 54077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 54177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 54277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 54377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 54477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 546d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv, 547d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable * driDrawPriv, 548d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, GLboolean isPixmap) 54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 550d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct intel_renderbuffer *rb; 551875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *screen = (struct intel_screen*) driScrnPriv->driverPrivate; 5522b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace gl_format rgbFormat; 5532b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace struct gl_framebuffer *fb; 554d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 5552b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (isPixmap) 5562b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace return false; 55777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5582b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace fb = CALLOC_STRUCT(gl_framebuffer); 5592b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (!fb) 5602b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace return false; 56177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5622b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_initialize_window_framebuffer(fb, mesaVis); 56377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5642b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (mesaVis->redBits == 5) 5652b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rgbFormat = MESA_FORMAT_RGB565; 5662b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else if (mesaVis->alphaBits == 0) 5672b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rgbFormat = MESA_FORMAT_XRGB8888; 5682b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else 5692b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rgbFormat = MESA_FORMAT_ARGB8888; 57077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5712b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* setup the hardware-based renderbuffers */ 5722b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rb = intel_create_renderbuffer(rgbFormat); 5732b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base); 574119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 5752b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (mesaVis->doubleBufferMode) { 576d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 5772b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base); 5782b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 57977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5802b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* 5812b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * Assert here that the gl_config has an expected depth/stencil bit 5822b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(), 5832b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * which constructs the advertised configs.) 5842b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace */ 5852b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (mesaVis->depthBits == 24) { 5862b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->stencilBits == 8); 5872b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace 5882b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (screen->hw_has_separate_stencil) { 5892b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_X8_Z24); 5902b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 5912b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_S8); 5922b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 5932b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } else { 5942b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* 5952b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * Use combined depth/stencil. Note that the renderbuffer is 5962b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * attached to two attachment points. 5972b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace */ 5982b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_S8_Z24); 5992b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 6002b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 601f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace } 6022b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 6032b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else if (mesaVis->depthBits == 16) { 6042b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->stencilBits == 0); 6058c94f6bbd80908fd2cae8e27fe78c429e54a78b8Chad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_Z16); 6068c94f6bbd80908fd2cae8e27fe78c429e54a78b8Chad Versace _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 6072b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 6082b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else { 6092b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->depthBits == 0); 6102b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->stencilBits == 0); 6112b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 61277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6132b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* now add any/all software-based renderbuffers we may need */ 6142b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _swrast_add_soft_renderbuffers(fb, 6152b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw color */ 6162b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw depth */ 6172b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw stencil */ 6182b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace mesaVis->accumRedBits > 0, 6192b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw alpha */ 6202b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false /* never sw aux */ ); 6212b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace driDrawPriv->driverPrivate = fb; 62277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6232b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace return true; 62477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 62577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 62677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 627d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv) 62877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 629d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = driDrawPriv->driverPrivate; 630d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 631d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_reference_framebuffer(&fb, NULL); 63277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 63377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 63477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 63577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 63677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 63777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 6382e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 6392e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis, 6402e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 6412e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 6422e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke 6432e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 6442e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api, 6452e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 6462e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 6472e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 6482e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 6492e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api, 6502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 6512e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 6522e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 65377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 65477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 655a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api, 656d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, 657d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 658e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned major_version, 659e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned minor_version, 660e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick uint32_t flags, 661e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned *error, 66277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 66377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 664d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *sPriv = driContextPriv->driScreenPriv; 665875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 66635cdd7b6dbc763fe57bf466def0a4257ca09beb8Eric Anholt bool success = false; 66777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 668bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 66919420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 67019420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (!IS_965(intelScreen->deviceID)) { 671e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = i915CreateContext(api, mesaVis, driContextPriv, 672e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 67319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt } 674bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 6752e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke intelScreen->no_vbo = true; 676e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = i830CreateContext(mesaVis, driContextPriv, 677e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 67877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 679bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 680bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt if (IS_965(intelScreen->deviceID)) 681e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = brwCreateContext(api, mesaVis, 682e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick driContextPriv, 683e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 684bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 685e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 686e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (success) { 687e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick struct gl_context *ctx = 688e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick (struct gl_context *) driContextPriv->driverPrivate; 689e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 690e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick _mesa_compute_version(ctx); 691e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (ctx->VersionMajor > major_version 692e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick || (ctx->VersionMajor == major_version 693e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick && ctx->VersionMinor >= minor_version)) { 694e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick return true; 695e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 696e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 697881bb4ac7285c462079844072fc1d0b26e340b12Jordan Justen *error = __DRI_CTX_ERROR_BAD_VERSION; 698e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick intelDestroyContext(driContextPriv); 699e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } else { 700e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 701e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID); 702e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 703e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 7042e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 70577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 70677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 7072e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 7085777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen) 7097e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 710d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *spriv = intelScreen->driScrnPriv; 711cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 7127e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 7132222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL; 7147e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 715827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 7167e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 717827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 718827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 7192e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 7207e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 7217e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 722bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) || 723bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt num_fences == 0) { 724bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__); 7252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 726bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt } 727e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 72806d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); 72906d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt 7302d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg intelScreen->named_regions = _mesa_NewHashTable(); 7312d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 732900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations = 0; 733900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations |= 734900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0; 735900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 7362e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 7377e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 7387e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 739c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 7406b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable 7416b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL. 7426b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * 7436b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid 7446b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL 7456b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored. 7466b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */ 7476b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void 7486b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen) 7496b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{ 7506b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace const char *s = getenv("INTEL_SEPARATE_STENCIL"); 7516b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace if (!s) { 7526b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace return; 7536b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("0", s, 2)) { 7546b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = false; 7556b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("1", s, 2)) { 7566b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = true; 7576b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else { 7586b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace fprintf(stderr, 7596b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has " 7606b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "invalid value and is ignored", s); 7616b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } 7626b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace} 7636b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 764f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterstatic bool 765f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterintel_detect_swizzling(struct intel_screen *screen) 766f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter{ 767f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo *buffer; 768f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter unsigned long flags = 0; 769f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter unsigned long aligned_pitch; 770f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter uint32_t tiling = I915_TILING_X; 771f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter uint32_t swizzle_mode = 0; 772f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 773f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test", 774f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 64, 64, 4, 775f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter &tiling, &aligned_pitch, flags); 776f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter if (buffer == NULL) 777f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return false; 778f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 779f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo_get_tiling(buffer, &tiling, &swizzle_mode); 780f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo_unreference(buffer); 781f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 782f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter if (swizzle_mode == I915_BIT_6_SWIZZLE_NONE) 783f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return false; 784f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter else 785f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return true; 786f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter} 787f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 7886b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/** 789c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 7908d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 7918d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 792d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver 793c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 794e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 795d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp) 796c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 7975777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen; 7983ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_format[3]; 7993ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_type[3]; 8005efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg unsigned int api_mask; 8017c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 8023ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt static const GLenum back_buffer_modes[] = { 8036bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 8043ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt }; 805e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 8063ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt int color; 8075d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs = NULL; 808c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 8091b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt if (psp->dri2.loader->base.version <= 2 || 8101b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt psp->dri2.loader->getBuffersWithFormat == NULL) { 8111b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt fprintf(stderr, 8121b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt "\nERROR! DRI2 loader with getBuffersWithFormat() " 8131b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt "support required\n"); 8141b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt return false; 8151b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt } 8161b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt 817c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 8185777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg intelScreen = CALLOC(sizeof *intelScreen); 819c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 820c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 8212e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 822c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 823c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 824c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 825c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 826c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 827c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 828875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis psp->driverPrivate = (void *) intelScreen; 829c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 8302222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt if (!intel_init_bufmgr(intelScreen)) 8312222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt return false; 832c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 8332222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt intelScreen->deviceID = drm_intel_bufmgr_gem_get_devid(intelScreen->bufmgr); 8344ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt 835cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intelScreen->kernel_has_gen7_sol_reset = 836cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intel_get_boolean(intelScreen->driScrnPriv, 837cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt I915_PARAM_HAS_GEN7_SOL_RESET); 838cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt 83989a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke if (IS_GEN7(intelScreen->deviceID)) { 84089a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke intelScreen->gen = 7; 84189a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke } else if (IS_GEN6(intelScreen->deviceID)) { 8427363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 6; 8437363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_GEN5(intelScreen->deviceID)) { 8447363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 5; 8457363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_965(intelScreen->deviceID)) { 8467363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 4; 8477363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_9XX(intelScreen->deviceID)) { 8487363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 3; 8497363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else { 8507363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 2; 8517363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } 8527363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg 853e5411d8fdc6a7dda18d82746b84197ef83ee0a13Chad Versace intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6; 8546b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7; 8556b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 856249fc7056104113633215106ac085b505d8dc161Eric Anholt int has_llc = 0; 857249fc7056104113633215106ac085b505d8dc161Eric Anholt bool success = intel_get_param(intelScreen->driScrnPriv, I915_PARAM_HAS_LLC, 858249fc7056104113633215106ac085b505d8dc161Eric Anholt &has_llc); 859249fc7056104113633215106ac085b505d8dc161Eric Anholt if (success && has_llc) 860249fc7056104113633215106ac085b505d8dc161Eric Anholt intelScreen->hw_has_llc = true; 861249fc7056104113633215106ac085b505d8dc161Eric Anholt else if (!success && intelScreen->gen >= 6) 862249fc7056104113633215106ac085b505d8dc161Eric Anholt intelScreen->hw_has_llc = true; 8637def293204977c41ea35198af147f743a31b1889Eugeni Dodonov 8646b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel_override_separate_stencil(intelScreen); 8656b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 8665efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask = (1 << __DRI_API_OPENGL); 8675efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1 8685efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES); 8695efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 8705efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2 8715efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES2); 8725efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 8735efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 8745efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID)) 8755efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg psp->api_mask = api_mask; 8765efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 877f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen); 878f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 879e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 880c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 881eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 882eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 8833ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_format[0] = GL_RGB; 8843ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 8853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 88624ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[1] = GL_BGR; 8873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 8883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 88924ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[2] = GL_BGRA; 8903ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 8913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 892160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[0] = 0; 893160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[0] = 0; 894160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 895bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate a rich set of useful configs that do not include an 896bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 897bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 8983ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 8995d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **new_configs; 900160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt int depth_factor; 901160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 902066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil 903066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer that has a diffferent number of bits per pixel than the color 904066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer. This isn't yet supported here. 905160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt */ 906160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 907160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 16; 908160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 909160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } else { 910160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 24; 91173e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick stencil_bits[1] = 8; 912160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } 91373e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 91473e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick depth_factor = 2; 91573e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 9165d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt new_configs = driCreateConfigs(fb_format[color], fb_type[color], 9175d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits, 9185d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits, 919160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor, 9205d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 9215d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(back_buffer_modes), 9225d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 9233cce4a1e10361458630511543b7a8a6438544775Ian Romanick ARRAY_SIZE(msaa_samples_array), 9242e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke false); 925bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (configs == NULL) 926bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = new_configs; 927bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick else 928bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = driConcatConfigs(configs, new_configs); 929bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 930bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 931bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate the minimum possible set of configs that include an 932bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 933bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 934bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 935bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick __DRIconfig **new_configs; 936bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 937bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 938bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 16; 939bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 0; 940bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } else { 941bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 24; 942bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 8; 943bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 944bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 945bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick new_configs = driCreateConfigs(fb_format[color], fb_type[color], 946bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits, stencil_bits, 1, 947bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick back_buffer_modes + 1, 1, 948bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick msaa_samples_array, 1, 9492e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke true); 9503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) 9513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = new_configs; 9523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt else 9533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = driConcatConfigs(configs, new_configs); 9543ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 9553ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 9563ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) { 9573ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 9583ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt __LINE__); 9593ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt return NULL; 9603ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 9613ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 9625d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt return (const __DRIconfig **)configs; 963c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 964e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 9652adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer { 9662adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke __DRIbuffer base; 9672adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_region *region; 9682adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}; 9692adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9702adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer * 9712adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen, 9722adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke unsigned attachment, unsigned format, 9732adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke int width, int height) 9742adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 9752adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer; 976875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 97779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 97883fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace assert(attachment == __DRI_BUFFER_FRONT_LEFT || 97983fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace attachment == __DRI_BUFFER_BACK_LEFT); 9802adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9812adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer = CALLOC(sizeof *intelBuffer); 9822adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer == NULL) 9832adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 9842adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 98583fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace /* The front and back buffers are color buffers, which are X tiled. */ 98679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace intelBuffer->region = intel_region_alloc(intelScreen, 98783fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace I915_TILING_X, 98883fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace format / 8, 98983fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace width, 99083fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace height, 99179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace true); 9922adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9932adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer->region == NULL) { 9942adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke FREE(intelBuffer); 9952adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 9962adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke } 9972adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9982adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_flink(intelBuffer->region, &intelBuffer->base.name); 9992adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10002adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.attachment = attachment; 10012adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.cpp = intelBuffer->region->cpp; 10022adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.pitch = 10032adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->region->pitch * intelBuffer->region->cpp; 10042adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10052adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return &intelBuffer->base; 10062adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 10072adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10082adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void 10092adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) 10102adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 10112adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer; 10122adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10132adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_release(&intelBuffer->region); 10142adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke free(intelBuffer); 10152adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 10162adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 10172adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 1018e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 10197192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis .InitScreen = intelInitScreen2, 1020e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 1021e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 1022e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 1023e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 1024e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 1025e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 1026e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 10272adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .AllocateBuffer = intelAllocateBuffer, 10282adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .ReleaseBuffer = intelReleaseBuffer 1029e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 103039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg 103139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */ 103239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = { 103339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driCoreExtension.base, 103439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driDRI2Extension.base, 103539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg NULL 103639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg}; 1037