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:
@@ -488,7 +488,7 @@ intel_new_renderbuffer(GLcontext * ctx, GLuint name)
|
||||
*/
|
||||
static void
|
||||
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) {
|
||||
intel_draw_buffer(ctx, fb);
|
||||
|
@@ -390,9 +390,12 @@ nouveauNewRenderbuffer(GLcontext *ctx, GLuint name)
|
||||
}
|
||||
|
||||
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
|
||||
|
@@ -782,7 +782,7 @@ struct dd_function_table {
|
||||
struct gl_framebuffer * (*NewFramebuffer)(GLcontext *ctx, GLuint name);
|
||||
struct gl_renderbuffer * (*NewRenderbuffer)(GLcontext *ctx, GLuint name);
|
||||
void (*BindFramebuffer)(GLcontext *ctx, GLenum target,
|
||||
struct gl_framebuffer *fb);
|
||||
struct gl_framebuffer *fb, struct gl_framebuffer *fbread);
|
||||
void (*FramebufferRenderbuffer)(GLcontext *ctx,
|
||||
struct gl_framebuffer *fb,
|
||||
GLenum attachment,
|
||||
|
@@ -924,7 +924,7 @@ check_end_texture_render(GLcontext *ctx, struct gl_framebuffer *fb)
|
||||
void GLAPIENTRY
|
||||
_mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
|
||||
{
|
||||
struct gl_framebuffer *newFb;
|
||||
struct gl_framebuffer *newFb, *newFbread;
|
||||
GLboolean bindReadBuf, bindDrawBuf;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
@@ -984,12 +984,14 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
|
||||
}
|
||||
_mesa_HashInsert(ctx->Shared->FrameBuffers, framebuffer, newFb);
|
||||
}
|
||||
newFbread = newFb;
|
||||
}
|
||||
else {
|
||||
/* Binding the window system framebuffer (which was originally set
|
||||
* with MakeCurrent).
|
||||
*/
|
||||
newFb = ctx->WinSysDrawBuffer;
|
||||
newFbread = ctx->WinSysReadBuffer;
|
||||
}
|
||||
|
||||
ASSERT(newFb);
|
||||
@@ -1000,7 +1002,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
|
||||
*/
|
||||
|
||||
if (bindReadBuf) {
|
||||
_mesa_reference_framebuffer(&ctx->ReadBuffer, newFb);
|
||||
_mesa_reference_framebuffer(&ctx->ReadBuffer, newFbread);
|
||||
}
|
||||
|
||||
if (bindDrawBuf) {
|
||||
@@ -1015,7 +1017,7 @@ _mesa_BindFramebufferEXT(GLenum target, GLuint framebuffer)
|
||||
}
|
||||
|
||||
if (ctx->Driver.BindFramebuffer) {
|
||||
ctx->Driver.BindFramebuffer(ctx, target, newFb);
|
||||
ctx->Driver.BindFramebuffer(ctx, target, newFb, newFbread);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user