cogl/framebuffer: Move public struct fields to private struct

This will limit accidental manipulation of the framebuffer struct
fields, while also paving the way to change to GObject type hierarchy.

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1496
This commit is contained in:
Jonas Ådahl 2020-10-12 23:31:38 +02:00 committed by Georges Basile Stavracas Neto
parent ffde1c0124
commit aa99e505ad
18 changed files with 934 additions and 510 deletions

View File

@ -259,7 +259,7 @@ emit_vertex_buffer_geometry (CoglFramebuffer *fb,
CoglPipeline *pipeline, CoglPipeline *pipeline,
CoglPangoDisplayListNode *node) CoglPangoDisplayListNode *node)
{ {
CoglContext *ctx = fb->context; CoglContext *ctx = cogl_framebuffer_get_context (fb);
/* It's expensive to go through the Cogl journal for large runs /* It's expensive to go through the Cogl journal for large runs
* of text in part because the journal transforms the quads in software * of text in part because the journal transforms the quads in software

View File

@ -587,12 +587,12 @@ _cogl_flush_attributes_state (CoglFramebuffer *framebuffer,
CoglAttribute **attributes, CoglAttribute **attributes,
int n_attributes) int n_attributes)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglFlushLayerState layers_state; CoglFlushLayerState layers_state;
CoglPipeline *copy = NULL; CoglPipeline *copy = NULL;
if (!(flags & COGL_DRAW_SKIP_JOURNAL_FLUSH)) if (!(flags & COGL_DRAW_SKIP_JOURNAL_FLUSH))
_cogl_journal_flush (framebuffer->journal); _cogl_framebuffer_flush_journal (framebuffer);
layers_state.unit = 0; layers_state.unit = 0;
layers_state.options.flags = 0; layers_state.options.flags = 0;

View File

@ -428,7 +428,7 @@ void
_cogl_clip_stack_flush (CoglClipStack *stack, _cogl_clip_stack_flush (CoglClipStack *stack,
CoglFramebuffer *framebuffer) CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
ctx->driver_vtable->clip_stack_flush (stack, framebuffer); ctx->driver_vtable->clip_stack_flush (stack, framebuffer);
} }

View File

@ -45,7 +45,7 @@ cogl_fence_closure_get_user_data (CoglFenceClosure *closure)
static void static void
_cogl_fence_check (CoglFenceClosure *fence) _cogl_fence_check (CoglFenceClosure *fence)
{ {
CoglContext *context = fence->framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (fence->framebuffer);
if (fence->type == FENCE_TYPE_WINSYS) if (fence->type == FENCE_TYPE_WINSYS)
{ {
@ -95,10 +95,11 @@ _cogl_fence_poll_prepare (void *source)
* hit and the main loop might block forever */ * hit and the main loop might block forever */
for (l = context->framebuffers; l; l = l->next) for (l = context->framebuffers; l; l = l->next)
{ {
CoglFramebuffer *fb = l->data; CoglFramebuffer *framebuffer = l->data;
CoglJournal *journal = cogl_framebuffer_get_journal (framebuffer);
if (!_cogl_list_empty (&fb->journal->pending_fences)) if (!_cogl_list_empty (&journal->pending_fences))
_cogl_framebuffer_flush_journal (fb); _cogl_framebuffer_flush_journal (framebuffer);
} }
if (!_cogl_list_empty (&context->fences)) if (!_cogl_list_empty (&context->fences))
@ -110,7 +111,7 @@ _cogl_fence_poll_prepare (void *source)
void void
_cogl_fence_submit (CoglFenceClosure *fence) _cogl_fence_submit (CoglFenceClosure *fence)
{ {
CoglContext *context = fence->framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (fence->framebuffer);
const CoglWinsysVtable *winsys = _cogl_context_get_winsys (context); const CoglWinsysVtable *winsys = _cogl_context_get_winsys (context);
fence->type = FENCE_TYPE_ERROR; fence->type = FENCE_TYPE_ERROR;
@ -156,8 +157,8 @@ cogl_framebuffer_add_fence_callback (CoglFramebuffer *framebuffer,
CoglFenceCallback callback, CoglFenceCallback callback,
void *user_data) void *user_data)
{ {
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglJournal *journal = framebuffer->journal; CoglJournal *journal = cogl_framebuffer_get_journal (framebuffer);
CoglFenceClosure *fence; CoglFenceClosure *fence;
if (!COGL_FLAGS_GET (context->features, COGL_FEATURE_ID_FENCE)) if (!COGL_FLAGS_GET (context->features, COGL_FEATURE_ID_FENCE))
@ -184,7 +185,7 @@ void
cogl_framebuffer_cancel_fence_callback (CoglFramebuffer *framebuffer, cogl_framebuffer_cancel_fence_callback (CoglFramebuffer *framebuffer,
CoglFenceClosure *fence) CoglFenceClosure *fence)
{ {
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
if (fence->type == FENCE_TYPE_PENDING) if (fence->type == FENCE_TYPE_PENDING)
{ {
@ -214,8 +215,8 @@ cogl_framebuffer_cancel_fence_callback (CoglFramebuffer *framebuffer,
void void
_cogl_fence_cancel_fences_for_framebuffer (CoglFramebuffer *framebuffer) _cogl_fence_cancel_fences_for_framebuffer (CoglFramebuffer *framebuffer)
{ {
CoglJournal *journal = framebuffer->journal; CoglJournal *journal = cogl_framebuffer_get_journal (framebuffer);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglFenceClosure *fence, *tmp; CoglFenceClosure *fence, *tmp;
while (!_cogl_list_empty (&journal->pending_fences)) while (!_cogl_list_empty (&journal->pending_fences))

View File

@ -119,69 +119,7 @@ typedef struct
struct _CoglFramebuffer struct _CoglFramebuffer
{ {
CoglObject _parent; CoglObject _parent;
gpointer priv;
CoglContext *context;
CoglFramebufferType type;
/* The user configuration before allocation... */
CoglFramebufferConfig config;
int width;
int height;
/* Format of the pixels in the framebuffer (including the expected
premult state) */
CoglPixelFormat internal_format;
gboolean allocated;
CoglMatrixStack *modelview_stack;
CoglMatrixStack *projection_stack;
float viewport_x;
float viewport_y;
float viewport_width;
float viewport_height;
int viewport_age;
int viewport_age_for_scissor_workaround;
CoglClipStack *clip_stack;
gboolean dither_enabled;
gboolean depth_writing_enabled;
CoglStereoMode stereo_mode;
/* We journal the textured rectangles we want to submit to OpenGL so
* we have an opportunity to batch them together into less draw
* calls. */
CoglJournal *journal;
/* The scene of a given framebuffer may depend on images in other
* framebuffers... */
GList *deps;
/* As part of an optimization for reading-back single pixels from a
* framebuffer in some simple cases where the geometry is still
* available in the journal we need to track the bounds of the last
* region cleared, its color and we need to track when something
* does in fact draw to that region so it is no longer clear.
*/
float clear_color_red;
float clear_color_green;
float clear_color_blue;
float clear_color_alpha;
int clear_clip_x0;
int clear_clip_y0;
int clear_clip_x1;
int clear_clip_y1;
gboolean clear_clip_dirty;
int samples_per_pixel;
/* Whether the depth buffer was enabled for this framebuffer,
* usually means it needs to be cleared before being reused next.
*/
gboolean depth_buffer_clear_needed;
gpointer driver_private;
GDestroyNotify driver_private_destroy;
}; };
typedef enum typedef enum
@ -224,6 +162,25 @@ _cogl_framebuffer_init (CoglFramebuffer *framebuffer,
int width, int width,
int height); int height);
gboolean
cogl_framebuffer_is_allocated (CoglFramebuffer *framebuffer);
void
cogl_framebuffer_init_config (CoglFramebuffer *framebuffer,
const CoglFramebufferConfig *config);
const CoglFramebufferConfig *
cogl_framebuffer_get_config (CoglFramebuffer *framebuffer);
void
cogl_framebuffer_update_samples_per_pixel (CoglFramebuffer *framebuffer,
int samples_per_pixel);
void
cogl_framebuffer_update_size (CoglFramebuffer *framebuffer,
int width,
int height);
/* XXX: For a public api we might instead want a way to explicitly /* XXX: For a public api we might instead want a way to explicitly
* set the _premult status of a framebuffer or what components we * set the _premult status of a framebuffer or what components we
* care about instead of exposing the CoglPixelFormat * care about instead of exposing the CoglPixelFormat
@ -240,6 +197,9 @@ void
_cogl_framebuffer_set_internal_format (CoglFramebuffer *framebuffer, _cogl_framebuffer_set_internal_format (CoglFramebuffer *framebuffer,
CoglPixelFormat internal_format); CoglPixelFormat internal_format);
CoglPixelFormat
cogl_framebuffer_get_internal_format (CoglFramebuffer *framebuffer);
void _cogl_framebuffer_free (CoglFramebuffer *framebuffer); void _cogl_framebuffer_free (CoglFramebuffer *framebuffer);
const CoglWinsysVtable * const CoglWinsysVtable *
@ -256,6 +216,9 @@ _cogl_framebuffer_clear_without_flush4f (CoglFramebuffer *framebuffer,
void void
_cogl_framebuffer_mark_clear_clip_dirty (CoglFramebuffer *framebuffer); _cogl_framebuffer_mark_clear_clip_dirty (CoglFramebuffer *framebuffer);
void
cogl_framebuffer_set_depth_buffer_clear_needed (CoglFramebuffer *framebuffer);
/* /*
* _cogl_framebuffer_get_clip_stack: * _cogl_framebuffer_get_clip_stack:
* @framebuffer: A #CoglFramebuffer * @framebuffer: A #CoglFramebuffer
@ -354,6 +317,13 @@ void
cogl_framebuffer_set_viewport4fv (CoglFramebuffer *framebuffer, cogl_framebuffer_set_viewport4fv (CoglFramebuffer *framebuffer,
float *viewport); float *viewport);
void
cogl_framebuffer_get_viewport4f (CoglFramebuffer *framebuffer,
float *viewport_x,
float *viewport_y,
float *viewport_width,
float *viewport_height);
unsigned long unsigned long
_cogl_framebuffer_compare (CoglFramebuffer *a, _cogl_framebuffer_compare (CoglFramebuffer *a,
CoglFramebuffer *b, CoglFramebuffer *b,
@ -397,6 +367,9 @@ _cogl_framebuffer_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
COGL_EXPORT int COGL_EXPORT int
_cogl_framebuffer_get_stencil_bits (CoglFramebuffer *framebuffer); _cogl_framebuffer_get_stencil_bits (CoglFramebuffer *framebuffer);
CoglJournal *
cogl_framebuffer_get_journal (CoglFramebuffer *framebuffer);
gpointer gpointer
cogl_framebuffer_get_driver_private (CoglFramebuffer *framebuffer); cogl_framebuffer_get_driver_private (CoglFramebuffer *framebuffer);

File diff suppressed because it is too large Load Diff

View File

@ -567,7 +567,8 @@ _cogl_journal_flush_vbo_offsets_and_entries (CoglJournalEntry *batch_start,
void *data) void *data)
{ {
CoglJournalFlushState *state = data; CoglJournalFlushState *state = data;
CoglContext *ctx = state->journal->framebuffer->context; CoglFramebuffer *framebuffer = state->journal->framebuffer;
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
size_t stride; size_t stride;
int i; int i;
CoglAttribute **attribute_entry; CoglAttribute **attribute_entry;
@ -688,7 +689,7 @@ _cogl_journal_flush_clip_stacks_and_entries (CoglJournalEntry *batch_start,
{ {
CoglJournalFlushState *state = data; CoglJournalFlushState *state = data;
CoglFramebuffer *framebuffer = state->journal->framebuffer; CoglFramebuffer *framebuffer = state->journal->framebuffer;
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglMatrixStack *projection_stack; CoglMatrixStack *projection_stack;
COGL_STATIC_TIMER (time_flush_clip_stack_pipeline_entries, COGL_STATIC_TIMER (time_flush_clip_stack_pipeline_entries,
@ -1032,7 +1033,7 @@ _cogl_journal_flush_dither_and_entries (CoglJournalEntry *batch_start,
{ {
CoglJournalFlushState *state = data; CoglJournalFlushState *state = data;
CoglFramebuffer *framebuffer = state->journal->framebuffer; CoglFramebuffer *framebuffer = state->journal->framebuffer;
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
COGL_STATIC_TIMER (time_flush_dither_and_entries, COGL_STATIC_TIMER (time_flush_dither_and_entries,
"Journal Flush", /* parent */ "Journal Flush", /* parent */
@ -1075,7 +1076,7 @@ _cogl_journal_flush_viewport_and_entries (CoglJournalEntry *batch_start,
{ {
CoglJournalFlushState *state = data; CoglJournalFlushState *state = data;
CoglFramebuffer *framebuffer = state->journal->framebuffer; CoglFramebuffer *framebuffer = state->journal->framebuffer;
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
float current_viewport[4]; float current_viewport[4];
COGL_STATIC_TIMER (time_flush_viewport_and_entries, COGL_STATIC_TIMER (time_flush_viewport_and_entries,
@ -1123,8 +1124,8 @@ static CoglAttributeBuffer *
create_attribute_buffer (CoglJournal *journal, create_attribute_buffer (CoglJournal *journal,
size_t n_bytes) size_t n_bytes)
{ {
CoglContext *ctx = cogl_framebuffer_get_context (journal->framebuffer);
CoglAttributeBuffer *vbo; CoglAttributeBuffer *vbo;
CoglContext *ctx = journal->framebuffer->context;
vbo = journal->vbo_pool[journal->next_vbo_in_pool]; vbo = journal->vbo_pool[journal->next_vbo_in_pool];
@ -1383,7 +1384,7 @@ _cogl_journal_flush (CoglJournal *journal)
} }
framebuffer = journal->framebuffer; framebuffer = journal->framebuffer;
ctx = framebuffer->context; ctx = cogl_framebuffer_get_context (framebuffer);
/* The entries in this journal may depend on images in other /* The entries in this journal may depend on images in other
* framebuffers which may require that we flush the journals * framebuffers which may require that we flush the journals

View File

@ -83,8 +83,7 @@ _cogl_onscreen_init_from_template (CoglOnscreen *onscreen,
_cogl_list_init (&onscreen->resize_closures); _cogl_list_init (&onscreen->resize_closures);
_cogl_list_init (&onscreen->dirty_closures); _cogl_list_init (&onscreen->dirty_closures);
framebuffer->config = onscreen_template->config; cogl_framebuffer_init_config (framebuffer, &onscreen_template->config);
cogl_object_ref (framebuffer->config.swap_chain);
} }
CoglOnscreen * CoglOnscreen *
@ -202,7 +201,8 @@ _cogl_dispatch_onscreen_cb (CoglContext *context)
static void static void
_cogl_onscreen_queue_dispatch_idle (CoglOnscreen *onscreen) _cogl_onscreen_queue_dispatch_idle (CoglOnscreen *onscreen)
{ {
CoglContext *ctx = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
if (!ctx->onscreen_dispatch_idle) if (!ctx->onscreen_dispatch_idle)
{ {
@ -219,7 +219,8 @@ void
_cogl_onscreen_queue_dirty (CoglOnscreen *onscreen, _cogl_onscreen_queue_dirty (CoglOnscreen *onscreen,
const CoglOnscreenDirtyInfo *info) const CoglOnscreenDirtyInfo *info)
{ {
CoglContext *ctx = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglOnscreenQueuedDirty *qe = g_slice_new (CoglOnscreenQueuedDirty); CoglOnscreenQueuedDirty *qe = g_slice_new (CoglOnscreenQueuedDirty);
qe->onscreen = cogl_object_ref (onscreen); qe->onscreen = cogl_object_ref (onscreen);
@ -237,8 +238,8 @@ _cogl_onscreen_queue_full_dirty (CoglOnscreen *onscreen)
info.x = 0; info.x = 0;
info.y = 0; info.y = 0;
info.width = framebuffer->width; info.width = cogl_framebuffer_get_width (framebuffer);
info.height = framebuffer->height; info.height = cogl_framebuffer_get_height (framebuffer);
_cogl_onscreen_queue_dirty (onscreen, &info); _cogl_onscreen_queue_dirty (onscreen, &info);
} }
@ -248,7 +249,8 @@ _cogl_onscreen_queue_event (CoglOnscreen *onscreen,
CoglFrameEvent type, CoglFrameEvent type,
CoglFrameInfo *info) CoglFrameInfo *info)
{ {
CoglContext *ctx = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglOnscreenEvent *event = g_slice_new (CoglOnscreenEvent); CoglOnscreenEvent *event = g_slice_new (CoglOnscreenEvent);
@ -270,7 +272,7 @@ cogl_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
const CoglWinsysVtable *winsys; const CoglWinsysVtable *winsys;
g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN); g_return_if_fail (cogl_is_onscreen (framebuffer));
info->frame_counter = onscreen->frame_counter; info->frame_counter = onscreen->frame_counter;
g_queue_push_tail (&onscreen->pending_frame_infos, info); g_queue_push_tail (&onscreen->pending_frame_infos, info);
@ -319,7 +321,7 @@ cogl_onscreen_swap_region (CoglOnscreen *onscreen,
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
const CoglWinsysVtable *winsys; const CoglWinsysVtable *winsys;
g_return_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN); g_return_if_fail (cogl_is_onscreen (framebuffer));
info->frame_counter = onscreen->frame_counter; info->frame_counter = onscreen->frame_counter;
g_queue_push_tail (&onscreen->pending_frame_infos, info); g_queue_push_tail (&onscreen->pending_frame_infos, info);
@ -365,7 +367,7 @@ cogl_onscreen_get_buffer_age (CoglOnscreen *onscreen)
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
const CoglWinsysVtable *winsys; const CoglWinsysVtable *winsys;
g_return_val_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN, 0); g_return_val_if_fail (cogl_is_onscreen (framebuffer), 0);
winsys = _cogl_framebuffer_get_winsys (framebuffer); winsys = _cogl_framebuffer_get_winsys (framebuffer);
@ -384,7 +386,7 @@ cogl_onscreen_direct_scanout (CoglOnscreen *onscreen,
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
const CoglWinsysVtable *winsys; const CoglWinsysVtable *winsys;
g_warn_if_fail (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN); g_warn_if_fail (cogl_is_onscreen (framebuffer));
g_warn_if_fail (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT)); g_warn_if_fail (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT));
info->frame_counter = onscreen->frame_counter; info->frame_counter = onscreen->frame_counter;
@ -442,7 +444,7 @@ cogl_onscreen_show (CoglOnscreen *onscreen)
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
const CoglWinsysVtable *winsys; const CoglWinsysVtable *winsys;
if (!framebuffer->allocated) if (!cogl_framebuffer_is_allocated (framebuffer))
{ {
if (!cogl_framebuffer_allocate (framebuffer, NULL)) if (!cogl_framebuffer_allocate (framebuffer, NULL))
return; return;
@ -458,7 +460,7 @@ cogl_onscreen_hide (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
if (framebuffer->allocated) if (cogl_framebuffer_is_allocated (framebuffer))
{ {
const CoglWinsysVtable *winsys = const CoglWinsysVtable *winsys =
_cogl_framebuffer_get_winsys (framebuffer); _cogl_framebuffer_get_winsys (framebuffer);
@ -487,23 +489,21 @@ _cogl_onscreen_notify_resize (CoglOnscreen *onscreen)
_cogl_closure_list_invoke (&onscreen->resize_closures, _cogl_closure_list_invoke (&onscreen->resize_closures,
CoglOnscreenResizeCallback, CoglOnscreenResizeCallback,
onscreen, onscreen,
framebuffer->width, cogl_framebuffer_get_width (framebuffer),
framebuffer->height); cogl_framebuffer_get_height (framebuffer));
} }
void void
_cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer, _cogl_framebuffer_winsys_update_size (CoglFramebuffer *framebuffer,
int width, int height) int width, int height)
{ {
if (framebuffer->width == width && framebuffer->height == height) if (cogl_framebuffer_get_width (framebuffer) == width &&
cogl_framebuffer_get_height (framebuffer) == height)
return; return;
framebuffer->width = width; cogl_framebuffer_update_size (framebuffer, width, height);
framebuffer->height = height;
cogl_framebuffer_set_viewport (framebuffer, 0, 0, width, height); if (!_cogl_has_private_feature (cogl_framebuffer_get_context (framebuffer),
if (!_cogl_has_private_feature (framebuffer->context,
COGL_PRIVATE_FEATURE_DIRTY_EVENTS)) COGL_PRIVATE_FEATURE_DIRTY_EVENTS))
_cogl_onscreen_queue_full_dirty (COGL_ONSCREEN (framebuffer)); _cogl_onscreen_queue_full_dirty (COGL_ONSCREEN (framebuffer));
} }
@ -521,7 +521,7 @@ cogl_onscreen_set_resizable (CoglOnscreen *onscreen,
onscreen->resizable = resizable; onscreen->resizable = resizable;
framebuffer = COGL_FRAMEBUFFER (onscreen); framebuffer = COGL_FRAMEBUFFER (onscreen);
if (framebuffer->allocated) if (cogl_framebuffer_is_allocated (framebuffer))
{ {
winsys = _cogl_framebuffer_get_winsys (COGL_FRAMEBUFFER (onscreen)); winsys = _cogl_framebuffer_get_winsys (COGL_FRAMEBUFFER (onscreen));

View File

@ -123,7 +123,7 @@ log_quad_sub_textures_cb (CoglTexture *texture,
else else
texture_override = texture; texture_override = texture;
_cogl_journal_log_quad (framebuffer->journal, _cogl_journal_log_quad (cogl_framebuffer_get_journal (framebuffer),
quad_coords, quad_coords,
state->pipeline, state->pipeline,
1, /* one layer */ 1, /* one layer */
@ -458,7 +458,7 @@ _cogl_multitexture_quad_single_primitive (CoglFramebuffer *framebuffer,
if (state.override_pipeline) if (state.override_pipeline)
pipeline = state.override_pipeline; pipeline = state.override_pipeline;
_cogl_journal_log_quad (framebuffer->journal, _cogl_journal_log_quad (cogl_framebuffer_get_journal (framebuffer),
position, position,
pipeline, pipeline,
n_layers, n_layers,
@ -631,7 +631,7 @@ _cogl_framebuffer_draw_multitextured_rectangles (
CoglMultiTexturedRect *rects, CoglMultiTexturedRect *rects,
int n_rects) int n_rects)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglPipeline *original_pipeline; CoglPipeline *original_pipeline;
ValidateLayerState state; ValidateLayerState state;
int i; int i;
@ -714,7 +714,7 @@ cogl_2d_primitives_immediate (CoglFramebuffer *framebuffer,
const CoglVertexP2 *vertices, const CoglVertexP2 *vertices,
unsigned int n_vertices) unsigned int n_vertices)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglAttributeBuffer *attribute_buffer; CoglAttributeBuffer *attribute_buffer;
CoglAttribute *attributes[1]; CoglAttribute *attributes[1];
size_t vertices_size = sizeof (CoglVertexP2) * n_vertices; size_t vertices_size = sizeof (CoglVertexP2) * n_vertices;

View File

@ -186,7 +186,7 @@ _cogl_gl_flush_attributes_state (CoglFramebuffer *framebuffer,
CoglAttribute **attributes, CoglAttribute **attributes,
int n_attributes) int n_attributes)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
int i; int i;
gboolean with_color_attrib = FALSE; gboolean with_color_attrib = FALSE;
gboolean unknown_color_alpha = FALSE; gboolean unknown_color_alpha = FALSE;

View File

@ -153,14 +153,14 @@ add_stencil_clip_region (CoglFramebuffer *framebuffer,
* the default [-1, -1, 1, 1] range. * the default [-1, -1, 1, 1] range.
*/ */
graphene_point3d_init (&p, graphene_point3d_init (&p,
- framebuffer->viewport_x, - cogl_framebuffer_get_viewport_x (framebuffer),
- framebuffer->viewport_y, - cogl_framebuffer_get_viewport_y (framebuffer),
0); 0);
graphene_matrix_init_translate (&matrix, &p); graphene_matrix_init_translate (&matrix, &p);
graphene_matrix_scale (&matrix, graphene_matrix_scale (&matrix,
2.0 / framebuffer->viewport_width, 2.0 / cogl_framebuffer_get_viewport_width (framebuffer),
- 2.0 / framebuffer->viewport_height, - 2.0 / cogl_framebuffer_get_viewport_height (framebuffer),
1); 1);
graphene_matrix_translate (&matrix, &GRAPHENE_POINT3D_INIT (-1.f, 1.f, 0.f)); graphene_matrix_translate (&matrix, &GRAPHENE_POINT3D_INIT (-1.f, 1.f, 0.f));
@ -398,7 +398,7 @@ void
_cogl_clip_stack_gl_flush (CoglClipStack *stack, _cogl_clip_stack_gl_flush (CoglClipStack *stack,
CoglFramebuffer *framebuffer) CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
gboolean using_stencil_buffer = FALSE; gboolean using_stencil_buffer = FALSE;
int scissor_x0; int scissor_x0;
int scissor_y0; int scissor_y0;

View File

@ -33,6 +33,7 @@
#include "cogl-context-private.h" #include "cogl-context-private.h"
#include "cogl-framebuffer-private.h" #include "cogl-framebuffer-private.h"
#include "cogl-framebuffer.h"
#include "cogl-texture-private.h" #include "cogl-texture-private.h"
#include "driver/gl/cogl-util-gl-private.h" #include "driver/gl/cogl-util-gl-private.h"
#include "driver/gl/cogl-framebuffer-gl-private.h" #include "driver/gl/cogl-framebuffer-gl-private.h"
@ -135,10 +136,17 @@ typedef struct _CoglFramebufferGl
static void static void
_cogl_framebuffer_gl_flush_viewport_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_viewport_state (CoglFramebuffer *framebuffer)
{ {
float viewport_x, viewport_y, viewport_width, viewport_height;
float gl_viewport_y; float gl_viewport_y;
g_return_if_fail (framebuffer->viewport_width >= 0); cogl_framebuffer_get_viewport4f (framebuffer,
g_return_if_fail (framebuffer->viewport_height >= 0); &viewport_x,
&viewport_y,
&viewport_width,
&viewport_height);
g_return_if_fail (viewport_width >= 0);
g_return_if_fail (viewport_height >= 0);
/* Convert the Cogl viewport y offset to an OpenGL viewport y offset /* Convert the Cogl viewport y offset to an OpenGL viewport y offset
* NB: OpenGL defines its window and viewport origins to be bottom * NB: OpenGL defines its window and viewport origins to be bottom
@ -146,67 +154,73 @@ _cogl_framebuffer_gl_flush_viewport_state (CoglFramebuffer *framebuffer)
* NB: We render upside down to offscreen framebuffers so we don't * NB: We render upside down to offscreen framebuffers so we don't
* need to convert the y offset in this case. */ * need to convert the y offset in this case. */
if (cogl_is_offscreen (framebuffer)) if (cogl_is_offscreen (framebuffer))
gl_viewport_y = framebuffer->viewport_y; gl_viewport_y = viewport_y;
else else
gl_viewport_y = framebuffer->height - gl_viewport_y =
(framebuffer->viewport_y + framebuffer->viewport_height); cogl_framebuffer_get_height (framebuffer) -
(viewport_y + viewport_height);
COGL_NOTE (OPENGL, "Calling glViewport(%f, %f, %f, %f)", COGL_NOTE (OPENGL, "Calling glViewport(%f, %f, %f, %f)",
framebuffer->viewport_x, viewport_x,
gl_viewport_y, gl_viewport_y,
framebuffer->viewport_width, viewport_width,
framebuffer->viewport_height); viewport_height);
GE (framebuffer->context, GE (cogl_framebuffer_get_context (framebuffer),
glViewport (framebuffer->viewport_x, glViewport (viewport_x,
gl_viewport_y, gl_viewport_y,
framebuffer->viewport_width, viewport_width,
framebuffer->viewport_height)); viewport_height));
} }
static void static void
_cogl_framebuffer_gl_flush_clip_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_clip_state (CoglFramebuffer *framebuffer)
{ {
_cogl_clip_stack_flush (framebuffer->clip_stack, framebuffer); _cogl_clip_stack_flush (_cogl_framebuffer_get_clip_stack (framebuffer),
framebuffer);
} }
static void static void
_cogl_framebuffer_gl_flush_dither_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_dither_state (CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
gboolean is_dither_enabled =
cogl_framebuffer_get_dither_enabled (framebuffer);
if (ctx->current_gl_dither_enabled != framebuffer->dither_enabled) if (ctx->current_gl_dither_enabled != is_dither_enabled)
{ {
if (framebuffer->dither_enabled) if (is_dither_enabled)
GE (ctx, glEnable (GL_DITHER)); GE (ctx, glEnable (GL_DITHER));
else else
GE (ctx, glDisable (GL_DITHER)); GE (ctx, glDisable (GL_DITHER));
ctx->current_gl_dither_enabled = framebuffer->dither_enabled; ctx->current_gl_dither_enabled = is_dither_enabled;
} }
} }
static void static void
_cogl_framebuffer_gl_flush_modelview_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_modelview_state (CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglMatrixEntry *modelview_entry = CoglMatrixEntry *modelview_entry =
_cogl_framebuffer_get_modelview_entry (framebuffer); _cogl_framebuffer_get_modelview_entry (framebuffer);
_cogl_context_set_current_modelview_entry (framebuffer->context,
modelview_entry); _cogl_context_set_current_modelview_entry (ctx, modelview_entry);
} }
static void static void
_cogl_framebuffer_gl_flush_projection_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_projection_state (CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglMatrixEntry *projection_entry = CoglMatrixEntry *projection_entry =
_cogl_framebuffer_get_projection_entry (framebuffer); _cogl_framebuffer_get_projection_entry (framebuffer);
_cogl_context_set_current_projection_entry (framebuffer->context,
projection_entry); _cogl_context_set_current_projection_entry (ctx, projection_entry);
} }
static void static void
_cogl_framebuffer_gl_flush_front_face_winding_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_front_face_winding_state (CoglFramebuffer *framebuffer)
{ {
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglPipelineCullFaceMode mode; CoglPipelineCullFaceMode mode;
/* NB: The face winding state is actually owned by the current /* NB: The face winding state is actually owned by the current
@ -238,10 +252,10 @@ _cogl_framebuffer_gl_flush_front_face_winding_state (CoglFramebuffer *framebuffe
static void static void
_cogl_framebuffer_gl_flush_stereo_mode_state (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush_stereo_mode_state (CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
GLenum draw_buffer = GL_BACK; GLenum draw_buffer = GL_BACK;
if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN) if (cogl_is_offscreen (framebuffer))
return; return;
if (!ctx->glDrawBuffer) if (!ctx->glDrawBuffer)
@ -251,7 +265,7 @@ _cogl_framebuffer_gl_flush_stereo_mode_state (CoglFramebuffer *framebuffer)
* must have already happened. If not it would override what we set here. */ * must have already happened. If not it would override what we set here. */
g_assert (ctx->was_bound_to_onscreen); g_assert (ctx->was_bound_to_onscreen);
switch (framebuffer->stereo_mode) switch (cogl_framebuffer_get_stereo_mode (framebuffer))
{ {
case COGL_STEREO_BOTH: case COGL_STEREO_BOTH:
draw_buffer = GL_BACK; draw_buffer = GL_BACK;
@ -274,9 +288,9 @@ _cogl_framebuffer_gl_flush_stereo_mode_state (CoglFramebuffer *framebuffer)
void void
_cogl_framebuffer_gl_bind (CoglFramebuffer *framebuffer, GLenum target) _cogl_framebuffer_gl_bind (CoglFramebuffer *framebuffer, GLenum target)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN) if (cogl_is_offscreen (framebuffer))
{ {
CoglOffscreen *offscreen = COGL_OFFSCREEN (framebuffer); CoglOffscreen *offscreen = COGL_OFFSCREEN (framebuffer);
GE (ctx, glBindFramebuffer (target, GE (ctx, glBindFramebuffer (target,
@ -325,7 +339,7 @@ _cogl_framebuffer_gl_flush_state (CoglFramebuffer *draw_buffer,
CoglFramebuffer *read_buffer, CoglFramebuffer *read_buffer,
CoglFramebufferState state) CoglFramebufferState state)
{ {
CoglContext *ctx = draw_buffer->context; CoglContext *ctx = cogl_framebuffer_get_context (draw_buffer);
unsigned long differences; unsigned long differences;
int bit; int bit;
@ -377,9 +391,9 @@ _cogl_framebuffer_gl_flush_state (CoglFramebuffer *draw_buffer,
return; return;
/* Lazily ensure the framebuffers have been allocated */ /* Lazily ensure the framebuffers have been allocated */
if (G_UNLIKELY (!draw_buffer->allocated)) if (G_UNLIKELY (!cogl_framebuffer_is_allocated (draw_buffer)))
cogl_framebuffer_allocate (draw_buffer, NULL); cogl_framebuffer_allocate (draw_buffer, NULL);
if (G_UNLIKELY (!read_buffer->allocated)) if (G_UNLIKELY (!cogl_framebuffer_is_allocated (read_buffer)))
cogl_framebuffer_allocate (read_buffer, NULL); cogl_framebuffer_allocate (read_buffer, NULL);
/* We handle buffer binding separately since the method depends on whether /* We handle buffer binding separately since the method depends on whether
@ -628,7 +642,7 @@ try_creating_fbo (CoglContext *ctx,
int texture_level_width, int texture_level_width,
int texture_level_height, int texture_level_height,
CoglTexture *depth_texture, CoglTexture *depth_texture,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
CoglOffscreenAllocateFlags flags, CoglOffscreenAllocateFlags flags,
CoglGLFramebuffer *gl_framebuffer) CoglGLFramebuffer *gl_framebuffer)
{ {
@ -739,10 +753,11 @@ gboolean
_cogl_offscreen_gl_allocate (CoglOffscreen *offscreen, _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
GError **error) GError **error)
{ {
CoglFramebuffer *fb = COGL_FRAMEBUFFER (offscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (offscreen);
CoglContext *ctx = fb->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglOffscreenAllocateFlags flags; CoglOffscreenAllocateFlags flags;
CoglGLFramebuffer *gl_framebuffer = &offscreen->gl_framebuffer; CoglGLFramebuffer *gl_framebuffer = &offscreen->gl_framebuffer;
const CoglFramebufferConfig *config;
int level_width; int level_width;
int level_height; int level_height;
@ -769,6 +784,8 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
_cogl_texture_gl_flush_legacy_texobj_filters (offscreen->texture, _cogl_texture_gl_flush_legacy_texobj_filters (offscreen->texture,
GL_NEAREST, GL_NEAREST); GL_NEAREST, GL_NEAREST);
config = cogl_framebuffer_get_config (framebuffer);
if (((offscreen->create_flags & COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL) && if (((offscreen->create_flags & COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL) &&
try_creating_fbo (ctx, try_creating_fbo (ctx,
offscreen->texture, offscreen->texture,
@ -776,7 +793,7 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = 0, flags = 0,
gl_framebuffer)) || gl_framebuffer)) ||
@ -787,7 +804,7 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = ctx->last_offscreen_allocate_flags, flags = ctx->last_offscreen_allocate_flags,
gl_framebuffer)) || gl_framebuffer)) ||
@ -804,7 +821,7 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = COGL_OFFSCREEN_ALLOCATE_FLAG_DEPTH_STENCIL, flags = COGL_OFFSCREEN_ALLOCATE_FLAG_DEPTH_STENCIL,
gl_framebuffer)) || gl_framebuffer)) ||
@ -814,7 +831,7 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = COGL_OFFSCREEN_ALLOCATE_FLAG_DEPTH | flags = COGL_OFFSCREEN_ALLOCATE_FLAG_DEPTH |
COGL_OFFSCREEN_ALLOCATE_FLAG_STENCIL, COGL_OFFSCREEN_ALLOCATE_FLAG_STENCIL,
gl_framebuffer) || gl_framebuffer) ||
@ -825,7 +842,7 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = COGL_OFFSCREEN_ALLOCATE_FLAG_STENCIL, flags = COGL_OFFSCREEN_ALLOCATE_FLAG_STENCIL,
gl_framebuffer) || gl_framebuffer) ||
@ -835,7 +852,7 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = COGL_OFFSCREEN_ALLOCATE_FLAG_DEPTH, flags = COGL_OFFSCREEN_ALLOCATE_FLAG_DEPTH,
gl_framebuffer) || gl_framebuffer) ||
@ -845,11 +862,12 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
level_width, level_width,
level_height, level_height,
offscreen->depth_texture, offscreen->depth_texture,
&fb->config, config,
flags = 0, flags = 0,
gl_framebuffer)) gl_framebuffer))
{ {
fb->samples_per_pixel = gl_framebuffer->samples_per_pixel; cogl_framebuffer_update_samples_per_pixel (framebuffer,
gl_framebuffer->samples_per_pixel);
if (!(offscreen->create_flags & COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL)) if (!(offscreen->create_flags & COGL_OFFSCREEN_DISABLE_DEPTH_AND_STENCIL))
{ {
@ -878,7 +896,8 @@ _cogl_offscreen_gl_allocate (CoglOffscreen *offscreen,
void void
_cogl_offscreen_gl_free (CoglOffscreen *offscreen) _cogl_offscreen_gl_free (CoglOffscreen *offscreen)
{ {
CoglContext *ctx = COGL_FRAMEBUFFER (offscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (offscreen);
CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
delete_renderbuffers (ctx, offscreen->gl_framebuffer.renderbuffers); delete_renderbuffers (ctx, offscreen->gl_framebuffer.renderbuffers);
@ -893,7 +912,7 @@ _cogl_framebuffer_gl_clear (CoglFramebuffer *framebuffer,
float blue, float blue,
float alpha) float alpha)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
GLbitfield gl_buffers = 0; GLbitfield gl_buffers = 0;
if (buffers & COGL_BUFFER_BIT_COLOR) if (buffers & COGL_BUFFER_BIT_COLOR)
@ -904,13 +923,17 @@ _cogl_framebuffer_gl_clear (CoglFramebuffer *framebuffer,
if (buffers & COGL_BUFFER_BIT_DEPTH) if (buffers & COGL_BUFFER_BIT_DEPTH)
{ {
gboolean is_depth_writing_enabled;
gl_buffers |= GL_DEPTH_BUFFER_BIT; gl_buffers |= GL_DEPTH_BUFFER_BIT;
if (ctx->depth_writing_enabled_cache != framebuffer->depth_writing_enabled) is_depth_writing_enabled =
cogl_framebuffer_get_depth_write_enabled (framebuffer);
if (ctx->depth_writing_enabled_cache != is_depth_writing_enabled)
{ {
GE( ctx, glDepthMask (framebuffer->depth_writing_enabled)); GE( ctx, glDepthMask (is_depth_writing_enabled));
ctx->depth_writing_enabled_cache = framebuffer->depth_writing_enabled; ctx->depth_writing_enabled_cache = is_depth_writing_enabled;
/* Make sure the DepthMask is updated when the next primitive is drawn */ /* Make sure the DepthMask is updated when the next primitive is drawn */
ctx->current_pipeline_changes_since_flush |= ctx->current_pipeline_changes_since_flush |=
@ -947,7 +970,7 @@ ensure_framebuffer_gl (CoglFramebuffer *framebuffer)
static inline void static inline void
_cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer) _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglFramebufferGl *framebuffer_gl; CoglFramebufferGl *framebuffer_gl;
framebuffer_gl = ensure_framebuffer_gl (framebuffer); framebuffer_gl = ensure_framebuffer_gl (framebuffer);
@ -963,11 +986,11 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer)
#ifdef HAVE_COGL_GL #ifdef HAVE_COGL_GL
if ((ctx->driver == COGL_DRIVER_GL3 && if ((ctx->driver == COGL_DRIVER_GL3 &&
framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN) || cogl_is_onscreen (framebuffer)) ||
(_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_QUERY_FRAMEBUFFER_BITS) && (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_QUERY_FRAMEBUFFER_BITS) &&
framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN)) cogl_is_offscreen (framebuffer)))
{ {
gboolean is_offscreen = framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN; gboolean is_offscreen = cogl_is_offscreen (framebuffer);
const struct { const struct {
GLenum attachment, pname; GLenum attachment, pname;
size_t offset; size_t offset;
@ -1017,8 +1040,8 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer)
/* If we don't have alpha textures then the alpha bits are actually /* If we don't have alpha textures then the alpha bits are actually
* stored in the red component */ * stored in the red component */
if (!_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_ALPHA_TEXTURES) && if (!_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_ALPHA_TEXTURES) &&
framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN && cogl_is_offscreen (framebuffer) &&
framebuffer->internal_format == COGL_PIXEL_FORMAT_A_8) cogl_framebuffer_get_internal_format (framebuffer) == COGL_PIXEL_FORMAT_A_8)
{ {
framebuffer_gl->bits.alpha = framebuffer_gl->bits.red; framebuffer_gl->bits.alpha = framebuffer_gl->bits.red;
framebuffer_gl->bits.red = 0; framebuffer_gl->bits.red = 0;
@ -1027,9 +1050,7 @@ _cogl_framebuffer_init_bits (CoglFramebuffer *framebuffer)
COGL_NOTE (OFFSCREEN, COGL_NOTE (OFFSCREEN,
"RGBA/D/S Bits for framebuffer[%p, %s]: %d, %d, %d, %d, %d, %d", "RGBA/D/S Bits for framebuffer[%p, %s]: %d, %d, %d, %d, %d, %d",
framebuffer, framebuffer,
framebuffer->type == COGL_FRAMEBUFFER_TYPE_OFFSCREEN cogl_is_offscreen (framebuffer) ? "offscreen" : "onscreen",
? "offscreen"
: "onscreen",
framebuffer_gl->bits.red, framebuffer_gl->bits.red,
framebuffer_gl->bits.blue, framebuffer_gl->bits.blue,
framebuffer_gl->bits.green, framebuffer_gl->bits.green,
@ -1057,27 +1078,27 @@ _cogl_framebuffer_gl_query_bits (CoglFramebuffer *framebuffer,
void void
_cogl_framebuffer_gl_finish (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_finish (CoglFramebuffer *framebuffer)
{ {
GE (framebuffer->context, glFinish ()); GE (cogl_framebuffer_get_context (framebuffer), glFinish ());
} }
void void
_cogl_framebuffer_gl_flush (CoglFramebuffer *framebuffer) _cogl_framebuffer_gl_flush (CoglFramebuffer *framebuffer)
{ {
GE (framebuffer->context, glFlush ()); GE (cogl_framebuffer_get_context (framebuffer), glFlush ());
} }
void void
_cogl_framebuffer_gl_discard_buffers (CoglFramebuffer *framebuffer, _cogl_framebuffer_gl_discard_buffers (CoglFramebuffer *framebuffer,
unsigned long buffers) unsigned long buffers)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
if (ctx->glDiscardFramebuffer) if (ctx->glDiscardFramebuffer)
{ {
GLenum attachments[3]; GLenum attachments[3];
int i = 0; int i = 0;
if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN) if (cogl_is_onscreen (framebuffer))
{ {
if (buffers & COGL_BUFFER_BIT_COLOR) if (buffers & COGL_BUFFER_BIT_COLOR)
attachments[i++] = GL_COLOR; attachments[i++] = GL_COLOR;
@ -1116,7 +1137,7 @@ _cogl_framebuffer_gl_draw_attributes (CoglFramebuffer *framebuffer,
_cogl_flush_attributes_state (framebuffer, pipeline, flags, _cogl_flush_attributes_state (framebuffer, pipeline, flags,
attributes, n_attributes); attributes, n_attributes);
GE (framebuffer->context, GE (cogl_framebuffer_get_context (framebuffer),
glDrawArrays ((GLenum)mode, first_vertex, n_vertices)); glDrawArrays ((GLenum)mode, first_vertex, n_vertices));
} }
@ -1180,7 +1201,7 @@ _cogl_framebuffer_gl_draw_indexed_attributes (CoglFramebuffer *framebuffer,
break; break;
} }
GE (framebuffer->context, GE (cogl_framebuffer_get_context (framebuffer),
glDrawElements ((GLenum)mode, glDrawElements ((GLenum)mode,
n_vertices, n_vertices,
indices_gl_type, indices_gl_type,
@ -1197,11 +1218,13 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
CoglBitmap *bitmap, CoglBitmap *bitmap,
GError **error) GError **error)
{ {
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
int framebuffer_height = cogl_framebuffer_get_height (framebuffer); int framebuffer_height = cogl_framebuffer_get_height (framebuffer);
int width = cogl_bitmap_get_width (bitmap); int width = cogl_bitmap_get_width (bitmap);
int height = cogl_bitmap_get_height (bitmap); int height = cogl_bitmap_get_height (bitmap);
CoglPixelFormat format = cogl_bitmap_get_format (bitmap); CoglPixelFormat format = cogl_bitmap_get_format (bitmap);
CoglPixelFormat internal_format =
cogl_framebuffer_get_internal_format (framebuffer);
CoglPixelFormat required_format; CoglPixelFormat required_format;
GLenum gl_intformat; GLenum gl_intformat;
GLenum gl_format; GLenum gl_format;
@ -1281,8 +1304,10 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
} }
if (COGL_PIXEL_FORMAT_CAN_HAVE_PREMULT (read_format)) if (COGL_PIXEL_FORMAT_CAN_HAVE_PREMULT (read_format))
{
read_format = ((read_format & ~COGL_PREMULT_BIT) | read_format = ((read_format & ~COGL_PREMULT_BIT) |
(framebuffer->internal_format & COGL_PREMULT_BIT)); (internal_format & COGL_PREMULT_BIT));
}
tmp_bmp = _cogl_bitmap_new_with_malloc_buffer (ctx, tmp_bmp = _cogl_bitmap_new_with_malloc_buffer (ctx,
width, height, width, height,
@ -1336,7 +1361,7 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
* converted to the right format below */ * converted to the right format below */
if (COGL_PIXEL_FORMAT_CAN_HAVE_PREMULT (format)) if (COGL_PIXEL_FORMAT_CAN_HAVE_PREMULT (format))
bmp_format = ((format & ~COGL_PREMULT_BIT) | bmp_format = ((format & ~COGL_PREMULT_BIT) |
(framebuffer->internal_format & COGL_PREMULT_BIT)); (internal_format & COGL_PREMULT_BIT));
else else
bmp_format = format; bmp_format = format;

View File

@ -259,7 +259,10 @@ flush_depth_state (CoglContext *ctx,
gboolean depth_writing_enabled = depth_state->write_enabled; gboolean depth_writing_enabled = depth_state->write_enabled;
if (ctx->current_draw_buffer) if (ctx->current_draw_buffer)
depth_writing_enabled &= ctx->current_draw_buffer->depth_writing_enabled; {
depth_writing_enabled &=
cogl_framebuffer_get_depth_write_enabled (ctx->current_draw_buffer);
}
if (ctx->depth_test_enabled_cache != depth_state->test_enabled) if (ctx->depth_test_enabled_cache != depth_state->test_enabled)
{ {
@ -267,7 +270,7 @@ flush_depth_state (CoglContext *ctx,
{ {
GE (ctx, glEnable (GL_DEPTH_TEST)); GE (ctx, glEnable (GL_DEPTH_TEST));
if (ctx->current_draw_buffer) if (ctx->current_draw_buffer)
ctx->current_draw_buffer->depth_buffer_clear_needed = TRUE; cogl_framebuffer_set_depth_buffer_clear_needed (ctx->current_draw_buffer);
} }
else else
GE (ctx, glDisable (GL_DEPTH_TEST)); GE (ctx, glDisable (GL_DEPTH_TEST));

View File

@ -88,7 +88,7 @@ typedef struct _CoglWinsysEGLVtable
int int
(* add_config_attributes) (CoglDisplay *display, (* add_config_attributes) (CoglDisplay *display,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
EGLint *attributes); EGLint *attributes);
gboolean gboolean
(* choose_config) (CoglDisplay *display, (* choose_config) (CoglDisplay *display,

View File

@ -81,7 +81,7 @@ find_onscreen_for_xid (CoglContext *context, uint32_t xid)
CoglOnscreenEGL *egl_onscreen; CoglOnscreenEGL *egl_onscreen;
CoglOnscreenXlib *xlib_onscreen; CoglOnscreenXlib *xlib_onscreen;
if (framebuffer->type != COGL_FRAMEBUFFER_TYPE_ONSCREEN) if (!cogl_is_onscreen (framebuffer))
continue; continue;
egl_onscreen = COGL_ONSCREEN (framebuffer)->winsys; egl_onscreen = COGL_ONSCREEN (framebuffer)->winsys;
@ -99,7 +99,7 @@ flush_pending_resize_notifications_cb (void *data,
{ {
CoglFramebuffer *framebuffer = data; CoglFramebuffer *framebuffer = data;
if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN) if (cogl_is_onscreen (framebuffer))
{ {
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
@ -320,7 +320,7 @@ error:
static int static int
_cogl_winsys_egl_add_config_attributes (CoglDisplay *display, _cogl_winsys_egl_add_config_attributes (CoglDisplay *display,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
EGLint *attributes) EGLint *attributes)
{ {
int i = 0; int i = 0;
@ -413,7 +413,7 @@ _cogl_winsys_egl_onscreen_init (CoglOnscreen *onscreen,
GError **error) GError **error)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *display = context->display; CoglDisplay *display = context->display;
CoglRenderer *renderer = display->renderer; CoglRenderer *renderer = display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
@ -513,7 +513,7 @@ static void
_cogl_winsys_egl_onscreen_deinit (CoglOnscreen *onscreen) _cogl_winsys_egl_onscreen_deinit (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (renderer); _cogl_xlib_renderer_get_data (renderer);
@ -544,7 +544,8 @@ static void
_cogl_winsys_onscreen_set_visibility (CoglOnscreen *onscreen, _cogl_winsys_onscreen_set_visibility (CoglOnscreen *onscreen,
gboolean visibility) gboolean visibility)
{ {
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (renderer); _cogl_xlib_renderer_get_data (renderer);
@ -562,7 +563,7 @@ _cogl_winsys_onscreen_set_resizable (CoglOnscreen *onscreen,
gboolean resizable) gboolean resizable)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;

View File

@ -196,7 +196,7 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
static void static void
egl_attributes_from_framebuffer_config (CoglDisplay *display, egl_attributes_from_framebuffer_config (CoglDisplay *display,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
EGLint *attributes) EGLint *attributes)
{ {
CoglRenderer *renderer = display->renderer; CoglRenderer *renderer = display->renderer;
@ -548,11 +548,12 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
GError **error) GError **error)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *display = context->display; CoglDisplay *display = context->display;
CoglDisplayEGL *egl_display = display->winsys; CoglDisplayEGL *egl_display = display->winsys;
CoglRenderer *renderer = display->renderer; CoglRenderer *renderer = display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
const CoglFramebufferConfig *config;
EGLint attributes[MAX_EGL_CONFIG_ATTRIBS]; EGLint attributes[MAX_EGL_CONFIG_ATTRIBS];
EGLConfig egl_config; EGLConfig egl_config;
EGLint config_count = 0; EGLint config_count = 0;
@ -560,9 +561,8 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
g_return_val_if_fail (egl_display->egl_context, FALSE); g_return_val_if_fail (egl_display->egl_context, FALSE);
egl_attributes_from_framebuffer_config (display, config = cogl_framebuffer_get_config (framebuffer);
&framebuffer->config, egl_attributes_from_framebuffer_config (display, config, attributes);
attributes);
status = eglChooseConfig (egl_renderer->edpy, status = eglChooseConfig (egl_renderer->edpy,
attributes, attributes,
@ -578,14 +578,14 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
/* Update the real number of samples_per_pixel now that we have /* Update the real number of samples_per_pixel now that we have
* found an egl_config... */ * found an egl_config... */
if (framebuffer->config.samples_per_pixel) if (config->samples_per_pixel)
{ {
EGLint samples; EGLint samples;
status = eglGetConfigAttrib (egl_renderer->edpy, status = eglGetConfigAttrib (egl_renderer->edpy,
egl_config, egl_config,
EGL_SAMPLES, &samples); EGL_SAMPLES, &samples);
g_return_val_if_fail (status == EGL_TRUE, TRUE); g_return_val_if_fail (status == EGL_TRUE, TRUE);
framebuffer->samples_per_pixel = samples; cogl_framebuffer_update_samples_per_pixel (framebuffer, samples);
} }
onscreen->winsys = g_slice_new0 (CoglOnscreenEGL); onscreen->winsys = g_slice_new0 (CoglOnscreenEGL);
@ -606,7 +606,7 @@ static void
_cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen) _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglDisplayEGL *egl_display = context->display->winsys; CoglDisplayEGL *egl_display = context->display->winsys;
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
@ -650,8 +650,8 @@ static gboolean
bind_onscreen_with_context (CoglOnscreen *onscreen, bind_onscreen_with_context (CoglOnscreen *onscreen,
EGLContext egl_context) EGLContext egl_context)
{ {
CoglFramebuffer *fb = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = fb->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
gboolean status = _cogl_winsys_egl_make_current (context->display, gboolean status = _cogl_winsys_egl_make_current (context->display,
@ -672,8 +672,8 @@ bind_onscreen_with_context (CoglOnscreen *onscreen,
static gboolean static gboolean
bind_onscreen (CoglOnscreen *onscreen) bind_onscreen (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *fb = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = fb->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglDisplayEGL *egl_display = context->display->winsys; CoglDisplayEGL *egl_display = context->display->winsys;
return bind_onscreen_with_context (onscreen, egl_display->egl_context); return bind_onscreen_with_context (onscreen, egl_display->egl_context);
@ -692,7 +692,8 @@ _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen)
static int static int
_cogl_winsys_onscreen_get_buffer_age (CoglOnscreen *onscreen) _cogl_winsys_onscreen_get_buffer_age (CoglOnscreen *onscreen)
{ {
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
@ -729,11 +730,11 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
int n_rectangles, int n_rectangles,
CoglFrameInfo *info) CoglFrameInfo *info)
{ {
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
int framebuffer_height = cogl_framebuffer_get_height (framebuffer); int framebuffer_height = cogl_framebuffer_get_height (framebuffer);
int *rectangles = g_alloca (sizeof (int) * n_rectangles * 4); int *rectangles = g_alloca (sizeof (int) * n_rectangles * 4);
int i; int i;
@ -769,7 +770,8 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
int n_rectangles, int n_rectangles,
CoglFrameInfo *info) CoglFrameInfo *info)
{ {
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
CoglOnscreenEGL *egl_onscreen = onscreen->winsys; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
@ -788,7 +790,7 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
if (n_rectangles && egl_renderer->pf_eglSwapBuffersWithDamage) if (n_rectangles && egl_renderer->pf_eglSwapBuffersWithDamage)
{ {
CoglFramebuffer *fb = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
size_t size = n_rectangles * sizeof (int) * 4; size_t size = n_rectangles * sizeof (int) * 4;
int *flipped = alloca (size); int *flipped = alloca (size);
int i; int i;
@ -798,7 +800,9 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
{ {
const int *rect = rectangles + 4 * i; const int *rect = rectangles + 4 * i;
int *flip_rect = flipped + 4 * i; int *flip_rect = flipped + 4 * i;
flip_rect[1] = fb->height - rect[1] - rect[3];
flip_rect[1] =
cogl_framebuffer_get_height (framebuffer) - rect[1] - rect[3];
} }
if (egl_renderer->pf_eglSwapBuffersWithDamage (egl_renderer->edpy, if (egl_renderer->pf_eglSwapBuffersWithDamage (egl_renderer->edpy,

View File

@ -178,7 +178,7 @@ find_onscreen_for_xid (CoglContext *context, uint32_t xid)
CoglFramebuffer *framebuffer = l->data; CoglFramebuffer *framebuffer = l->data;
CoglOnscreenXlib *xlib_onscreen; CoglOnscreenXlib *xlib_onscreen;
if (framebuffer->type != COGL_FRAMEBUFFER_TYPE_ONSCREEN) if (!cogl_is_onscreen (framebuffer))
continue; continue;
/* Does the GLXEvent have the GLXDrawable or the X Window? */ /* Does the GLXEvent have the GLXDrawable or the X Window? */
@ -331,7 +331,7 @@ flush_pending_notifications_cb (void *data,
{ {
CoglFramebuffer *framebuffer = data; CoglFramebuffer *framebuffer = data;
if (framebuffer->type == COGL_FRAMEBUFFER_TYPE_ONSCREEN) if (cogl_is_onscreen (framebuffer))
{ {
CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer); CoglOnscreen *onscreen = COGL_ONSCREEN (framebuffer);
CoglOnscreenGLX *glx_onscreen = onscreen->winsys; CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
@ -389,7 +389,8 @@ static void
set_sync_pending (CoglOnscreen *onscreen) set_sync_pending (CoglOnscreen *onscreen)
{ {
CoglOnscreenGLX *glx_onscreen = onscreen->winsys; CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglGLXRenderer *glx_renderer = renderer->winsys; CoglGLXRenderer *glx_renderer = renderer->winsys;
@ -412,7 +413,8 @@ static void
set_complete_pending (CoglOnscreen *onscreen) set_complete_pending (CoglOnscreen *onscreen)
{ {
CoglOnscreenGLX *glx_onscreen = onscreen->winsys; CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglGLXRenderer *glx_renderer = renderer->winsys; CoglGLXRenderer *glx_renderer = renderer->winsys;
@ -464,7 +466,7 @@ update_output (CoglOnscreen *onscreen)
{ {
CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *display = context->display; CoglDisplay *display = context->display;
CoglOutput *output; CoglOutput *output;
int width, height; int width, height;
@ -631,7 +633,7 @@ update_all_outputs (CoglRenderer *renderer)
{ {
CoglFramebuffer *framebuffer = l->data; CoglFramebuffer *framebuffer = l->data;
if (framebuffer->type != COGL_FRAMEBUFFER_TYPE_ONSCREEN) if (!cogl_is_onscreen (framebuffer))
continue; continue;
update_output (COGL_ONSCREEN (framebuffer)); update_output (COGL_ONSCREEN (framebuffer));
@ -856,7 +858,7 @@ update_winsys_features (CoglContext *context, GError **error)
static void static void
glx_attributes_from_framebuffer_config (CoglDisplay *display, glx_attributes_from_framebuffer_config (CoglDisplay *display,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
int *attributes) int *attributes)
{ {
CoglGLXRenderer *glx_renderer = display->renderer->winsys; CoglGLXRenderer *glx_renderer = display->renderer->winsys;
@ -908,7 +910,7 @@ glx_attributes_from_framebuffer_config (CoglDisplay *display,
* an explicit boolean status. */ * an explicit boolean status. */
static gboolean static gboolean
find_fbconfig (CoglDisplay *display, find_fbconfig (CoglDisplay *display,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
GLXFBConfig *config_ret, GLXFBConfig *config_ret,
GError **error) GError **error)
{ {
@ -1235,7 +1237,7 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
GError **error) GError **error)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *display = context->display; CoglDisplay *display = context->display;
CoglGLXDisplay *glx_display = display->winsys; CoglGLXDisplay *glx_display = display->winsys;
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
@ -1244,12 +1246,14 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
Window xwin; Window xwin;
CoglOnscreenXlib *xlib_onscreen; CoglOnscreenXlib *xlib_onscreen;
CoglOnscreenGLX *glx_onscreen; CoglOnscreenGLX *glx_onscreen;
const CoglFramebufferConfig *config;
GLXFBConfig fbconfig; GLXFBConfig fbconfig;
GError *fbconfig_error = NULL; GError *fbconfig_error = NULL;
g_return_val_if_fail (glx_display->glx_context, FALSE); g_return_val_if_fail (glx_display->glx_context, FALSE);
if (!find_fbconfig (display, &framebuffer->config, config = cogl_framebuffer_get_config (framebuffer);
if (!find_fbconfig (display, config,
&fbconfig, &fbconfig,
&fbconfig_error)) &fbconfig_error))
{ {
@ -1263,7 +1267,7 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
/* Update the real number of samples_per_pixel now that we have /* Update the real number of samples_per_pixel now that we have
* found an fbconfig... */ * found an fbconfig... */
if (framebuffer->config.samples_per_pixel) if (config->samples_per_pixel)
{ {
int samples; int samples;
int status = glx_renderer->glXGetFBConfigAttrib (xlib_renderer->xdpy, int status = glx_renderer->glXGetFBConfigAttrib (xlib_renderer->xdpy,
@ -1271,7 +1275,7 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
GLX_SAMPLES, GLX_SAMPLES,
&samples); &samples);
g_return_val_if_fail (status == Success, TRUE); g_return_val_if_fail (status == Success, TRUE);
framebuffer->samples_per_pixel = samples; cogl_framebuffer_update_samples_per_pixel (framebuffer, samples);
} }
/* FIXME: We need to explicitly Select for ConfigureNotify events. /* FIXME: We need to explicitly Select for ConfigureNotify events.
@ -1384,7 +1388,7 @@ static void
_cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen) _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglContextGLX *glx_context = context->winsys; CoglContextGLX *glx_context = context->winsys;
CoglGLXDisplay *glx_display = context->display->winsys; CoglGLXDisplay *glx_display = context->display->winsys;
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
@ -1455,7 +1459,8 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
static void static void
_cogl_winsys_onscreen_bind (CoglOnscreen *onscreen) _cogl_winsys_onscreen_bind (CoglOnscreen *onscreen)
{ {
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglContextGLX *glx_context = context->winsys; CoglContextGLX *glx_context = context->winsys;
CoglGLXDisplay *glx_display = context->display->winsys; CoglGLXDisplay *glx_display = context->display->winsys;
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
@ -1526,7 +1531,7 @@ static void
_cogl_winsys_wait_for_gpu (CoglOnscreen *onscreen) _cogl_winsys_wait_for_gpu (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
ctx->glFinish (); ctx->glFinish ();
} }
@ -1535,7 +1540,7 @@ static void
_cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen) _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *ctx = framebuffer->context; CoglContext *ctx = cogl_framebuffer_get_context (framebuffer);
CoglGLXRenderer *glx_renderer; CoglGLXRenderer *glx_renderer;
CoglXlibRenderer *xlib_renderer; CoglXlibRenderer *xlib_renderer;
CoglGLXDisplay *glx_display; CoglGLXDisplay *glx_display;
@ -1598,7 +1603,7 @@ static int
_cogl_winsys_onscreen_get_buffer_age (CoglOnscreen *onscreen) _cogl_winsys_onscreen_get_buffer_age (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (context->display->renderer); CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (context->display->renderer);
CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
CoglOnscreenGLX *glx_onscreen = onscreen->winsys; CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
@ -1635,7 +1640,7 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
CoglFrameInfo *info) CoglFrameInfo *info)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
@ -1842,7 +1847,7 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
CoglFrameInfo *info) CoglFrameInfo *info)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
@ -1924,7 +1929,8 @@ static void
_cogl_winsys_onscreen_set_visibility (CoglOnscreen *onscreen, _cogl_winsys_onscreen_set_visibility (CoglOnscreen *onscreen,
gboolean visibility) gboolean visibility)
{ {
CoglContext *context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
@ -1940,7 +1946,7 @@ _cogl_winsys_onscreen_set_resizable (CoglOnscreen *onscreen,
gboolean resizable) gboolean resizable)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *context = framebuffer->context; CoglContext *context = cogl_framebuffer_get_context (framebuffer);
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;

View File

@ -808,7 +808,7 @@ fail:
static int static int
meta_renderer_native_add_egl_config_attributes (CoglDisplay *cogl_display, meta_renderer_native_add_egl_config_attributes (CoglDisplay *cogl_display,
CoglFramebufferConfig *config, const CoglFramebufferConfig *config,
EGLint *attributes) EGLint *attributes)
{ {
CoglRendererEGL *cogl_renderer_egl = cogl_display->renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_display->renderer->winsys;
@ -1726,7 +1726,7 @@ copy_shared_framebuffer_cpu (CoglOnscreen *onscreen,
MetaRendererNativeGpuData *renderer_gpu_data) MetaRendererNativeGpuData *renderer_gpu_data)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = framebuffer->context; CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
MetaDumbBuffer *dumb_fb; MetaDumbBuffer *dumb_fb;
CoglBitmap *dumb_bitmap; CoglBitmap *dumb_bitmap;
CoglPixelFormat cogl_format; CoglPixelFormat cogl_format;
@ -1869,7 +1869,8 @@ ensure_crtc_modes (CoglOnscreen *onscreen,
{ {
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
CoglContext *cogl_context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *cogl_renderer = cogl_context->display->renderer; CoglRenderer *cogl_renderer = cogl_context->display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform; MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
@ -1897,7 +1898,8 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
int n_rectangles, int n_rectangles,
CoglFrameInfo *frame_info) CoglFrameInfo *frame_info)
{ {
CoglContext *cogl_context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context); CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
CoglRenderer *cogl_renderer = cogl_context->display->renderer; CoglRenderer *cogl_renderer = cogl_context->display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
@ -2118,7 +2120,8 @@ meta_onscreen_native_direct_scanout (CoglOnscreen *onscreen,
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
MetaGpuKms *render_gpu = onscreen_native->render_gpu; MetaGpuKms *render_gpu = onscreen_native->render_gpu;
CoglContext *cogl_context = COGL_FRAMEBUFFER (onscreen)->context; CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *cogl_renderer = cogl_context->display->renderer; CoglRenderer *cogl_renderer = cogl_context->display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform; MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
@ -2217,7 +2220,7 @@ meta_renderer_native_create_surface_gbm (CoglOnscreen *onscreen,
MetaRendererNative *renderer_native = onscreen_native->renderer_native; MetaRendererNative *renderer_native = onscreen_native->renderer_native;
MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native); MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native);
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = framebuffer->context; CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context->display; CoglDisplay *cogl_display = cogl_context->display;
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys; CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
CoglRenderer *cogl_renderer = cogl_display->renderer; CoglRenderer *cogl_renderer = cogl_display->renderer;
@ -2305,7 +2308,7 @@ meta_renderer_native_create_surface_egl_device (CoglOnscreen *onscreen,
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
CoglContext *cogl_context = framebuffer->context; CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context->display; CoglDisplay *cogl_display = cogl_context->display;
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys; CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
CoglRenderer *cogl_renderer = cogl_display->renderer; CoglRenderer *cogl_renderer = cogl_display->renderer;
@ -2538,7 +2541,7 @@ meta_renderer_native_init_onscreen (CoglOnscreen *onscreen,
GError **error) GError **error)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = framebuffer->context; CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context->display; CoglDisplay *cogl_display = cogl_context->display;
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys; CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
CoglOnscreenEGL *onscreen_egl; CoglOnscreenEGL *onscreen_egl;
@ -2644,7 +2647,7 @@ destroy_egl_surface (CoglOnscreen *onscreen)
MetaOnscreenNative *onscreen_native = onscreen_egl->platform; MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native); MetaEgl *egl = meta_onscreen_native_get_egl (onscreen_native);
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = framebuffer->context; CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglRenderer *cogl_renderer = cogl_context->display->renderer; CoglRenderer *cogl_renderer = cogl_context->display->renderer;
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys; CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
@ -2660,7 +2663,7 @@ static void
meta_renderer_native_release_onscreen (CoglOnscreen *onscreen) meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
{ {
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen); CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
CoglContext *cogl_context = framebuffer->context; CoglContext *cogl_context = cogl_framebuffer_get_context (framebuffer);
CoglDisplay *cogl_display = cogl_context_get_display (cogl_context); CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys; CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
CoglOnscreenEGL *onscreen_egl = onscreen->winsys; CoglOnscreenEGL *onscreen_egl = onscreen->winsys;