intel_screen.c revision 7c50d29f7ced3d60e52ee0146d982b49ea421de2
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 60e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409Jesse Barnes DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) 61fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, 62fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt * DRI_CONF_BO_REUSE_ALL 63fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt */ 64f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1") 65fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_BEGIN(en, "Buffer object reuse") 66fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(0, "Disable buffer object reuse") 67fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects") 68fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_DESC_END 69fe91c05b5494b889c8adda77ff562712116d2e59Eric Anholt DRI_CONF_OPT_END 701ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 71a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#ifdef I915 72a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt DRI_CONF_TEXTURE_TILING(false) 73a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#else 74a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt DRI_CONF_TEXTURE_TILING(true) 75a962c07cc3e5fba3be5c08071bc7abc5d840f138Eric Anholt#endif 761ba96651e12b3c74fb9c8f5a61b183ef36a27b1eEric Anholt 77b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_BEGIN(early_z, bool, false) 78b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).") 79b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt DRI_CONF_OPT_END 80b30dc2c66aeaad6661eef515a08a3da89aa07cb2Eric Anholt 81862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_BEGIN(fragment_shader, bool, false) 82862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.") 83862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt DRI_CONF_OPT_END 84862a2a55b35d1dec9224b025a6e7a0cf8593a6a7Eric Anholt 85a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 86a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_QUALITY 87a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_FORCE_S3TC_ENABLE(false) 88acba9c1771d653126fd6f604cb80c050b9e8ffb3Michel Dänzer DRI_CONF_ALLOW_LARGE_TEXTURES(2) 89a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 90a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_DEBUG 91a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_NO_RAST(false) 9240bc2748c2781600c748e546160bcc2aab637825Eric Anholt DRI_CONF_ALWAYS_FLUSH_BATCH(false) 93f3687284c12f34268172b9c60e2effd697162129Eric Anholt DRI_CONF_ALWAYS_FLUSH_CACHE(false) 9481aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt 9581aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_BEGIN(stub_occlusion_query, bool, false) 9681aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_DESC(en, "Enable stub ARB_occlusion_query support on 915/945.") 9781aa5d717bd0098608e9cc292b316293800c7e11Eric Anholt DRI_CONF_OPT_END 98a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt DRI_CONF_SECTION_END 99a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric AnholtDRI_CONF_END; 100a0e453a5eca7ed4b57a7f4c1e418d368815e3957Eric Anholt 1011e4677a61f0576c32e65e9202fa08e81e1162f65Eric Anholtconst GLuint __driNConfigOptions = 11; 10277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#ifdef USE_NEW_INTERFACE 10485063f14ea431b586d710f249563fc73481552c7Eric Anholtstatic PFNGLXCREATECONTEXTMODES create_context_modes = NULL; 10577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt#endif /*USE_NEW_INTERFACE */ 10677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 10777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 10877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Map all the memory regions described by the screen. 10977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return GL_TRUE if success, GL_FALSE if error. 11077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 11177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtGLboolean 11277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelMapScreenRegions(__DRIscreenPrivate * sPriv) 11377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 11477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; 11577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 11677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (0) 11777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_printf("TEX 0x%08x ", intelScreen->tex.handle); 11877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (intelScreen->tex.size != 0) { 11977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (drmMap(sPriv->fd, 12077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.handle, 12177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.size, 12277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt (drmAddress *) & intelScreen->tex.map) != 0) { 12377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelUnmapScreenRegions(intelScreen); 12477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 12577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 12677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 12777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 12877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 12977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 13077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 13177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtvoid 13277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUnmapScreenRegions(intelScreenPrivate * intelScreen) 13377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 13477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (intelScreen->tex.map) { 13577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt drmUnmap(intelScreen->tex.map, intelScreen->tex.size); 13677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.map = NULL; 13777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 13877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 13977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 14077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 14177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 14277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelPrintDRIInfo(intelScreenPrivate * intelScreen, 14377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIscreenPrivate * sPriv, I830DRIPtr gDRIPriv) 14477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 14577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Front size: 0x%x offset: 0x%x pitch: %d\n", 14677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.size, intelScreen->front.offset, 14746eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch); 14877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Back size: 0x%x offset: 0x%x pitch: %d\n", 14977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.size, intelScreen->back.offset, 15046eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch); 15177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Depth size: 0x%x offset: 0x%x pitch: %d\n", 15277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.size, intelScreen->depth.offset, 15346eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch); 15477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Texture size: 0x%x offset: 0x%x\n", 15577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.size, intelScreen->tex.offset); 15677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "*** Memory : 0x%x\n", gDRIPriv->mem); 15777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 15877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 15977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 16077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 16139e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo AaltonenintelPrintSAREA(const drm_i915_sarea_t * sarea) 16277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 16377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "SAREA: sarea width %d height %d\n", sarea->width, 16477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->height); 16577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "SAREA: pitch: %d\n", sarea->pitch); 16677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, 167f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie "SAREA: front offset: 0x%08x size: 0x%x handle: 0x%x tiled: %d\n", 16877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->front_offset, sarea->front_size, 169f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie (unsigned) sarea->front_handle, sarea->front_tiled); 17077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, 171f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie "SAREA: back offset: 0x%08x size: 0x%x handle: 0x%x tiled: %d\n", 17277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->back_offset, sarea->back_size, 173f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie (unsigned) sarea->back_handle, sarea->back_tiled); 174f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie fprintf(stderr, "SAREA: depth offset: 0x%08x size: 0x%x handle: 0x%x tiled: %d\n", 17577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->depth_offset, sarea->depth_size, 176f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie (unsigned) sarea->depth_handle, sarea->depth_tiled); 17777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "SAREA: tex offset: 0x%08x size: 0x%x handle: 0x%x\n", 17877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sarea->tex_offset, sarea->tex_size, (unsigned) sarea->tex_handle); 17977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 18077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 18177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 18277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 18377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * A number of the screen parameters are obtained/computed from 18477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * information in the SAREA. This function updates those parameters. 18577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 186aae2729aeb3f6eed26e8f7673f47f2b978786bb1Brian Paulstatic void 18777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen, 18839e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen drm_i915_sarea_t * sarea) 18977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 19077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->width = sarea->width; 19177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->height = sarea->height; 19246eb02b60920a920b782bacb15f01b44e18f888dKristian Høgsberg intelScreen->pitch = sarea->pitch; 19377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 19477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.offset = sarea->front_offset; 19577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.handle = sarea->front_handle; 19677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.size = sarea->front_size; 197f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt intelScreen->front.tiled = sarea->front_tiled; 19877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 19977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.offset = sarea->back_offset; 20077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.handle = sarea->back_handle; 20177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.size = sarea->back_size; 202f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt intelScreen->back.tiled = sarea->back_tiled; 20377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 20477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.offset = sarea->depth_offset; 20577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.handle = sarea->depth_handle; 20677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.size = sarea->depth_size; 207f00a64999c197e6a96e65fd00f64224a6f22c9faEric Anholt intelScreen->depth.tiled = sarea->depth_tiled; 20877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 20977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (intelScreen->driScrnPriv->ddx_version.minor >= 9) { 21077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.bo_handle = sarea->front_bo_handle; 21177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.bo_handle = sarea->back_bo_handle; 21277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.bo_handle = sarea->depth_bo_handle; 21377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } else { 21477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->front.bo_handle = -1; 21577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->back.bo_handle = -1; 21677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->depth.bo_handle = -1; 21777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 21877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 21977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.offset = sarea->tex_offset; 22077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->logTextureGranularity = sarea->log_tex_granularity; 22177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.handle = sarea->tex_handle; 22277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->tex.size = sarea->tex_size; 22377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 22477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (0) 22577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelPrintSAREA(sarea); 22677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 22777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 22877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic const __DRItexOffsetExtension intelTexOffsetExtension = { 22977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt { __DRI_TEX_OFFSET }, 23077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelSetTexOffset, 23177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 23277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 2336d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsbergstatic const __DRItexBufferExtension intelTexBufferExtension = { 2346d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, 2356d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg intelSetTexBuffer, 23666175aac7609ad314f25fbdff0d3958af310dc24Eric Anholt intelSetTexBuffer2, 2376d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg}; 2386d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg 2397c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 2407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2Flush(__DRIdrawable *drawable) 2417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 2427c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg struct intel_context *intel = drawable->driContextPriv->driverPrivate; 2437c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 2447c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg if (intel->gen < 4) 2457c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg INTEL_FIREVERTICES(intel); 2467c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 2477c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg if (intel->batch->map != intel->batch->ptr) 2487c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intel_batchbuffer_flush(intel->batch); 2497c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 2507c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 2517c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic void 2527c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian HøgsbergintelDRI2FlushInvalidate(__DRIdrawable *drawable) 2537c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg{ 2547c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush(drawable); 2557c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg drawable->validBuffers = GL_FALSE; 2567c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg} 2577c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 2587c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsbergstatic const struct __DRI2flushExtensionRec intelFlushExtension = { 2597c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg { __DRI2_FLUSH, __DRI2_FLUSH_VERSION }, 2607c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2Flush, 2617c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg intelDRI2FlushInvalidate, 2627c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg}; 2637c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 264e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIextension *intelScreenExtensions[] = { 26577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driReadDrawableExtension, 26677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driCopySubBufferExtension.base, 26777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driSwapControlExtension.base, 26877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driFrameTrackingExtension.base, 26977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &driMediaStreamCounterExtension.base, 27077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &intelTexOffsetExtension.base, 2716d48779c7e5c9002d1bec4b1266ca05a474218efKristian Høgsberg &intelTexBufferExtension.base, 2727c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg &intelFlushExtension.base, 27377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt NULL 27477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt}; 27577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 27624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergstatic GLboolean 27724e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsbergintel_get_param(__DRIscreenPrivate *psp, int param, int *value) 27824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg{ 27924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg int ret; 2801c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane struct drm_i915_getparam gp; 28124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 28224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.param = param; 28324e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg gp.value = value; 28424e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 2851c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane ret = drmCommandWriteRead(psp->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 28624e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg if (ret) { 28742e9bde0fa2276b8f5bb434328eea7665794b127Brian Paul _mesa_warning(NULL, "drm_i915_getparam: %d", ret); 28824e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_FALSE; 28924e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg } 29024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg 29124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_TRUE; 29224e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg} 29377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 29477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean intelInitDriver(__DRIscreenPrivate *sPriv) 29577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 29677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen; 29777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv; 29839e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen drm_i915_sarea_t *sarea; 29977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 30077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (sPriv->devPrivSize != sizeof(I830DRIRec)) { 30177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, 30277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt "\nERROR! sizeof(I830DRIRec) does not match passed size from device driver\n"); 30377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 30477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 30577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 30677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Allocate the private area */ 30777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate)); 30877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intelScreen) { 30977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "\nERROR! Allocating private area failed\n"); 31077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 31177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 31277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* parse information in __driConfigOptions */ 31377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt driParseOptionInfo(&intelScreen->optionCache, 31477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __driConfigOptions, __driNConfigOptions); 31577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 31677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->driScrnPriv = sPriv; 31777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = (void *) intelScreen; 31839e6d0d8108fe6d222865e7bb9de1e3cea18b4c4Timo Aaltonen sarea = (drm_i915_sarea_t *) 3193628185f566e178a12b493fb89abf52b4b281f99Eric Anholt (((GLubyte *) sPriv->pSAREA) + gDRIPriv->sarea_priv_offset); 3203628185f566e178a12b493fb89abf52b4b281f99Eric Anholt intelScreen->sarea = sarea; 32177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->deviceID = gDRIPriv->deviceID; 32377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelUpdateScreenFromSAREA(intelScreen, sarea); 32577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 32677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intelMapScreenRegions(sPriv)) { 32777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt fprintf(stderr, "\nERROR! mapping regions\n"); 32877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_free(intelScreen); 32977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = NULL; 33077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 33177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 33277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 33377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (0) 33477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv); 33577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 33677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreen->drmMinor = sPriv->drm_version.minor; 33777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 33877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Determine if IRQs are active? */ 3391c718c0d78cf4eae9e02b03a0abbec384db948a6Alan Hourihane if (!intel_get_param(sPriv, I915_PARAM_IRQ_ACTIVE, 34024e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg &intelScreen->irq_active)) 34124e7e457680d700e986fd0b0e0f046fadf67caf4Kristian Høgsberg return GL_FALSE; 34277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 343e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg sPriv->extensions = intelScreenExtensions; 34477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 34577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 34677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 34777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 34877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 34977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 35077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyScreen(__DRIscreenPrivate * sPriv) 35177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 35277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; 35377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 354904f31a62444d9f7e9b12ddafaa4beeb7fed6dfaEric Anholt dri_bufmgr_destroy(intelScreen->bufmgr); 35577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelUnmapScreenRegions(intelScreen); 3566d66f23c50ebe8f973757b6fd1b81c9b7920c447Eric Anholt driDestroyOptionInfo(&intelScreen->optionCache); 35777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 35877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt FREE(intelScreen); 35977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sPriv->private = NULL; 36077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 36177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 36277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 36377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 36477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is called when we need to set up GL rendering to a new X window. 36577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 36677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 36777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateBuffer(__DRIscreenPrivate * driScrnPriv, 36877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIdrawablePrivate * driDrawPriv, 36977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt const __GLcontextModes * mesaVis, GLboolean isPixmap) 37077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 37177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (isPixmap) { 37277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; /* not implemented */ 37377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 37477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 37577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GLboolean swStencil = (mesaVis->stencilBits > 0 && 37677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt mesaVis->depthBits != 24); 3774a253431abf43a0638afb43605b44a8742b72a60Brian Paul gl_format rgbFormat; 37877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 37977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer); 38077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 38177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intel_fb) 38277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_FALSE; 38377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 38477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis); 38577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 386119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt if (mesaVis->redBits == 5) 3874a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_RGB565; 388119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else if (mesaVis->alphaBits == 0) 389409469fb70682cd819ab405e0f92a4659381cfbeBrian Paul rgbFormat = MESA_FORMAT_XRGB8888; 390119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt else 3914a253431abf43a0638afb43605b44a8742b72a60Brian Paul rgbFormat = MESA_FORMAT_ARGB8888; 392119f34e2a52d7e074ea51d49acf6c11d83142cccEric Anholt 39377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* setup the hardware-based renderbuffers */ 394f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat); 395f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT, 396f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie &intel_fb->color_rb[0]->Base); 39777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 39877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (mesaVis->doubleBufferMode) { 399f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat); 400f75843a517bd188639e6866db2a7b04de3524e16Dave Airlie 40177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT, 40277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &intel_fb->color_rb[1]->Base); 40377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 40477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 40577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 40638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->depthBits == 24) { 40738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt if (mesaVis->stencilBits == 8) { 40838c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt /* combined depth/stencil buffer */ 40938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt struct intel_renderbuffer *depthStencilRb 4104a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_S8_Z24); 41138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt /* note: bind RB to two attachment points */ 41238c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, 41338c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt &depthStencilRb->Base); 41438c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL, 41538c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt &depthStencilRb->Base); 41638c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt } else { 41738c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt struct intel_renderbuffer *depthRb 4184a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_X8_Z24); 41938c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, 42038c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt &depthRb->Base); 42138c616260a4c14bf5a1d7831e6349c3e8817d14bEric Anholt } 42277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 42377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else if (mesaVis->depthBits == 16) { 42477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* just 16-bit depth buffer, no hw stencil */ 42577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_renderbuffer *depthRb 4264a253431abf43a0638afb43605b44a8742b72a60Brian Paul = intel_create_renderbuffer(MESA_FORMAT_Z16); 42777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base); 42877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 42977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 43077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* now add any/all software-based renderbuffers we may need */ 43177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_add_soft_renderbuffers(&intel_fb->Base, 43277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw color */ 43377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw depth */ 43477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt swStencil, mesaVis->accumRedBits > 0, 43577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE, /* never sw alpha */ 43677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GL_FALSE /* never sw aux */ ); 43777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt driDrawPriv->driverPrivate = (void *) intel_fb; 43877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 43977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return GL_TRUE; 44077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 44177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 44277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 44377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic void 44477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv) 44577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 446d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He struct intel_framebuffer *intel_fb = driDrawPriv->driverPrivate; 447d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He struct intel_renderbuffer *depth_rb; 448d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He struct intel_renderbuffer *stencil_rb; 449d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 450d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (intel_fb) { 451d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (intel_fb->color_rb[0]) { 452d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(intel_fb->color_rb[0], NULL); 453d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 454d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 455d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (intel_fb->color_rb[1]) { 456d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(intel_fb->color_rb[1], NULL); 457d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 458d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 459d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He depth_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); 460d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (depth_rb) { 461d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(depth_rb, NULL); 462d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 463d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 464d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He stencil_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); 465d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He if (stencil_rb) { 466d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He intel_renderbuffer_set_region(stencil_rb, NULL); 467d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 468d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He } 469d027e8feff7d38cccadc6aaccc0454b21ce4dca0Shuang He 4700f04a1d3f8989b0a391e6dad80abf06ce151d1f1Brian Paul _mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL); 47177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 47277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 47377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 47477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 47577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * Get information about previous buffer swaps. 47677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 47777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic int 47877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo) 47977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 48077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt struct intel_framebuffer *intel_fb; 48177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 48277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if ((dPriv == NULL) || (dPriv->driverPrivate == NULL) 48377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt || (sInfo == NULL)) { 48477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return -1; 48577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 48677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 48777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intel_fb = dPriv->driverPrivate; 48877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_count = intel_fb->swap_count; 48977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_ust = intel_fb->swap_ust; 49077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_missed_count = intel_fb->swap_missed_count; 49177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 49277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0) 49377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt ? driCalculateSwapUsage(dPriv, 0, intel_fb->swap_missed_ust) 49477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt : 0.0; 49577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 49677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return 0; 49777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 49877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 49977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 50077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/* There are probably better ways to do this, such as an 50177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * init-designated function to register chipids and createcontext 50277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * functions. 50377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 50477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i830CreateContext(const __GLcontextModes * mesaVis, 50577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIcontextPrivate * driContextPriv, 50677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate); 50777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 50877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtextern GLboolean i915CreateContext(const __GLcontextModes * mesaVis, 50977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIcontextPrivate * driContextPriv, 51077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate); 511bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholtextern GLboolean brwCreateContext(const __GLcontextModes * mesaVis, 512bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt __DRIcontextPrivate * driContextPriv, 513bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt void *sharedContextPrivate); 51477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 51577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstatic GLboolean 51677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric AnholtintelCreateContext(const __GLcontextModes * mesaVis, 51777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIcontextPrivate * driContextPriv, 51877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt void *sharedContextPrivate) 51977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 52077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; 52177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; 52277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 523bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 52419420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (IS_9XX(intelScreen->deviceID)) { 52519420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt if (!IS_965(intelScreen->deviceID)) { 52619420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt return i915CreateContext(mesaVis, driContextPriv, 527bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt sharedContextPrivate); 52819420e6c2592e8a31e2ead4bccebc1a9ccca52b1Eric Anholt } 529bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt } else { 530cd031749a75883a6fbf8fb7bf989b77a7c705819Dave Airlie intelScreen->no_vbo = GL_TRUE; 53177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate); 53277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 533bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 534bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt if (IS_965(intelScreen->deviceID)) 535bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate); 536bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 537bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID); 538bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt return GL_FALSE; 53977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 54077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 54177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 542e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic __DRIconfig ** 5436cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian HøgsbergintelFillInModes(__DRIscreenPrivate *psp, 5446cb3f5c4d8618a14bb7ad1d9df10ed7e648a7b2bKristian Høgsberg unsigned pixel_bits, unsigned depth_bits, 54577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unsigned stencil_bits, GLboolean have_back_buffer) 54677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 547e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg __DRIconfig **configs; 54877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __GLcontextModes *m; 54977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unsigned depth_buffer_factor; 55077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt unsigned back_buffer_factor; 551e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg int i; 55277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 55377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const GLenum back_buffer_modes[] = { 5547c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg GLX_NONE, GLX_SWAP_UNDEFINED_OML, 5557c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg GLX_SWAP_EXCHANGE_OML, GLX_SWAP_COPY_OML 55677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt }; 55777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 5585a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint8_t depth_bits_array[3]; 5595a46e176715b0eae7b8a715e8aec42f5a27214fcKeith Whitwell uint8_t stencil_bits_array[3]; 560e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t msaa_samples_array[1]; 56177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 56277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_bits_array[0] = 0; 56377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_bits_array[1] = depth_bits; 56477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_bits_array[2] = depth_bits; 56577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 56677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Just like with the accumulation buffer, always provide some modes 56777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * with a stencil buffer. It will be a sw fallback, but some apps won't 56877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * care about that. 56977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 57077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[0] = 0; 57177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[1] = 0; 57277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (depth_bits == 24) 57377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits; 57477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 57577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits; 57677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 577eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 578eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 57977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1; 58077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt back_buffer_factor = (have_back_buffer) ? 3 : 1; 58177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 58277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (pixel_bits == 16) { 5835d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 5845d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits_array, stencil_bits_array, 5855d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_buffer_factor, back_buffer_modes, 5865d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_factor, 5875d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 1); 58877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 58977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt else { 5905d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs_a8r8g8b8; 5915d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs_x8r8g8b8; 5925d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt 5935d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs_a8r8g8b8 = driCreateConfigs(GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 5945d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits_array, 5955d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits_array, 5965d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_buffer_factor, 5975d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 5985d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_factor, 5995d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 1); 6005d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs_x8r8g8b8 = driCreateConfigs(GL_BGR, GL_UNSIGNED_INT_8_8_8_8_REV, 6015d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits_array, 6025d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits_array, 6035d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_buffer_factor, 6045d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 6055d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_factor, 6065d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 1); 6075d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt configs = driConcatConfigs(configs_a8r8g8b8, configs_x8r8g8b8); 60877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 60977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 610e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg if (configs == NULL) { 611e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 61277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt __LINE__); 61377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 61477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 61577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 61677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* Mark the visual as slow if there are "fake" stencil bits. 61777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 618e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg for (i = 0; configs[i]; i++) { 619e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg m = &configs[i]->modes; 62077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) { 62177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt m->visualRating = GLX_SLOW_CONFIG; 62277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 62377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 62477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 625e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return configs; 62677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 62777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 6287e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtstatic GLboolean 6297e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholtintel_init_bufmgr(intelScreenPrivate *intelScreen) 6307e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt{ 6317e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt int gem_kernel = 0; 6327e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt struct drm_i915_getparam gp; 6337e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt __DRIscreenPrivate *spriv = intelScreen->driScrnPriv; 634cb4ef34214d61fb48bdff689a85ea107060e061bEric Anholt int num_fences = 0; 6357e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6367e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen->no_hw = getenv("INTEL_NO_HW") != NULL; 6377e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6387e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gp.param = I915_PARAM_HAS_GEM; 6397e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt gp.value = &gem_kernel; 6407e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6417e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt (void) drmCommandWriteRead(spriv->fd, DRM_I915_GETPARAM, &gp, sizeof(gp)); 6427e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 6437e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt /* If we've got a new enough DDX that's initializing GEM and giving us 6447e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt * object handles for the shared buffers, use that. 6457e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt */ 6465727147f894137f194d8efc7adb81b80a9b5acd7Eric Anholt if (!intelScreen->driScrnPriv->dri2.enabled && 6475727147f894137f194d8efc7adb81b80a9b5acd7Eric Anholt intelScreen->driScrnPriv->ddx_version.minor < 9) { 648827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing GEM.\n", 649827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 650827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt return GL_FALSE; 6517e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 652827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt 653827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt intelScreen->bufmgr = intel_bufmgr_gem_init(spriv->fd, BATCH_SZ); 6547e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt /* Otherwise, use the classic buffer manager. */ 6557e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (intelScreen->bufmgr == NULL) { 656827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n", 657827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt __func__, __LINE__); 658827ba44f6ee83ab21c6a2b09323f6f1df4a7d4c8Eric Anholt return GL_FALSE; 6597e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt } 6607e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 661e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt if (intel_get_param(spriv, I915_PARAM_NUM_FENCES_AVAIL, &num_fences)) 662e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt intelScreen->kernel_exec_fencing = !!num_fences; 663e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt else 664e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt intelScreen->kernel_exec_fencing = GL_FALSE; 665e7aef006e50d0b859c621267af8376f5a0f43445Eric Anholt 6667e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_TRUE; 6677e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt} 6687e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 66977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt/** 67077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This is the driver specific part of the createNewScreen entry point. 6718d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using legacy DRI. 67277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 67377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \todo maybe fold this into intelInitDriver 67477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * 67577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * \return the __GLcontextModes supported by this driver 67677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 677e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp) 67877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 6797e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreenPrivate *intelScreen; 680bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#ifdef I915 68177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const __DRIversion ddx_expected = { 1, 5, 0 }; 682bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#else 683bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt static const __DRIversion ddx_expected = { 1, 6, 0 }; 684bea6b5fe5aa3138cec8d057766ae48da4aa57deeEric Anholt#endif 68577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const __DRIversion dri_expected = { 4, 0, 0 }; 68677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt static const __DRIversion drm_expected = { 1, 5, 0 }; 68777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv; 68877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 68977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!driCheckDriDdxDrmVersions2("i915", 69077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &psp->dri_version, &dri_expected, 69177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &psp->ddx_version, &ddx_expected, 69277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt &psp->drm_version, &drm_expected)) { 69377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 69477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 69577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 69677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (!intelInitDriver(psp)) 69777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 69877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 699e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 700e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 7017e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt intelScreen = psp->private; 7027e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!intel_init_bufmgr(intelScreen)) 7037e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_FALSE; 7047e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 705e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg return (const __DRIconfig **) 706e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg intelFillInModes(psp, dri_priv->cpp * 8, 707e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg (dri_priv->cpp == 2) ? 16 : 24, 708e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg (dri_priv->cpp == 2) ? 0 : 8, 1); 70977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 71077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 71177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholtstruct intel_context *intelScreenContext(intelScreenPrivate *intelScreen) 71277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt{ 71377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt /* 71477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * This should probably change to have the screen allocate a dummy 71577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt * context at screen creation. For now just use the current context. 71677a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt */ 71777a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 71877a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt GET_CURRENT_CONTEXT(ctx); 71977a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt if (ctx == NULL) { 72077a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt _mesa_problem(NULL, "No current context in intelScreenContext\n"); 72177a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return NULL; 72277a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt } 72377a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt return intel_context(ctx); 72477a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt} 72577a5bcaff43df8d54e0e0ef833726e4b41d7eb36Eric Anholt 726c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg/** 727c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * This is the driver specific part of the createNewScreen entry point. 7288d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * Called when using DRI2. 7298d976aedc4654bc66b80f22690e3674f1ef46183Brian Paul * 730c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg * \return the __GLcontextModes supported by this driver 731c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg */ 732e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergstatic const 733e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg__DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp) 734c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg{ 735c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreenPrivate *intelScreen; 7363ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_format[3]; 7373ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt GLenum fb_type[3]; 7387c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg 7393ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt static const GLenum back_buffer_modes[] = { 7407c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg GLX_NONE, GLX_SWAP_UNDEFINED_OML, 7417c50d29f7ced3d60e52ee0146d982b49ea421de2Kristian Høgsberg GLX_SWAP_EXCHANGE_OML, GLX_SWAP_COPY_OML 7423ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt }; 743e13593678f62941db06b7ae1a21b81c643371659Brian Paul uint8_t depth_bits[4], stencil_bits[4], msaa_samples_array[1]; 7443ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt int color; 7455d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **configs = NULL; 746c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 747c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* Allocate the private area */ 748c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate)); 749c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intelScreen) { 750c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg fprintf(stderr, "\nERROR! Allocating private area failed\n"); 751c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg return GL_FALSE; 752c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg } 753c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg /* parse information in __driConfigOptions */ 754c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg driParseOptionInfo(&intelScreen->optionCache, 755c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg __driConfigOptions, __driNConfigOptions); 756c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 757c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->driScrnPriv = psp; 758c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg psp->private = (void *) intelScreen; 759c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 760c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg intelScreen->drmMinor = psp->drm_version.minor; 761c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 762f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg /* Determine chipset ID */ 763c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID, 764c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg &intelScreen->deviceID)) 765c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg return GL_FALSE; 766c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7677e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt if (!intel_init_bufmgr(intelScreen)) 7687e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt return GL_FALSE; 7697e0bbdcf033981282978554c2e68ce48b55aa291Eric Anholt 770f56b569e9af356c11869ee49a4669bb01b75397eKristian Høgsberg intelScreen->irq_active = 1; 771e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg psp->extensions = intelScreenExtensions; 772c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg 7733ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[0] = 0; 7743ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[0] = 0; 7753ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[1] = 16; 7763ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[1] = 0; 7773ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[2] = 24; 7783ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[2] = 0; 7793ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt depth_bits[3] = 24; 7803ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt stencil_bits[3] = 8; 7813ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 782eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer msaa_samples_array[0] = 0; 783eaf15db895e3a5c6c5ccc2f23a4f0fa522855868Michel Dänzer 7843ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_format[0] = GL_RGB; 7853ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[0] = GL_UNSIGNED_SHORT_5_6_5; 7863ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 78724ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[1] = GL_BGR; 7883ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[1] = GL_UNSIGNED_INT_8_8_8_8_REV; 7893ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 79024ff169486e315671c09cd8a57a311a935ccfff5Eric Anholt fb_format[2] = GL_BGRA; 7913ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fb_type[2] = GL_UNSIGNED_INT_8_8_8_8_REV; 7923ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 793160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[0] = 0; 794160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[0] = 0; 795160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 7963ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt for (color = 0; color < ARRAY_SIZE(fb_format); color++) { 7975d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt __DRIconfig **new_configs; 798160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt int depth_factor; 799160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 800160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt /* With DRI2 right now, GetBuffers always returns a depth/stencil buffer 801160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt * with the same cpp as the drawable. So we can't support depth cpp != 802160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt * color cpp currently. 803160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt */ 804160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt if (fb_type[color] == GL_UNSIGNED_SHORT_5_6_5) { 805160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 16; 806160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 807160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt 808160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor = 2; 809160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } else { 810160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[1] = 24; 811160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[1] = 0; 812160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_bits[2] = 24; 813160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt stencil_bits[2] = 8; 8145d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt 815160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor = 3; 816160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt } 8175d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt new_configs = driCreateConfigs(fb_format[color], fb_type[color], 8185d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt depth_bits, 8195d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt stencil_bits, 820160c3617fc8867edc445b1ba62fc996c4630cc35Eric Anholt depth_factor, 8215d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt back_buffer_modes, 8225d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(back_buffer_modes), 8235d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt msaa_samples_array, 8245d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt ARRAY_SIZE(msaa_samples_array)); 8253ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) 8263ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = new_configs; 8273ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt else 8283ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt configs = driConcatConfigs(configs, new_configs); 8293ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8303ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8313ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt if (configs == NULL) { 8323ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, 8333ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt __LINE__); 8343ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt return NULL; 8353ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt } 8363ee21f30cda27e0ee1357f930163526622ba9434Eric Anholt 8375d5ae371eaeca7e33e638af3aee1ae8e162db0a7Eric Anholt return (const __DRIconfig **)configs; 838c5c73c1b605611faf0f06df9b5d08d8984388238Kristian Høgsberg} 839e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 840e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsbergconst struct __DriverAPIRec driDriverAPI = { 841e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .InitScreen = intelInitScreen, 842e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyScreen = intelDestroyScreen, 843e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateContext = intelCreateContext, 844e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyContext = intelDestroyContext, 845e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CreateBuffer = intelCreateBuffer, 846e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .DestroyBuffer = intelDestroyBuffer, 847e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .SwapBuffers = intelSwapBuffers, 848e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .MakeCurrent = intelMakeCurrent, 849e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .UnbindContext = intelUnbindContext, 850e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .GetSwapInfo = intelGetSwapInfo, 851e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .GetDrawableMSC = driDrawableGetMSC32, 852e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .WaitForMSC = driWaitForMSC32, 853e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .CopySubBuffer = intelCopySubBuffer, 854e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg 855e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg .InitScreen2 = intelInitScreen2, 856e82dd8c6e1fa2fff5b960de26961080ba5e9651dKristian Høgsberg}; 857