intel_screen.c revision 0beed7f072e2a8127c7c02dfc39fb37053d96b22
177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/************************************************************************** 277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * All Rights Reserved. 577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * copy of this software and associated documentation files (the 877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * "Software"), to deal in the Software without restriction, including 977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * without limitation the rights to use, copy, modify, merge, publish, 1077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to 1177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * permit persons to whom the Software is furnished to do so, subject to 1277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * the following conditions: 1377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 1477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * The above copyright notice and this permission notice (including the 1577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * next paragraph) shall be included in all copies or substantial portions 1677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * of the Software. 1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt **************************************************************************/ 2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt#include <errno.h> 29ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h" 31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 32ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h" 332d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg#include "main/hash.h" 34d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg#include "main/fbobject.h" 3545a56e4730a74a012ad712fd9b6013d900b04742Vinson Lee#include "main/mfeatures.h" 3614aff23e1b4d52d5e10a3aeb65c3f4c783498a35Brian Paul#include "main/version.h" 37d0dc75c000d5af92648c7de901756400672b8447Brian Paul#include "swrast/s_renderbuffer.h" 386c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul 3977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h" 4077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h" 4177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] = 43a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_BEGIN 44a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_PERFORMANCE 45e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) 46fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, 47fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt * DRI_CONF_BO_REUSE_ALL 48fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt */ 49f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1") 50fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_BEGIN(en, "Buffer object reuse") 51fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(0, "Disable buffer object reuse") 52fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects") 53fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_END 54fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_OPT_END 551ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 568e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_OPT_BEGIN(texture_tiling, bool, true) 578e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_DESC(en, "Enable texture tiling") 588e7a8d65931a650534e0f5c4e0d8118cd6f7636eEric Anholt DRI_CONF_OPT_END 591ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 60b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_BEGIN(early_z, bool, false) 61b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") 62b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_END 63b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt 64a58514cc9c5cc5867f9140700462c5ac5749550dEric Anholt DRI_CONF_OPT_BEGIN(fragment_shader, bool, true) 65862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.") 66862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_END 67862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt 68a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 69a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_QUALITY 70a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 71acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 72a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 73a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_DEBUG 74a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_NO_RAST(false) 7540bc2748c2781600c748e546160bcc2aab637825Eric Anholt DRI_CONF_ALWAYS_FLUSH_BATCH(false) 76f3687284c12f34268172b9c60e2effd697162129Eric Anholt DRI_CONF_ALWAYS_FLUSH_CACHE(false) 77642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholt DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN(false) 7881aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt 7981aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false) 8081aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.") 8181aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_END 82c6abde211fa875f90e59e3709720cfe394669069Eric Anholt 83c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_BEGIN(shader_precompile, bool, false) 84c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_DESC(en, "Perform code generation at shader link time.") 85c6abde211fa875f90e59e3709720cfe394669069Eric Anholt DRI_CONF_OPT_END 86a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 87a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 88a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 89642247883fb9e6dce9bad724f7f6503321e0ef6fEric Anholtconst GLuint __driNConfigOptions = 13; 9077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 91df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_batchbuffer.h" 92df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_buffers.h" 93df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_bufmgr.h" 94df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_chipset.h" 95df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_fbo.h" 96da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace#include "intel_mipmap_tree.h" 97df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_screen.h" 98df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_tex.h" 99df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "intel_regions.h" 100df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 101df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt#include "i915_drm.h" 102df9f89154471ec162227ebce1681c5010f64e6e6Eric Anholt 10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 10485063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 1076d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 1086d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 1096d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 11066175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 1116d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 1126d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 1137c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 1147c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable) 1157c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 116dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt GET_CURRENT_CONTEXT(ctx); 117dea5e57861ec998cb7ee913a8819752cb9fa946bEric Anholt struct intel_context *intel = intel_context(ctx); 118ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel == NULL) 119ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat return; 1207c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 121ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->gen < 4) 122ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat INTEL_FIREVERTICES(intel); 1237c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 124ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel->need_throttle = true; 125e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg 126ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat if (intel->batch.used) 127ce1c949b162260cec84431913f7aac83cb1b938eAnuj Phogat intel_batchbuffer_flush(intel); 1287c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 1297c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 1307c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = { 1317c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 1327c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush, 133e67c338b415c983bee570e6644b9684d8d1fc99bKristian Høgsberg dri2InvalidateDrawable, 1347c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}; 1357c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 136c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 1379ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsbergintel_create_image_from_name(__DRIscreen *screen, 138c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int width, int height, int format, 139c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int name, int pitch, void *loaderPrivate) 140c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 141875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 142c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 143c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int cpp; 144c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 145c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 146c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 147c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 148c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 149c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg switch (format) { 150c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 151c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_RGB565; 152c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGB; 153c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 154c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 155c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 156c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 157c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGB; 158c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 159c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 160c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 161c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 162c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = GL_RGBA; 163c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 164c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg break; 1659fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu case __DRI_IMAGE_FORMAT_ABGR8888: 1669fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->format = MESA_FORMAT_RGBA8888_REV; 1679fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->internal_format = GL_RGBA; 1689fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->data_type = GL_UNSIGNED_BYTE; 1699fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu break; 170c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg default: 171c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg free(image); 172c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 173c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 174c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 175c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 176c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 177c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 1789ec0b2a45e18c045fd3dbcdf846fad7faf97494cKristian Høgsberg image->region = intel_region_alloc_for_handle(intelScreen, 1799087ba128089ed0dc00e6eb38f37126fb7557d3bKristian Høgsberg cpp, width, height, 180c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg pitch, name, "image"); 181c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image->region == NULL) { 182c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 183c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 184c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 185c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 186c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 187c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 188c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 189c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic __DRIimage * 190c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_create_image_from_renderbuffer(__DRIcontext *context, 191c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg int renderbuffer, void *loaderPrivate) 192c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 193c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg __DRIimage *image; 194c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_context *intel = context->driverPrivate; 195c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct gl_renderbuffer *rb; 196c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg struct intel_renderbuffer *irb; 197c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 198d7322c9d420e484bc3c7cecb873b04cf7da7f33aKristian Høgsberg rb = _mesa_lookup_renderbuffer(&intel->ctx, renderbuffer); 199c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (!rb) { 200c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg _mesa_error(&intel->ctx, 201c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg GL_INVALID_OPERATION, "glRenderbufferExternalMESA"); 202c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 203c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg } 204c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 205c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg irb = intel_renderbuffer(rb); 206c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image = CALLOC(sizeof *image); 207c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg if (image == NULL) 208c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return NULL; 209c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 210c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->internal_format = rb->InternalFormat; 211c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->format = rb->Format; 212f9874feef4d8952df5054bd8e8f4e0deda4ef44fBrian Paul image->data_type = GL_UNSIGNED_BYTE; 213c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg image->data = loaderPrivate; 214da2816a45e6e3a33246a341fee72e6f893f315d9Chad Versace intel_region_reference(&image->region, irb->mt->region); 215c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 216c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg return image; 217c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 218c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 219c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic void 220c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergintel_destroy_image(__DRIimage *image) 221c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg{ 222c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_region_release(&image->region); 223c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg FREE(image); 224c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg} 225c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 226f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic __DRIimage * 227f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_create_image(__DRIscreen *screen, 228f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int width, int height, int format, 229f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg unsigned int use, 230f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg void *loaderPrivate) 231f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 232f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg __DRIimage *image; 233875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 234e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg uint32_t tiling; 235f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg int cpp; 236f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 237e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_X; 238e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 239e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg if (width != 64 || height != 64) 240e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg return NULL; 241e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg tiling = I915_TILING_NONE; 242e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg } 243e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg 244f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image = CALLOC(sizeof *image); 245f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg if (image == NULL) 246f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 247f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 2488de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes image->dri_format = format; 2498de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes 250f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg switch (format) { 251f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_FORMAT_RGB565: 252f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->format = MESA_FORMAT_RGB565; 253f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->internal_format = GL_RGB; 254f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 255f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg break; 256f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_FORMAT_XRGB8888: 257f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->format = MESA_FORMAT_XRGB8888; 258f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->internal_format = GL_RGB; 259f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 260f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg break; 261f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_FORMAT_ARGB8888: 262f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->format = MESA_FORMAT_ARGB8888; 263f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->internal_format = GL_RGBA; 264f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data_type = GL_UNSIGNED_BYTE; 265f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg break; 2669fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu case __DRI_IMAGE_FORMAT_ABGR8888: 2679fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->format = MESA_FORMAT_RGBA8888_REV; 2689fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->internal_format = GL_RGBA; 2699fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu image->data_type = GL_UNSIGNED_BYTE; 2709fe197c62611815ebe74248033271ad9fd07ae06Chia-I Wu break; 271f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg default: 272f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg free(image); 273f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 274f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 275f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 276f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->data = loaderPrivate; 277f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg cpp = _mesa_get_format_bytes(image->format); 278f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 279f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg image->region = 280e5169e9615e8391ea369415b356168717b8f7be0Kristian Høgsberg intel_region_alloc(intelScreen, tiling, 2812e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke cpp, width, height, true); 282f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg if (image->region == NULL) { 283f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg FREE(image); 284f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return NULL; 285f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 286f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 287f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return image; 288f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 289f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 290f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergstatic GLboolean 291f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsbergintel_query_image(__DRIimage *image, int attrib, int *value) 292f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg{ 293f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg switch (attrib) { 294f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_STRIDE: 295f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg *value = image->region->pitch * image->region->cpp; 2962e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 297f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_HANDLE: 2988004a1cb95b8a195f3f4bbaa8d39d2f3297167deEric Anholt *value = image->region->bo->handle; 2992e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 300f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg case __DRI_IMAGE_ATTRIB_NAME: 301f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg return intel_region_flink(image->region, (uint32_t *) value); 3028de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes case __DRI_IMAGE_ATTRIB_FORMAT: 3038de5c355fa2bf0f30df2c7cf39aee01e793284bfJesse Barnes return image->dri_format; 304f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg default: 3052e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 306f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg } 307f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg} 308f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg 3093af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkestatic __DRIimage * 3103af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzkeintel_dup_image(__DRIimage *orig_image, void *loaderPrivate) 3113af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke{ 3123af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke __DRIimage *image; 3133af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3143af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image = CALLOC(sizeof *image); 3153af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image == NULL) 3163af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 3173af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3183af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_region_reference(&image->region, orig_image->region); 3193af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke if (image->region == NULL) { 3203af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke FREE(image); 3213af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return NULL; 3223af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke } 3233af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3243af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->internal_format = orig_image->internal_format; 3253af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->format = orig_image->format; 3263af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->data_type = orig_image->data_type; 3273af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke image->data = loaderPrivate; 3283af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 3293af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke return image; 3303af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke} 3313af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke 332221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergstatic GLboolean 333221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsbergintel_validate_usage(__DRIimage *image, unsigned int use) 334221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg{ 335221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (use & __DRI_IMAGE_USE_CURSOR) { 336221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg if (image->region->width != 64 || image->region->height != 64) 337221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_FALSE; 338221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg } 339221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 340221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg return GL_TRUE; 341221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg} 342221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg 343c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsbergstatic struct __DRIimageExtensionRec intelImageExtension = { 3440beed7f072e2a8127c7c02dfc39fb37053d96b22Jesse Barnes { __DRI_IMAGE, 3 }, 345c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_name, 346c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_create_image_from_renderbuffer, 347c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg intel_destroy_image, 348f301932dba4cc75e810e0c051e39247128a899fcKristian Høgsberg intel_create_image, 3493af3c58dfd8b1ddc96fc10b6865de0cb26860ddeBenjamin Franzke intel_query_image, 350221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg intel_dup_image, 351221c678329fd1c073d5f8dcf387129cd426ecf07Kristian Høgsberg intel_validate_usage 352c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg}; 353c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg 354e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 3556d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 3567c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg &intelFlushExtension.base, 357c26247100bfd453a7ec013f630abe366c12fbd8bKristian Høgsberg &intelImageExtension.base, 358234286c0f8b7d30ed49223c648d4c73c1a517ab3Jesse Barnes &dri2ConfigQueryExtension.base, 35977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 36177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 3622e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 363d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsbergintel_get_param(__DRIscreen *psp, int param, int *value) 36424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 36524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 3661c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 36724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 368f33d100fa71cecfb163dd91cd56b9a2788a43c22Eric Anholt memset(&gp, 0, sizeof(gp)); 36924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 37024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 37124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 3721c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 37324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 374f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt if (ret != -EINVAL) 375f6ca4a304bf920ea6913b08638fb8eb3e020d446Eric Anholt _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 3762e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 37724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 37824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 3792e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 38024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 3822e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 383900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilsonintel_get_boolean(__DRIscreen *psp, int param) 384900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson{ 385900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson int value = 0; 386900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson return intel_get_param(psp, param, &value) && value; 387900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson} 388900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 38977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 3902d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergnop_callback(GLuint key, void *data, void *userData) 3912d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg{ 3922d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg} 3932d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 3942d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsbergstatic void 395d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyScreen(__DRIscreen * sPriv) 39677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 397875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 399904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 4006d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 40177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4022d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg /* Some regions may still have references to them at this point, so 4032d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * flush the hash table to prevent _mesa_DeleteHashTable() from 4042d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg * complaining about the hash not being empty; */ 4052d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_HashDeleteAll(intelScreen->named_regions, nop_callback, NULL); 4062d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg _mesa_DeleteHashTable(intelScreen->named_regions); 4072d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 40877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 409875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis sPriv->driverPrivate = NULL; 41077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 41177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 41277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 41377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 41477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 41577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 41677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 417d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelCreateBuffer(__DRIscreen * driScrnPriv, 418d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIdrawable * driDrawPriv, 419d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, GLboolean isPixmap) 42077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 421d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct intel_renderbuffer *rb; 422875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *screen = (struct intel_screen*) driScrnPriv->driverPrivate; 423d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 42477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (isPixmap) { 4252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; /* not implemented */ 42677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 42777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 4284a253431abf43a0638afb43605b44a8742b72a60Brian Paul gl_format rgbFormat; 42977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 430d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer); 43177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 432d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg if (!fb) 4332e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 43477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 4352ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez _mesa_initialize_window_framebuffer(fb, mesaVis); 43677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 437119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt if (mesaVis->redBits == 5) 4384a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_RGB565; 439119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else if (mesaVis->alphaBits == 0) 440409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul rgbFormat = MESA_FORMAT_XRGB8888; 441119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else 4424a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_ARGB8888; 443119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 44477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* setup the hardware-based renderbuffers */ 445d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 4469f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base); 44777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 44877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (mesaVis->doubleBufferMode) { 449d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg rb = intel_create_renderbuffer(rgbFormat); 4509f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base); 45177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 45277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 453f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace /* 454f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace * Assert here that the gl_config has an expected depth/stencil bit 455f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(), 456f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace * which constructs the advertised configs.) 457f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace */ 45838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->depthBits == 24) { 459800a4b202f8b23540dbb128e780ca8b7e90d1f46Eric Anholt assert(mesaVis->stencilBits == 8); 460aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace 461aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace if (screen->hw_has_separate_stencil 462aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace && screen->dri2_has_hiz != INTEL_DRI2_HAS_HIZ_FALSE) { 463aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace /* 464aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * Request a separate stencil buffer even if we do not yet know if 465aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * the screen supports it. (See comments for 466aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * enum intel_dri2_has_hiz). 467aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace */ 468aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace rb = intel_create_renderbuffer(MESA_FORMAT_X8_Z24); 4699f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 470aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace rb = intel_create_renderbuffer(MESA_FORMAT_S8); 4719f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 472aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace } else { 473aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace /* 474aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * Use combined depth/stencil. Note that the renderbuffer is 475aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace * attached to two attachment points. 476aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace */ 477aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace rb = intel_create_renderbuffer(MESA_FORMAT_S8_Z24); 4789f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base); 4799f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base); 480aea2236af60aee329e6ea73a41f2410d8eacc7b6Chad Versace } 48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 48277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else if (mesaVis->depthBits == 16) { 483f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace assert(mesaVis->stencilBits == 0); 48477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* just 16-bit depth buffer, no hw stencil */ 48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_renderbuffer *depthRb 4864a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_Z16); 4879f8ed9d66298e2dc5dff508e3ea723469fe06d93Brian Paul _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base.Base); 48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 489f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace else { 490f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace assert(mesaVis->depthBits == 0); 491f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace assert(mesaVis->stencilBits == 0); 492f4efb7ff4f9cb0f6386e9b53f4dcfd9ef23dc9d1Chad Versace } 49377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 49477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* now add any/all software-based renderbuffers we may need */ 495d0dc75c000d5af92648c7de901756400672b8447Brian Paul _swrast_add_soft_renderbuffers(fb, 496d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw color */ 497d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw depth */ 498d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw stencil */ 499d0dc75c000d5af92648c7de901756400672b8447Brian Paul mesaVis->accumRedBits > 0, 500d0dc75c000d5af92648c7de901756400672b8447Brian Paul false, /* never sw alpha */ 501d0dc75c000d5af92648c7de901756400672b8447Brian Paul false /* never sw aux */ ); 502d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg driDrawPriv->driverPrivate = fb; 50377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5042e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 50577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 50677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 50777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 509d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian HøgsbergintelDestroyBuffer(__DRIdrawable * driDrawPriv) 51077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 511d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg struct gl_framebuffer *fb = driDrawPriv->driverPrivate; 512d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg 513d282128ff68cc58bc3f5b808031c5fe7325bd69bKristian Høgsberg _mesa_reference_framebuffer(&fb, NULL); 51477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 51577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 51677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 51777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 51877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 51977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 5202e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 5212e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei830CreateContext(const struct gl_config *mesaVis, 5222e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 5232e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 5242e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke 5252e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 5262e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkei915CreateContext(int api, 5272e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 5282e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 5292e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 5302e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkeextern bool 5312e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth GraunkebrwCreateContext(int api, 5322e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke const struct gl_config *mesaVis, 5332e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke __DRIcontext *driContextPriv, 5342e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke void *sharedContextPrivate); 53577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 53677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 537a7a9a91d7b28e5b5faed509d00f0f951e3136b1bKristian HøgsbergintelCreateContext(gl_api api, 538d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg const struct gl_config * mesaVis, 539d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIcontext * driContextPriv, 540e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned major_version, 541e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned minor_version, 542e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick uint32_t flags, 543e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick unsigned *error, 54477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 546d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *sPriv = driContextPriv->driScreenPriv; 547875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = sPriv->driverPrivate; 54835cdd7b6dbc763fe57bf466def0a4257ca09beb8Eric Anholt bool success = false; 54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 550bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 55119420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 55219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (!IS_965(intelScreen->deviceID)) { 553e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = i915CreateContext(api, mesaVis, driContextPriv, 554e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 55519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt } 556bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 5572e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke intelScreen->no_vbo = true; 558e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = i830CreateContext(mesaVis, driContextPriv, 559e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 56077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 561bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 562bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt if (IS_965(intelScreen->deviceID)) 563e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick success = brwCreateContext(api, mesaVis, 564e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick driContextPriv, 565e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick sharedContextPrivate); 566bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 567e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 568e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (success) { 569e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick struct gl_context *ctx = 570e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick (struct gl_context *) driContextPriv->driverPrivate; 571e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 572e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick _mesa_compute_version(ctx); 573e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick if (ctx->VersionMajor > major_version 574e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick || (ctx->VersionMajor == major_version 575e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick && ctx->VersionMinor >= minor_version)) { 576e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_BAD_VERSION; 577e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick return true; 578e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 579e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 580e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick intelDestroyContext(driContextPriv); 581e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } else { 582e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick *error = __DRI_CTX_ERROR_NO_MEMORY; 583e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID); 584e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick } 585e532b6288f01b63d8d8ba8c8dc08292967e65490Ian Romanick 5862e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 58777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 58877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5892e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunkestatic bool 5905777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsbergintel_init_bufmgr(struct intel_screen *intelScreen) 5917e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 592d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg __DRIscreen *spriv = intelScreen->driScrnPriv; 593cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 5947e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 5954ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt intelScreen->no_hw = (getenv("INTEL_NO_HW") != NULL || 5964ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt getenv("INTEL_DEVID_OVERRIDE") != NULL); 5977e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 598827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 5997e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 600827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 601827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 6022e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 6037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6047e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 605bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt if (!intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences) || 606bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt num_fences == 0) { 607bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt fprintf(stderr, "[%s: %u] Kernel 2.6.29 required.\n", __func__, __LINE__); 6082e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 609bb35000b4b6dfe60048b2f5d60bc102c4a7fd791Eric Anholt } 610e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 61106d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt drm_intel_bufmgr_gem_enable_fenced_relocs(intelScreen->bufmgr); 61206d1472ffa0648efa9374fa227894fbf0b0be054Eric Anholt 6132d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg intelScreen->named_regions = _mesa_NewHashTable(); 6142d99588b3556928a0879b4160210ac771dbf1f0bKristian Høgsberg 615900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations = 0; 616900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intelScreen->relaxed_relocations |= 617900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson intel_get_boolean(spriv, I915_PARAM_HAS_RELAXED_DELTA) << 0; 618900a5c91eeb3acae7ee0ad331154531c4dba96e1Chris Wilson 6192e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return true; 6207e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 6217e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 622c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 6236b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_hiz with environment variable INTEL_HIZ. 6246b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * 6256b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_HIZ are "0" and "1". If an invalid valid value is 6266b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * encountered, a warning is emitted and INTEL_HIZ is ignored. 6276b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */ 6286b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void 6296b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_hiz(struct intel_screen *intel) 6306b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{ 6316b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace const char *s = getenv("INTEL_HIZ"); 6326b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace if (!s) { 6336b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace return; 6346b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("0", s, 2)) { 6356b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel->hw_has_hiz = false; 6366b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("1", s, 2)) { 6376b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel->hw_has_hiz = true; 6386b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else { 6396b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace fprintf(stderr, 6406b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "warning: env variable INTEL_HIZ=\"%s\" has invalid value " 6416b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "and is ignored", s); 6426b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } 6436b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace} 6446b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 6456b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/** 6466b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Override intel_screen.hw_has_separate_stencil with environment variable 6476b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * INTEL_SEPARATE_STENCIL. 6486b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * 6496b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * Valid values for INTEL_SEPARATE_STENCIL are "0" and "1". If an invalid 6506b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * valid value is encountered, a warning is emitted and INTEL_SEPARATE_STENCIL 6516b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace * is ignored. 6526b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace */ 6536b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versacestatic void 6546b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versaceintel_override_separate_stencil(struct intel_screen *screen) 6556b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace{ 6566b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace const char *s = getenv("INTEL_SEPARATE_STENCIL"); 6576b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace if (!s) { 6586b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace return; 6596b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("0", s, 2)) { 6606b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = false; 6616b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else if (!strncmp("1", s, 2)) { 6626b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace screen->hw_has_separate_stencil = true; 6636b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } else { 6646b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace fprintf(stderr, 6656b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "warning: env variable INTEL_SEPARATE_STENCIL=\"%s\" has " 6666b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace "invalid value and is ignored", s); 6676b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace } 6686b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace} 6696b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 6706b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace/** 671c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 6728d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 6738d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 674d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * \return the struct gl_config supported by this driver 675c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 676e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 677d61f07318c8678901b948fdaa8ccdf37aa3203e9Kristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreen *psp) 678c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 6795777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg struct intel_screen *intelScreen; 6803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_format[3]; 6813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_type[3]; 6825efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg unsigned int api_mask; 6834ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt char *devid_override; 6847c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 6853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt static const GLenum back_buffer_modes[] = { 6866bd9da01eacf9d100dfb0a9529700aa894a23d24Ian Romanick GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 6873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt }; 688e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 6893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt int color; 6905d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs = NULL; 691c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 692c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 6935777dee02c6497207e6b4b9d68de072e7be7c06eKristian Høgsberg intelScreen = CALLOC(sizeof *intelScreen); 694c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 695c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 6962e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 697c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 698c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 699c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 700c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 701c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 702c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 703875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis psp->driverPrivate = (void *) intelScreen; 704c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 705f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg /* Determine chipset ID */ 706c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID, 707c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg &intelScreen->deviceID)) 7082e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 709c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7104ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt /* Allow an override of the device ID for the purpose of making the 7114ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt * driver produce dumps for debugging of new chipset enablement. 7124ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt * This implies INTEL_NO_HW, to avoid programming your actual GPU 7134ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt * incorrectly. 7144ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt */ 7154ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt devid_override = getenv("INTEL_DEVID_OVERRIDE"); 7164ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt if (devid_override) { 7174ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt intelScreen->deviceID = strtod(devid_override, NULL); 7184ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt } 7194ac2f09e2034d8940a0ce9426a8d5c5d74bc63bdEric Anholt 720cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intelScreen->kernel_has_gen7_sol_reset = 721cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt intel_get_boolean(intelScreen->driScrnPriv, 722cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt I915_PARAM_HAS_GEN7_SOL_RESET); 723cd2a24a4c2cf3aab8cbaf831d9712bc3c09cba66Eric Anholt 72489a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke if (IS_GEN7(intelScreen->deviceID)) { 72589a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke intelScreen->gen = 7; 72689a82d72cafc1efbcf099e5229ba9b1cb53504f0Kenneth Graunke } else if (IS_GEN6(intelScreen->deviceID)) { 7277363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 6; 7287363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_GEN5(intelScreen->deviceID)) { 7297363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 5; 7307363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_965(intelScreen->deviceID)) { 7317363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 4; 7327363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else if (IS_9XX(intelScreen->deviceID)) { 7337363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 3; 7347363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } else { 7357363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg intelScreen->gen = 2; 7367363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg } 7377363088f9f9558b2bad3ac6da48947514a8cd790Kristian Høgsberg 738e5411d8fdc6a7dda18d82746b84197ef83ee0a13Chad Versace intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6; 7396b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7; 74006ad9adcb031b97af2ce9cd22b919b8befcec43bChad Versace intelScreen->hw_has_hiz = intelScreen->gen >= 6; 7416b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intelScreen->dri2_has_hiz = INTEL_DRI2_HAS_HIZ_UNKNOWN; 7426b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 7437def293204977c41ea35198af147f743a31b1889Eugeni Dodonov#if defined(I915_PARAM_HAS_LLC) 7447def293204977c41ea35198af147f743a31b1889Eugeni Dodonov intelScreen->hw_has_llc = 7457def293204977c41ea35198af147f743a31b1889Eugeni Dodonov intel_get_boolean(intelScreen->driScrnPriv, 7467def293204977c41ea35198af147f743a31b1889Eugeni Dodonov I915_PARAM_HAS_LLC); 7477def293204977c41ea35198af147f743a31b1889Eugeni Dodonov#else 7487def293204977c41ea35198af147f743a31b1889Eugeni Dodonov intelScreen->hw_has_llc = intelScreen->gen >= 6; 7497def293204977c41ea35198af147f743a31b1889Eugeni Dodonov#endif 7507def293204977c41ea35198af147f743a31b1889Eugeni Dodonov 7516b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel_override_hiz(intelScreen); 7526b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace intel_override_separate_stencil(intelScreen); 7536b2bf272ee173bd8ee6c731500861de21fa01b5fChad Versace 7545efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask = (1 << __DRI_API_OPENGL); 7555efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES1 7565efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES); 7575efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 7585efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#if FEATURE_ES2 7595efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg api_mask |= (1 << __DRI_API_GLES2); 7605efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg#endif 7615efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 7625efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID)) 7635efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg psp->api_mask = api_mask; 7645efee4d4e68067a3fd85b9ff6a2636f502538768Kristian Høgsberg 7657e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!intel_init_bufmgr(intelScreen)) 7662e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke return false; 7677e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 768e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 769c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 770eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 771eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 7723ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_format[0] = GL_RGB; 7733ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 7743ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 77524ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[1] = GL_BGR; 7763ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 7773ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 77824ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[2] = GL_BGRA; 7793ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 7803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 781160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[0] = 0; 782160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[0] = 0; 783160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 784bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate a rich set of useful configs that do not include an 785bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 786bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 7873ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 7885d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **new_configs; 789160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt int depth_factor; 790160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 791066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil 792066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer that has a diffferent number of bits per pixel than the color 793066f45c7a1888ca8a9de78a81b38af7c74bca9e1Ian Romanick * buffer. This isn't yet supported here. 794160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt */ 795160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 796160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 16; 797160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 798160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } else { 799160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 24; 80073e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick stencil_bits[1] = 8; 801160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } 80273e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 80373e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick depth_factor = 2; 80473e24cd5a7a0760726a681dda5b88805ddcf1555Ian Romanick 8055d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt new_configs = driCreateConfigs(fb_format[color], fb_type[color], 8065d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits, 8075d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits, 808160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor, 8095d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 8105d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(back_buffer_modes), 8115d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 8123cce4a1e10361458630511543b7a8a6438544775Ian Romanick ARRAY_SIZE(msaa_samples_array), 8132e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke false); 814bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (configs == NULL) 815bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = new_configs; 816bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick else 817bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick configs = driConcatConfigs(configs, new_configs); 818bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 819bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 820bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick /* Generate the minimum possible set of configs that include an 821bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick * accumulation buffer. 822bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick */ 823bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 824bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick __DRIconfig **new_configs; 825bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 826bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 827bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 16; 828bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 0; 829bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } else { 830bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits[0] = 24; 831bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick stencil_bits[0] = 8; 832bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick } 833bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick 834bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick new_configs = driCreateConfigs(fb_format[color], fb_type[color], 835bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick depth_bits, stencil_bits, 1, 836bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick back_buffer_modes + 1, 1, 837bb65a1d009e3d8398492aa30d944c17a40535aa1Ian Romanick msaa_samples_array, 1, 8382e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke true); 8393ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) 8403ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = new_configs; 8413ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt else 8423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = driConcatConfigs(configs, new_configs); 8433ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) { 8463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 8473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt __LINE__); 8483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt return NULL; 8493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8515d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt return (const __DRIconfig **)configs; 852c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 853e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 8542adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestruct intel_buffer { 8552adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke __DRIbuffer base; 8562adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_region *region; 8572adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke}; 8582adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 85979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace/** 86079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \brief Get tiling format for a DRI buffer. 86179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * 86279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \param attachment is the buffer's attachmet point, such as 86379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * __DRI_BUFFER_DEPTH. 86479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \param out_tiling is the returned tiling format for buffer. 86579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * \return false if attachment is unrecognized or is incompatible with screen. 86679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */ 86779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versacestatic bool 86879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versaceintel_get_dri_buffer_tiling(struct intel_screen *screen, 86979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t attachment, 87079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t *out_tiling) 87179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace{ 87279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if (screen->gen < 4) { 87379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_X; 87479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 87579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 87679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 87779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace switch (attachment) { 87879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_DEPTH: 87979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_DEPTH_STENCIL: 88079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_HIZ: 88179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_Y; 88279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 88379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_ACCUM: 88479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FRONT_LEFT: 88579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FRONT_RIGHT: 88679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_BACK_LEFT: 88779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_BACK_RIGHT: 88879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FAKE_FRONT_LEFT: 88979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_FAKE_FRONT_RIGHT: 89079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_X; 89179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 89279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace case __DRI_BUFFER_STENCIL: 89379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace /* The stencil buffer is W tiled. However, we request from the kernel 89479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * a non-tiled buffer because the GTT is incapable of W fencing. 89579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */ 89679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace *out_tiling = I915_TILING_NONE; 89779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return true; 89879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace default: 89979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if(unlikely(INTEL_DEBUG & DEBUG_DRI)) { 90079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace fprintf(stderr, "error: %s: unrecognized DRI buffer attachment 0x%x\n", 90179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace __FUNCTION__, attachment); 90279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 90379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return false; 90479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 90579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace} 90679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 9072adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic __DRIbuffer * 9082adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelAllocateBuffer(__DRIscreen *screen, 9092adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke unsigned attachment, unsigned format, 9102adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke int width, int height) 9112adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 9122adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer; 913875a757ddd103722cfe9a2b21035024aa5a23d32George Sapountzis struct intel_screen *intelScreen = screen->driverPrivate; 91479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 9155dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg uint32_t tiling; 91679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t region_width; 91779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t region_height; 91879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace uint32_t region_cpp; 91979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 92079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace bool ok = true; 92179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace 92279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace ok = intel_get_dri_buffer_tiling(intelScreen, attachment, &tiling); 92379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if (!ok) 92479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace return NULL; 9252adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9262adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer = CALLOC(sizeof *intelBuffer); 9272adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer == NULL) 9282adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 9292adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 93079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace if (attachment == __DRI_BUFFER_STENCIL) { 93179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace /* The stencil buffer has quirky pitch requirements. From Vol 2a, 93279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * 11.5.6.2.1 3DSTATE_STENCIL_BUFFER, field "Surface Pitch": 93379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * The pitch must be set to 2x the value computed based on width, as 93479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * the stencil buffer is stored with two rows interleaved. 93579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * To accomplish this, we resort to the nasty hack of doubling the 93679653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace * region's cpp and halving its height. 93779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace */ 93879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_width = ALIGN(width, 64); 93979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_height = ALIGN(ALIGN(height, 2) / 2, 64); 94079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_cpp = format / 4; 94179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } else { 94279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_width = width; 94379653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_height = height; 94479653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_cpp = format / 8; 94579653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace } 9465dfba09d49ccec2655e4d22ef6f46b9c67862bc9Kristian Høgsberg 94779653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace intelBuffer->region = intel_region_alloc(intelScreen, 94879653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace tiling, 94979653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_cpp, 95079653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_width, 95179653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace region_height, 95279653c12d6da4d89aaa73e4e8260a84d91f93593Chad Versace true); 9532adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9542adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke if (intelBuffer->region == NULL) { 9552adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke FREE(intelBuffer); 9562adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return NULL; 9572adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke } 9582adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9592adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_flink(intelBuffer->region, &intelBuffer->base.name); 9602adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9612adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.attachment = attachment; 9622adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.cpp = intelBuffer->region->cpp; 9632adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->base.pitch = 9642adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intelBuffer->region->pitch * intelBuffer->region->cpp; 9652adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9662adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke return &intelBuffer->base; 9672adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 9682adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9692adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzkestatic void 9702adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin FranzkeintelReleaseBuffer(__DRIscreen *screen, __DRIbuffer *buffer) 9712adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke{ 9722adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer; 9732adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9742adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke intel_region_release(&intelBuffer->region); 9752adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke free(intelBuffer); 9762adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke} 9772adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 9782adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke 979e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 9807192c37294964b3f6e1551469f161593ec8f851dGeorge Sapountzis .InitScreen = intelInitScreen2, 981e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 982e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 983e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 984e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 985e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 986e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 987e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 9882adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .AllocateBuffer = intelAllocateBuffer, 9892adfde3aaee43d7ec974d25794a07fe02f36c6cdBenjamin Franzke .ReleaseBuffer = intelReleaseBuffer 990e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 99139a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg 99239a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg/* This is the table of extensions that the loader will dlsym() for. */ 99339a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian HøgsbergPUBLIC const __DRIextension *__driDriverExtensions[] = { 99439a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driCoreExtension.base, 99539a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg &driDRI2Extension.base, 99639a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg NULL 99739a0e4e7de379a182c1544fa24d5cb2a7687ec72Kristian Høgsberg}; 998