wined3d: Always use context_bind_fbo() to change the framebuffer binding.
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 49e2337..86e73c5 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -47,15 +47,24 @@
void context_bind_fbo(struct WineD3DContext *context, GLenum target, GLuint *fbo)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
+ GLuint f;
- if (!*fbo)
+ if (!fbo)
{
- GL_EXTCALL(glGenFramebuffersEXT(1, fbo));
- checkGLcall("glGenFramebuffersEXT()");
- TRACE("Created FBO %d\n", *fbo);
+ f = 0;
+ }
+ else
+ {
+ if (!*fbo)
+ {
+ GL_EXTCALL(glGenFramebuffersEXT(1, fbo));
+ checkGLcall("glGenFramebuffersEXT()");
+ TRACE("Created FBO %u.\n", *fbo);
+ }
+ f = *fbo;
}
- GL_EXTCALL(glBindFramebufferEXT(target, *fbo));
+ GL_EXTCALL(glBindFramebufferEXT(target, f));
checkGLcall("glBindFramebuffer()");
}
@@ -77,17 +86,14 @@
}
/* GL locking is done by the caller */
-static void context_destroy_fbo(struct WineD3DContext *context, const GLuint *fbo)
+static void context_destroy_fbo(struct WineD3DContext *context, GLuint *fbo)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, *fbo));
- checkGLcall("glBindFramebuffer()");
-
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, fbo);
context_clean_fbo_attachments(gl_info);
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
GL_EXTCALL(glDeleteFramebuffersEXT(1, fbo));
checkGLcall("glDeleteFramebuffers()");
}
@@ -308,8 +314,7 @@
IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
const struct wined3d_gl_info *gl_info = context->gl_info;
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, entry->id));
- checkGLcall("glBindFramebuffer()");
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, &entry->id);
context_clean_fbo_attachments(gl_info);
memcpy(entry->render_targets, device->render_targets, GL_LIMITS(buffers) * sizeof(*entry->render_targets));
@@ -419,7 +424,6 @@
static void context_apply_fbo_state(struct WineD3DContext *context)
{
IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.wineD3DDevice;
- const struct wined3d_gl_info *gl_info = context->gl_info;
if (device->render_offscreen)
{
@@ -427,7 +431,7 @@
context_apply_fbo_entry(context, context->current_fbo);
} else {
context->current_fbo = NULL;
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
}
context_check_fbo_status(context);
@@ -1800,8 +1804,7 @@
LEAVE_GL();
} else {
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glFramebufferRenderbufferEXT");
+ context_bind_fbo(context, GL_FRAMEBUFFER_EXT, NULL);
LEAVE_GL();
}
context->draw_buffer_dirty = TRUE;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index b9d60e2..a1ed4dc 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -6041,7 +6041,7 @@
ActivateContext(This, surface, CTXUSAGE_RESOURCELOAD);
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(This->activeContext, GL_FRAMEBUFFER_EXT, NULL);
buffer = surface_get_gl_buffer(surface, swapchain);
glDrawBuffer(buffer);
checkGLcall("glDrawBuffer()");
@@ -6083,8 +6083,7 @@
if (This->activeContext->current_fbo) {
context_bind_fbo(This->activeContext, GL_FRAMEBUFFER_EXT, &This->activeContext->current_fbo->id);
} else {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
+ context_bind_fbo(This->activeContext, GL_FRAMEBUFFER_EXT, NULL);
}
if (swapchain && surface == ((IWineD3DSwapChainImpl *)swapchain)->frontBuffer
@@ -6468,7 +6467,7 @@
}
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(This->activeContext, GL_READ_FRAMEBUFFER_EXT, NULL);
glReadBuffer(buffer);
checkGLcall("glReadBuffer()");
} else {
@@ -6507,7 +6506,7 @@
}
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(This->activeContext, GL_DRAW_FRAMEBUFFER_EXT, NULL);
glDrawBuffer(buffer);
checkGLcall("glDrawBuffer()");
} else {
@@ -6538,8 +6537,7 @@
if (This->activeContext->current_fbo) {
context_bind_fbo(This->activeContext, GL_FRAMEBUFFER_EXT, &This->activeContext->current_fbo->id);
} else {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
+ context_bind_fbo(This->activeContext, GL_FRAMEBUFFER_EXT, NULL);
}
/* If we switched from GL_BACK to GL_FRONT above, we need to switch back here */
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 4ff3245..0122e1e 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -4404,7 +4404,7 @@
/* Note that we use depth_blt here as well, rather than glCopyTexImage2D
* directly on the FBO texture. That's because we need to flip. */
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ context_bind_fbo(device->activeContext, GL_FRAMEBUFFER_EXT, NULL);
if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
{
glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
@@ -4451,8 +4451,7 @@
if (device->activeContext->current_fbo) {
context_bind_fbo(device->activeContext, GL_FRAMEBUFFER_EXT, &device->activeContext->current_fbo->id);
} else {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
+ context_bind_fbo(device->activeContext, GL_FRAMEBUFFER_EXT, NULL);
}
LEAVE_GL();
@@ -4465,15 +4464,13 @@
ENTER_GL();
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
- checkGLcall("glBindFramebuffer()");
+ context_bind_fbo(device->activeContext, GL_FRAMEBUFFER_EXT, NULL);
surface_depth_blt(This, This->texture_name, This->currentDesc.Width,
This->currentDesc.Height, This->texture_target);
checkGLcall("depth_blt");
if (device->activeContext->current_fbo) {
- GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, device->activeContext->current_fbo->id));
- checkGLcall("glBindFramebuffer()");
+ context_bind_fbo(device->activeContext, GL_FRAMEBUFFER_EXT, &device->activeContext->current_fbo->id);
}
LEAVE_GL();