i965/blorp: Handle DrawBuffers properly.

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.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50407

Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
This commit is contained in:
Paul Berry 2012-07-13 14:59:13 -07:00
parent fa1d267beb
commit ff9313fac7

View file

@ -233,13 +233,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;