intel_screen.c revision 3913cd19b82802449dad2008ff4cfc1d546c05a6
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> 293913cd19b82802449dad2008ff4cfc1d546c05a6Quentin Glidic#include <time.h> 30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h" 32ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 33ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h" 342d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h" 35d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h" 3645a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h" 3714aff23e1b4d52d5e10a3aeb65c3f4c783498a35Brian Paul#include "main/version.h" 38d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h" 396c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul 4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h" 4177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h" 4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] = 44a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_BEGIN 45a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_PERFORMANCE 46e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) 47fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, 48fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt * DRI_CONF_BO_REUSE_ALL 49fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt */ 50f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1") 51fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_BEGIN(en, "Buffer object reuse") 52fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(0, "Disable buffer object reuse") 53fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects") 54fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_END 55fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_OPT_END 561ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 578e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_OPT_BEGIN(texture_tiling, bool, true) 588e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_DESC(en, "Enable texture tiling") 598e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_OPT_END 601ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 61d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt DRI_CONF_OPT_BEGIN(hiz, bool, true) 62d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt DRI_CONF_DESC(en, "Enable Hierarchical Z on gen6+") 63d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt DRI_CONF_OPT_END 64d09fce51f0cf91c9c07f69063fe2180cc319d8dfEric Anholt 65b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_BEGIN(early_z, bool, false) 66b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") 67b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_END 68b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt 69a58514cc9c5cc5867f9140700462c5ac5749550dEric Anholt DRI_CONF_OPT_BEGIN(fragment_shader, bool, true) 70862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.") 71862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_END 72862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt 73a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 74a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_QUALITY 75a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 76acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 77a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 78a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_DEBUG 79a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_NO_RAST(false) 8040bc2748c2781600c748e546160bcc2aab637825Eric Anholt DRI_CONF_ALWAYS_FLUSH_BATCH(false) 81f3687284c12f34268172b9c60e2effd697162129Eric Anholt DRI_CONF_ALWAYS_FLUSH_CACHE(false) 82642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false) 83040894391a2cf85035c6ad85f3f85c6efb23324bKenneth Graunke DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED(false) 8481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt 8581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false) 8681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.") 8781aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_END 88c6abde211fa875f90e59e3709720cfe394669069Eric Anholt 899ef710575b914ddfc8e9a162d98ad554c1c217f7Kenneth Graunke DRI_CONF_OPT_BEGIN(shader_precompile, bool, true) 90c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_DESC(en, "Perform code generation at shader link time.") 91c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_END 92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 93a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 94a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 95040894391a2cf85035c6ad85f3f85c6efb23324bKenneth Graunkeconst GLuint __driNConfigOptions = 15; 9677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 97df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h" 98df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h" 99df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h" 100df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h" 101df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h" 102da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace#include "intel_mipmap_tree.h" 103df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h" 104df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h" 105df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h" 106df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 107df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h" 108df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 11085063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 11277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 113006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt/** 114006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt * For debugging purposes, this returns a time in seconds. 115006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt */ 116006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholtdouble 117006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholtget_time(void) 118006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt{ 119006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt struct timespec tp; 120006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt 121006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt clock_gettime(CLOCK_MONOTONIC, &tp); 122006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt 123006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt return tp.tv_sec + tp.tv_nsec / 1000000000.0; 124006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt} 125006c1a3c652803e2ff8d5f7ea55c9cb5d8353279Eric Anholt 126252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkevoid 127252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunkeaub_dump_bmp(struct gl_context *ctx) 128252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke{ 129252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke struct gl_framebuffer *fb = ctx->DrawBuffer; 130252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 131252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke for (int i = 0; i < fb->_NumColorDrawBuffers; i++) { 132252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke struct intel_renderbuffer *irb = 133252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke intel_renderbuffer(fb->_ColorDrawBuffers[i]); 134252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 135252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke if (irb && irb->mt) { 136252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke enum aub_dump_bmp_format format; 137252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 138252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke switch (irb->Base.Base.Format) { 139252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke case MESA_FORMAT_ARGB8888: 140252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke case MESA_FORMAT_XRGB8888: 141252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke format = AUB_DUMP_BMP_FORMAT_ARGB_8888; 142252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke break; 143252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke default: 144252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke continue; 145252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 146252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 147252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke drm_intel_gem_bo_aub_dump_bmp(irb->mt->region->bo, 148252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->draw_x, 149252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->draw_y, 150252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->Base.Base.Width, 151252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->Base.Base.Height, 152252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke format, 153252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->mt->region->pitch * 154252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke irb->mt->region->cpp, 155252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 0); 156252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 157252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke } 158252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke} 159252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke 1606d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 1616d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 1626d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 16366175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 1646d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 1656d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 1667c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 1677c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable) 1687c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 169dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt GET_CURRENT_CONTEXT(ctx); 170dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt struct intel_context *intel = intel_context(ctx); 171ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel == NULL) 172ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat return; 1737c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 174ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->gen < 4) 175ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat INTEL_FIREVERTICES(intel); 1767c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 17761fd6847827048ce9b01b1d164111472ad8bf593Chad Versace intel_downsample_for_dri2_flush(intel, drawable); 178ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel->need_throttle = true; 179e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg 180ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->batch.used) 181ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel_batchbuffer_flush(intel); 1820247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt 1830247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt if (INTEL_DEBUG & DEBUG_AUB) { 184252d3118dd40e9e3c577702b4c65a2d6cfd343b6Kenneth Graunke aub_dump_bmp(ctx); 1850247d89183e26fbd07e4176ff6f8d1b4989e24abEric Anholt } 1867c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 1877c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1887c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = { 1897c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 1907c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush, 191e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg dri2InvalidateDrawable, 1927c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}; 1937c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 19400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzstruct intel_image_format intel_image_formats[] = { 19500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_ARGB8888, __DRI_IMAGE_COMPONENTS_RGBA, 1, 19600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } }, 19700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 19800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_XRGB8888, __DRI_IMAGE_COMPONENTS_RGB, 1, 19900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_XRGB8888, 4 }, } }, 20000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 20100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_YUV410, __DRI_IMAGE_COMPONENTS_Y_U_V, 3, 20200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 20300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 }, 20400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 2, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 } } }, 20500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 20600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_YUV411, __DRI_IMAGE_COMPONENTS_Y_U_V, 3, 20700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 20800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 20900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 2, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 } } }, 21000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 21100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_YUV420, __DRI_IMAGE_COMPONENTS_Y_U_V, 3, 21200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 21300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 }, 21400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 2, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 } } }, 21500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 21600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_YUV422, __DRI_IMAGE_COMPONENTS_Y_U_V, 3, 21700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 21800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 21900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 2, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 } } }, 22000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 22100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_YUV444, __DRI_IMAGE_COMPONENTS_Y_U_V, 3, 22200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 22300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 22400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 2, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 } } }, 22500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 22600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_NV12, __DRI_IMAGE_COMPONENTS_Y_UV, 2, 22700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 22800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88, 2 } } }, 22900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 23000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_NV16, __DRI_IMAGE_COMPONENTS_Y_UV, 2, 23100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, 23200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88, 2 } } }, 23300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 23400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz /* For YUYV buffers, we set up two overlapping DRI images and treat 23500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * them as planar buffers in the compositors. Plane 0 is GR88 and 23600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * samples YU or YV pairs and places Y into the R component, while 23700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * plane 1 is ARGB and samples YUYV clusters and places pairs and 23800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * places U into the G component and V into A. This lets the 23900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * texture sampler interpolate the Y components correctly when 24000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * sampling from plane 0, and interpolate U and V correctly when 24100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz * sampling from plane 1. */ 24200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { __DRI_IMAGE_FOURCC_YUYV, __DRI_IMAGE_COMPONENTS_Y_XUXV, 2, 24300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR88, 2 }, 24400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz { 0, 1, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } } 24500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz}; 24600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 247c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 2481bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergintel_allocate_image(int dri_format, void *loaderPrivate) 249c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 250c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 251c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 252c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 253c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 254c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 255c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 2561bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg image->dri_format = dri_format; 25795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = 0; 258249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira 2591bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg switch (dri_format) { 260c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 261c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_RGB565; 262c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 263c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 264c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 265c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 266c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 267c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 268c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 2699fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu case __DRI_IMAGE_FORMAT_ABGR8888: 2709fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->format = MESA_FORMAT_RGBA8888_REV; 2719fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu break; 272fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley case __DRI_IMAGE_FORMAT_XBGR8888: 273fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley image->format = MESA_FORMAT_RGBX8888_REV; 274fd0082c47ecf1028bbb9e1e0dbc20173a3174772Sean V Kelley break; 27544a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case __DRI_IMAGE_FORMAT_R8: 27644a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->format = MESA_FORMAT_R8; 27744a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 27844a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case __DRI_IMAGE_FORMAT_GR88: 27944a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->format = MESA_FORMAT_GR88; 28044a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 28144a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case __DRI_IMAGE_FORMAT_NONE: 28244a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->format = MESA_FORMAT_NONE; 28344a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 284c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg default: 285c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg free(image); 286c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 287c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 288c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 289454fc07ddefe2b750d78c94e8d52a11a8741c42fKristian Høgsberg image->internal_format = _mesa_get_format_base_format(image->format); 290c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 291c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 2921bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg return image; 2931bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg} 2941bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg 2951bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergstatic __DRIimage * 2961bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen, 2971bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg int width, int height, int format, 2981bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg int name, int pitch, void *loaderPrivate) 2991bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg{ 3001bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg struct intel_screen *intelScreen = screen->driverPrivate; 3011bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg __DRIimage *image; 3021bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg int cpp; 3031bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg 3041bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg image = intel_allocate_image(format, loaderPrivate); 305636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg if (image->format == MESA_FORMAT_NONE) 30600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz cpp = 1; 307636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg else 308636646a481ef6ce29e74e4604125a42def3ed1e5Kristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 3099ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg image->region = intel_region_alloc_for_handle(intelScreen, 3109087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg cpp, width, height, 311c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg pitch, name, "image"); 312c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image->region == NULL) { 313c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 314c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 315c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 316c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 317c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 318c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 319c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 320c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 321c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context, 322c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int renderbuffer, void *loaderPrivate) 323c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 324c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 325c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_context *intel = context->driverPrivate; 326c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct gl_renderbuffer *rb; 327c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_renderbuffer *irb; 328c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 329d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer); 330c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (!rb) { 331c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg _mesa_error(&intel->ctx, 332c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); 333c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 334c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 335c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 336c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg irb = intel_renderbuffer(rb); 337c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 338c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 339c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 340c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 341c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = rb->InternalFormat; 342c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = rb->Format; 34395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = 0; 344c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 345da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace intel_region_reference(&image->region, irb->mt->region); 346c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 347249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira switch (image->format) { 348249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_RGB565: 349249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_RGB565; 350249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 351249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_XRGB8888: 352249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_XRGB8888; 353249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 354249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_ARGB8888: 355249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_ARGB8888; 356249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 357249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira case MESA_FORMAT_RGBA8888_REV: 358249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = __DRI_IMAGE_FORMAT_ABGR8888; 359249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira break; 36044a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case MESA_FORMAT_R8: 36144a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->dri_format = __DRI_IMAGE_FORMAT_R8; 36244a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 36344a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg case MESA_FORMAT_RG88: 36444a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg image->dri_format = __DRI_IMAGE_FORMAT_GR88; 36544a2b57f93ab68f873eab543f1ecb9dc7f230a7eKristian Høgsberg break; 366249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira } 367249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira 368c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 369c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 370c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 371c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void 372c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image) 373c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 374c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_region_release(&image->region); 375c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 376c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 377c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 378f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage * 379f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen, 380f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int width, int height, int format, 381f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg unsigned int use, 382f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg void *loaderPrivate) 383f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 384f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg __DRIimage *image; 385875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 386e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg uint32_t tiling; 387f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int cpp; 388f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 389e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_X; 390e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 391e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (width != 64 || height != 64) 392e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg return NULL; 393e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_NONE; 394e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg } 395e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg 3961bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg image = intel_allocate_image(format, loaderPrivate); 397f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 398f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->region = 3991bb15c0a089cb268960d164d354ee6d942b4238fKristian Høgsberg intel_region_alloc(intelScreen, tiling, cpp, width, height, true); 400f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg if (image->region == NULL) { 401f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg FREE(image); 402f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 403f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 404f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 405f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return image; 406f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 407f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 408f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean 409f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value) 410f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 411f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg switch (attrib) { 412f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_STRIDE: 413f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg *value = image->region->pitch * image->region->cpp; 4142e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 415f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_HANDLE: 4168004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt *value = image->region->bo->handle; 4172e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 418f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_NAME: 419f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return intel_region_flink(image->region, (uint32_t *) value); 4208de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_ATTRIB_FORMAT: 421fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira *value = image->dri_format; 422fc7d224e295c4cb641238c37612409b1174cea12Ander Conselvan de Oliveira return true; 42344f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case __DRI_IMAGE_ATTRIB_WIDTH: 42444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg *value = image->region->width; 42544f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return true; 42644f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg case __DRI_IMAGE_ATTRIB_HEIGHT: 42744f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg *value = image->region->height; 42844f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg return true; 42900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz case __DRI_IMAGE_ATTRIB_COMPONENTS: 43000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (image->planar_format == NULL) 43100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return false; 43200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz *value = image->planar_format->components; 43300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return true; 43444f066b9ffb7749e872c9cc44ab4d6e2973c2372Kristian Høgsberg default: 4352e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 436f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 437f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 438f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 4393af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage * 4403af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate) 4413af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{ 4423af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke __DRIimage *image; 4433af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 4443af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image = CALLOC(sizeof *image); 4453af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image == NULL) 4463af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 4473af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 4483af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_region_reference(&image->region, orig_image->region); 4493af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image->region == NULL) { 4503af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke FREE(image); 4513af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 4523af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke } 4533af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 4543af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->internal_format = orig_image->internal_format; 45500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz image->planar_format = orig_image->planar_format; 456249817e92839d9ecdd78360eb3a856724df504c4Ander Conselvan de Oliveira image->dri_format = orig_image->dri_format; 4573af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->format = orig_image->format; 45895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = orig_image->offset; 4593af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->data = loaderPrivate; 46000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 46100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz memcpy(image->strides, orig_image->strides, sizeof(image->strides)); 46200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz memcpy(image->offsets, orig_image->offsets, sizeof(image->offsets)); 46300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 4643af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return image; 4653af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke} 4663af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 467221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergstatic GLboolean 468221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergintel_validate_usage(__DRIimage *image, unsigned int use) 469221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg{ 470221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 471221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (image->region->width != 64 || image->region->height != 64) 472221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_FALSE; 473221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg } 474221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 475221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_TRUE; 476221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg} 477221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 47895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsbergstatic __DRIimage * 47900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzintel_create_image_from_names(__DRIscreen *screen, 48000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int width, int height, int fourcc, 48100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int *names, int num_names, 48200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int *strides, int *offsets, 48300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz void *loaderPrivate) 48495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg{ 48500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz struct intel_image_format *f = NULL; 48695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg __DRIimage *image; 48700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int i, index; 48800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 48900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (screen == NULL || names == NULL || num_names != 1) 49000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return NULL; 49100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 49200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz for (i = 0; i < ARRAY_SIZE(intel_image_formats); i++) { 49300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (intel_image_formats[i].fourcc == fourcc) { 49400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz f = &intel_image_formats[i]; 49500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz } 49600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz } 49700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 49800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (f == NULL) 49900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return NULL; 50000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 50100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz image = intel_create_image_from_name(screen, width, height, 50200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz __DRI_IMAGE_FORMAT_NONE, 50300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz names[0], strides[0], 50400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz loaderPrivate); 50500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 50600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (image == NULL) 50700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return NULL; 50800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 50900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz image->planar_format = f; 51000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz for (i = 0; i < f->nplanes; i++) { 51100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz index = f->planes[i].buffer_index; 51200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz image->offsets[index] = offsets[index]; 51300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz image->strides[index] = strides[index]; 51400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz } 51500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 51600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return image; 51700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz} 51800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 51900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzstatic __DRIimage * 52000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantzintel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate) 52100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz{ 52200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz int width, height, offset, stride, dri_format, cpp, index, pitch; 52300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz struct intel_image_format *f; 52495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg uint32_t mask_x, mask_y; 52500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz __DRIimage *image; 52600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 52700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (parent == NULL || parent->planar_format == NULL) 52800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return NULL; 52900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 53000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz f = parent->planar_format; 53100978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 53200978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz if (plane >= f->nplanes) 53300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz return NULL; 53400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz 53500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz width = parent->region->width >> f->planes[plane].width_shift; 53600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz height = parent->region->height >> f->planes[plane].height_shift; 53700978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz dri_format = f->planes[plane].dri_format; 53800978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz index = f->planes[plane].buffer_index; 53900978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz offset = parent->offsets[index]; 54000978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz stride = parent->strides[index]; 54195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 54295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image = intel_allocate_image(dri_format, loaderPrivate); 54300978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz cpp = _mesa_get_format_bytes(image->format); /* safe since no none format */ 54400978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz pitch = stride / cpp; 54595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg if (offset + height * cpp * pitch > parent->region->bo->size) { 54695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds"); 54795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg FREE(image); 54895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg return NULL; 54995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg } 55095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 55195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region = calloc(sizeof(*image->region), 1); 55295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg if (image->region == NULL) { 55395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg FREE(image); 55495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg return NULL; 55595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg } 55695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 55795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->cpp = _mesa_get_format_bytes(image->format); 55895bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->width = width; 55995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->height = height; 56095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->pitch = pitch; 56195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->refcount = 1; 56295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->bo = parent->region->bo; 56395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg drm_intel_bo_reference(image->region->bo); 56495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->tiling = parent->region->tiling; 56595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->region->screen = parent->region->screen; 56695bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg image->offset = offset; 56795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 56896fd94ba9421c7c3072988f999ee869534f2bc2aPaul Berry intel_region_get_tile_masks(image->region, &mask_x, &mask_y, false); 56995bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg if (offset & mask_x) 57095bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg _mesa_warning(NULL, 57195bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg "intel_create_sub_image: offset not on tile boundary"); 57295bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 57395bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg return image; 57495bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg} 57595bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg 576c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = { 57795bc0527e9f81c62cbfe02dace94e73d9950d04dKristian Høgsberg { __DRI_IMAGE, 5 }, 578c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_name, 579c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_renderbuffer, 580c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_destroy_image, 581f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg intel_create_image, 5823af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_query_image, 583221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg intel_dup_image, 5844fddb2ba21add1c1968330e5224ecead59da3995Kristian Høgsberg intel_validate_usage, 58500978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz intel_create_image_from_names, 58600978098794f723230a33cab1c1152686f1c4fa5Jakob Bornecrantz intel_from_planar 587c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}; 588c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 589e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 5906d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 5917c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg &intelFlushExtension.base, 592c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg &intelImageExtension.base, 593234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes &dri2ConfigQueryExtension.base, 59477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 59577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 59677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5972e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 598d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value) 59924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 60024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 6011c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 60224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 603f33d100fa71cecfb163dd91cd56b9a2788a43c22Eric Anholt memset(&gp, 0, sizeof(gp)); 60424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 60524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 60624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 6071c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 60824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 609f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt if (ret != -EINVAL) 610f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 6112e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 61224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 61324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 6142e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 61524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 61677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6172e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 618900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param) 619900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{ 620900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson int value = 0; 621900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson return intel_get_param(psp, param, &value) && value; 622900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson} 623900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 62477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 6252d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData) 6262d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{ 6272d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg} 6282d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 6292d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void 630d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv) 63177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 632875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 63377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 634904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 6356d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 63677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6372d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg /* Some regions may still have references to them at this point, so 6382d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * flush the hash table to prevent _mesa_DeleteHashTable() from 6392d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * complaining about the hash not being empty; */ 6402d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL); 6412d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_DeleteHashTable(intelScreen->named_regions); 6422d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 64377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 644875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis sPriv->driverPrivate = NULL; 64577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 64677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 64777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 64877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 64977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 65077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 65177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 652d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv, 653d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable * driDrawPriv, 654d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, GLboolean isPixmap) 65577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 656d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct intel_renderbuffer *rb; 657875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *screen = (struct intel_screen*) driScrnPriv->driverPrivate; 6582b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace gl_format rgbFormat; 659e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace unsigned num_samples = intel_quantize_num_samples(screen, mesaVis->samples); 6602b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace struct gl_framebuffer *fb; 661d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 6622b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (isPixmap) 6632b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace return false; 66477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6652b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace fb = CALLOC_STRUCT(gl_framebuffer); 6662b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (!fb) 6672b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace return false; 66877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6692b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_initialize_window_framebuffer(fb, mesaVis); 67077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6712b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (mesaVis->redBits == 5) 6722b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rgbFormat = MESA_FORMAT_RGB565; 6732b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else if (mesaVis->alphaBits == 0) 6742b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rgbFormat = MESA_FORMAT_XRGB8888; 6752b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else 6762b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace rgbFormat = MESA_FORMAT_ARGB8888; 67777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6782b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* setup the hardware-based renderbuffers */ 679e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace rb = intel_create_renderbuffer(rgbFormat, num_samples); 6802b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base); 681119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 6822b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (mesaVis->doubleBufferMode) { 683e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace rb = intel_create_renderbuffer(rgbFormat, num_samples); 6842b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base); 6852b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 68677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6872b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* 6882b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * Assert here that the gl_config has an expected depth/stencil bit 6892b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(), 6902b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * which constructs the advertised configs.) 6912b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace */ 6922b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (mesaVis->depthBits == 24) { 6932b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->stencilBits == 8); 6942b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace 6952b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace if (screen->hw_has_separate_stencil) { 696e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_X8_Z24, 697e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace num_samples); 6982b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 699e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_S8, 700e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace num_samples); 7012b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 7022b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } else { 7032b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* 7042b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * Use combined depth/stencil. Note that the renderbuffer is 7052b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace * attached to two attachment points. 7062b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace */ 707e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_S8_Z24, 708e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace num_samples); 7092b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 7102b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 711f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace } 7122b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 7132b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else if (mesaVis->depthBits == 16) { 7142b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->stencilBits == 0); 715e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace rb = intel_create_private_renderbuffer(MESA_FORMAT_Z16, 716e2f2376e884225705e2369caee4a8c4e90e938f3Chad Versace num_samples); 7178c94f6bbd80908fd2cae8e27fe78c429e54a78b8Chad Versace _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 7182b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 7192b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace else { 7202b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->depthBits == 0); 7212b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace assert(mesaVis->stencilBits == 0); 7222b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace } 72377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 7242b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace /* now add any/all software-based renderbuffers we may need */ 7252b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace _swrast_add_soft_renderbuffers(fb, 7262b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw color */ 7272b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw depth */ 7282b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw stencil */ 7292b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace mesaVis->accumRedBits > 0, 7302b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false, /* never sw alpha */ 7312b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace false /* never sw aux */ ); 7322b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace driDrawPriv->driverPrivate = fb; 73377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 7342b4fbc4d7d3578642ca57b5e45094e66e03626fcChad Versace return true; 73577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 73677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 73777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 738d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv) 73977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 740d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = driDrawPriv->driverPrivate; 741d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 742d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_reference_framebuffer(&fb, NULL); 74377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 74477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 74577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 74677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 74777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 74877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 7492e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 7502e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis, 7512e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 7522e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 7532e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke 7542e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 7552e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api, 7562e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 7572e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 758db273724c9484d513f5caa34729475d2873d9f7bIan Romanick unsigned major_version, 759db273724c9484d513f5caa34729475d2873d9f7bIan Romanick unsigned minor_version, 760db273724c9484d513f5caa34729475d2873d9f7bIan Romanick unsigned *error, 7612e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 7622e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 7632e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api, 7642e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 7652e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 766d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick unsigned major_version, 767d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick unsigned minor_version, 768bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick uint32_t flags, 769d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick unsigned *error, 7702e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 77177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 77277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 773a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api, 774d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, 775d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 776e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned major_version, 777e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned minor_version, 778e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick uint32_t flags, 779e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned *error, 78077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 78177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 782d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *sPriv = driContextPriv->driScreenPriv; 783875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 78435cdd7b6dbc763fe57bf466def0a4257ca09beb8Eric Anholt bool success = false; 78577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 786bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 78719420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 7882b636243265f0f09b7fd8d42046119222a63cad4Ian Romanick success = i915CreateContext(api, mesaVis, driContextPriv, 789db273724c9484d513f5caa34729475d2873d9f7bIan Romanick major_version, minor_version, error, 7902b636243265f0f09b7fd8d42046119222a63cad4Ian Romanick sharedContextPrivate); 791bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 792a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick switch (api) { 793a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick case API_OPENGL: 794a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick if (major_version > 1 || minor_version > 3) { 795a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick *error = __DRI_CTX_ERROR_BAD_VERSION; 79691473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick success = false; 797a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick } 798a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick break; 799a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick case API_OPENGLES: 800a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick break; 801a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick default: 802a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick *error = __DRI_CTX_ERROR_BAD_API; 80391473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick success = false; 804a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick } 805a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick 80691473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick if (success) { 80791473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick intelScreen->no_vbo = true; 80891473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick success = i830CreateContext(mesaVis, driContextPriv, 80991473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick sharedContextPrivate); 81091473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick if (!success) 81191473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 812a81e4b3e9272f70ab9074f1c133dda94c58daeffIan Romanick } 81377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 814bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 8152b636243265f0f09b7fd8d42046119222a63cad4Ian Romanick success = brwCreateContext(api, mesaVis, 816d60692601388b5448fb0ed4eb894103293b2f074Ian Romanick driContextPriv, 817bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick major_version, minor_version, flags, 818bf8644e64daa4e1d59d1e399355b349406438d7aIan Romanick error, sharedContextPrivate); 819bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 820e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 82191473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick if (success) 82291473485fcf3e2cef465784ae5581787a2a8a3b3Ian Romanick return true; 823e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 824a87b0110b93597c6df5d84e720f685816d01ed40Ian Romanick if (driContextPriv->driverPrivate != NULL) 825a87b0110b93597c6df5d84e720f685816d01ed40Ian Romanick intelDestroyContext(driContextPriv); 826a87b0110b93597c6df5d84e720f685816d01ed40Ian Romanick 8272e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 82877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 82977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 8302e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 8315777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen) 8327e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 833d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *spriv = intelScreen->driScrnPriv; 834cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 8357e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 8362222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL; 8377e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 838827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 8397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 840827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 841827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 8422e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 8437e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 8447e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 845bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) || 846bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt num_fences == 0) { 847bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__); 8482e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 849bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt } 850e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 85106d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); 85206d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt 8532d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg intelScreen->named_regions = _mesa_NewHashTable(); 8542d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 855900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations = 0; 856900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations |= 857900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0; 858900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 8592e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 8607e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 8617e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 862c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 8636b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable 8646b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL. 8656b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * 8666b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid 8676b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL 8686b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored. 8696b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */ 8706b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void 8716b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen) 8726b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{ 8736b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace const char *s = getenv("INTEL_SEPARATE_STENCIL"); 8746b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace if (!s) { 8756b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace return; 8766b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("0", s, 2)) { 8776b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = false; 8786b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("1", s, 2)) { 8796b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = true; 8806b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else { 8816b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace fprintf(stderr, 8826b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has " 8836b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "invalid value and is ignored", s); 8846b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } 8856b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace} 8866b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 887f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterstatic bool 888f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetterintel_detect_swizzling(struct intel_screen *screen) 889f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter{ 890f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo *buffer; 891f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter unsigned long flags = 0; 892f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter unsigned long aligned_pitch; 893f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter uint32_t tiling = I915_TILING_X; 894f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter uint32_t swizzle_mode = 0; 895f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 896f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test", 897f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 64, 64, 4, 898f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter &tiling, &aligned_pitch, flags); 899f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter if (buffer == NULL) 900f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return false; 901f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 902f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo_get_tiling(buffer, &tiling, &swizzle_mode); 903f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter drm_intel_bo_unreference(buffer); 904f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 905f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter if (swizzle_mode == I915_BIT_6_SWIZZLE_NONE) 906f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return false; 907f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter else 908f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter return true; 909f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter} 910f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 911b2d428cb8d20e003b65769c7757a137406c671e6Chad Versacestatic __DRIconfig** 912b2d428cb8d20e003b65769c7757a137406c671e6Chad Versaceintel_screen_make_configs(__DRIscreen *dri_screen) 913b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace{ 914b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace static const GLenum back_buffer_modes[] = { 915b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 916b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace }; 917b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 9188b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace static const uint8_t singlesample_samples[1] = {0}; 919e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace static const uint8_t multisample_samples[2] = {4, 8}; 9208b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace 921e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace struct intel_screen *screen = dri_screen->driverPrivate; 922b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace GLenum fb_format[3]; 923b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace GLenum fb_type[3]; 9248b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace uint8_t depth_bits[4], stencil_bits[4]; 925b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace __DRIconfig **configs = NULL; 926b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 927b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fb_format[0] = GL_RGB; 928b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 929b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 930b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fb_format[1] = GL_BGR; 931b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 932b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 933b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fb_format[2] = GL_BGRA; 934b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 935b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 936e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace /* Generate singlesample configs without accumulation buffer. */ 9378b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace for (int i = 0; i < ARRAY_SIZE(fb_format); i++) { 938b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace __DRIconfig **new_configs; 9398b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace const int num_depth_stencil_bits = 2; 940b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 941b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil 942b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace * buffer that has a different number of bits per pixel than the color 943b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace * buffer. This isn't yet supported here. 944b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace */ 9458b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace depth_bits[0] = 0; 9468b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace stencil_bits[0] = 0; 9478b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace 9488b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace if (fb_type[i] == GL_UNSIGNED_SHORT_5_6_5) { 949b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace depth_bits[1] = 16; 950b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace stencil_bits[1] = 0; 951b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } else { 952b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace depth_bits[1] = 24; 953b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace stencil_bits[1] = 8; 954b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } 955b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 9568b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace new_configs = driCreateConfigs(fb_format[i], fb_type[i], 957b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace depth_bits, 958b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace stencil_bits, 9598b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace num_depth_stencil_bits, 960b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace back_buffer_modes, 961b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace ARRAY_SIZE(back_buffer_modes), 9628b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace singlesample_samples, 1, 963b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace false); 964a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace configs = driConcatConfigs(configs, new_configs); 965b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } 966b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 967b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace /* Generate the minimum possible set of configs that include an 968b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace * accumulation buffer. 969b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace */ 9708b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace for (int i = 0; i < ARRAY_SIZE(fb_format); i++) { 971b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace __DRIconfig **new_configs; 972b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 9738b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace if (fb_type[i] == GL_UNSIGNED_SHORT_5_6_5) { 974b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace depth_bits[0] = 16; 975b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace stencil_bits[0] = 0; 976b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } else { 977b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace depth_bits[0] = 24; 978b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace stencil_bits[0] = 8; 979b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } 980b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 9818b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace new_configs = driCreateConfigs(fb_format[i], fb_type[i], 982b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace depth_bits, stencil_bits, 1, 983b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace back_buffer_modes + 1, 1, 9848b5d68dd28a78c2250bfc4a7fa62cd9e5cdd756eChad Versace singlesample_samples, 1, 985b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace true); 986a4bf68ca50da0ce291a464aec9b03a469ab2561aChad Versace configs = driConcatConfigs(configs, new_configs); 987b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } 988b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 989e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace /* Generate multisample configs. 990e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * 991e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * This loop breaks early, and hence is a no-op, on gen < 6. 992e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * 993e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * Multisample configs must follow the singlesample configs in order to 994e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * work around an X server bug present in 1.12. The X server chooses to 995e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * associate the first listed RGBA888-Z24S8 config, regardless of its 996e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * sample count, with the 32-bit depth visual used for compositing. 997e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * 998e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * Only doublebuffer configs with GLX_SWAP_UNDEFINED_OML behavior are 999e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * supported. Singlebuffer configs are not supported because no one wants 1000e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace * them. GLX_SWAP_COPY_OML is not supported due to page flipping. 1001e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace */ 1002e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace for (int i = 0; i < ARRAY_SIZE(fb_format); i++) { 1003e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace if (screen->gen < 6) 1004e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace break; 1005e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace 1006e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace __DRIconfig **new_configs; 1007e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace const int num_depth_stencil_bits = 2; 10083aaeb3e5e76b7b468e2eb2a26f30d68d19d3c854Eric Anholt int num_msaa_modes = 0; 1009e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace 1010e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace depth_bits[0] = 0; 1011e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace stencil_bits[0] = 0; 1012e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace 1013e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace if (fb_type[i] == GL_UNSIGNED_SHORT_5_6_5) { 1014e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace depth_bits[1] = 16; 1015e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace stencil_bits[1] = 0; 1016e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace } else { 1017e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace depth_bits[1] = 24; 1018e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace stencil_bits[1] = 8; 1019e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace } 1020e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace 1021e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace if (screen->gen >= 7) 1022e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace num_msaa_modes = 2; 1023e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace else if (screen->gen == 6) 1024e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace num_msaa_modes = 1; 1025e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace 1026e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace new_configs = driCreateConfigs(fb_format[i], fb_type[i], 1027e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace depth_bits, 1028e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace stencil_bits, 1029e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace num_depth_stencil_bits, 1030e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace back_buffer_modes + 1, 1, 1031e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace multisample_samples, 1032e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace num_msaa_modes, 1033e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace false); 1034e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace configs = driConcatConfigs(configs, new_configs); 1035e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace } 1036e943e5c291c5f4c017f9f5a483f1940313333fc3Chad Versace 1037b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace if (configs == NULL) { 1038b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 1039b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace __LINE__); 1040b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace return NULL; 1041b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace } 1042b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 1043b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace return configs; 1044b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace} 1045b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace 10466b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/** 1047c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 10488d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 10498d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 1050d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver 1051c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 1052e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 1053d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp) 1054c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 10555777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen; 10565efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg unsigned int api_mask; 10577c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 10581b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt if (psp->dri2.loader->base.version <= 2 || 10591b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt psp->dri2.loader->getBuffersWithFormat == NULL) { 10601b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt fprintf(stderr, 10611b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt "\nERROR! DRI2 loader with getBuffersWithFormat() " 10621b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt "support required\n"); 10631b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt return false; 10641b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt } 10651b4374d364f877d1b7d01e1231adeee2e0f63a4dEric Anholt 1066c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 10675777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg intelScreen = CALLOC(sizeof *intelScreen); 1068c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 1069c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 10702e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 1071c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 1072c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 1073c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 1074c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 1075c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 1076c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 1077875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis psp->driverPrivate = (void *) intelScreen; 1078c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 10792222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt if (!intel_init_bufmgr(intelScreen)) 10802222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt return false; 1081c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 10822222aa06e16dbfe4c29e05a1189bce80680aba19Eric Anholt intelScreen->deviceID = drm_intel_bufmgr_gem_get_devid(intelScreen->bufmgr); 10834ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt 1084cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intelScreen->kernel_has_gen7_sol_reset = 1085cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intel_get_boolean(intelScreen->driScrnPriv, 1086cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt I915_PARAM_HAS_GEN7_SOL_RESET); 1087cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt 108889a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke if (IS_GEN7(intelScreen->deviceID)) { 108989a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke intelScreen->gen = 7; 109089a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke } else if (IS_GEN6(intelScreen->deviceID)) { 10917363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 6; 10927363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_GEN5(intelScreen->deviceID)) { 10937363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 5; 10947363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_965(intelScreen->deviceID)) { 10957363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 4; 10967363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_9XX(intelScreen->deviceID)) { 10977363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 3; 10987363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else { 10997363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 2; 11007363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } 11017363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg 1102e5411d8fdc6a7dda18d82746b84197ef83ee0a13Chad Versace intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6; 11036b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7; 11046b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 1105249fc7056104113633215106ac085b505d8dc161Eric Anholt int has_llc = 0; 1106249fc7056104113633215106ac085b505d8dc161Eric Anholt bool success = intel_get_param(intelScreen->driScrnPriv, I915_PARAM_HAS_LLC, 1107249fc7056104113633215106ac085b505d8dc161Eric Anholt &has_llc); 1108249fc7056104113633215106ac085b505d8dc161Eric Anholt if (success && has_llc) 1109249fc7056104113633215106ac085b505d8dc161Eric Anholt intelScreen->hw_has_llc = true; 1110249fc7056104113633215106ac085b505d8dc161Eric Anholt else if (!success && intelScreen->gen >= 6) 1111249fc7056104113633215106ac085b505d8dc161Eric Anholt intelScreen->hw_has_llc = true; 11127def293204977c41ea35198af147f743a31b1889Eugeni Dodonov 11136b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel_override_separate_stencil(intelScreen); 11146b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 11155efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask = (1 << __DRI_API_OPENGL); 11165efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1 11175efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES); 11185efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 11195efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2 11205efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES2); 11215efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 11225efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 11235efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID)) 11245efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg psp->api_mask = api_mask; 11255efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 1126f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen); 1127f172eae8b23d0612865895c52af745021ae20a4cDaniel Vetter 1128e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 1129c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 1130b2d428cb8d20e003b65769c7757a137406c671e6Chad Versace return (const __DRIconfig**) intel_screen_make_configs(psp); 1131c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 1132e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 11332adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer { 11342adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke __DRIbuffer base; 11352adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_region *region; 11362adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}; 11372adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11382adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer * 11392adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen, 11402adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke unsigned attachment, unsigned format, 11412adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke int width, int height) 11422adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 11432adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer; 1144875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 114579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 114683fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace assert(attachment == __DRI_BUFFER_FRONT_LEFT || 114783fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace attachment == __DRI_BUFFER_BACK_LEFT); 11482adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11492adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer = CALLOC(sizeof *intelBuffer); 11502adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer == NULL) 11512adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 11522adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 115383fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace /* The front and back buffers are color buffers, which are X tiled. */ 115479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace intelBuffer->region = intel_region_alloc(intelScreen, 115583fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace I915_TILING_X, 115683fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace format / 8, 115783fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace width, 115883fa0842ca0772e9a3493bd7a66f69c458a1739bChad Versace height, 115979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace true); 11602adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11612adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer->region == NULL) { 11622adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke FREE(intelBuffer); 11632adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 11642adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke } 11652adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11662adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_flink(intelBuffer->region, &intelBuffer->base.name); 11672adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11682adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.attachment = attachment; 11692adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.cpp = intelBuffer->region->cpp; 11702adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.pitch = 11712adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->region->pitch * intelBuffer->region->cpp; 11722adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11732adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return &intelBuffer->base; 11742adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 11752adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11762adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void 11772adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) 11782adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 11792adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer; 11802adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11812adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_release(&intelBuffer->region); 11822adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke free(intelBuffer); 11832adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 11842adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 11852adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 1186e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 11877192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis .InitScreen = intelInitScreen2, 1188e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 1189e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 1190e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 1191e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 1192e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 1193e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 1194e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 11952adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .AllocateBuffer = intelAllocateBuffer, 11962adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .ReleaseBuffer = intelReleaseBuffer 1197e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 119839a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg 119939a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */ 120039a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = { 120139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driCoreExtension.base, 120239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driDRI2Extension.base, 120339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg NULL 120439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg}; 1205