summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2014-05-02 01:06:04 -0700
committerKenneth Graunke <[email protected]>2014-05-06 11:31:29 -0700
commitc1c1cf5f92f692c8894bd97e7139a0ec78648f29 (patch)
tree1173822c8be307417255c7b61b26254e27c610b2 /src/mesa
parente526ebf35c113d59eb0b860e492c1308d3862ee9 (diff)
meta: Add infrastructure for saving/restoring the DrawBuffers state.
Sometimes we need to configure what draw buffers we render to, without creating a new FBO. This path will make that possible. Cc: "10.2" <[email protected]> Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Anuj Phogat <[email protected]> Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/common/meta.c39
-rw-r--r--src/mesa/drivers/common/meta.h3
2 files changed, 42 insertions, 0 deletions
diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 36150a522f7..7c84c335de2 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -392,6 +392,24 @@ _mesa_meta_init(struct gl_context *ctx)
ctx->Meta = CALLOC_STRUCT(gl_meta_state);
}
+static GLenum
+gl_buffer_index_to_drawbuffers_enum(gl_buffer_index bufindex)
+{
+ assert(bufindex < BUFFER_COUNT);
+
+ if (bufindex >= BUFFER_COLOR0)
+ return GL_COLOR_ATTACHMENT0 + bufindex - BUFFER_COLOR0;
+ else if (bufindex == BUFFER_FRONT_LEFT)
+ return GL_FRONT_LEFT;
+ else if (bufindex == BUFFER_FRONT_RIGHT)
+ return GL_FRONT_RIGHT;
+ else if (bufindex == BUFFER_BACK_LEFT)
+ return GL_BACK_LEFT;
+ else if (bufindex == BUFFER_BACK_RIGHT)
+ return GL_BACK_RIGHT;
+
+ return GL_NONE;
+}
/**
* Free context meta-op state.
@@ -778,6 +796,23 @@ _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
_mesa_set_framebuffer_srgb(ctx, GL_FALSE);
}
+ if (state & MESA_META_DRAW_BUFFERS) {
+ int buf, real_color_buffers = 0;
+ memset(save->ColorDrawBuffers, 0, sizeof(save->ColorDrawBuffers));
+
+ for (buf = 0; buf < MAX_DRAW_BUFFERS; buf++) {
+ int buf_index = ctx->DrawBuffer->_ColorDrawBufferIndexes[buf];
+ if (buf_index == -1)
+ continue;
+
+ save->ColorDrawBuffers[buf] =
+ gl_buffer_index_to_drawbuffers_enum(buf_index);
+
+ if (++real_color_buffers >= ctx->DrawBuffer->_NumColorDrawBuffers)
+ break;
+ }
+ }
+
/* misc */
{
save->Lighting = ctx->Light.Enabled;
@@ -1176,6 +1211,10 @@ _mesa_meta_end(struct gl_context *ctx)
ctx->CurrentRenderbuffer->Name != save->RenderbufferName)
_mesa_BindRenderbuffer(GL_RENDERBUFFER, save->RenderbufferName);
+ if (state & MESA_META_DRAW_BUFFERS) {
+ _mesa_DrawBuffers(MAX_DRAW_BUFFERS, save->ColorDrawBuffers);
+ }
+
ctx->Meta->SaveStackDepth--;
ctx->API = save->API;
diff --git a/src/mesa/drivers/common/meta.h b/src/mesa/drivers/common/meta.h
index 99f11231ed7..32b71fae709 100644
--- a/src/mesa/drivers/common/meta.h
+++ b/src/mesa/drivers/common/meta.h
@@ -181,6 +181,9 @@ struct save_state
GLboolean TransformFeedbackNeedsResume;
GLuint DrawBufferName, ReadBufferName, RenderbufferName;
+
+ /** MESA_META_DRAW_BUFFERS */
+ GLenum ColorDrawBuffers[MAX_DRAW_BUFFERS];
};
/**