Commit 08101957 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

wined3d: Explicitly pass render targets to context_apply_draw_buffers().

This avoids the special handling for blits.
parent 1848ae8d
...@@ -1961,17 +1961,12 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur ...@@ -1961,17 +1961,12 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
} }
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit) static void context_apply_draw_buffers(struct wined3d_context *context, UINT rt_count, IWineD3DSurfaceImpl **rts)
{ {
const struct wined3d_gl_info *gl_info = context->gl_info; if (!surface_is_offscreen(rts[0]))
IWineD3DSurfaceImpl *rt = context->current_rt;
IWineD3DDeviceImpl *device;
device = rt->resource.device;
if (!surface_is_offscreen(rt))
{ {
ENTER_GL(); ENTER_GL();
glDrawBuffer(surface_get_gl_buffer(rt)); glDrawBuffer(surface_get_gl_buffer(rts[0]));
checkGLcall("glDrawBuffer()"); checkGLcall("glDrawBuffer()");
LEAVE_GL(); LEAVE_GL();
} }
...@@ -1980,36 +1975,31 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit ...@@ -1980,36 +1975,31 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit
ENTER_GL(); ENTER_GL();
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{ {
if (!blit) const struct wined3d_gl_info *gl_info = context->gl_info;
{ unsigned int i;
unsigned int i;
for (i = 0; i < gl_info->limits.buffers; ++i)
{
if (device->render_targets[i])
context->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
else
context->draw_buffers[i] = GL_NONE;
}
if (gl_info->supported[ARB_DRAW_BUFFERS]) for (i = 0; i < gl_info->limits.buffers; ++i)
{ {
GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, context->draw_buffers)); if (i < rt_count && rts[i])
checkGLcall("glDrawBuffers()"); context->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
}
else else
{ context->draw_buffers[i] = GL_NONE;
glDrawBuffer(context->draw_buffers[0]); }
checkGLcall("glDrawBuffer()");
} if (gl_info->supported[ARB_DRAW_BUFFERS])
} else { {
glDrawBuffer(GL_COLOR_ATTACHMENT0); GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, context->draw_buffers));
checkGLcall("glDrawBuffers()");
}
else
{
glDrawBuffer(context->draw_buffers[0]);
checkGLcall("glDrawBuffer()"); checkGLcall("glDrawBuffer()");
} }
} }
else else
{ {
glDrawBuffer(device->offscreenBuffer); glDrawBuffer(rts[0]->resource.device->offscreenBuffer);
checkGLcall("glDrawBuffer()"); checkGLcall("glDrawBuffer()");
} }
LEAVE_GL(); LEAVE_GL();
...@@ -2122,7 +2112,7 @@ void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImp ...@@ -2122,7 +2112,7 @@ void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImp
if (context->draw_buffer_dirty) if (context->draw_buffer_dirty)
{ {
context_apply_draw_buffer(context, TRUE); context_apply_draw_buffers(context, 1, &context->current_rt);
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
context->draw_buffer_dirty = FALSE; context->draw_buffer_dirty = FALSE;
} }
...@@ -2252,7 +2242,7 @@ void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImp ...@@ -2252,7 +2242,7 @@ void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImp
if (context->draw_buffer_dirty) if (context->draw_buffer_dirty)
{ {
context_apply_draw_buffer(context, FALSE); context_apply_draw_buffers(context, context->gl_info->limits.buffers, device->render_targets);
context->draw_buffer_dirty = FALSE; context->draw_buffer_dirty = FALSE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment