From 0089c7f4ee99a8af41e2ab5134f833ea115cbaa6 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 20 Mar 2006 22:12:48 +0000 Subject: [PATCH] Checkpoint: render-to-texture starting to work. Had to turn off stencil in fbotexture.c. Teapot is drawn upside down, not centered... --- src/mesa/drivers/dri/i915/intel_buffers.c | 12 ++++++-- src/mesa/drivers/dri/i915/intel_fbo.c | 34 +++++++++++++++-------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/mesa/drivers/dri/i915/intel_buffers.c b/src/mesa/drivers/dri/i915/intel_buffers.c index f5c03d0b57e..6441df3d44f 100644 --- a/src/mesa/drivers/dri/i915/intel_buffers.c +++ b/src/mesa/drivers/dri/i915/intel_buffers.c @@ -128,8 +128,8 @@ static void intelBufferSize(GLframebuffer *buffer, */ static void intelSetRenderbufferClipRects( struct intel_context *intel ) { - ASSERT(intel->ctx.DrawBuffer->Width > 0); - ASSERT(intel->ctx.DrawBuffer->Height > 0); + assert(intel->ctx.DrawBuffer->Width > 0); + assert(intel->ctx.DrawBuffer->Height > 0); intel->fboRect.x1 = 0; intel->fboRect.y1 = 0; intel->fboRect.x2 = intel->ctx.DrawBuffer->Width; @@ -521,6 +521,14 @@ intelDrawBuffer(GLcontext *ctx, GLenum mode) _mesa_update_draw_buffer_bounds(ctx); } + if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { + /* this may occur when we're called by glBindFrameBuffer() during + * the process of someone setting up renderbuffers, etc. + */ + _mesa_debug(ctx, "DrawBuffer: incomplete user FBO\n"); + return; + } + /* * How many color buffers are we drawing into? */ diff --git a/src/mesa/drivers/dri/i915/intel_fbo.c b/src/mesa/drivers/dri/i915/intel_fbo.c index 962e4c01add..e2e173d7dee 100644 --- a/src/mesa/drivers/dri/i915/intel_fbo.c +++ b/src/mesa/drivers/dri/i915/intel_fbo.c @@ -428,7 +428,7 @@ intel_framebuffer_renderbuffer(GLcontext *ctx, static struct intel_renderbuffer * -intel_wrap_texture(GLcontext *ctx) +intel_wrap_texture(GLcontext *ctx, struct gl_texture_image *texImage) { const GLuint name = ~0; /* XXX OK? */ struct intel_renderbuffer *irb; @@ -442,7 +442,19 @@ intel_wrap_texture(GLcontext *ctx) _mesa_init_renderbuffer(&irb->Base, name); irb->Magic = MAGIC; /* XXX FBO temporary */ + irb->Base.Width = texImage->Width; + irb->Base.Height = texImage->Height; + irb->Base.InternalFormat = texImage->InternalFormat; /* XXX fix? */ + irb->Base._BaseFormat = texImage->TexFormat->BaseFormat; + irb->Base.DataType = GL_UNSIGNED_BYTE; /* FBO XXX fix */ + irb->Base.RedBits = texImage->TexFormat->RedBits; + irb->Base.GreenBits = texImage->TexFormat->GreenBits; + irb->Base.BlueBits = texImage->TexFormat->BlueBits; + irb->Base.AlphaBits = texImage->TexFormat->AlphaBits; + irb->Base.DepthBits = texImage->TexFormat->DepthBits; + irb->Base.Delete = intel_delete_renderbuffer; + /* XXX span funcs */ return irb; } @@ -469,7 +481,7 @@ intel_renderbuffer_texture(GLcontext *ctx, ASSERT(newImage); if (!irb) { - irb = intel_wrap_texture(ctx); + irb = intel_wrap_texture(ctx, newImage); if (!irb) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "render to texture"); return; @@ -484,11 +496,15 @@ intel_renderbuffer_texture(GLcontext *ctx, intel_region_reference(&irb->region, intel_image->mt->region); if (newImage->TexFormat == &_mesa_texformat_argb8888) { - _mesa_debug(ctx, "****** Render to texture OK\n"); + _mesa_debug(ctx, "Render to texture OK\n"); } else { - _mesa_debug(ctx, "****** Render to texture BAD FORMAT\n"); + _mesa_debug(ctx, "Render to texture BAD FORMAT\n"); } + + ctx->Driver.DrawBuffer(ctx, 0); /* second param is ignored */ + + } @@ -511,15 +527,9 @@ intel_finish_render_texture(GLcontext *ctx, _mesa_debug(ctx, "intel_finish_render_texture, refcount=%d\n", irb->Base.RefCount); + /* should never hit zero here */ + assert(irb->Base.RefCount > 0); - if (irb->Base.RefCount <= 0) { - _mesa_debug(ctx, "%s refcount == 0!\n", __FUNCTION__); -#if 0 - irb->Base.Delete(&irb->Base); -#endif - } - - /* XXX not finished? */ }