summaryrefslogtreecommitdiff
path: root/cogl/driver/gl/cogl-framebuffer-gl.c
diff options
context:
space:
mode:
Diffstat (limited to 'cogl/driver/gl/cogl-framebuffer-gl.c')
-rw-r--r--cogl/driver/gl/cogl-framebuffer-gl.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/driver/gl/cogl-framebuffer-gl.c
index 5ef84867..b487a4ce 100644
--- a/cogl/driver/gl/cogl-framebuffer-gl.c
+++ b/cogl/driver/gl/cogl-framebuffer-gl.c
@@ -236,6 +236,39 @@ _cogl_framebuffer_gl_flush_front_face_winding_state (CoglFramebuffer *framebuffe
context->current_pipeline_age--;
}
+static void
+_cogl_framebuffer_gl_flush_stereo_mode_state (CoglFramebuffer *framebuffer)
+{
+ CoglContext *ctx = framebuffer->context;
+ GLenum draw_buffer = GL_BACK;
+
+ if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN)
+ return;
+
+ /* The one-shot default draw buffer setting in _cogl_framebuffer_gl_bind
+ * must have already happened. If not it would override what we set here. */
+ g_assert (ctx->was_bound_to_onscreen);
+
+ switch (framebuffer->stereo_mode)
+ {
+ case COGL_STEREO_BOTH:
+ draw_buffer = GL_BACK;
+ break;
+ case COGL_STEREO_LEFT:
+ draw_buffer = GL_BACK_LEFT;
+ break;
+ case COGL_STEREO_RIGHT:
+ draw_buffer = GL_BACK_RIGHT;
+ break;
+ }
+
+ if (ctx->current_gl_draw_buffer != draw_buffer)
+ {
+ GE (ctx, glDrawBuffer (draw_buffer));
+ ctx->current_gl_draw_buffer = draw_buffer;
+ }
+}
+
void
_cogl_framebuffer_gl_bind (CoglFramebuffer *framebuffer, GLenum target)
{
@@ -406,6 +439,9 @@ _cogl_framebuffer_gl_flush_state (CoglFramebuffer *draw_buffer,
/* Nothing to do for depth write state change; the state will always
* be taken into account when flushing the pipeline's depth state. */
break;
+ case COGL_FRAMEBUFFER_STATE_INDEX_STEREO_MODE:
+ _cogl_framebuffer_gl_flush_stereo_mode_state (draw_buffer);
+ break;
default:
g_warn_if_reached ();
}