intel_screen.c revision a962c07cc3e5fba3be5c08071bc7abc5d840f138
177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/************************************************************************** 277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * All Rights Reserved. 577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * copy of this software and associated documentation files (the 877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * "Software"), to deal in the Software without restriction, including 977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * without limitation the rights to use, copy, modify, merge, publish, 1077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to 1177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * permit persons to whom the Software is furnished to do so, subject to 1277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * the following conditions: 1377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 1477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * The above copyright notice and this permission notice (including the 1577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * next paragraph) shall be included in all copies or substantial portions 1677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * of the Software. 1777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 1877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 2677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt **************************************************************************/ 2777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h" 29ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/context.h" 30ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/framebuffer.h" 31ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/renderbuffer.h" 326c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul 3377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "utils.h" 3477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "vblank.h" 3577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "xmlpool.h" 3677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 376c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_batchbuffer.h" 3877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_buffers.h" 396c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_bufmgr.h" 406c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_chipset.h" 414006c5e4526a1cdb910500764590e39d32750967Brian Paul#include "intel_extensions.h" 4277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "intel_fbo.h" 436c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_regions.h" 446fcebbe719eab1f8e292c8dcd6c3e898b0f8d261Brian Paul#include "intel_swapbuffers.h" 456c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_screen.h" 466c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_span.h" 476c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul#include "intel_tex.h" 4877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 49bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#include "i915_drm.h" 5077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#include "i830_dri.h" 516c244b0f326504ae6add1ddcb407e73c3e72da78Brian Paul 521ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt#define DRI_CONF_TEXTURE_TILING(def) \ 531ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt DRI_CONF_OPT_BEGIN(texture_tiling, bool, def) \ 541ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt DRI_CONF_DESC(en, "Enable texture tiling") \ 551ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt DRI_CONF_OPT_END \ 5677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtPUBLIC const char __driConfigOptions[] = 58a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_BEGIN 59a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_PERFORMANCE 60a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) 61e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) 62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, 63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt * DRI_CONF_BO_REUSE_ALL 64fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt */ 65f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1") 66fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_BEGIN(en, "Buffer object reuse") 67fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(0, "Disable buffer object reuse") 68fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects") 69fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_END 70fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_OPT_END 711ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 72a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915 73a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt DRI_CONF_TEXTURE_TILING(false) 74a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else 75a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt DRI_CONF_TEXTURE_TILING(true) 76a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif 771ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 78b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_BEGIN(early_z, bool, false) 79b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") 80b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_END 81b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt 82a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 83a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_QUALITY 84a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 85acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 86a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 87a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_DEBUG 88a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_NO_RAST(false) 8940bc2748c2781600c748e546160bcc2aab637825Eric Anholt DRI_CONF_ALWAYS_FLUSH_BATCH(false) 90f3687284c12f34268172b9c60e2effd697162129Eric Anholt DRI_CONF_ALWAYS_FLUSH_CACHE(false) 91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 92a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 93a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 94b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholtconst GLuint __driNConfigOptions = 10; 9577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 9677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 9785063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 9877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 9977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 10177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Map all the memory regions described by the screen. 10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return GL_TRUE if success, GL_FALSE if error. 10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 10477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtGLboolean 10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelMapScreenRegions(__DRIscreenPrivate * sPriv) 10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; 10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (0) 11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_printf("TEX 0x%08x ", intelScreen->tex.handle); 11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (intelScreen->tex.size != 0) { 11277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (drmMap(sPriv->fd, 11377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.handle, 11477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.size, 11577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt (drmAddress *) & intelScreen->tex.map) != 0) { 11677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelUnmapScreenRegions(intelScreen); 11777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 11877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 11977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 12077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 12177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 12277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 12377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 12477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtvoid 12577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUnmapScreenRegions(intelScreenPrivate * intelScreen) 12677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 12777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (intelScreen->tex.map) { 12877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt drmUnmap(intelScreen->tex.map, intelScreen->tex.size); 12977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.map = NULL; 13077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 13177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 13277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 13377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 13477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 13577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelPrintDRIInfo(intelScreenPrivate * intelScreen, 13677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIscreenPrivate * sPriv, I830DRIPtr gDRIPriv) 13777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 13877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Front size: 0x%x offset: 0x%x pitch: %d\n", 13977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.size, intelScreen->front.offset, 14046eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch); 14177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Back size: 0x%x offset: 0x%x pitch: %d\n", 14277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.size, intelScreen->back.offset, 14346eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch); 14477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Depth size: 0x%x offset: 0x%x pitch: %d\n", 14577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.size, intelScreen->depth.offset, 14646eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch); 14777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Texture size: 0x%x offset: 0x%x\n", 14877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.size, intelScreen->tex.offset); 14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Memory : 0x%x\n", gDRIPriv->mem); 15077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 15177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 15277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 15377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 15439e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo AaltonenintelPrintSAREA(const drm_i915_sarea_t * sarea) 15577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 15677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "SAREA: sarea width %d height %d\n", sarea->width, 15777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->height); 15877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "SAREA: pitch: %d\n", sarea->pitch); 15977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, 160f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie "SAREA: front offset: 0x%08x size: 0x%x handle: 0x%x tiled: %d\n", 16177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->front_offset, sarea->front_size, 162f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie (unsigned) sarea->front_handle, sarea->front_tiled); 16377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, 164f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie "SAREA: back offset: 0x%08x size: 0x%x handle: 0x%x tiled: %d\n", 16577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->back_offset, sarea->back_size, 166f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie (unsigned) sarea->back_handle, sarea->back_tiled); 167f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie fprintf(stderr, "SAREA: depth offset: 0x%08x size: 0x%x handle: 0x%x tiled: %d\n", 16877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->depth_offset, sarea->depth_size, 169f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie (unsigned) sarea->depth_handle, sarea->depth_tiled); 17077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "SAREA: tex offset: 0x%08x size: 0x%x handle: 0x%x\n", 17177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->tex_offset, sarea->tex_size, (unsigned) sarea->tex_handle); 17277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 17377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 17477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 17577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 17677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * A number of the screen parameters are obtained/computed from 17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * information in the SAREA. This function updates those parameters. 17877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 179aae2729aeb3f6eed26e8f7673f47f2b978786bb1Brian Paulstatic void 18077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen, 18139e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen drm_i915_sarea_t * sarea) 18277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->width = sarea->width; 18477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->height = sarea->height; 18546eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch = sarea->pitch; 18677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 18777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.offset = sarea->front_offset; 18877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.handle = sarea->front_handle; 18977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.size = sarea->front_size; 190f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt intelScreen->front.tiled = sarea->front_tiled; 19177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 19277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.offset = sarea->back_offset; 19377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.handle = sarea->back_handle; 19477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.size = sarea->back_size; 195f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt intelScreen->back.tiled = sarea->back_tiled; 19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 19777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.offset = sarea->depth_offset; 19877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.handle = sarea->depth_handle; 19977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.size = sarea->depth_size; 200f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt intelScreen->depth.tiled = sarea->depth_tiled; 20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 20277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (intelScreen->driScrnPriv->ddx_version.minor >= 9) { 20377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.bo_handle = sarea->front_bo_handle; 20477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.bo_handle = sarea->back_bo_handle; 20577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.bo_handle = sarea->depth_bo_handle; 20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } else { 20777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.bo_handle = -1; 20877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.bo_handle = -1; 20977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.bo_handle = -1; 21077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 21177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 21277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.offset = sarea->tex_offset; 21377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->logTextureGranularity = sarea->log_tex_granularity; 21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.handle = sarea->tex_handle; 21577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.size = sarea->tex_size; 21677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 21777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (0) 21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelPrintSAREA(sarea); 21977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 22077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 22177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = { 22277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt { __DRI_TEX_OFFSET }, 22377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelSetTexOffset, 22477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 22577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2266d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 2276d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 2286d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 22966175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 2306d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 2316d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 232e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 23377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driReadDrawableExtension, 23477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driCopySubBufferExtension.base, 23577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driSwapControlExtension.base, 23677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driFrameTrackingExtension.base, 23777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driMediaStreamCounterExtension.base, 23877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &intelTexOffsetExtension.base, 2396d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 24077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 24177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 24277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 24324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean 24424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergintel_get_param(__DRIscreenPrivate *psp, int param, int *value) 24524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 24624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 2471c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 24824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 24924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 25024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 25124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 2521c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 25324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 25442e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 25524e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_FALSE; 25624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 25724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 25824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_TRUE; 25924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 26077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 26177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean intelInitDriver(__DRIscreenPrivate *sPriv) 26277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 26377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen; 26477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv; 26539e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen drm_i915_sarea_t *sarea; 26677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (sPriv->devPrivSize != sizeof(I830DRIRec)) { 26877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, 26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt "\nERROR! sizeof(I830DRIRec) does not match passed size from device driver\n"); 27077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 27177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 27277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 27377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Allocate the private area */ 27477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate)); 27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intelScreen) { 27677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "\nERROR! Allocating private area failed\n"); 27777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 27877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 27977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* parse information in __driConfigOptions */ 28077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt driParseOptionInfo(&intelScreen->optionCache, 28177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __driConfigOptions, __driNConfigOptions); 28277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->driScrnPriv = sPriv; 28477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = (void *) intelScreen; 28539e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen sarea = (drm_i915_sarea_t *) 2863628185f566e178a12b493fb89abf52b4b281f99Eric Anholt (((GLubyte *) sPriv->pSAREA) + gDRIPriv->sarea_priv_offset); 2873628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intelScreen->sarea = sarea; 28877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 28977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->deviceID = gDRIPriv->deviceID; 29077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 29177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelUpdateScreenFromSAREA(intelScreen, sarea); 29277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 29377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intelMapScreenRegions(sPriv)) { 29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "\nERROR! mapping regions\n"); 29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_free(intelScreen); 29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = NULL; 29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 29877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 29977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 30077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (0) 30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv); 30277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->drmMinor = sPriv->drm_version.minor; 30477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Determine if IRQs are active? */ 3061c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane if (!intel_get_param(sPriv, I915_PARAM_IRQ_ACTIVE, 30724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg &intelScreen->irq_active)) 30824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_FALSE; 30977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 310e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg sPriv->extensions = intelScreenExtensions; 31177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 31277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 31377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 31477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 31577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 31677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 31777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyScreen(__DRIscreenPrivate * sPriv) 31877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 31977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; 32077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 321904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 32277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelUnmapScreenRegions(intelScreen); 3236d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 32677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = NULL; 32777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 32877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 33077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 33177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 33277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateBuffer(__DRIscreenPrivate * driScrnPriv, 33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIdrawablePrivate * driDrawPriv, 33677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt const __GLcontextModes * mesaVis, GLboolean isPixmap) 33777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 33877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (isPixmap) { 33977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; /* not implemented */ 34077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 34177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 34277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLboolean swStencil = (mesaVis->stencilBits > 0 && 34377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt mesaVis->depthBits != 24); 344119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt GLenum rgbFormat; 34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer); 34777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 34877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intel_fb) 34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis); 35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 353119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt if (mesaVis->redBits == 5) 354119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt rgbFormat = GL_RGB5; 355119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else if (mesaVis->alphaBits == 0) 356119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt rgbFormat = GL_RGB8; 357119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else 358119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt rgbFormat = GL_RGBA8; 359119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* setup the hardware-based renderbuffers */ 361f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat); 362f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT, 363f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie &intel_fb->color_rb[0]->Base); 36477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (mesaVis->doubleBufferMode) { 366f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat); 367f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie 36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT, 36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &intel_fb->color_rb[1]->Base); 37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 37277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 37338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->depthBits == 24) { 37438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->stencilBits == 8) { 37538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt /* combined depth/stencil buffer */ 37638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt struct intel_renderbuffer *depthStencilRb 377e131c46b20241737ceba4856dbe01dcca6dd2c03Kristian Høgsberg = intel_create_renderbuffer(GL_DEPTH24_STENCIL8_EXT); 37838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt /* note: bind RB to two attachment points */ 37938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, 38038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt &depthStencilRb->Base); 38138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL, 38238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt &depthStencilRb->Base); 38338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt } else { 38438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt struct intel_renderbuffer *depthRb 385e131c46b20241737ceba4856dbe01dcca6dd2c03Kristian Høgsberg = intel_create_renderbuffer(GL_DEPTH_COMPONENT24); 38638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, 38738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt &depthRb->Base); 38838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt } 38977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 39077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else if (mesaVis->depthBits == 16) { 39177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* just 16-bit depth buffer, no hw stencil */ 39277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_renderbuffer *depthRb 393f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie = intel_create_renderbuffer(GL_DEPTH_COMPONENT16); 39477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base); 39577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 39677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 39777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* now add any/all software-based renderbuffers we may need */ 39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_add_soft_renderbuffers(&intel_fb->Base, 39977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw color */ 40077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw depth */ 40177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt swStencil, mesaVis->accumRedBits > 0, 40277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw alpha */ 40377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE /* never sw aux */ ); 40477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt driDrawPriv->driverPrivate = (void *) intel_fb; 40577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 40677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 40777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 40877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 40977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 41077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 41177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv) 41277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 413d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He struct intel_framebuffer *intel_fb = driDrawPriv->driverPrivate; 414d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He struct intel_renderbuffer *depth_rb; 415d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He struct intel_renderbuffer *stencil_rb; 416d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 417d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (intel_fb) { 418d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (intel_fb->color_rb[0]) { 419d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(intel_fb->color_rb[0], NULL); 420d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 421d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 422d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (intel_fb->color_rb[1]) { 423d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(intel_fb->color_rb[1], NULL); 424d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 425d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 426d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He depth_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); 427d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (depth_rb) { 428d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(depth_rb, NULL); 429d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 430d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 431d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He stencil_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); 432d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (stencil_rb) { 433d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(stencil_rb, NULL); 434d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 435d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 436d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 4370f04a1d3f8989b0a391e6dad80abf06ce151d1f1Brian Paul _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); 43877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 43977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 44077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 44177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 44277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Get information about previous buffer swaps. 44377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 44477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic int 44577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo) 44677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 44777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_framebuffer *intel_fb; 44877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 44977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if ((dPriv == NULL) || (dPriv->driverPrivate == NULL) 45077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt || (sInfo == NULL)) { 45177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return -1; 45277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 45377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 45477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intel_fb = dPriv->driverPrivate; 45577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_count = intel_fb->swap_count; 45677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_ust = intel_fb->swap_ust; 45777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_missed_count = intel_fb->swap_missed_count; 45877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 45977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0) 46077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt ? driCalculateSwapUsage(dPriv, 0, intel_fb->swap_missed_ust) 46177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt : 0.0; 46277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 46377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return 0; 46477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 46577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 46677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 46777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 46877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 46977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 47077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 47177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis, 47277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIcontextPrivate * driContextPriv, 47377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate); 47477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 47577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis, 47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIcontextPrivate * driContextPriv, 47777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate); 478bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis, 479bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt __DRIcontextPrivate * driContextPriv, 480bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt void *sharedContextPrivate); 48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 48277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 48377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis, 48477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIcontextPrivate * driContextPriv, 48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 48677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; 48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; 48977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 490bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 49119420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 49219420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (!IS_965(intelScreen->deviceID)) { 49319420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt return i915CreateContext(mesaVis, driContextPriv, 494bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt sharedContextPrivate); 49519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt } 496bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 497cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie intelScreen->no_vbo = GL_TRUE; 49877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate); 49977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 500bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 501bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt if (IS_965(intelScreen->deviceID)) 502bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate); 503bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 504bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID); 505bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt return GL_FALSE; 50677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 50777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 509e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIconfig ** 5106cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian HøgsbergintelFillInModes(__DRIscreenPrivate *psp, 5116cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg unsigned pixel_bits, unsigned depth_bits, 51277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unsigned stencil_bits, GLboolean have_back_buffer) 51377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 514e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIconfig **configs; 51577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __GLcontextModes *m; 51677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unsigned depth_buffer_factor; 51777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unsigned back_buffer_factor; 518e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg int i; 51977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 52077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't 52177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * support pageflipping at all. 52277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 52377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const GLenum back_buffer_modes[] = { 52477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 52577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt }; 52677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5275a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint8_t depth_bits_array[3]; 5285a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint8_t stencil_bits_array[3]; 529e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t msaa_samples_array[1]; 53077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 53177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_bits_array[0] = 0; 53277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_bits_array[1] = depth_bits; 53377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_bits_array[2] = depth_bits; 53477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 53577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Just like with the accumulation buffer, always provide some modes 53677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * with a stencil buffer. It will be a sw fallback, but some apps won't 53777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * care about that. 53877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 53977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[0] = 0; 54077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[1] = 0; 54177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (depth_bits == 24) 54277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits; 54377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 54477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits; 54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 546eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 547eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 54877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1; 54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt back_buffer_factor = (have_back_buffer) ? 3 : 1; 55077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 55177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (pixel_bits == 16) { 5525d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 5535d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits_array, stencil_bits_array, 5545d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_buffer_factor, back_buffer_modes, 5555d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_factor, 5565d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 1); 55777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 55877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 5595d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs_a8r8g8b8; 5605d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs_x8r8g8b8; 5615d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt 5625d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 5635d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits_array, 5645d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits_array, 5655d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_buffer_factor, 5665d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 5675d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_factor, 5685d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 1); 5695d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV, 5705d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits_array, 5715d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits_array, 5725d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_buffer_factor, 5735d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 5745d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_factor, 5755d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 1); 5765d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs = driConcatConfigs(configs_a8r8g8b8, configs_x8r8g8b8); 57777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 57877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 579e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (configs == NULL) { 580e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 58177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __LINE__); 58277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 58377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 58477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 58577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Mark the visual as slow if there are "fake" stencil bits. 58677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 587e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg for (i = 0; configs[i]; i++) { 588e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg m = &configs[i]->modes; 58977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) { 59077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt m->visualRating = GLX_SLOW_CONFIG; 59177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 59277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 59377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 594e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return configs; 59577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 59677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5977e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean 5987e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtintel_init_bufmgr(intelScreenPrivate *intelScreen) 5997e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 6007e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt GLboolean gem_disable = getenv("INTEL_NO_GEM") != NULL; 6017e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt int gem_kernel = 0; 6027e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt GLboolean gem_supported; 6037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt struct drm_i915_getparam gp; 6047e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt __DRIscreenPrivate *spriv = intelScreen->driScrnPriv; 605cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 6067e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6077e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL; 6087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6097e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gp.param = I915_PARAM_HAS_GEM; 6107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gp.value = &gem_kernel; 6117e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6127e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt (void) drmCommandWriteRead(spriv->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 6137e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6147e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt /* If we've got a new enough DDX that's initializing GEM and giving us 6157e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt * object handles for the shared buffers, use that. 6167e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt */ 6177e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->ttm = GL_FALSE; 6187e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->driScrnPriv->dri2.enabled) 6197e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gem_supported = GL_TRUE; 6207e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt else if (intelScreen->driScrnPriv->ddx_version.minor >= 9 && 6217e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gem_kernel && 6227e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->front.bo_handle != -1) 6237e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gem_supported = GL_TRUE; 6247e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt else 6257e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gem_supported = GL_FALSE; 6267e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6277e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!gem_disable && gem_supported) { 6287e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 6297e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr != NULL) 6307e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->ttm = GL_TRUE; 6317e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6327e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt /* Otherwise, use the classic buffer manager. */ 6337e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 6347e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (gem_disable) { 635d2f56fe687afb2c259338542971e432dd448671bBrian Paul _mesa_warning(NULL, "GEM disabled. Using classic."); 6367e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } else { 637d2f56fe687afb2c259338542971e432dd448671bBrian Paul _mesa_warning(NULL, 638d2f56fe687afb2c259338542971e432dd448671bBrian Paul "Failed to initialize GEM. Falling back to classic."); 6397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6407e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6417e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->tex.size == 0) { 6427e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 6437e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt __func__, __LINE__); 6447e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_FALSE; 6457e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6467e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6473628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intelScreen->bufmgr = 6483628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intel_bufmgr_fake_init(spriv->fd, 6493628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intelScreen->tex.offset, 6503628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intelScreen->tex.map, 6513628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intelScreen->tex.size, 6523628185f566e178a12b493fb89abf52b4b281f99Eric Anholt (unsigned int * volatile) 6533628185f566e178a12b493fb89abf52b4b281f99Eric Anholt &intelScreen->sarea->last_dispatch); 6547e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6557e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 656e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences)) 657e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt intelScreen->kernel_exec_fencing = !!num_fences; 658e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt else 659e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt intelScreen->kernel_exec_fencing = GL_FALSE; 660e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 6617e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_TRUE; 6627e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 6637e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 66477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 66577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is the driver specific part of the createNewScreen entry point. 6668d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using legacy DRI. 66777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 66877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \todo maybe fold this into intelInitDriver 66977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 67077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return the __GLcontextModes supported by this driver 67177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 672e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp) 67377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 6747e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreenPrivate *intelScreen; 675bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 67677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const __DRIversion ddx_expected = { 1, 5, 0 }; 677bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 678bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt static const __DRIversion ddx_expected = { 1, 6, 0 }; 679bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 68077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const __DRIversion dri_expected = { 4, 0, 0 }; 68177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const __DRIversion drm_expected = { 1, 5, 0 }; 68277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv; 68377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 68477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!driCheckDriDdxDrmVersions2("i915", 68577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &psp->dri_version, &dri_expected, 68677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &psp->ddx_version, &ddx_expected, 68777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &psp->drm_version, &drm_expected)) { 68877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 68977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 69077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 69177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Calling driInitExtensions here, with a NULL context pointer, 69277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * does not actually enable the extensions. It just makes sure 69377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * that all the dispatch offsets for all the extensions that 69477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * *might* be enables are known. This is needed because the 69577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * dispatch offsets need to be known when _mesa_context_create is 69677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * called, but we can't enable the extensions until we have a 69777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * context pointer. 69877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 69977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Hello chicken. Hello egg. How are you two today? 70077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 70160c0f09abb9421de359cd92e094a943d650fc7faKristian Høgsberg intelInitExtensions(NULL, GL_TRUE); 70260c0f09abb9421de359cd92e094a943d650fc7faKristian Høgsberg 70377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intelInitDriver(psp)) 70477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 70577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 706e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 707e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7087e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen = psp->private; 7097e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!intel_init_bufmgr(intelScreen)) 7107e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_FALSE; 7117e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 712e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return (const __DRIconfig **) 713e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg intelFillInModes(psp, dri_priv->cpp * 8, 714e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg (dri_priv->cpp == 2) ? 16 : 24, 715e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg (dri_priv->cpp == 2) ? 0 : 8, 1); 71677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 71777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 71877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstruct intel_context *intelScreenContext(intelScreenPrivate *intelScreen) 71977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 72077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* 72177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This should probably change to have the screen allocate a dummy 72277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * context at screen creation. For now just use the current context. 72377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 72477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 72577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GET_CURRENT_CONTEXT(ctx); 72677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (ctx == NULL) { 72777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_problem(NULL, "No current context in intelScreenContext\n"); 72877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 72977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 73077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return intel_context(ctx); 73177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 73277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 733c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 734c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 7358d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 7368d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 737c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver 738c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 739e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 740e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp) 741c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 742c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreenPrivate *intelScreen; 7433ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_format[3]; 7443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_type[3]; 7453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't 7463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt * support pageflipping at all. 7473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt */ 7483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt static const GLenum back_buffer_modes[] = { 7493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML 7503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt }; 751e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 7523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt int color; 7535d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs = NULL; 754c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 755c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Calling driInitExtensions here, with a NULL context pointer, 756c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * does not actually enable the extensions. It just makes sure 757c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * that all the dispatch offsets for all the extensions that 758c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * *might* be enables are known. This is needed because the 759c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * dispatch offsets need to be known when _mesa_context_create is 760c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * called, but we can't enable the extensions until we have a 761c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * context pointer. 762c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * 763c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * Hello chicken. Hello egg. How are you two today? 764c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 76560c0f09abb9421de359cd92e094a943d650fc7faKristian Høgsberg intelInitExtensions(NULL, GL_TRUE); 766c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 767c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 768c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate)); 769c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 770c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 771c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg return GL_FALSE; 772c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 773c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 774c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 775c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 776c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 777c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 778c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg psp->private = (void *) intelScreen; 779c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 780c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->drmMinor = psp->drm_version.minor; 781c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 782f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg /* Determine chipset ID */ 783c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID, 784c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg &intelScreen->deviceID)) 785c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg return GL_FALSE; 786c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7877e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!intel_init_bufmgr(intelScreen)) 7887e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_FALSE; 7897e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 790f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg intelScreen->irq_active = 1; 791e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 792c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7933ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[0] = 0; 7943ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[0] = 0; 7953ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[1] = 16; 7963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[1] = 0; 7973ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[2] = 24; 7983ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[2] = 0; 7993ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[3] = 24; 8003ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[3] = 8; 8013ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 802eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 803eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 8043ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_format[0] = GL_RGB; 8053ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 8063ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 80724ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[1] = GL_BGR; 8083ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 8093ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 81024ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[2] = GL_BGRA; 8113ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 8123ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 813160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[0] = 0; 814160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[0] = 0; 815160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 8163ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 8175d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **new_configs; 818160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt int depth_factor; 819160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 820160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt /* With DRI2 right now, GetBuffers always returns a depth/stencil buffer 821160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt * with the same cpp as the drawable. So we can't support depth cpp != 822160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt * color cpp currently. 823160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt */ 824160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 825160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 16; 826160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 827160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 828160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor = 2; 829160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } else { 830160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 24; 831160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 832160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[2] = 24; 833160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[2] = 8; 8345d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt 835160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor = 3; 836160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } 8375d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt new_configs = driCreateConfigs(fb_format[color], fb_type[color], 8385d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits, 8395d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits, 840160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor, 8415d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 8425d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(back_buffer_modes), 8435d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 8445d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(msaa_samples_array)); 8453ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) 8463ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = new_configs; 8473ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt else 8483ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = driConcatConfigs(configs, new_configs); 8493ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8503ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8513ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) { 8523ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 8533ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt __LINE__); 8543ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt return NULL; 8553ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8563ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8575d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt return (const __DRIconfig **)configs; 858c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 859e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 860e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 861e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .InitScreen = intelInitScreen, 862e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 863e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 864e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 865e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 866e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 867e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .SwapBuffers = intelSwapBuffers, 868e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 869e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 870e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .GetSwapInfo = intelGetSwapInfo, 871e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .GetDrawableMSC = driDrawableGetMSC32, 872e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .WaitForMSC = driWaitForMSC32, 873e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CopySubBuffer = intelCopySubBuffer, 874e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 875e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .InitScreen2 = intelInitScreen2, 876e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 877