[Mesa-dev] [PATCH 09/10] i965/blorp: Handle DrawBuffers properly.

Paul Berry stereotype441 at gmail.com
Wed Jul 18 08:15:20 PDT 2012


When the client program uses glDrawBuffer() or glDrawBuffers() to
select more than one color buffer for drawing into, and then performs
a blit, we need to blit into every single enabled draw buffer.

+2 oglconforms.
---
 src/mesa/drivers/dri/i965/brw_blorp_blit.cpp |   17 ++++++++++-------
 1 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
index 7194fa2..9481422 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
+++ b/src/mesa/drivers/dri/i965/brw_blorp_blit.cpp
@@ -232,13 +232,16 @@ try_blorp_blit(struct intel_context *intel,
    switch (buffer_bit) {
    case GL_COLOR_BUFFER_BIT:
       src_rb = read_fb->_ColorReadBuffer;
-      dst_rb =
-         draw_fb->Attachment[
-            draw_fb->_ColorDrawBufferIndexes[0]].Renderbuffer;
-      if (!formats_match(buffer_bit, src_rb, dst_rb))
-         return false;
-      do_blorp_blit(intel, buffer_bit, src_rb, dst_rb, srcX0, srcY0,
-                    dstX0, dstY0, dstX1, dstY1, mirror_x, mirror_y);
+      for (unsigned i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; ++i) {
+         dst_rb = ctx->DrawBuffer->_ColorDrawBuffers[i];
+         if (dst_rb && !formats_match(buffer_bit, src_rb, dst_rb))
+            return false;
+      }
+      for (unsigned i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; ++i) {
+         dst_rb = ctx->DrawBuffer->_ColorDrawBuffers[i];
+         do_blorp_blit(intel, buffer_bit, src_rb, dst_rb, srcX0, srcY0,
+                       dstX0, dstY0, dstX1, dstY1, mirror_x, mirror_y);
+      }
       break;
    case GL_DEPTH_BUFFER_BIT:
       src_rb = read_fb->Attachment[BUFFER_DEPTH].Renderbuffer;
-- 
1.7.7.6



More information about the mesa-dev mailing list