radeon_common_context.c revision 0bfa8dfaaf49703eb5c3237b5cae6201b8755e4d
123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/************************************************************************** 223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 323d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and 423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie VA Linux Systems Inc., Fremont, California. 523d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieCopyright (C) The Weather Channel, Inc. 2002. All Rights Reserved. 623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 723d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieThe Weather Channel (TM) funded Tungsten Graphics to develop the 823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieinitial release of the Radeon 8500 driver under the XFree86 license. 923d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieThis notice must be preserved. 1023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 1123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieAll Rights Reserved. 1223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 1323d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirliePermission is hereby granted, free of charge, to any person obtaining 1423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliea copy of this software and associated documentation files (the 1523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie"Software"), to deal in the Software without restriction, including 1623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliewithout limitation the rights to use, copy, modify, merge, publish, 1723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliedistribute, sublicense, and/or sell copies of the Software, and to 1823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliepermit persons to whom the Software is furnished to do so, subject to 1923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliethe following conditions: 2023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 2123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieThe above copyright notice and this permission notice (including the 2223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlienext paragraph) shall be included in all copies or substantial 2323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieportions of the Software. 2423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 2523d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2623d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2723d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2823d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 2923d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 3023d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 3123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 3223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 3323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie**************************************************************************/ 3423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 3523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "radeon_common.h" 3623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "xmlpool.h" /* for symbolic values of enum-type options */ 3723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "utils.h" 3823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#include "vblank.h" 39f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie#include "drirenderbuffer.h" 40e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/context.h" 416e30fe4873f30ccf9edec9ab6113ea647dccb9b7Dave Airlie#include "main/framebuffer.h" 42d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#include "main/state.h" 43e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "main/simple_list.h" 44e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast/swrast.h" 45e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "swrast_setup/swrast_setup.h" 46e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie#include "tnl/tnl.h" 4723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 4823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#define DRIVER_DATE "20090101" 4923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 5023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#ifndef RADEON_DEBUG 5123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieint RADEON_DEBUG = (0); 5223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie#endif 5323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 5423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Return various strings for glGetString(). 5523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */ 5623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic const GLubyte *radeonGetString(GLcontext * ctx, GLenum name) 5723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 5823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeonContextPtr radeon = RADEON_CONTEXT(ctx); 5923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie static char buffer[128]; 6023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 6123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie switch (name) { 6223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case GL_VENDOR: 6323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (IS_R300_CLASS(radeon->radeonScreen)) 6423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return (GLubyte *) "DRI R300 Project"; 6523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie else 6623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return (GLubyte *) "Tungsten Graphics, Inc."; 6723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 6823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case GL_RENDERER: 6923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie { 7023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie unsigned offset; 7123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie GLuint agp_mode = (radeon->radeonScreen->card_type==RADEON_CARD_PCI) ? 0 : 7223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->AGPMode; 7323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie const char* chipname; 7423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 7523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (IS_R300_CLASS(radeon->radeonScreen)) 7623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie chipname = "R300"; 7723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie else if (IS_R200_CLASS(radeon->radeonScreen)) 7823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie chipname = "R200"; 7923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie else 8023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie chipname = "R100"; 8123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 8223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie offset = driGetRendererString(buffer, chipname, DRIVER_DATE, 8323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie agp_mode); 8423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 8523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (IS_R300_CLASS(radeon->radeonScreen)) { 8623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie sprintf(&buffer[offset], " %sTCL", 8723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie (radeon->radeonScreen->chip_flags & RADEON_CHIPSET_TCL) 8823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie ? "" : "NO-"); 8923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } else { 9023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie sprintf(&buffer[offset], " %sTCL", 9123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie !(radeon->TclFallback & RADEON_TCL_FALLBACK_TCL_DISABLE) 9223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie ? "" : "NO-"); 9323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 9423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 9523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (radeon->radeonScreen->driScreen->dri2.enabled) 9623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie strcat(buffer, " DRI2"); 9723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 9823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return (GLubyte *) buffer; 9923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 10023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 10123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie default: 10223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return NULL; 10323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 10423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 10523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 10623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Initialize the driver's misc functions. 10723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */ 10823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void radeonInitDriverFuncs(struct dd_function_table *functions) 10923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 11023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie functions->GetString = radeonGetString; 11123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 11223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 11323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/** 11423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Create and initialize all common fields of the context, 11523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * including the Mesa context itself. 11623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */ 11723d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonInitContext(radeonContextPtr radeon, 11823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie struct dd_function_table* functions, 11923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie const __GLcontextModes * glVisual, 12023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie __DRIcontextPrivate * driContextPriv, 12123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie void *sharedContextPrivate) 12223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 12323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; 12423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeonScreenPtr screen = (radeonScreenPtr) (sPriv->private); 12523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie GLcontext* ctx; 12623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie GLcontext* shareCtx; 12723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie int fthrottle_mode; 12823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 12923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* Fill in additional standard functions. */ 13023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeonInitDriverFuncs(functions); 13123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 13223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen = screen; 13323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* Allocate and initialize the Mesa context */ 13423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (sharedContextPrivate) 13523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie shareCtx = ((radeonContextPtr)sharedContextPrivate)->glCtx; 13623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie else 13723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie shareCtx = NULL; 13823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->glCtx = _mesa_create_context(glVisual, shareCtx, 13923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie functions, (void *)radeon); 14023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!radeon->glCtx) 14123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return GL_FALSE; 14223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 14323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie ctx = radeon->glCtx; 14423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie driContextPriv->driverPrivate = radeon; 14523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 14623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* DRI fields */ 14723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.context = driContextPriv; 14823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.screen = sPriv; 14923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.drawable = NULL; 15023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.readable = NULL; 15123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.hwContext = driContextPriv->hHWContext; 15223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.hwLock = &sPriv->pSAREA->lock; 15323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.fd = sPriv->fd; 15423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->dri.drmMinor = sPriv->drm_version.minor; 15523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 15623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->sarea = (drm_radeon_sarea_t *) ((GLubyte *) sPriv->pSAREA + 15723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie screen->sarea_priv_offset); 15823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 15923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* Setup IRQs */ 16023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fthrottle_mode = driQueryOptioni(&radeon->optionCache, "fthrottle_mode"); 16123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->iw.irq_seq = -1; 16223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->irqsEmitted = 0; 16323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->do_irqs = (fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS && 16423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->irq); 16523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 16623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); 16723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 16823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!radeon->do_irqs) 16923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fprintf(stderr, 17023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie "IRQ's not enabled, falling back to %s: %d %d\n", 17123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->do_usleeps ? "usleeps" : "busy waits", 17223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fthrottle_mode, radeon->radeonScreen->irq); 1730a725db10c1491539d48370df7207206538bf945Dave Airlie 1740a725db10c1491539d48370df7207206538bf945Dave Airlie radeon->texture_depth = driQueryOptioni (&radeon->optionCache, 1750a725db10c1491539d48370df7207206538bf945Dave Airlie "texture_depth"); 1760a725db10c1491539d48370df7207206538bf945Dave Airlie if (radeon->texture_depth == DRI_CONF_TEXTURE_DEPTH_FB) 1770a725db10c1491539d48370df7207206538bf945Dave Airlie radeon->texture_depth = ( glVisual->rgbBits > 16 ) ? 1780a725db10c1491539d48370df7207206538bf945Dave Airlie DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16; 17923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 1800b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora radeon->texture_row_align = 32; 1810b22615c2c860968a027c04519e25864ae69f6cdMaciej Cencora 18223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return GL_TRUE; 18323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 18423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 185e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 186e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 187e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie/** 188e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * Destroy the command buffer and state atoms. 189e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie */ 190e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airliestatic void radeon_destroy_atom_list(radeonContextPtr radeon) 191e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie{ 192e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie struct radeon_state_atom *atom; 193e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 194e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie foreach(atom, &radeon->hw.atomlist) { 195e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie FREE(atom->cmd); 196e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie if (atom->lastcmd) 197e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie FREE(atom->lastcmd); 198e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie } 199e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 200e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie} 201e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 20223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/** 20323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Cleanup common context fields. 20423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * Called by r200DestroyContext/r300DestroyContext 20523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */ 206e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlievoid radeonDestroyContext(__DRIcontextPrivate *driContextPriv ) 20723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 208d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK 20923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie FILE *track; 210d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif 211e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie GET_CURRENT_CONTEXT(ctx); 212e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate; 213e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeonContextPtr current = ctx ? RADEON_CONTEXT(ctx) : NULL; 21423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 215e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie if (radeon == current) { 216e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeon_firevertices(radeon); 217e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie _mesa_make_current(NULL, NULL, NULL); 218e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie } 219e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 220e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie assert(radeon); 221e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie if (radeon) { 22223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 223e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie if (radeon->dma.current) { 224e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie rcommonFlushCmdBuf( radeon, __FUNCTION__ ); 225e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie } 22623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 22741702160090a4c1325afc07c56682f3e1c4fcaf0Dave Airlie radeonReleaseArrays(radeon->glCtx, ~0); 22823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 229e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie if (radeon->vtbl.free_context) 230e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeon->vtbl.free_context(radeon->glCtx); 231e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie _swsetup_DestroyContext( radeon->glCtx ); 232e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie _tnl_DestroyContext( radeon->glCtx ); 233e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie _vbo_DestroyContext( radeon->glCtx ); 234e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie _swrast_DestroyContext( radeon->glCtx ); 235e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 236e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeonDestroyBuffer(radeon->dri.drawable); 237e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeonDestroyBuffer(radeon->dri.readable); 238e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 239e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie /* free atom list */ 240e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie /* free the Mesa context */ 241e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie _mesa_destroy_context(radeon->glCtx); 242e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 243e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie /* _mesa_destroy_context() might result in calls to functions that 244e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * depend on the DriverCtx, so don't set it to NULL before. 245e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * 246e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie * radeon->glCtx->DriverCtx = NULL; 247e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie */ 248e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie /* free the option cache */ 249e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie driDestroyOptionCache(&radeon->optionCache); 250e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 251e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie rcommonDestroyCmdBuf(radeon); 252e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 253e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeon_destroy_atom_list(radeon); 254e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie 255e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie if (radeon->state.scissor.pClipRects) { 256e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie FREE(radeon->state.scissor.pClipRects); 257e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie radeon->state.scissor.pClipRects = 0; 258e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie } 25923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 260d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#ifdef RADEON_BO_TRACK 26123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie track = fopen("/tmp/tracklog", "w"); 26223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (track) { 26323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon_tracker_print(&radeon->radeonScreen->bom->tracker, track); 26423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fclose(track); 26523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 266d513915d27eac8a57ff7f5c1973b4a07fe288c53Dave Airlie#endif 267e00ef43d796f0ae0247b1072bf0aa8cdd8e3034dDave Airlie FREE(radeon); 26823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 26923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 27023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be unbound from its buffer. 27123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */ 27223d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonUnbindContext(__DRIcontextPrivate * driContextPriv) 27323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 27423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeonContextPtr radeon = (radeonContextPtr) driContextPriv->driverPrivate; 27523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 27623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (RADEON_DEBUG & DEBUG_DRI) 27723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fprintf(stderr, "%s ctx %p\n", __FUNCTION__, 27823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->glCtx); 27923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 28023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return GL_TRUE; 28123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 28223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 28323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 28423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void 28523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_kernel_renderbuffer_current(radeonContextPtr radeon, 2862b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct radeon_framebuffer *draw) 28723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 28823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* if radeon->fake */ 28923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie struct radeon_renderbuffer *rb; 29023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 2912b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) { 29223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 29323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 29423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->frontOffset, 29523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 29623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 29723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 29823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 29923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 30023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 30123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp; 30223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 3032b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) { 30423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 30523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 30623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->backOffset, 30723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 30823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 30923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 31023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 31123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 31223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 31323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->backPitch * rb->cpp; 31423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 3152b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) { 31623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 31723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 31823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->depthOffset, 31923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 32023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 32123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 32223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 32323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 32423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 32523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp; 32623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 3272b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) { 32823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 32923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 33023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->depthOffset, 33123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 33223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0, 33323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 33423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 33523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 33623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 33723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp; 33823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 33923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 34023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 34123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airliestatic void 34223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_make_renderbuffer_current(radeonContextPtr radeon, 3432b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct radeon_framebuffer *draw) 34423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 34523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie int size = 4096*4096*4; 34623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* if radeon->fake */ 34723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie struct radeon_renderbuffer *rb; 34823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 34923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (radeon->radeonScreen->kernel_mm) { 35023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon_make_kernel_renderbuffer_current(radeon, draw); 35123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return; 35223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 35323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 35423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 3552b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) { 35623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 35723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 35823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->frontOffset + 35923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->fbLocation, 36023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie size, 36123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 4096, 36223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 36323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 36423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 36523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 36623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp; 36723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 3682b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) { 36923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 37023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 37123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->backOffset + 37223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->fbLocation, 37323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie size, 37423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 4096, 37523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 37623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 37723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 37823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 37923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->backPitch * rb->cpp; 38023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 3812b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) { 38223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 38323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 38423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->depthOffset + 38523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->fbLocation, 38623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie size, 38723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 4096, 38823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 38923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 39023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 39123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 39223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp; 39323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 3942b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) { 39523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!rb->bo) { 39623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->bo = radeon_bo_open(radeon->radeonScreen->bom, 39723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->depthOffset + 39823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->radeonScreen->fbLocation, 39923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie size, 40023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 4096, 40123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie RADEON_GEM_DOMAIN_VRAM, 40223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 0); 40323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 40423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->cpp = radeon->radeonScreen->cpp; 40523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp; 40623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 40723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 40823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 40998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldstatic unsigned 41098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveldradeon_bits_per_pixel(const struct radeon_renderbuffer *rb) 41198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld{ 41298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld switch (rb->base._ActualFormat) { 41398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_RGB5: 41498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_DEPTH_COMPONENT16: 41598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld return 16; 41698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_RGB8: 41798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_RGBA8: 41898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_DEPTH_COMPONENT24: 41998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_DEPTH24_STENCIL8_EXT: 42098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case GL_STENCIL_INDEX8_EXT: 42198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld return 32; 42298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld default: 42398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld return 0; 42498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 42598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld} 42623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 42723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlievoid 42823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlieradeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) 42923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 43023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie unsigned int attachments[10]; 4310bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden __DRIbuffer *buffers = NULL; 43223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie __DRIscreen *screen; 43323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie struct radeon_renderbuffer *rb; 43423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie int i, count; 4352b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct radeon_framebuffer *draw; 43623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeonContextPtr radeon; 437bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie char *regname; 438f577c8e462fc924ea436d129ad64c8a1226b5f9cDave Airlie struct radeon_bo *depth_bo = NULL, *bo; 43923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 44023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (RADEON_DEBUG & DEBUG_DRI) 44123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable); 44223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 44323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie draw = drawable->driverPrivate; 44423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie screen = context->driScreenPriv; 44523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon = (radeonContextPtr) context->driverPrivate; 44698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 4470bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden if (screen->dri2.loader 4480bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden && (screen->dri2.loader->base.version > 2) 44998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld && (screen->dri2.loader->getBuffersWithFormat != NULL)) { 45098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld struct radeon_renderbuffer *depth_rb; 45198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld struct radeon_renderbuffer *stencil_rb; 45298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 45398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld i = 0; 45498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if ((radeon->is_front_buffer_rendering || !draw->color_rb[1]) 45598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld && draw->color_rb[0]) { 45698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_FRONT_LEFT; 45798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]); 45898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 45998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 46098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (draw->color_rb[1]) { 46198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_BACK_LEFT; 46298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]); 46398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 46498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 46598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH); 46698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL); 46798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 46898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if ((depth_rb != NULL) && (stencil_rb != NULL)) { 46998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; 47098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = radeon_bits_per_pixel(depth_rb); 47198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } else if (depth_rb != NULL) { 47298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_DEPTH; 47398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = radeon_bits_per_pixel(depth_rb); 47498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } else if (stencil_rb != NULL) { 47598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_STENCIL; 47698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = radeon_bits_per_pixel(stencil_rb); 47798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 47898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 47998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld buffers = (*screen->dri2.loader->getBuffersWithFormat)(drawable, 48098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld &drawable->w, 48198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld &drawable->h, 48298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments, i / 2, 48398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld &count, 48498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld drawable->loaderPrivate); 4850bfa8dfaaf49703eb5c3237b5cae6201b8755e4dTormod Volden } else if (screen->dri2.loader) { 48698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld i = 0; 48798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (draw->color_rb[0]) 48898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_FRONT_LEFT; 48998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (draw->color_rb[1]) 49098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_BACK_LEFT; 49198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH)) 49298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_DEPTH; 49398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL)) 49498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments[i++] = __DRI_BUFFER_STENCIL; 49523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 49698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld buffers = (*screen->dri2.loader->getBuffers)(drawable, 49798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld &drawable->w, 49898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld &drawable->h, 49998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld attachments, i, 50098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld &count, 50198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld drawable->loaderPrivate); 50298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 50398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 50423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (buffers == NULL) 50523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return; 50623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 50723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie /* set one cliprect to cover the whole drawable */ 50823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->x = 0; 50923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->y = 0; 51023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->backX = 0; 51123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->backY = 0; 51223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->numClipRects = 1; 51323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pClipRects[0].x1 = 0; 51423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pClipRects[0].y1 = 0; 51523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pClipRects[0].x2 = drawable->w; 51623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pClipRects[0].y2 = drawable->h; 51723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->numBackClipRects = 1; 51823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pBackClipRects[0].x1 = 0; 51923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pBackClipRects[0].y1 = 0; 52023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pBackClipRects[0].x2 = drawable->w; 52123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie drawable->pBackClipRects[0].y2 = drawable->h; 52223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie for (i = 0; i < count; i++) { 52323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie switch (buffers[i].attachment) { 52423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case __DRI_BUFFER_FRONT_LEFT: 525bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb = draw->color_rb[0]; 526bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie regname = "dri2 front buffer"; 52723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie break; 52898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case __DRI_BUFFER_FAKE_FRONT_LEFT: 52998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld rb = draw->color_rb[0]; 53098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld regname = "dri2 fake front buffer"; 53198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld break; 53223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case __DRI_BUFFER_BACK_LEFT: 533bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb = draw->color_rb[1]; 534bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie regname = "dri2 back buffer"; 53523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie break; 53623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case __DRI_BUFFER_DEPTH: 537bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH); 538bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie regname = "dri2 depth buffer"; 53923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie break; 54098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld case __DRI_BUFFER_DEPTH_STENCIL: 54198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH); 54298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld regname = "dri2 depth / stencil buffer"; 54398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld break; 54423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case __DRI_BUFFER_STENCIL: 5458c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL); 546bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie regname = "dri2 stencil buffer"; 54723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie break; 54823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie case __DRI_BUFFER_ACCUM: 54923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie default: 55023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fprintf(stderr, 55123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie "unhandled buffer attach event, attacment type %d\n", 55223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie buffers[i].attachment); 55323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return; 55423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 555bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie 556bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie if (rb == NULL) 557bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie continue; 558bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie 559bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie if (rb->bo) { 5608c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie uint32_t name = radeon_gem_name_bo(rb->bo); 5618c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (name == buffers[i].name) 5628c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie continue; 563bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie } 5648c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 5658c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (RADEON_DEBUG & DEBUG_DRI) 5668c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie fprintf(stderr, 5678c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie "attaching buffer %s, %d, at %d, cpp %d, pitch %d\n", 5688c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie regname, buffers[i].name, buffers[i].attachment, 5698c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie buffers[i].cpp, buffers[i].pitch); 5708c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 571bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb->cpp = buffers[i].cpp; 572bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb->pitch = buffers[i].pitch; 573bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb->width = drawable->w; 574bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb->height = drawable->h; 575bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie rb->has_surface = 0; 576bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie 5778c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (buffers[i].attachment == __DRI_BUFFER_STENCIL && depth_bo) { 5788c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (RADEON_DEBUG & DEBUG_DRI) 5798c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie fprintf(stderr, "(reusing depth buffer as stencil)\n"); 5808c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie bo = depth_bo; 5818c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie radeon_bo_ref(bo); 5828c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } else { 5838c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie bo = radeon_bo_open(radeon->radeonScreen->bom, 5848c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie buffers[i].name, 5858c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 0, 5868c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 0, 5878c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie RADEON_GEM_DOMAIN_VRAM, 5888c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie buffers[i].flags); 5898c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie if (bo == NULL) { 5908c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 5918c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie fprintf(stderr, "failed to attach %s %d\n", 5928c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie regname, buffers[i].name); 5938c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 5948c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie } 595bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie } 5968c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 597d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie if (buffers[i].attachment == __DRI_BUFFER_DEPTH) { 598d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie if (draw->base.Visual.depthBits == 16) 599d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie rb->cpp = 2; 6008c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie depth_bo = bo; 601d81a48757a9bde35299fd7c3cfbe83885238409aDave Airlie } 6028c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie 6038c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie radeon_renderbuffer_set_bo(rb, bo); 6048c7e30fb950c83f5e9e29e60735e999ac608145aDave Airlie radeon_bo_unref(bo); 60598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 60698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) { 60798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL); 60898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (rb != NULL) { 60998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld struct radeon_bo *stencil_bo = NULL; 61098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 61198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (rb->bo) { 61298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld uint32_t name = radeon_gem_name_bo(rb->bo); 61398bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld if (name == buffers[i].name) 61498bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld continue; 61598bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 61698bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld 61798bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld stencil_bo = bo; 61898bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld radeon_bo_ref(stencil_bo); 61998bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld radeon_renderbuffer_set_bo(rb, stencil_bo); 62098bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld radeon_bo_unref(stencil_bo); 62198bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 62298bb5c610dc68d8e9a185216ce9d2dc6d278c114Joel Bosveld } 62323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 624bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie 62523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie driUpdateFramebufferSize(radeon->glCtx, drawable); 62623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 62723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 62823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie/* Force the context `c' to be the current context and associate with it 62923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie * buffer `b'. 63023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie */ 63123d3559bd4ece1fcab5513ebdaa38600d6654374Dave AirlieGLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv, 63223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie __DRIdrawablePrivate * driDrawPriv, 63323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie __DRIdrawablePrivate * driReadPriv) 63423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie{ 63523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeonContextPtr radeon; 6362b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct radeon_framebuffer *drfb; 6372b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie struct gl_framebuffer *readfb; 63823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 63923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (!driContextPriv) { 64023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (RADEON_DEBUG & DEBUG_DRI) 64123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fprintf(stderr, "%s ctx is null\n", __FUNCTION__); 64223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie _mesa_make_current(NULL, NULL, NULL); 64323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return GL_TRUE; 64423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 6452b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 64623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon = (radeonContextPtr) driContextPriv->driverPrivate; 6472b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie drfb = driDrawPriv->driverPrivate; 6482b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie readfb = driReadPriv->driverPrivate; 64923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 65023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (driContextPriv->driScreenPriv->dri2.enabled) { 65123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon_update_renderbuffers(driContextPriv, driDrawPriv); 65223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (driDrawPriv != driReadPriv) 65323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon_update_renderbuffers(driContextPriv, driReadPriv); 65423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->state.color.rrb = 655bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT); 65623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie radeon->state.depth.rrb = 657bdaa0341caffc353fd26bbd91865c2d86eed11c1Dave Airlie radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH); 65823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } else { 6592b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie radeon_make_renderbuffer_current(radeon, drfb); 66023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 66123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 66223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 66323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (RADEON_DEBUG & DEBUG_DRI) 6642b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb); 66523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 666e0de73e8a558db5dfe8e20ed7aa2e9eae28861c1Dave Airlie if (radeon->dri.readable != driReadPriv) 667e0de73e8a558db5dfe8e20ed7aa2e9eae28861c1Dave Airlie radeon->dri.readable = driReadPriv; 668e0de73e8a558db5dfe8e20ed7aa2e9eae28861c1Dave Airlie 66923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie driUpdateFramebufferSize(radeon->glCtx, driDrawPriv); 67023d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (driReadPriv != driDrawPriv) 67123d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie driUpdateFramebufferSize(radeon->glCtx, driReadPriv); 67223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 6732b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie _mesa_make_current(radeon->glCtx, &drfb->base, readfb); 67423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 6752b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie _mesa_update_state(radeon->glCtx); 67623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 6772b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if (radeon->glCtx->DrawBuffer == &drfb->base) { 67823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 6792b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if (radeon->dri.drawable != driDrawPriv) { 6802b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if (driDrawPriv->swap_interval == (unsigned)-1) { 6812b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie int i; 6822b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie driDrawPriv->vblFlags = 6832b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie (radeon->radeonScreen->irq != 0) 6842b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie ? driGetDefaultVBlankFlags(&radeon-> 6852b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie optionCache) 6862b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie : VBLANK_FLAG_NO_IRQ; 6872b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 6882b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie driDrawableInitVBlank(driDrawPriv); 6892b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie drfb->vbl_waited = driDrawPriv->vblSeq; 6902b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 6912b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie for (i = 0; i < 2; i++) { 6922b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie if (drfb->color_rb[i]) 6932b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie drfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq; 6942b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie } 6952b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 6962b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie } 6972b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie radeon->dri.drawable = driDrawPriv; 6982b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie 699778cf80d9e462ca26e660dca1910328f66f6427dDave Airlie radeon_window_moved(radeon); 7002b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie } 7012b85fccae5ba33748846f74f90fe0f72c673a4b1Dave Airlie radeon_draw_buffer(radeon->glCtx, &drfb->base); 70223d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie } 70323d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 70423d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 70523d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie if (RADEON_DEBUG & DEBUG_DRI) 70623d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie fprintf(stderr, "End %s\n", __FUNCTION__); 70723d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie return GL_TRUE; 70823d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie} 70923d3559bd4ece1fcab5513ebdaa38600d6654374Dave Airlie 710