2008-04-25 09:37:36 -04:00
|
|
|
/*
|
2009-04-27 10:48:12 -04:00
|
|
|
* Cogl
|
2008-04-25 09:37:36 -04:00
|
|
|
*
|
2009-04-27 10:48:12 -04:00
|
|
|
* An object oriented GL/GLES Abstraction/Utility Layer
|
2008-04-25 09:37:36 -04:00
|
|
|
*
|
2009-04-27 10:48:12 -04:00
|
|
|
* Copyright (C) 2007,2008,2009 Intel Corporation.
|
2008-04-25 09:37:36 -04:00
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
2010-03-01 07:56:10 -05:00
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*
|
2008-04-25 09:37:36 -04:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "cogl.h"
|
2010-11-04 20:00:25 -04:00
|
|
|
#include "cogl-object.h"
|
2008-04-25 09:37:36 -04:00
|
|
|
#include "cogl-internal.h"
|
2010-08-16 16:11:42 -04:00
|
|
|
#include "cogl-profile.h"
|
2008-04-25 09:37:36 -04:00
|
|
|
#include "cogl-util.h"
|
2010-11-04 18:25:52 -04:00
|
|
|
#include "cogl-context-private.h"
|
2009-09-16 09:01:57 -04:00
|
|
|
#include "cogl-journal-private.h"
|
2009-01-26 06:07:35 -05:00
|
|
|
#include "cogl-texture-private.h"
|
2010-10-27 13:54:57 -04:00
|
|
|
#include "cogl-pipeline-private.h"
|
|
|
|
#include "cogl-pipeline-opengl-private.h"
|
2009-11-26 14:06:35 -05:00
|
|
|
#include "cogl-framebuffer-private.h"
|
2010-11-03 20:27:47 -04:00
|
|
|
#include "cogl2-path.h"
|
2008-04-25 09:37:36 -04:00
|
|
|
|
2009-01-26 06:07:35 -05:00
|
|
|
#include <string.h>
|
|
|
|
|
2010-06-18 10:25:51 -04:00
|
|
|
#ifdef HAVE_COGL_GL
|
2010-11-29 11:56:41 -05:00
|
|
|
#include "cogl-pipeline-fragend-arbfp-private.h"
|
2010-06-18 10:25:51 -04:00
|
|
|
#define glActiveTexture _context->drv.pf_glActiveTexture
|
|
|
|
#endif
|
|
|
|
|
2010-03-22 09:33:55 -04:00
|
|
|
/* This isn't defined in the GLES headers */
|
|
|
|
#ifndef GL_POINT_SPRITE
|
|
|
|
#define GL_POINT_SPRITE 0x8861
|
|
|
|
#endif
|
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
static void _cogl_context_free (CoglContext *context);
|
|
|
|
|
|
|
|
COGL_OBJECT_DEFINE (Context, context);
|
|
|
|
|
2009-07-27 20:34:33 -04:00
|
|
|
extern void
|
|
|
|
_cogl_create_context_driver (CoglContext *context);
|
2010-06-02 10:16:14 -04:00
|
|
|
extern void
|
|
|
|
_cogl_create_context_winsys (CoglContext *context);
|
|
|
|
extern void
|
|
|
|
_cogl_destroy_context_winsys (CoglContext *context);
|
2009-07-27 20:34:33 -04:00
|
|
|
|
2008-04-25 09:37:36 -04:00
|
|
|
static CoglContext *_context = NULL;
|
2009-02-24 13:51:25 -05:00
|
|
|
static gboolean gl_is_indirect = FALSE;
|
2008-04-25 09:37:36 -04:00
|
|
|
|
2010-11-24 13:37:47 -05:00
|
|
|
static void
|
|
|
|
_cogl_init_feature_overrides (CoglContext *ctx)
|
|
|
|
{
|
2011-01-24 09:28:00 -05:00
|
|
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_VBOS)))
|
2010-11-24 13:37:47 -05:00
|
|
|
ctx->feature_flags &= ~COGL_FEATURE_VBOS;
|
|
|
|
|
2011-01-24 09:28:00 -05:00
|
|
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_PBOS)))
|
2010-11-24 13:37:47 -05:00
|
|
|
ctx->feature_flags &= ~COGL_FEATURE_PBOS;
|
|
|
|
|
2011-01-24 09:28:00 -05:00
|
|
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_ARBFP)))
|
2010-11-24 13:37:47 -05:00
|
|
|
ctx->feature_flags &= ~COGL_FEATURE_SHADERS_ARBFP;
|
|
|
|
|
2011-01-24 09:28:00 -05:00
|
|
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_GLSL)))
|
2010-11-24 13:37:47 -05:00
|
|
|
ctx->feature_flags &= ~COGL_FEATURE_SHADERS_GLSL;
|
|
|
|
|
2011-01-24 09:28:00 -05:00
|
|
|
if (G_UNLIKELY (COGL_DEBUG_ENABLED (COGL_DEBUG_DISABLE_NPOT_TEXTURES)))
|
2010-11-24 13:37:47 -05:00
|
|
|
ctx->feature_flags &= ~(COGL_FEATURE_TEXTURE_NPOT |
|
|
|
|
COGL_FEATURE_TEXTURE_NPOT_BASIC |
|
|
|
|
COGL_FEATURE_TEXTURE_NPOT_MIPMAP |
|
|
|
|
COGL_FEATURE_TEXTURE_NPOT_REPEAT);
|
|
|
|
}
|
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
/* FIXME: We don't report a GError here should we? With non NULL
|
|
|
|
* displays then there should basically be no risk of error I think,
|
|
|
|
* but NULL just says "please do the right thing" and we could hit any
|
|
|
|
* number of problems that should be reported back to the caller!
|
|
|
|
*
|
|
|
|
* Also is it acceptable for construction to report an error
|
|
|
|
* or should there be a separate cogl_context_check_status()
|
|
|
|
* API of some kind?
|
|
|
|
*/
|
|
|
|
CoglContext *
|
|
|
|
cogl_context_new (CoglDisplay *display)
|
2008-04-25 09:37:36 -04:00
|
|
|
{
|
2010-11-04 20:00:25 -04:00
|
|
|
CoglContext *context;
|
2009-01-26 06:07:35 -05:00
|
|
|
GLubyte default_texture_data[] = { 0xff, 0xff, 0xff, 0x0 };
|
2010-11-04 20:00:25 -04:00
|
|
|
unsigned long enable_flags = 0;
|
2009-09-25 09:34:34 -04:00
|
|
|
CoglHandle window_buffer;
|
2010-07-05 18:24:34 -04:00
|
|
|
int i;
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
/* A NULL display means "please just do something sensible"
|
|
|
|
* and since we haven't implemented anything for CoglDisplay
|
|
|
|
* yet that's the only kind of context construction we allow
|
|
|
|
* for now. */
|
|
|
|
g_return_val_if_fail (display == NULL, NULL);
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-08-16 16:11:42 -04:00
|
|
|
#ifdef CLUTTER_ENABLE_PROFILE
|
|
|
|
/* We need to be absolutely sure that uprof has been initialized
|
|
|
|
* before calling _cogl_uprof_init. uprof_init (NULL, NULL)
|
|
|
|
* will be a NOP if it has been initialized but it will also
|
|
|
|
* mean subsequent parsing of the UProf GOptionGroup will have no
|
|
|
|
* affect.
|
|
|
|
*
|
|
|
|
* Sadly GOptionGroup based library initialization is extremely
|
|
|
|
* fragile by design because GOptionGroups have no notion of
|
|
|
|
* dependencies and so the order things are initialized isn't
|
|
|
|
* currently under tight control.
|
|
|
|
*/
|
|
|
|
uprof_init (NULL, NULL);
|
|
|
|
_cogl_uprof_init ();
|
|
|
|
#endif
|
|
|
|
|
2008-04-25 09:37:36 -04:00
|
|
|
/* Allocate context memory */
|
2010-11-04 20:00:25 -04:00
|
|
|
context = g_malloc (sizeof (CoglContext));
|
|
|
|
|
|
|
|
/* XXX: Gross hack!
|
|
|
|
* Currently everything in Cogl just assumes there is a default
|
|
|
|
* context which it can access via _COGL_GET_CONTEXT() including
|
|
|
|
* code used to construct a CoglContext. Until all of that code
|
|
|
|
* has been updated to take an explicit context argument we have
|
|
|
|
* to immediatly make our pointer the default context.
|
|
|
|
*/
|
|
|
|
_context = context;
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2008-04-25 09:37:36 -04:00
|
|
|
/* Init default values */
|
|
|
|
_context->feature_flags = 0;
|
2009-11-14 09:59:59 -05:00
|
|
|
_context->feature_flags_private = 0;
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->texture_types = NULL;
|
|
|
|
context->buffer_types = NULL;
|
2010-06-11 08:50:36 -04:00
|
|
|
|
2009-10-22 07:35:33 -04:00
|
|
|
/* Initialise the driver specific state */
|
|
|
|
/* TODO: combine these two into one function */
|
2010-11-04 20:00:25 -04:00
|
|
|
_cogl_create_context_driver (context);
|
2009-10-22 07:35:33 -04:00
|
|
|
_cogl_features_init ();
|
2010-11-24 13:37:47 -05:00
|
|
|
_cogl_init_feature_overrides (_context);
|
2009-10-22 07:35:33 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
_cogl_create_context_winsys (context);
|
2010-06-02 10:16:14 -04:00
|
|
|
|
2010-10-27 13:54:57 -04:00
|
|
|
_cogl_pipeline_init_default_pipeline ();
|
|
|
|
_cogl_pipeline_init_default_layers ();
|
2010-11-04 09:57:36 -04:00
|
|
|
_cogl_pipeline_init_state_hash_functions ();
|
|
|
|
_cogl_pipeline_init_layer_state_hash_functions ();
|
2009-11-11 07:50:48 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->enable_flags = 0;
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->enable_backface_culling = FALSE;
|
|
|
|
context->flushed_front_winding = COGL_FRONT_WINDING_COUNTER_CLOCKWISE;
|
2009-03-10 13:53:51 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->indirect = gl_is_indirect;
|
2009-02-24 13:51:25 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
cogl_matrix_init_identity (&context->identity_matrix);
|
|
|
|
cogl_matrix_init_identity (&context->y_flip_matrix);
|
|
|
|
cogl_matrix_scale (&context->y_flip_matrix, 1, -1, 1);
|
2009-10-22 11:13:01 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->flushed_matrix_mode = COGL_MATRIX_MODELVIEW;
|
2010-04-26 05:01:43 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->texture_units =
|
2010-04-26 05:01:43 -04:00
|
|
|
g_array_new (FALSE, FALSE, sizeof (CoglTextureUnit));
|
|
|
|
|
2010-10-27 13:54:57 -04:00
|
|
|
/* See cogl-pipeline.c for more details about why we leave texture unit 1
|
2010-04-26 05:01:43 -04:00
|
|
|
* active by default... */
|
2010-11-04 20:00:25 -04:00
|
|
|
context->active_texture_unit = 1;
|
2010-04-26 05:01:43 -04:00
|
|
|
GE (glActiveTexture (GL_TEXTURE1));
|
2009-09-28 21:58:27 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->legacy_fog_state.enabled = FALSE;
|
2010-07-06 15:18:26 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->opaque_color_pipeline = cogl_pipeline_new ();
|
|
|
|
context->blended_color_pipeline = cogl_pipeline_new ();
|
|
|
|
context->texture_pipeline = cogl_pipeline_new ();
|
|
|
|
context->codegen_header_buffer = g_string_new ("");
|
|
|
|
context->codegen_source_buffer = g_string_new ("");
|
|
|
|
context->source_stack = NULL;
|
2010-04-26 05:01:43 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->legacy_state_set = 0;
|
2008-12-04 08:45:09 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->default_gl_texture_2d_tex = COGL_INVALID_HANDLE;
|
|
|
|
context->default_gl_texture_rect_tex = COGL_INVALID_HANDLE;
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->framebuffers = NULL;
|
2011-01-21 12:28:34 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->journal_flush_attributes_array =
|
2011-01-20 14:31:53 -05:00
|
|
|
g_array_new (TRUE, FALSE, sizeof (CoglAttribute *));
|
2010-11-04 20:00:25 -04:00
|
|
|
context->journal_clip_bounds = NULL;
|
2008-12-09 10:10:33 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->polygon_vertices = g_array_new (FALSE, FALSE, sizeof (float));
|
2010-10-18 12:17:22 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->current_pipeline = NULL;
|
|
|
|
context->current_pipeline_changes_since_flush = 0;
|
|
|
|
context->current_pipeline_skip_gl_color = FALSE;
|
2010-04-26 05:01:43 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->pipeline0_nodes =
|
2010-04-08 07:21:04 -04:00
|
|
|
g_array_sized_new (FALSE, FALSE, sizeof (CoglHandle), 20);
|
2010-11-04 20:00:25 -04:00
|
|
|
context->pipeline1_nodes =
|
2010-04-08 07:21:04 -04:00
|
|
|
g_array_sized_new (FALSE, FALSE, sizeof (CoglHandle), 20);
|
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
_cogl_bitmask_init (&context->arrays_enabled);
|
|
|
|
_cogl_bitmask_init (&context->temp_bitmask);
|
|
|
|
_cogl_bitmask_init (&context->arrays_to_change);
|
2008-12-11 10:33:38 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->max_texture_units = -1;
|
|
|
|
context->max_texture_image_units = -1;
|
|
|
|
context->max_activateable_texture_units = -1;
|
2010-04-26 05:01:43 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->current_program = COGL_INVALID_HANDLE;
|
2010-04-26 05:01:43 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->current_fragment_program_type = COGL_PIPELINE_PROGRAM_TYPE_FIXED;
|
|
|
|
context->current_vertex_program_type = COGL_PIPELINE_PROGRAM_TYPE_FIXED;
|
|
|
|
context->current_gl_program = 0;
|
2010-04-26 05:01:43 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->gl_blend_enable_cache = FALSE;
|
2010-04-08 07:21:04 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->depth_test_enabled_cache = FALSE;
|
|
|
|
context->depth_test_function_cache = COGL_DEPTH_TEST_FUNCTION_LESS;
|
|
|
|
context->depth_writing_enabled_cache = TRUE;
|
|
|
|
context->depth_range_near_cache = 0;
|
|
|
|
context->depth_range_far_cache = 1;
|
2010-05-26 06:33:32 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->point_size_cache = 1.0f;
|
2010-03-22 05:32:17 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->legacy_depth_test_enabled = FALSE;
|
2010-05-26 06:33:32 -04:00
|
|
|
|
2010-12-07 11:44:36 -05:00
|
|
|
#ifdef HAVE_COGL_GL
|
2010-11-29 11:56:41 -05:00
|
|
|
_context->arbfp_cache = g_hash_table_new (_cogl_pipeline_fragend_arbfp_hash,
|
|
|
|
_cogl_pipeline_fragend_arbfp_equal);
|
2010-12-07 11:44:36 -05:00
|
|
|
#endif
|
2010-12-03 07:01:18 -05:00
|
|
|
|
2010-07-05 18:24:34 -04:00
|
|
|
for (i = 0; i < COGL_BUFFER_BIND_TARGET_COUNT; i++)
|
2010-11-04 20:00:25 -04:00
|
|
|
context->current_buffer[i] = NULL;
|
2010-07-05 18:24:34 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->framebuffer_stack = _cogl_create_framebuffer_stack ();
|
2010-04-26 13:08:45 -04:00
|
|
|
|
2010-11-05 13:20:14 -04:00
|
|
|
_context->current_clip_stack_valid = FALSE;
|
|
|
|
|
2009-09-25 09:34:34 -04:00
|
|
|
window_buffer = _cogl_onscreen_new ();
|
2009-11-26 14:06:35 -05:00
|
|
|
cogl_set_framebuffer (window_buffer);
|
|
|
|
/* XXX: the deprecated _cogl_set_draw_buffer API expects to
|
|
|
|
* find the window buffer here... */
|
2010-11-04 20:00:25 -04:00
|
|
|
context->window_buffer = window_buffer;
|
2009-11-26 14:06:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->dirty_bound_framebuffer = TRUE;
|
|
|
|
context->dirty_gl_viewport = TRUE;
|
2008-11-10 13:53:14 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->current_path = cogl2_path_new ();
|
|
|
|
context->stencil_pipeline = cogl_pipeline_new ();
|
2008-05-27 13:42:50 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->in_begin_gl_block = FALSE;
|
2009-07-27 20:34:33 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->quad_buffer_indices_byte = COGL_INVALID_HANDLE;
|
|
|
|
context->quad_buffer_indices = COGL_INVALID_HANDLE;
|
|
|
|
context->quad_buffer_indices_len = 0;
|
2010-10-12 07:48:58 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->rectangle_byte_indices = NULL;
|
|
|
|
context->rectangle_short_indices = NULL;
|
|
|
|
context->rectangle_short_indices_len = 0;
|
2010-10-12 07:48:58 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->texture_download_pipeline = COGL_INVALID_HANDLE;
|
|
|
|
context->blit_texture_pipeline = COGL_INVALID_HANDLE;
|
2009-08-30 06:36:11 -04:00
|
|
|
|
2010-12-05 13:02:05 -05:00
|
|
|
#ifndef HAVE_COGL_GLES2
|
2009-09-25 14:04:13 -04:00
|
|
|
/* The default for GL_ALPHA_TEST is to always pass which is equivalent to
|
|
|
|
* the test being disabled therefore we assume that for all drivers there
|
|
|
|
* will be no performance impact if we always leave the test enabled which
|
2010-12-05 13:02:05 -05:00
|
|
|
* makes things a bit simpler for us. Under GLES2 the alpha test is
|
|
|
|
* implemented in the fragment shader so there is no enable for it
|
|
|
|
*/
|
2009-09-25 14:04:13 -04:00
|
|
|
GE (glEnable (GL_ALPHA_TEST));
|
2010-12-05 13:02:05 -05:00
|
|
|
#endif
|
2009-09-25 14:04:13 -04:00
|
|
|
|
2010-12-06 07:31:51 -05:00
|
|
|
#ifdef HAVE_COGL_GLES2
|
|
|
|
_context->flushed_modelview_stack = NULL;
|
|
|
|
_context->flushed_projection_stack = NULL;
|
|
|
|
#endif
|
|
|
|
|
2009-01-26 06:07:35 -05:00
|
|
|
/* Create default textures used for fall backs */
|
2010-11-04 20:00:25 -04:00
|
|
|
context->default_gl_texture_2d_tex =
|
2009-01-26 06:07:35 -05:00
|
|
|
cogl_texture_new_from_data (1, /* width */
|
|
|
|
1, /* height */
|
2009-07-27 20:34:33 -04:00
|
|
|
COGL_TEXTURE_NO_SLICING,
|
|
|
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE, /* data format */
|
2009-01-26 06:07:35 -05:00
|
|
|
/* internal format */
|
2009-07-27 20:34:33 -04:00
|
|
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
2009-01-26 06:07:35 -05:00
|
|
|
0, /* auto calc row stride */
|
2009-01-28 09:09:51 -05:00
|
|
|
default_texture_data);
|
2010-11-04 20:00:25 -04:00
|
|
|
context->default_gl_texture_rect_tex =
|
2009-01-26 06:07:35 -05:00
|
|
|
cogl_texture_new_from_data (1, /* width */
|
|
|
|
1, /* height */
|
2009-07-27 20:34:33 -04:00
|
|
|
COGL_TEXTURE_NO_SLICING,
|
|
|
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE, /* data format */
|
2009-01-26 06:07:35 -05:00
|
|
|
/* internal format */
|
2009-07-27 20:34:33 -04:00
|
|
|
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
|
2009-01-26 06:07:35 -05:00
|
|
|
0, /* auto calc row stride */
|
2009-01-28 09:09:51 -05:00
|
|
|
default_texture_data);
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
cogl_push_source (context->opaque_color_pipeline);
|
|
|
|
_cogl_pipeline_flush_gl_state (context->opaque_color_pipeline, FALSE, 0);
|
2010-03-19 05:16:08 -04:00
|
|
|
_cogl_enable (enable_flags);
|
2009-10-22 14:01:52 -04:00
|
|
|
_cogl_flush_face_winding ();
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
context->atlases = NULL;
|
2009-12-04 08:06:32 -05:00
|
|
|
|
2011-01-13 10:35:30 -05:00
|
|
|
_context->buffer_map_fallback_array = g_byte_array_new ();
|
|
|
|
_context->buffer_map_fallback_in_use = FALSE;
|
|
|
|
|
2010-03-22 09:33:55 -04:00
|
|
|
/* As far as I can tell, GL_POINT_SPRITE doesn't have any effect
|
|
|
|
unless GL_COORD_REPLACE is enabled for an individual
|
|
|
|
layer. Therefore it seems like it should be ok to just leave it
|
|
|
|
enabled all the time instead of having to have a set property on
|
2010-10-27 13:54:57 -04:00
|
|
|
each pipeline to track whether any layers have point sprite
|
2011-01-13 09:12:10 -05:00
|
|
|
coords enabled. We don't need to do this for GLES2 because point
|
|
|
|
sprites are handled using a builtin varying in the shader. */
|
|
|
|
#ifndef HAVE_COGL_GLES2
|
2010-03-22 09:33:55 -04:00
|
|
|
if (cogl_features_available (COGL_FEATURE_POINT_SPRITE))
|
|
|
|
GE (glEnable (GL_POINT_SPRITE));
|
2011-01-13 09:12:10 -05:00
|
|
|
#endif
|
2010-03-22 09:33:55 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
return _cogl_context_object_new (context);
|
2008-04-25 09:37:36 -04:00
|
|
|
}
|
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
static void
|
|
|
|
_cogl_context_free (CoglContext *context)
|
2008-04-25 09:37:36 -04:00
|
|
|
{
|
2010-11-04 20:00:25 -04:00
|
|
|
_cogl_destroy_context_winsys (context);
|
2010-06-02 10:16:14 -04:00
|
|
|
|
2009-09-28 21:58:27 -04:00
|
|
|
_cogl_destroy_texture_units ();
|
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
_cogl_free_framebuffer_stack (context->framebuffer_stack);
|
2009-09-25 09:34:34 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->current_path)
|
|
|
|
cogl_handle_unref (context->current_path);
|
2008-12-04 08:45:09 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->default_gl_texture_2d_tex)
|
|
|
|
cogl_handle_unref (context->default_gl_texture_2d_tex);
|
|
|
|
if (context->default_gl_texture_rect_tex)
|
|
|
|
cogl_handle_unref (context->default_gl_texture_rect_tex);
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->opaque_color_pipeline)
|
|
|
|
cogl_handle_unref (context->opaque_color_pipeline);
|
|
|
|
if (context->blended_color_pipeline)
|
|
|
|
cogl_handle_unref (context->blended_color_pipeline);
|
|
|
|
if (context->texture_pipeline)
|
|
|
|
cogl_handle_unref (context->texture_pipeline);
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->blit_texture_pipeline)
|
|
|
|
cogl_handle_unref (context->blit_texture_pipeline);
|
2011-01-20 12:45:47 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->journal_flush_attributes_array)
|
|
|
|
g_array_free (context->journal_flush_attributes_array, TRUE);
|
|
|
|
if (context->journal_clip_bounds)
|
|
|
|
g_array_free (context->journal_clip_bounds, TRUE);
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->polygon_vertices)
|
|
|
|
g_array_free (context->polygon_vertices, TRUE);
|
2010-10-18 12:17:22 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->quad_buffer_indices_byte)
|
|
|
|
cogl_handle_unref (context->quad_buffer_indices_byte);
|
|
|
|
if (context->quad_buffer_indices)
|
|
|
|
cogl_handle_unref (context->quad_buffer_indices);
|
2010-10-12 07:48:58 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->rectangle_byte_indices)
|
|
|
|
cogl_object_unref (context->rectangle_byte_indices);
|
|
|
|
if (context->rectangle_short_indices)
|
|
|
|
cogl_object_unref (context->rectangle_short_indices);
|
2010-10-12 07:48:58 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->default_pipeline)
|
|
|
|
cogl_handle_unref (context->default_pipeline);
|
2009-11-11 07:50:48 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->dummy_layer_dependant)
|
|
|
|
cogl_handle_unref (context->dummy_layer_dependant);
|
|
|
|
if (context->default_layer_n)
|
|
|
|
cogl_handle_unref (context->default_layer_n);
|
|
|
|
if (context->default_layer_0)
|
|
|
|
cogl_handle_unref (context->default_layer_0);
|
2010-04-08 07:21:04 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
if (context->current_clip_stack_valid)
|
|
|
|
_cogl_clip_stack_unref (context->current_clip_stack);
|
2010-11-02 10:28:12 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
g_slist_free (context->atlases);
|
2009-12-04 08:06:32 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
_cogl_bitmask_destroy (&context->arrays_enabled);
|
|
|
|
_cogl_bitmask_destroy (&context->temp_bitmask);
|
|
|
|
_cogl_bitmask_destroy (&context->arrays_to_change);
|
2010-05-24 07:40:11 -04:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
g_slist_free (context->texture_types);
|
|
|
|
g_slist_free (context->buffer_types);
|
2010-06-11 08:50:36 -04:00
|
|
|
|
2010-12-06 07:31:51 -05:00
|
|
|
#ifdef HAVE_COGL_GLES2
|
|
|
|
if (_context->flushed_modelview_stack)
|
|
|
|
cogl_object_unref (_context->flushed_modelview_stack);
|
|
|
|
if (_context->flushed_projection_stack)
|
|
|
|
cogl_object_unref (_context->flushed_projection_stack);
|
|
|
|
#endif
|
|
|
|
|
2010-12-07 11:44:36 -05:00
|
|
|
#ifdef HAVE_COGL_GL
|
2010-11-04 20:00:25 -04:00
|
|
|
g_hash_table_unref (context->arbfp_cache);
|
2010-12-07 11:44:36 -05:00
|
|
|
#endif
|
2010-12-03 07:01:18 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
g_byte_array_free (context->buffer_map_fallback_array, TRUE);
|
2011-01-13 10:35:30 -05:00
|
|
|
|
2010-11-04 20:00:25 -04:00
|
|
|
g_free (context);
|
2008-04-25 09:37:36 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
CoglContext *
|
2010-05-27 07:18:29 -04:00
|
|
|
_cogl_context_get_default (void)
|
2008-04-25 09:37:36 -04:00
|
|
|
{
|
2009-01-26 06:07:35 -05:00
|
|
|
/* Create if doesn't exist yet */
|
2008-04-25 09:37:36 -04:00
|
|
|
if (_context == NULL)
|
2010-11-04 20:00:25 -04:00
|
|
|
_context = cogl_context_new (NULL);
|
2009-01-26 06:07:35 -05:00
|
|
|
|
2008-04-25 09:37:36 -04:00
|
|
|
return _context;
|
|
|
|
}
|
2009-02-24 13:51:25 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* _cogl_set_indirect_context:
|
|
|
|
* @indirect: TRUE if GL context is indirect
|
|
|
|
*
|
|
|
|
* Advises COGL that the GL context is indirect (commands are sent
|
|
|
|
* over a socket). COGL uses this information to try to avoid
|
|
|
|
* round-trips in its use of GL, for example.
|
|
|
|
*
|
|
|
|
* This function cannot be called "on the fly," only before COGL
|
|
|
|
* initializes.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
_cogl_set_indirect_context (gboolean indirect)
|
|
|
|
{
|
|
|
|
/* we get called multiple times if someone creates
|
|
|
|
* more than the default stage
|
|
|
|
*/
|
|
|
|
if (_context != NULL)
|
|
|
|
{
|
|
|
|
if (indirect != _context->indirect)
|
|
|
|
g_warning ("Right now all stages will be treated as "
|
|
|
|
"either direct or indirect, ignoring attempt "
|
|
|
|
"to change to indirect=%d", indirect);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
gl_is_indirect = indirect;
|
|
|
|
}
|