diff options
| author | Michel Dänzer <daenzer@vmware.com> | 2009-12-05 17:20:03 +0100 | 
|---|---|---|
| committer | Michel Dänzer <michel@daenzer.net> | 2009-12-05 17:54:23 +0100 | 
| commit | 433f0a82f5a4696e6b0c4061f645485ec8079bb4 (patch) | |
| tree | d453439a4d5ecd7e921419a8d02428ab38772eaf | |
| parent | 5b1a7843f841b2bfdd54538a2eaad9dadae3e09d (diff) | |
radeon: Only get DRI2 front buffer information for glXBindTexImageEXT.
| -rw-r--r-- | src/mesa/drivers/dri/r300/r300_texstate.c | 13 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_common.c | 8 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_common_context.c | 55 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/radeon/radeon_common_context.h | 3 | 
4 files changed, 37 insertions, 42 deletions
| diff --git a/src/mesa/drivers/dri/r300/r300_texstate.c b/src/mesa/drivers/dri/r300/r300_texstate.c index e6f2c0c1a7..9eaf390b46 100644 --- a/src/mesa/drivers/dri/r300/r300_texstate.c +++ b/src/mesa/drivers/dri/r300/r300_texstate.c @@ -409,18 +409,7 @@ void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo      	    return;      	} -	radeon_update_renderbuffers(pDRICtx, dPriv); -	/* back & depth buffer are useless free them right away */ -	rb = (void*)rfb->base.Attachment[BUFFER_DEPTH].Renderbuffer; -	if (rb && rb->bo) { -		radeon_bo_unref(rb->bo); -        rb->bo = NULL; -	} -	rb = (void*)rfb->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer; -	if (rb && rb->bo) { -		radeon_bo_unref(rb->bo); -		rb->bo = NULL; -	} +	radeon_update_renderbuffers(pDRICtx, dPriv, GL_TRUE);  	rb = rfb->color_rb[0];  	if (rb->bo == NULL) {  		/* Failed to BO for the buffer */ diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c b/src/mesa/drivers/dri/radeon/radeon_common.c index 184287aa44..c81e80e820 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common.c +++ b/src/mesa/drivers/dri/radeon/radeon_common.c @@ -840,7 +840,7 @@ void radeonDrawBuffer( GLcontext *ctx, GLenum mode )         */  		if (!was_front_buffer_rendering && radeon->is_front_buffer_rendering) {  			radeon_update_renderbuffers(radeon->dri.context, -				radeon->dri.context->driDrawablePriv); +				radeon->dri.context->driDrawablePriv, GL_FALSE);        }  	} @@ -857,7 +857,7 @@ void radeonReadBuffer( GLcontext *ctx, GLenum mode )  		if (!was_front_buffer_reading && rmesa->is_front_buffer_reading) {  			radeon_update_renderbuffers(rmesa->dri.context, -						    rmesa->dri.context->driReadablePriv); +						    rmesa->dri.context->driReadablePriv, GL_FALSE);  	 	}  	}  	/* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */ @@ -908,9 +908,9 @@ void radeon_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei he  		if (radeon->is_front_buffer_rendering) {  			ctx->Driver.Flush(ctx);  		} -		radeon_update_renderbuffers(driContext, driContext->driDrawablePriv); +		radeon_update_renderbuffers(driContext, driContext->driDrawablePriv, GL_FALSE);  		if (driContext->driDrawablePriv != driContext->driReadablePriv) -			radeon_update_renderbuffers(driContext, driContext->driReadablePriv); +			radeon_update_renderbuffers(driContext, driContext->driReadablePriv, GL_FALSE);  	}  	old_viewport = ctx->Driver.Viewport; diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c index 71f70d724b..5c68bf5df6 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.c +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c @@ -499,7 +499,8 @@ radeon_bits_per_pixel(const struct radeon_renderbuffer *rb)  }  void -radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) +radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable, +			    GLboolean front_only)  {  	unsigned int attachments[10];  	__DRIbuffer *buffers = NULL; @@ -525,7 +526,7 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)  		struct radeon_renderbuffer *stencil_rb;  		i = 0; -		if ((radeon->is_front_buffer_rendering || +		if ((front_only || radeon->is_front_buffer_rendering ||  		     radeon->is_front_buffer_reading ||  		     !draw->color_rb[1])  		    && draw->color_rb[0]) { @@ -533,23 +534,25 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)  			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]);  		} -		if (draw->color_rb[1]) { -			attachments[i++] = __DRI_BUFFER_BACK_LEFT; -			attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]); -		} +		if (!front_only) { +			if (draw->color_rb[1]) { +				attachments[i++] = __DRI_BUFFER_BACK_LEFT; +				attachments[i++] = radeon_bits_per_pixel(draw->color_rb[1]); +			} -		depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH); -		stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL); +			depth_rb = radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH); +			stencil_rb = radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL); -		if ((depth_rb != NULL) && (stencil_rb != NULL)) { -			attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; -			attachments[i++] = radeon_bits_per_pixel(depth_rb); -		} else if (depth_rb != NULL) { -			attachments[i++] = __DRI_BUFFER_DEPTH; -			attachments[i++] = radeon_bits_per_pixel(depth_rb); -		} else if (stencil_rb != NULL) { -			attachments[i++] = __DRI_BUFFER_STENCIL; -			attachments[i++] = radeon_bits_per_pixel(stencil_rb); +			if ((depth_rb != NULL) && (stencil_rb != NULL)) { +				attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; +				attachments[i++] = radeon_bits_per_pixel(depth_rb); +			} else if (depth_rb != NULL) { +				attachments[i++] = __DRI_BUFFER_DEPTH; +				attachments[i++] = radeon_bits_per_pixel(depth_rb); +			} else if (stencil_rb != NULL) { +				attachments[i++] = __DRI_BUFFER_STENCIL; +				attachments[i++] = radeon_bits_per_pixel(stencil_rb); +			}  		}  		buffers = (*screen->dri2.loader->getBuffersWithFormat)(drawable, @@ -562,12 +565,14 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)  		i = 0;  		if (draw->color_rb[0])  			attachments[i++] = __DRI_BUFFER_FRONT_LEFT; -		if (draw->color_rb[1]) -			attachments[i++] = __DRI_BUFFER_BACK_LEFT; -		if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH)) -			attachments[i++] = __DRI_BUFFER_DEPTH; -		if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL)) -			attachments[i++] = __DRI_BUFFER_STENCIL; +		if (!front_only) { +			if (draw->color_rb[1]) +				attachments[i++] = __DRI_BUFFER_BACK_LEFT; +			if (radeon_get_renderbuffer(&draw->base, BUFFER_DEPTH)) +				attachments[i++] = __DRI_BUFFER_DEPTH; +			if (radeon_get_renderbuffer(&draw->base, BUFFER_STENCIL)) +				attachments[i++] = __DRI_BUFFER_STENCIL; +		}  		buffers = (*screen->dri2.loader->getBuffers)(drawable,  								 &drawable->w, @@ -735,9 +740,9 @@ GLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,  	readfb = driReadPriv->driverPrivate;  	if (driContextPriv->driScreenPriv->dri2.enabled) { -		radeon_update_renderbuffers(driContextPriv, driDrawPriv); +		radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);  		if (driDrawPriv != driReadPriv) -			radeon_update_renderbuffers(driContextPriv, driReadPriv); +			radeon_update_renderbuffers(driContextPriv, driReadPriv, GL_FALSE);  		_mesa_reference_renderbuffer(&radeon->state.color.rb,  			&(radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT)->base));  		_mesa_reference_renderbuffer(&radeon->state.depth.rb, diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.h b/src/mesa/drivers/dri/radeon/radeon_common_context.h index ad953ddbb5..49a9ec5610 100644 --- a/src/mesa/drivers/dri/radeon/radeon_common_context.h +++ b/src/mesa/drivers/dri/radeon/radeon_common_context.h @@ -589,7 +589,8 @@ GLboolean radeonInitContext(radeonContextPtr radeon,  void radeonCleanupContext(radeonContextPtr radeon);  GLboolean radeonUnbindContext(__DRIcontextPrivate * driContextPriv); -void radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable); +void radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable, +				 GLboolean front_only);  GLboolean radeonMakeCurrent(__DRIcontextPrivate * driContextPriv,  			    __DRIdrawablePrivate * driDrawPriv,  			    __DRIdrawablePrivate * driReadPriv); | 
