[mutter] cogl: Add and use sampler init/free hooks in the CoglDriverVtable
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] cogl: Add and use sampler init/free hooks in the CoglDriverVtable
- Date: Thu, 18 Jun 2020 18:20:01 +0000 (UTC)
commit e2c2a332e6bd957db10dda9ae5639c76d2bd12e0
Author: Adam Jackson <ajax redhat com>
Date: Wed Jan 15 15:45:17 2020 -0500
cogl: Add and use sampler init/free hooks in the CoglDriverVtable
next_fake_sampler_object_number moves to CoglGLContext.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1194
cogl/cogl/cogl-driver.h | 9 ++++
cogl/cogl/cogl-sampler-cache.c | 57 +---------------------
cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h | 8 +++
cogl/cogl/driver/gl/cogl-pipeline-opengl.c | 42 ++++++++++++++++
cogl/cogl/driver/gl/cogl-util-gl-private.h | 4 ++
cogl/cogl/driver/gl/cogl-util-gl.c | 1 +
cogl/cogl/driver/gl/gl/cogl-driver-gl.c | 3 ++
cogl/cogl/driver/gl/gles/cogl-driver-gles.c | 3 ++
8 files changed, 72 insertions(+), 55 deletions(-)
---
diff --git a/cogl/cogl/cogl-driver.h b/cogl/cogl/cogl-driver.h
index e52a99cfb8..6ad24d65c8 100644
--- a/cogl/cogl/cogl-driver.h
+++ b/cogl/cogl/cogl-driver.h
@@ -35,6 +35,7 @@
#include "cogl-offscreen.h"
#include "cogl-framebuffer-private.h"
#include "cogl-attribute-private.h"
+#include "cogl-sampler-cache-private.h"
typedef struct _CoglDriverVtable CoglDriverVtable;
@@ -265,6 +266,14 @@ struct _CoglDriverVtable
const void *data,
unsigned int size,
GError **error);
+
+ void
+ (*sampler_init) (CoglContext *context,
+ CoglSamplerCacheEntry *entry);
+
+ void
+ (*sampler_free) (CoglContext *context,
+ CoglSamplerCacheEntry *entry);
};
#define COGL_DRIVER_ERROR (_cogl_driver_error_quark ())
diff --git a/cogl/cogl/cogl-sampler-cache.c b/cogl/cogl/cogl-sampler-cache.c
index f2dbaeb631..2e0e761f00 100644
--- a/cogl/cogl/cogl-sampler-cache.c
+++ b/cogl/cogl/cogl-sampler-cache.c
@@ -34,11 +34,6 @@
#include "cogl-sampler-cache-private.h"
#include "cogl-context-private.h"
-#include "driver/gl/cogl-util-gl-private.h"
-
-#ifndef GL_TEXTURE_WRAP_R
-#define GL_TEXTURE_WRAP_R 0x8072
-#endif
struct _CoglSamplerCache
{
@@ -54,10 +49,6 @@ struct _CoglSamplerCache
GL state. */
GHashTable *hash_table_cogl;
GHashTable *hash_table_gl;
-
- /* This is used for generated fake unique sampler object numbers
- when the sampler object extension is not supported */
- GLuint next_fake_sampler_object_number;
};
static CoglSamplerCacheWrapMode
@@ -176,22 +167,10 @@ _cogl_sampler_cache_new (CoglContext *context)
sampler_state_equal_gl);
cache->hash_table_cogl = g_hash_table_new (hash_sampler_state_cogl,
sampler_state_equal_cogl);
- cache->next_fake_sampler_object_number = 1;
return cache;
}
-static void
-set_wrap_mode (CoglContext *context,
- GLuint sampler_object,
- GLenum param,
- CoglSamplerCacheWrapMode wrap_mode)
-{
- GE( context, glSamplerParameteri (sampler_object,
- param,
- wrap_mode) );
-}
-
static CoglSamplerCacheEntry *
_cogl_sampler_cache_get_entry_gl (CoglSamplerCache *cache,
const CoglSamplerCacheEntry *key)
@@ -202,39 +181,9 @@ _cogl_sampler_cache_get_entry_gl (CoglSamplerCache *cache,
if (entry == NULL)
{
- CoglContext *context = cache->context;
-
entry = g_slice_dup (CoglSamplerCacheEntry, key);
- if (_cogl_has_private_feature (context,
- COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS))
- {
- GE( context, glGenSamplers (1, &entry->sampler_object) );
-
- GE( context, glSamplerParameteri (entry->sampler_object,
- GL_TEXTURE_MIN_FILTER,
- entry->min_filter) );
- GE( context, glSamplerParameteri (entry->sampler_object,
- GL_TEXTURE_MAG_FILTER,
- entry->mag_filter) );
-
- set_wrap_mode (context,
- entry->sampler_object,
- GL_TEXTURE_WRAP_S,
- entry->wrap_mode_s);
- set_wrap_mode (context,
- entry->sampler_object,
- GL_TEXTURE_WRAP_T,
- entry->wrap_mode_t);
- }
- else
- {
- /* If sampler objects aren't supported then we'll invent a
- unique number so that pipelines can still compare the
- unique state just by comparing the sampler object
- numbers */
- entry->sampler_object = cache->next_fake_sampler_object_number++;
- }
+ cache->context->driver_vtable->sampler_init (cache->context, entry);
g_hash_table_insert (cache->hash_table_gl, entry, entry);
}
@@ -320,9 +269,7 @@ hash_table_free_gl_cb (void *key,
CoglContext *context = user_data;
CoglSamplerCacheEntry *entry = value;
- if (_cogl_has_private_feature (context,
- COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS))
- GE( context, glDeleteSamplers (1, &entry->sampler_object) );
+ context->driver_vtable->sampler_free (context, entry);
g_slice_free (CoglSamplerCacheEntry, entry);
}
diff --git a/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
b/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
index 8cae99cc08..e10ca69dcb 100644
--- a/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
+++ b/cogl/cogl/driver/gl/cogl-pipeline-opengl-private.h
@@ -155,5 +155,13 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
const char **strings_in,
const GLint *lengths_in);
+void
+_cogl_sampler_gl_init (CoglContext *context,
+ CoglSamplerCacheEntry *entry);
+
+void
+_cogl_sampler_gl_free (CoglContext *context,
+ CoglSamplerCacheEntry *entry);
+
#endif /* __COGL_PIPELINE_OPENGL_PRIVATE_H */
diff --git a/cogl/cogl/driver/gl/cogl-pipeline-opengl.c b/cogl/cogl/driver/gl/cogl-pipeline-opengl.c
index df1ce13e2d..3264a00297 100644
--- a/cogl/cogl/driver/gl/cogl-pipeline-opengl.c
+++ b/cogl/cogl/driver/gl/cogl-pipeline-opengl.c
@@ -694,6 +694,48 @@ _cogl_pipeline_layer_forward_wrap_modes (CoglPipelineLayer *layer,
gl_wrap_mode_t);
}
+void
+_cogl_sampler_gl_init (CoglContext *context, CoglSamplerCacheEntry *entry)
+{
+ if (_cogl_has_private_feature (context,
+ COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS))
+ {
+ GE( context, glGenSamplers (1, &entry->sampler_object) );
+
+ GE( context, glSamplerParameteri (entry->sampler_object,
+ GL_TEXTURE_MIN_FILTER,
+ entry->min_filter) );
+ GE( context, glSamplerParameteri (entry->sampler_object,
+ GL_TEXTURE_MAG_FILTER,
+ entry->mag_filter) );
+
+ GE (context, glSamplerParameteri (entry->sampler_object,
+ GL_TEXTURE_WRAP_S,
+ entry->wrap_mode_s) );
+ GE (context, glSamplerParameteri (entry->sampler_object,
+ GL_TEXTURE_WRAP_T,
+ entry->wrap_mode_t) );
+ }
+ else
+ {
+ CoglGLContext *gl_context = context->driver_context;
+
+ /* If sampler objects aren't supported then we'll invent a
+ unique number so that pipelines can still compare the
+ unique state just by comparing the sampler object
+ numbers */
+ entry->sampler_object = gl_context->next_fake_sampler_object_number++;
+ }
+}
+
+void
+_cogl_sampler_gl_free (CoglContext *context, CoglSamplerCacheEntry *entry)
+{
+ if (_cogl_has_private_feature (context,
+ COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS))
+ GE( context, glDeleteSamplers (1, &entry->sampler_object) );
+}
+
/* OpenGL associates the min/mag filters and repeat modes with the
* texture object not the texture unit so we always have to re-assert
* the filter and repeat modes whenever we use a texture since it may
diff --git a/cogl/cogl/driver/gl/cogl-util-gl-private.h b/cogl/cogl/driver/gl/cogl-util-gl-private.h
index 0d23da1a86..b3367973f5 100644
--- a/cogl/cogl/driver/gl/cogl-util-gl-private.h
+++ b/cogl/cogl/driver/gl/cogl-util-gl-private.h
@@ -79,6 +79,10 @@ _cogl_gl_error_to_string (GLenum error_code);
typedef struct _CoglGLContext {
GArray *texture_units;
int active_texture_unit;
+
+ /* This is used for generated fake unique sampler object numbers
+ when the sampler object extension is not supported */
+ GLuint next_fake_sampler_object_number;
} CoglGLContext;
CoglGLContext *
diff --git a/cogl/cogl/driver/gl/cogl-util-gl.c b/cogl/cogl/driver/gl/cogl-util-gl.c
index c49c5289f7..1e2381934a 100644
--- a/cogl/cogl/driver/gl/cogl-util-gl.c
+++ b/cogl/cogl/driver/gl/cogl-util-gl.c
@@ -93,6 +93,7 @@ _cogl_driver_gl_context_init (CoglContext *context)
if (!gl_context)
return FALSE;
+ gl_context->next_fake_sampler_object_number = 1;
gl_context->texture_units =
g_array_new (FALSE, FALSE, sizeof (CoglTextureUnit));
diff --git a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
index 42351c4d80..d066ff0722 100644
--- a/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
+++ b/cogl/cogl/driver/gl/gl/cogl-driver-gl.c
@@ -42,6 +42,7 @@
#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"
static gboolean
_cogl_driver_gl_real_context_init (CoglContext *context)
@@ -562,4 +563,6 @@ _cogl_driver_gl =
_cogl_buffer_gl_map_range,
_cogl_buffer_gl_unmap,
_cogl_buffer_gl_set_data,
+ _cogl_sampler_gl_init,
+ _cogl_sampler_gl_free,
};
diff --git a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c
index d85d2f9f20..34f850fd53 100644
--- a/cogl/cogl/driver/gl/gles/cogl-driver-gles.c
+++ b/cogl/cogl/driver/gl/gles/cogl-driver-gles.c
@@ -42,6 +42,7 @@
#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"
#ifndef GL_UNSIGNED_INT_24_8
#define GL_UNSIGNED_INT_24_8 0x84FA
@@ -426,4 +427,6 @@ _cogl_driver_gles =
_cogl_buffer_gl_map_range,
_cogl_buffer_gl_unmap,
_cogl_buffer_gl_set_data,
+ _cogl_sampler_gl_init,
+ _cogl_sampler_gl_free,
};
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]