diff options
Diffstat (limited to 'cogl/driver/gl/cogl-framebuffer-gl.c')
-rw-r--r-- | cogl/driver/gl/cogl-framebuffer-gl.c | 36 |
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 (); } |