[3/3] wined3d: Fix draw buffers tracking.

Matteo Bruni matteo.mystral at gmail.com
Tue Jun 21 16:49:45 CDT 2011


-------------- next part --------------
From 475eb9333e29e1d8869ae742407cf4a8ca1a37d5 Mon Sep 17 00:00:00 2001
From: Matteo Bruni <mbruni at codeweavers.com>
Date: Fri, 17 Jun 2011 19:28:38 +0200
Subject: wined3d: Fix draw buffers tracking.

Commit 002674e49d3343d2ad4670081276e38af867eefe didn't cover all the
cases.
---
 dlls/wined3d/context.c |   30 +++++++++++++++++++++++-------
 1 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index f7fb6c5..6c31bb2 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1986,7 +1986,7 @@ static inline GLenum draw_buffer_from_rt_mask(DWORD rt_mask)
 }
 
 /* Context activation and GL locking are done by the caller. */
-static void context_apply_draw_buffers(struct wined3d_context *context, DWORD rt_mask, struct wined3d_surface **rts)
+static void context_apply_draw_buffers(struct wined3d_context *context, DWORD rt_mask)
 {
     if (!rt_mask)
     {
@@ -2007,7 +2007,7 @@ static void context_apply_draw_buffers(struct wined3d_context *context, DWORD rt
 
             while (rt_mask)
             {
-                if ((rt_mask & 1) && rts[i] && rts[i]->resource.format->id != WINED3DFMT_NULL)
+                if (rt_mask & 1)
                     context->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
                 else
                     context->draw_buffers[i] = GL_NONE;
@@ -2110,7 +2110,10 @@ void context_apply_blit_state(struct wined3d_context *context, struct wined3d_de
             ENTER_GL();
             context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, context->current_rt, NULL, SFLAG_INTEXTURE);
             LEAVE_GL();
-            rt_mask = 1;
+            if (context->current_rt && context->current_rt->resource.format->id != WINED3DFMT_NULL)
+                rt_mask = 1;
+            else
+                rt_mask = 0;
         }
         else
         {
@@ -2128,7 +2131,7 @@ void context_apply_blit_state(struct wined3d_context *context, struct wined3d_de
     ENTER_GL();
     if (rt_mask != context->draw_buffers_mask)
     {
-        context_apply_draw_buffers(context, rt_mask, &context->current_rt);
+        context_apply_draw_buffers(context, rt_mask);
         context->draw_buffers_mask = rt_mask;
     }
 
@@ -2181,7 +2184,8 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
             for (i = 0; i < rt_count; ++i)
             {
                 context->blit_targets[i] = rts[i];
-                rt_mask |= (1 << i);
+                if (rts[i] && rts[i]->resource.format->id != WINED3DFMT_NULL)
+                    rt_mask |= (1 << i);
             }
             while (i < context->gl_info->limits.buffers)
             {
@@ -2208,7 +2212,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, struct wined3d_d
     ENTER_GL();
     if (rt_mask != context->draw_buffers_mask)
     {
-        context_apply_draw_buffers(context, rt_mask, rts);
+        context_apply_draw_buffers(context, rt_mask);
         context->draw_buffers_mask = rt_mask;
     }
 
@@ -2272,6 +2276,8 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de
         else
         {
             const struct wined3d_shader *ps = device->stateBlock->state.pixel_shader;
+            DWORD rt_mask_bits;
+            struct wined3d_surface **rts = fb->render_targets;
 
             ENTER_GL();
             context_apply_fbo_state(context, GL_FRAMEBUFFER, fb->render_targets, fb->depth_stencil, SFLAG_INTEXTURE);
@@ -2280,6 +2286,16 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de
             LEAVE_GL();
             rt_mask = ps ? ps->reg_maps.rt_mask : 1;
             rt_mask &= device->valid_rt_mask;
+            rt_mask_bits = rt_mask;
+            i = 0;
+            while (rt_mask_bits)
+            {
+                rt_mask_bits &= ~(1 << i);
+                if (!rts[i] || rts[i]->resource.format->id == WINED3DFMT_NULL)
+                    rt_mask &= ~(1 << i);
+
+                i++;
+            }
         }
     }
     else
@@ -2290,7 +2306,7 @@ BOOL context_apply_draw_state(struct wined3d_context *context, struct wined3d_de
     ENTER_GL();
     if (context->draw_buffers_mask != rt_mask)
     {
-        context_apply_draw_buffers(context, rt_mask, fb->render_targets);
+        context_apply_draw_buffers(context, rt_mask);
         context->draw_buffers_mask = rt_mask;
     }
 
-- 
1.7.3.4


More information about the wine-patches mailing list