summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2019-12-11 18:39:57 -0500
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2019-12-18 16:33:54 +0000
commit9a3a6dc212fbab4365f4a7c74ecfad6c0889d527 (patch)
tree2b5210be7bd195b3824f62e854bd37d3ed450344
parentf9599b64d0284b64b5ffc23bd022ca0cd736c739 (diff)
downloadmutter-9a3a6dc212fbab4365f4a7c74ecfad6c0889d527.tar.gz
cogl: Move GL-specific context setup/teardown into the driver
https://gitlab.gnome.org/GNOME/mutter/merge_requests/973
-rw-r--r--cogl/cogl/cogl-context.c50
-rw-r--r--cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h2
-rw-r--r--cogl/cogl/driver/gl/cogl-pipeline-opengl.c4
-rw-r--r--cogl/cogl/driver/gl/gl/cogl-driver-gl.c43
4 files changed, 45 insertions, 54 deletions
diff --git a/cogl/cogl/cogl-context.c b/cogl/cogl/cogl-context.c
index 2d856e845..cb28321f6 100644
--- a/cogl/cogl/cogl-context.c
+++ b/cogl/cogl/cogl-context.c
@@ -47,8 +47,6 @@
#include "cogl1-context.h"
#include "cogl-gpu-info-private.h"
#include "cogl-gtype-private.h"
-#include "driver/gl/cogl-pipeline-opengl-private.h"
-#include "driver/gl/cogl-util-gl-private.h"
#include "winsys/cogl-winsys-private.h"
#include <string.h>
@@ -256,17 +254,6 @@ cogl_context_new (CoglDisplay *display,
context->flushed_matrix_mode = COGL_MATRIX_MODELVIEW;
- context->texture_units =
- g_array_new (FALSE, FALSE, sizeof (CoglTextureUnit));
-
- if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_ANY_GL))
- {
- /* See cogl-pipeline.c for more details about why we leave texture unit 1
- * active by default... */
- context->active_texture_unit = 1;
- GE (context, glActiveTexture (GL_TEXTURE1));
- }
-
context->opaque_color_pipeline = cogl_pipeline_new (context);
context->codegen_header_buffer = g_string_new ("");
@@ -341,31 +328,6 @@ cogl_context_new (CoglDisplay *display,
context->texture_download_pipeline = NULL;
context->blit_texture_pipeline = NULL;
-#ifdef HAVE_COGL_GL
- if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_ALPHA_TEST))
- /* 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
- * 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
- */
- GE (context, glEnable (GL_ALPHA_TEST));
-
- if (context->driver == COGL_DRIVER_GL3)
- {
- GLuint vertex_array;
-
- /* In a forward compatible context, GL 3 doesn't support rendering
- * using the default vertex array object. Cogl doesn't use vertex
- * array objects yet so for now we just create a dummy array
- * object that we will use as our own default object. Eventually
- * it could be good to attach the vertex array objects to
- * CoglPrimitives */
- context->glGenVertexArrays (1, &vertex_array);
- context->glBindVertexArray (vertex_array);
- }
-#endif
-
context->current_modelview_entry = NULL;
context->current_projection_entry = NULL;
_cogl_matrix_entry_identity_init (&context->identity_entry);
@@ -387,16 +349,6 @@ cogl_context_new (CoglDisplay *display,
context->buffer_map_fallback_array = g_byte_array_new ();
context->buffer_map_fallback_in_use = FALSE;
- /* 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 each
- pipeline to track whether any layers have point sprite coords
- enabled. We don't need to do this for GL3 or GLES2 because point
- sprites are handled using a builtin varying in the shader. */
- if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_GL_FIXED))
- GE (context, glEnable (GL_POINT_SPRITE));
-
_cogl_list_init (&context->fences);
return context;
@@ -478,8 +430,6 @@ _cogl_context_free (CoglContext *context)
_cogl_sampler_cache_free (context->sampler_cache);
- _cogl_destroy_texture_units ();
-
g_ptr_array_free (context->uniform_names, TRUE);
g_hash_table_destroy (context->uniform_name_hash);
diff --git a/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h b/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
index de2be482d..afcb4460e 100644
--- a/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
+++ b/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
@@ -127,7 +127,7 @@ CoglTextureUnit *
_cogl_get_texture_unit (int index_);
void
-_cogl_destroy_texture_units (void);
+_cogl_destroy_texture_units (CoglContext *ctx);
void
_cogl_set_active_texture_unit (int unit_index);
diff --git a/cogl/cogl/driver/gl/cogl-pipeline-opengl.c b/cogl/cogl/driver/gl/cogl-pipeline-opengl.c
index ebdb0981c..07cf2eb47 100644
--- a/cogl/cogl/driver/gl/cogl-pipeline-opengl.c
+++ b/cogl/cogl/driver/gl/cogl-pipeline-opengl.c
@@ -116,12 +116,10 @@ _cogl_get_texture_unit (int index_)
}
void
-_cogl_destroy_texture_units (void)
+_cogl_destroy_texture_units (CoglContext *ctx)
{
int i;
- _COGL_GET_CONTEXT (ctx, NO_RETVAL);
-
for (i = 0; i < ctx->texture_units->len; i++)
{
CoglTextureUnit *unit =
diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
index 75ffb8d84..a9fdee0a4 100644
--- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
+++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
@@ -42,17 +42,60 @@
#include "driver/gl/cogl-attribute-gl-private.h"
#include "driver/gl/cogl-clip-stack-gl-private.h"
#include "driver/gl/cogl-buffer-gl-private.h"
+#include "driver/gl/cogl-pipeline-opengl-private.h"
gboolean
_cogl_driver_gl_context_init (CoglContext *context,
GError **error)
{
+ context->texture_units =
+ g_array_new (FALSE, FALSE, sizeof (CoglTextureUnit));
+
+ /* See cogl-pipeline.c for more details about why we leave texture unit 1
+ * active by default... */
+ context->active_texture_unit = 1;
+ GE (context, glActiveTexture (GL_TEXTURE1));
+
+ if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_ALPHA_TEST))
+ /* 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
+ * 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
+ */
+ GE (context, glEnable (GL_ALPHA_TEST));
+
+ if ((context->driver == COGL_DRIVER_GL3))
+ {
+ GLuint vertex_array;
+
+ /* In a forward compatible context, GL 3 doesn't support rendering
+ * using the default vertex array object. Cogl doesn't use vertex
+ * array objects yet so for now we just create a dummy array
+ * object that we will use as our own default object. Eventually
+ * it could be good to attach the vertex array objects to
+ * CoglPrimitives */
+ context->glGenVertexArrays (1, &vertex_array);
+ context->glBindVertexArray (vertex_array);
+ }
+
+ /* 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 each
+ pipeline to track whether any layers have point sprite coords
+ enabled. We don't need to do this for GL3 or GLES2 because point
+ sprites are handled using a builtin varying in the shader. */
+ if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_GL_FIXED))
+ GE (context, glEnable (GL_POINT_SPRITE));
+
return TRUE;
}
void
_cogl_driver_gl_context_deinit (CoglContext *context)
{
+ _cogl_destroy_texture_units (context);
}
static gboolean