fix mesa fb binding

Make sure that we bind the right buffer (draw or read) when rebinding
the window framebuffer (the api doesn't allow binding different draw and
read buffers at the same time, but the default window framebuffer is basically
2 fb objects, one for read, one for write, which can be different). Pass both
of these two down the driver api (no driver uses this right now).
This commit is contained in:
Roland Scheidegger
2007-07-17 17:29:55 +02:00
parent b9f2cf9a4e
commit dbfb375805
4 changed files with 12 additions and 7 deletions

View File

@@ -488,7 +488,7 @@ intel_new_renderbuffer(GLcontext * ctx, GLuint name)
*/ */
static void static void
intel_bind_framebuffer(GLcontext * ctx, GLenum target, intel_bind_framebuffer(GLcontext * ctx, GLenum target,
struct gl_framebuffer *fb) struct gl_framebuffer *fb, struct gl_framebuffer *fbread)
{ {
if (target == GL_FRAMEBUFFER_EXT || target == GL_DRAW_FRAMEBUFFER_EXT) { if (target == GL_FRAMEBUFFER_EXT || target == GL_DRAW_FRAMEBUFFER_EXT) {
intel_draw_buffer(ctx, fb); intel_draw_buffer(ctx, fb);

View File

@@ -390,9 +390,12 @@ nouveauNewRenderbuffer(GLcontext *ctx, GLuint name)
} }
static void static void
nouveauBindFramebuffer(GLcontext *ctx, GLenum target, struct gl_framebuffer *fb) nouveauBindFramebuffer(GLcontext *ctx, GLenum target,
struct gl_framebuffer *fb, struct gl_framebuffer *fbread)
{ {
nouveau_build_framebuffer(ctx, fb); if (target == GL_FRAMEBUFFER_EXT || target == GL_DRAW_FRAMEBUFFER_EXT) {
nouveau_build_framebuffer(ctx, fb);
}
} }
static void static void

View File

@@ -782,7 +782,7 @@ struct dd_function_table {
struct gl_framebuffer * (*NewFramebuffer)(GLcontext *ctx, GLuint name); struct gl_framebuffer * (*NewFramebuffer)(GLcontext *ctx, GLuint name);
struct gl_renderbuffer * (*NewRenderbuffer)(GLcontext *ctx, GLuint name); struct gl_renderbuffer * (*NewRenderbuffer)(GLcontext *ctx, GLuint name);
void (*BindFramebuffer)(GLcontext *ctx, GLenum target, void (*BindFramebuffer)(GLcontext *ctx, GLenum target,
struct gl_framebuffer *fb); struct gl_framebuffer *fb, struct gl_framebuffer *fbread);
void (*FramebufferRenderbuffer)(GLcontext *ctx, void (*FramebufferRenderbuffer)(GLcontext *ctx,
struct gl_framebuffer *fb, struct gl_framebuffer *fb,
GLenum attachment, GLenum attachment,

View File

@@ -924,7 +924,7 @@ check_end_texture_render(GLcontext *ctx, struct gl_framebuffer *fb)
void GLAPIENTRY void GLAPIENTRY
_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer) _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
{ {
struct gl_framebuffer *newFb; struct gl_framebuffer *newFb, *newFbread;
GLboolean bindReadBuf, bindDrawBuf; GLboolean bindReadBuf, bindDrawBuf;
GET_CURRENT_CONTEXT(ctx); GET_CURRENT_CONTEXT(ctx);
@@ -984,12 +984,14 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
} }
_mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb); _mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb);
} }
newFbread = newFb;
} }
else { else {
/* Binding the window system framebuffer (which was originally set /* Binding the window system framebuffer (which was originally set
* with MakeCurrent). * with MakeCurrent).
*/ */
newFb = ctx->WinSysDrawBuffer; newFb = ctx->WinSysDrawBuffer;
newFbread = ctx->WinSysReadBuffer;
} }
ASSERT(newFb); ASSERT(newFb);
@@ -1000,7 +1002,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
*/ */
if (bindReadBuf) { if (bindReadBuf) {
_mesa_reference_framebuffer(&ctx->ReadBuffer, newFb); _mesa_reference_framebuffer(&ctx->ReadBuffer, newFbread);
} }
if (bindDrawBuf) { if (bindDrawBuf) {
@@ -1015,7 +1017,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
} }
if (ctx->Driver.BindFramebuffer) { if (ctx->Driver.BindFramebuffer) {
ctx->Driver.BindFramebuffer(ctx, target, newFb); ctx->Driver.BindFramebuffer(ctx, target, newFb, newFbread);
} }
} }