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
This commit is contained in:
Adam Jackson 2020-01-15 15:45:17 -05:00
parent 245977e525
commit e2c2a332e6
8 changed files with 72 additions and 55 deletions

View File

@ -35,6 +35,7 @@
#include "cogl-offscreen.h" #include "cogl-offscreen.h"
#include "cogl-framebuffer-private.h" #include "cogl-framebuffer-private.h"
#include "cogl-attribute-private.h" #include "cogl-attribute-private.h"
#include "cogl-sampler-cache-private.h"
typedef struct _CoglDriverVtable CoglDriverVtable; typedef struct _CoglDriverVtable CoglDriverVtable;
@ -265,6 +266,14 @@ struct _CoglDriverVtable
const void *data, const void *data,
unsigned int size, unsigned int size,
GError **error); GError **error);
void
(*sampler_init) (CoglContext *context,
CoglSamplerCacheEntry *entry);
void
(*sampler_free) (CoglContext *context,
CoglSamplerCacheEntry *entry);
}; };
#define COGL_DRIVER_ERROR (_cogl_driver_error_quark ()) #define COGL_DRIVER_ERROR (_cogl_driver_error_quark ())

View File

@ -34,11 +34,6 @@
#include "cogl-sampler-cache-private.h" #include "cogl-sampler-cache-private.h"
#include "cogl-context-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 struct _CoglSamplerCache
{ {
@ -54,10 +49,6 @@ struct _CoglSamplerCache
GL state. */ GL state. */
GHashTable *hash_table_cogl; GHashTable *hash_table_cogl;
GHashTable *hash_table_gl; 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 static CoglSamplerCacheWrapMode
@ -176,22 +167,10 @@ _cogl_sampler_cache_new (CoglContext *context)
sampler_state_equal_gl); sampler_state_equal_gl);
cache->hash_table_cogl = g_hash_table_new (hash_sampler_state_cogl, cache->hash_table_cogl = g_hash_table_new (hash_sampler_state_cogl,
sampler_state_equal_cogl); sampler_state_equal_cogl);
cache->next_fake_sampler_object_number = 1;
return cache; 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 * static CoglSamplerCacheEntry *
_cogl_sampler_cache_get_entry_gl (CoglSamplerCache *cache, _cogl_sampler_cache_get_entry_gl (CoglSamplerCache *cache,
const CoglSamplerCacheEntry *key) const CoglSamplerCacheEntry *key)
@ -202,39 +181,9 @@ _cogl_sampler_cache_get_entry_gl (CoglSamplerCache *cache,
if (entry == NULL) if (entry == NULL)
{ {
CoglContext *context = cache->context;
entry = g_slice_dup (CoglSamplerCacheEntry, key); entry = g_slice_dup (CoglSamplerCacheEntry, key);
if (_cogl_has_private_feature (context, cache->context->driver_vtable->sampler_init (cache->context, entry);
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++;
}
g_hash_table_insert (cache->hash_table_gl, entry, 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; CoglContext *context = user_data;
CoglSamplerCacheEntry *entry = value; CoglSamplerCacheEntry *entry = value;
if (_cogl_has_private_feature (context, context->driver_vtable->sampler_free (context, entry);
COGL_PRIVATE_FEATURE_SAMPLER_OBJECTS))
GE( context, glDeleteSamplers (1, &entry->sampler_object) );
g_slice_free (CoglSamplerCacheEntry, entry); g_slice_free (CoglSamplerCacheEntry, entry);
} }

View File

@ -155,5 +155,13 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
const char **strings_in, const char **strings_in,
const GLint *lengths_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 */ #endif /* __COGL_PIPELINE_OPENGL_PRIVATE_H */

View File

@ -694,6 +694,48 @@ _cogl_pipeline_layer_forward_wrap_modes (CoglPipelineLayer *layer,
gl_wrap_mode_t); 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 /* OpenGL associates the min/mag filters and repeat modes with the
* texture object not the texture unit so we always have to re-assert * 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 * the filter and repeat modes whenever we use a texture since it may

View File

@ -79,6 +79,10 @@ _cogl_gl_error_to_string (GLenum error_code);
typedef struct _CoglGLContext { typedef struct _CoglGLContext {
GArray *texture_units; GArray *texture_units;
int active_texture_unit; 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;
CoglGLContext * CoglGLContext *

View File

@ -93,6 +93,7 @@ _cogl_driver_gl_context_init (CoglContext *context)
if (!gl_context) if (!gl_context)
return FALSE; return FALSE;
gl_context->next_fake_sampler_object_number = 1;
gl_context->texture_units = gl_context->texture_units =
g_array_new (FALSE, FALSE, sizeof (CoglTextureUnit)); g_array_new (FALSE, FALSE, sizeof (CoglTextureUnit));

View File

@ -42,6 +42,7 @@
#include "driver/gl/cogl-attribute-gl-private.h" #include "driver/gl/cogl-attribute-gl-private.h"
#include "driver/gl/cogl-clip-stack-gl-private.h" #include "driver/gl/cogl-clip-stack-gl-private.h"
#include "driver/gl/cogl-buffer-gl-private.h" #include "driver/gl/cogl-buffer-gl-private.h"
#include "driver/gl/cogl-pipeline-opengl-private.h"
static gboolean static gboolean
_cogl_driver_gl_real_context_init (CoglContext *context) _cogl_driver_gl_real_context_init (CoglContext *context)
@ -562,4 +563,6 @@ _cogl_driver_gl =
_cogl_buffer_gl_map_range, _cogl_buffer_gl_map_range,
_cogl_buffer_gl_unmap, _cogl_buffer_gl_unmap,
_cogl_buffer_gl_set_data, _cogl_buffer_gl_set_data,
_cogl_sampler_gl_init,
_cogl_sampler_gl_free,
}; };

View File

@ -42,6 +42,7 @@
#include "driver/gl/cogl-attribute-gl-private.h" #include "driver/gl/cogl-attribute-gl-private.h"
#include "driver/gl/cogl-clip-stack-gl-private.h" #include "driver/gl/cogl-clip-stack-gl-private.h"
#include "driver/gl/cogl-buffer-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 #ifndef GL_UNSIGNED_INT_24_8
#define GL_UNSIGNED_INT_24_8 0x84FA #define GL_UNSIGNED_INT_24_8 0x84FA
@ -426,4 +427,6 @@ _cogl_driver_gles =
_cogl_buffer_gl_map_range, _cogl_buffer_gl_map_range,
_cogl_buffer_gl_unmap, _cogl_buffer_gl_unmap,
_cogl_buffer_gl_set_data, _cogl_buffer_gl_set_data,
_cogl_sampler_gl_init,
_cogl_sampler_gl_free,
}; };