[cogl] framebuffer: don't reference default fb in _clear apis
- From: Robert Bragg <rbragg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cogl] framebuffer: don't reference default fb in _clear apis
- Date: Fri, 12 Aug 2011 14:45:36 +0000 (UTC)
commit f7b1bab1ada47497439c7fadd88a76d9502517d0
Author: Robert Bragg <robert linux intel com>
Date: Wed Aug 3 17:06:10 2011 +0100
framebuffer: don't reference default fb in _clear apis
Some of the functions we were calling in cogl_framebuffer_clear[4f] were
referring to the current framebuffer, which would result in a crash
if nothing had been pushed before trying to explicitly clear a given
framebuffer.
Reviewed-by: Neil Roberts <neil linux intel com>
cogl/cogl-clip-stack.c | 41 ++++++++++++++++++++-------------------
cogl/cogl-clip-stack.h | 4 ++-
cogl/cogl-clip-state-private.h | 3 +-
cogl/cogl-clip-state.c | 8 ++++--
cogl/cogl-framebuffer-private.h | 11 +++++----
cogl/cogl-framebuffer.c | 26 ++++++++++++------------
cogl/cogl-journal.c | 5 +++-
cogl/cogl2-path.c | 8 ++++--
8 files changed, 59 insertions(+), 47 deletions(-)
---
diff --git a/cogl/cogl-clip-stack.c b/cogl/cogl-clip-stack.c
index 7663bb4..a76ca04 100644
--- a/cogl/cogl-clip-stack.c
+++ b/cogl/cogl-clip-stack.c
@@ -67,14 +67,14 @@ project_vertex (const CoglMatrix *modelview_projection,
}
static void
-set_clip_plane (GLint plane_num,
+set_clip_plane (CoglFramebuffer *framebuffer,
+ GLint plane_num,
const float *vertex_a,
const float *vertex_b)
{
GLfloat planef[4];
double planed[4];
GLfloat angle;
- CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
CoglMatrixStack *modelview_stack =
_cogl_framebuffer_get_modelview_stack (framebuffer);
CoglMatrixStack *projection_stack =
@@ -135,12 +135,12 @@ set_clip_plane (GLint plane_num,
}
static void
-set_clip_planes (float x_1,
+set_clip_planes (CoglFramebuffer *framebuffer,
+ float x_1,
float y_1,
float x_2,
float y_2)
{
- CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
CoglMatrixStack *modelview_stack =
_cogl_framebuffer_get_modelview_stack (framebuffer);
CoglMatrix modelview_matrix;
@@ -179,29 +179,29 @@ set_clip_planes (float x_1,
if (signed_area > 0.0f)
{
/* counter-clockwise */
- set_clip_plane (GL_CLIP_PLANE0, vertex_tl, vertex_bl);
- set_clip_plane (GL_CLIP_PLANE1, vertex_bl, vertex_br);
- set_clip_plane (GL_CLIP_PLANE2, vertex_br, vertex_tr);
- set_clip_plane (GL_CLIP_PLANE3, vertex_tr, vertex_tl);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE0, vertex_tl, vertex_bl);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE1, vertex_bl, vertex_br);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE2, vertex_br, vertex_tr);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE3, vertex_tr, vertex_tl);
}
else
{
/* clockwise */
- set_clip_plane (GL_CLIP_PLANE0, vertex_tl, vertex_tr);
- set_clip_plane (GL_CLIP_PLANE1, vertex_tr, vertex_br);
- set_clip_plane (GL_CLIP_PLANE2, vertex_br, vertex_bl);
- set_clip_plane (GL_CLIP_PLANE3, vertex_bl, vertex_tl);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE0, vertex_tl, vertex_tr);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE1, vertex_tr, vertex_br);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE2, vertex_br, vertex_bl);
+ set_clip_plane (framebuffer, GL_CLIP_PLANE3, vertex_bl, vertex_tl);
}
}
static void
-add_stencil_clip_rectangle (float x_1,
+add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
+ float x_1,
float y_1,
float x_2,
float y_2,
gboolean first)
{
- CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
CoglMatrixStack *modelview_stack =
_cogl_framebuffer_get_modelview_stack (framebuffer);
CoglMatrixStack *projection_stack =
@@ -584,7 +584,8 @@ _cogl_clip_stack_get_bounds (CoglClipStack *stack,
}
void
-_cogl_clip_stack_flush (CoglClipStack *stack)
+_cogl_clip_stack_flush (CoglClipStack *stack,
+ CoglFramebuffer *framebuffer)
{
int has_clip_planes;
gboolean using_clip_planes = FALSE;
@@ -613,7 +614,7 @@ _cogl_clip_stack_flush (CoglClipStack *stack)
ctx->current_clip_stack = _cogl_clip_stack_ref (stack);
modelview_stack =
- _cogl_framebuffer_get_modelview_stack (cogl_get_draw_framebuffer ());
+ _cogl_framebuffer_get_modelview_stack (framebuffer);
has_clip_planes = cogl_features_available (COGL_FEATURE_FOUR_CLIP_PLANES);
@@ -644,8 +645,6 @@ _cogl_clip_stack_flush (CoglClipStack *stack)
scissor_x0 = scissor_y0 = scissor_x1 = scissor_y1 = scissor_y_start = 0;
else
{
- CoglFramebuffer *framebuffer = cogl_get_draw_framebuffer ();
-
/* We store the entry coordinates in Cogl coordinate space
* but OpenGL requires the window origin to be the bottom
* left so we may need to convert the incoming coordinates.
@@ -714,7 +713,8 @@ _cogl_clip_stack_flush (CoglClipStack *stack)
{
COGL_NOTE (CLIPPING, "Adding clip planes clip for rectangle");
- set_clip_planes (rect->x0,
+ set_clip_planes (framebuffer,
+ rect->x0,
rect->y0,
rect->x1,
rect->y1);
@@ -726,7 +726,8 @@ _cogl_clip_stack_flush (CoglClipStack *stack)
{
COGL_NOTE (CLIPPING, "Adding stencil clip for rectangle");
- add_stencil_clip_rectangle (rect->x0,
+ add_stencil_clip_rectangle (framebuffer,
+ rect->x0,
rect->y0,
rect->x1,
rect->y1,
diff --git a/cogl/cogl-clip-stack.h b/cogl/cogl-clip-stack.h
index 307d7ef..6188f51 100644
--- a/cogl/cogl-clip-stack.h
+++ b/cogl/cogl-clip-stack.h
@@ -26,6 +26,7 @@
#include "cogl2-path.h"
#include "cogl-matrix.h"
+#include "cogl.h"
/* The clip stack works like a GSList where only a pointer to the top
of the stack is stored. The empty clip stack is represented simply
@@ -178,7 +179,8 @@ _cogl_clip_stack_get_bounds (CoglClipStack *stack,
int *scissor_y1);
void
-_cogl_clip_stack_flush (CoglClipStack *stack);
+_cogl_clip_stack_flush (CoglClipStack *stack,
+ CoglFramebuffer *framebuffer);
CoglClipStack *
_cogl_clip_stack_ref (CoglClipStack *stack);
diff --git a/cogl/cogl-clip-state-private.h b/cogl/cogl-clip-state-private.h
index f77a166..66bf895 100644
--- a/cogl/cogl-clip-state-private.h
+++ b/cogl/cogl-clip-state-private.h
@@ -41,7 +41,8 @@ void
_cogl_clip_state_destroy (CoglClipState *state);
void
-_cogl_clip_state_flush (CoglClipState *clip_state);
+_cogl_clip_state_flush (CoglClipState *clip_state,
+ CoglFramebuffer *framebuffer);
CoglClipStack *
_cogl_clip_state_get_stack (CoglClipState *clip_state);
diff --git a/cogl/cogl-clip-state.c b/cogl/cogl-clip-state.c
index 02b487e..8ef3f4b 100644
--- a/cogl/cogl-clip-state.c
+++ b/cogl/cogl-clip-state.c
@@ -146,11 +146,13 @@ cogl_clip_pop (void)
}
void
-_cogl_clip_state_flush (CoglClipState *clip_state)
+_cogl_clip_state_flush (CoglClipState *clip_state,
+ CoglFramebuffer *framebuffer)
{
/* Flush the topmost stack. The clip stack code will bail out early
if this is already flushed */
- _cogl_clip_stack_flush (clip_state->stacks->data);
+ _cogl_clip_stack_flush (clip_state->stacks->data,
+ framebuffer);
}
/* XXX: This should never have been made public API! */
@@ -166,7 +168,7 @@ cogl_clip_ensure (void)
application however so it makes sense to flush the journal
here */
_cogl_framebuffer_flush_journal (framebuffer);
- _cogl_clip_state_flush (clip_state);
+ _cogl_clip_state_flush (clip_state, framebuffer);
}
static void
diff --git a/cogl/cogl-framebuffer-private.h b/cogl/cogl-framebuffer-private.h
index 3e41077..3a0c09f 100644
--- a/cogl/cogl-framebuffer-private.h
+++ b/cogl/cogl-framebuffer-private.h
@@ -146,11 +146,12 @@ _cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
int width, int height);
void
-_cogl_clear4f (unsigned long buffers,
- float red,
- float green,
- float blue,
- float alpha);
+_cogl_framebuffer_clear_without_flush4f (CoglFramebuffer *framebuffer,
+ unsigned long buffers,
+ float red,
+ float green,
+ float blue,
+ float alpha);
void
_cogl_framebuffer_clear (CoglFramebuffer *framebuffer,
diff --git a/cogl/cogl-framebuffer.c b/cogl/cogl-framebuffer.c
index e321fcc..ac00d54 100644
--- a/cogl/cogl-framebuffer.c
+++ b/cogl/cogl-framebuffer.c
@@ -228,11 +228,12 @@ _cogl_framebuffer_get_winsys (CoglFramebuffer *framebuffer)
* needed when doing operations that may be called whiling flushing
* the journal */
void
-_cogl_clear4f (unsigned long buffers,
- float red,
- float green,
- float blue,
- float alpha)
+_cogl_framebuffer_clear_without_flush4f (CoglFramebuffer *framebuffer,
+ unsigned long buffers,
+ float red,
+ float green,
+ float blue,
+ float alpha)
{
GLbitfield gl_buffers = 0;
@@ -240,15 +241,12 @@ _cogl_clear4f (unsigned long buffers,
if (buffers & COGL_BUFFER_BIT_COLOR)
{
- CoglFramebuffer *draw_framebuffer;
-
GE( ctx, glClearColor (red, green, blue, alpha) );
gl_buffers |= GL_COLOR_BUFFER_BIT;
- draw_framebuffer = cogl_get_draw_framebuffer ();
- if (ctx->current_gl_color_mask != draw_framebuffer->color_mask)
+ if (ctx->current_gl_color_mask != framebuffer->color_mask)
{
- CoglColorMask color_mask = draw_framebuffer->color_mask;
+ CoglColorMask color_mask = framebuffer->color_mask;
GE( ctx, glColorMask (!!(color_mask & COGL_COLOR_MASK_RED),
!!(color_mask & COGL_COLOR_MASK_GREEN),
!!(color_mask & COGL_COLOR_MASK_BLUE),
@@ -396,7 +394,8 @@ _cogl_framebuffer_clear4f (CoglFramebuffer *framebuffer,
* always be done first when preparing to draw. */
_cogl_framebuffer_flush_state (framebuffer, framebuffer, 0);
- _cogl_clear4f (buffers, red, green, blue, alpha);;
+ _cogl_framebuffer_clear_without_flush4f (framebuffer, buffers,
+ red, green, blue, alpha);
/* This is a debugging variable used to visually display the quad
* batches from the journal. It is reset here to increase the
@@ -1463,7 +1462,8 @@ _cogl_framebuffer_flush_state (CoglFramebuffer *draw_buffer,
* matrices so we must do it before flushing the matrices...
*/
if (!(flags & COGL_FRAMEBUFFER_FLUSH_SKIP_CLIP_STATE))
- _cogl_clip_state_flush (&draw_buffer->clip_state);
+ _cogl_clip_state_flush (&draw_buffer->clip_state,
+ draw_buffer);
if (!(flags & COGL_FRAMEBUFFER_FLUSH_SKIP_MODELVIEW))
_cogl_matrix_stack_flush_to_gl (draw_buffer->modelview_stack,
@@ -1651,7 +1651,7 @@ _cogl_blit_framebuffer (unsigned int src_x,
by the scissor and we want to hide this feature for the Cogl API
because it's not obvious to an app how the clip state will affect
the scissor */
- _cogl_clip_stack_flush (NULL);
+ _cogl_clip_stack_flush (NULL, draw_buffer);
ctx->glBlitFramebuffer (src_x, src_y,
src_x + width, src_y + height,
diff --git a/cogl/cogl-journal.c b/cogl/cogl-journal.c
index 9f073d3..c58328c 100644
--- a/cogl/cogl-journal.c
+++ b/cogl/cogl-journal.c
@@ -95,6 +95,8 @@ typedef struct _CoglJournalFlushState
{
CoglJournal *journal;
+ CoglFramebuffer *framebuffer;
+
CoglAttributeBuffer *attribute_buffer;
GArray *attributes;
int current_attribute;
@@ -705,7 +707,7 @@ _cogl_journal_flush_clip_stacks_and_entries (CoglJournalEntry *batch_start,
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_BATCHING)))
g_print ("BATCHING: clip stack batch len = %d\n", batch_len);
- _cogl_clip_stack_flush (batch_start->clip_stack);
+ _cogl_clip_stack_flush (batch_start->clip_stack, state->framebuffer);
_cogl_matrix_stack_push (state->modelview_stack);
@@ -1352,6 +1354,7 @@ _cogl_journal_flush (CoglJournal *journal,
* that the timer isn't started recursively. */
COGL_TIMER_START (_cogl_uprof_context, flush_timer);
+ state.framebuffer = framebuffer;
cogl_push_framebuffer (framebuffer);
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_BATCHING)))
diff --git a/cogl/cogl2-path.c b/cogl/cogl2-path.c
index 521bd1f..3707be6 100644
--- a/cogl/cogl2-path.c
+++ b/cogl/cogl2-path.c
@@ -401,9 +401,11 @@ _cogl_add_path_to_stencil_buffer (CoglPath *path,
will have set up a scissor for the minimum bounding box of
all of the clips. That box will likely mean that this
_cogl_clear won't need to clear the entire
- buffer. _cogl_clear4f is used instead of cogl_clear because
- it won't try to flush the journal */
- _cogl_clear4f (COGL_BUFFER_BIT_STENCIL, 0, 0, 0, 0);
+ buffer. _cogl_framebuffer_clear_without_flush4f is used instead
+ of cogl_clear because it won't try to flush the journal */
+ _cogl_framebuffer_clear_without_flush4f (framebuffer,
+ COGL_BUFFER_BIT_STENCIL,
+ 0, 0, 0, 0);
else
{
/* Just clear the bounding box */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]