diff options
Diffstat (limited to 'gst-libs/gst/gl/gstglshader.c')
-rw-r--r-- | gst-libs/gst/gl/gstglshader.c | 77 |
1 files changed, 52 insertions, 25 deletions
diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c index 05b4cafec..56cb9ed7d 100644 --- a/gst-libs/gst/gl/gstglshader.c +++ b/gst-libs/gst/gl/gstglshader.c @@ -73,6 +73,7 @@ struct _GstGLShaderPrivate GList *stages; gboolean linked; + GHashTable *uniform_locations; GstGLSLFuncs vtable; }; @@ -122,6 +123,7 @@ gst_gl_shader_finalize (GObject * object) (GstGLContextThreadFunc) _cleanup_shader, shader); priv->program_handle = 0; + g_hash_table_destroy (priv->uniform_locations); if (shader->context) { gst_object_unref (shader->context); @@ -189,6 +191,30 @@ gst_gl_shader_init (GstGLShader * self) priv = self->priv = GST_GL_SHADER_GET_PRIVATE (self); priv->linked = FALSE; + priv->uniform_locations = + g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); +} + +static int +_get_uniform_location (GstGLShader * shader, const gchar * name) +{ + GstGLShaderPrivate *priv = shader->priv; + int location; + gpointer value; + + g_return_val_if_fail (priv->linked, 0); + + if (!g_hash_table_lookup_extended (priv->uniform_locations, name, NULL, + &value)) { + const GstGLFuncs *gl = shader->context->gl_vtable; + location = gl->GetUniformLocation (priv->program_handle, name); + g_hash_table_insert (priv->uniform_locations, g_strdup (name), + GINT_TO_POINTER (location)); + } else { + location = GPOINTER_TO_INT (value); + } + + return location; } static GstGLShader * @@ -680,6 +706,7 @@ gst_gl_shader_release_unlocked (GstGLShader * shader) shader->priv->stages = NULL; priv->linked = FALSE; + g_hash_table_remove_all (priv->uniform_locations); g_object_notify (G_OBJECT (shader), "linked"); } @@ -763,7 +790,7 @@ gst_gl_shader_set_uniform_1f (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform1f (location, value); } @@ -781,7 +808,7 @@ gst_gl_shader_set_uniform_1fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform1fv (location, count, value); } @@ -799,7 +826,7 @@ gst_gl_shader_set_uniform_1i (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform1i (location, value); } @@ -817,7 +844,7 @@ gst_gl_shader_set_uniform_1iv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform1iv (location, count, value); } @@ -835,7 +862,7 @@ gst_gl_shader_set_uniform_2f (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform2f (location, value0, value1); } @@ -853,7 +880,7 @@ gst_gl_shader_set_uniform_2fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform2fv (location, count, value); } @@ -871,7 +898,7 @@ gst_gl_shader_set_uniform_2i (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform2i (location, v0, v1); } @@ -889,7 +916,7 @@ gst_gl_shader_set_uniform_2iv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform2iv (location, count, value); } @@ -907,7 +934,7 @@ gst_gl_shader_set_uniform_3f (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform3f (location, v0, v1, v2); } @@ -925,7 +952,7 @@ gst_gl_shader_set_uniform_3fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform3fv (location, count, value); } @@ -943,7 +970,7 @@ gst_gl_shader_set_uniform_3i (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform3i (location, v0, v1, v2); } @@ -961,7 +988,7 @@ gst_gl_shader_set_uniform_3iv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform3iv (location, count, value); } @@ -979,7 +1006,7 @@ gst_gl_shader_set_uniform_4f (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform4f (location, v0, v1, v2, v3); } @@ -997,7 +1024,7 @@ gst_gl_shader_set_uniform_4fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform4fv (location, count, value); } @@ -1015,7 +1042,7 @@ gst_gl_shader_set_uniform_4i (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform4i (location, v0, v1, v2, v3); } @@ -1033,7 +1060,7 @@ gst_gl_shader_set_uniform_4iv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->Uniform4iv (location, count, value); } @@ -1051,7 +1078,7 @@ gst_gl_shader_set_uniform_matrix_2fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix2fv (location, count, transpose, value); } @@ -1069,7 +1096,7 @@ gst_gl_shader_set_uniform_matrix_3fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix3fv (location, count, transpose, value); } @@ -1087,7 +1114,7 @@ gst_gl_shader_set_uniform_matrix_4fv (GstGLShader * shader, const gchar * name, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix4fv (location, count, transpose, value); } @@ -1106,7 +1133,7 @@ gst_gl_shader_set_uniform_matrix_2x3fv (GstGLShader * shader, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix2x3fv (location, count, transpose, value); } @@ -1124,7 +1151,7 @@ gst_gl_shader_set_uniform_matrix_2x4fv (GstGLShader * shader, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix2x4fv (location, count, transpose, value); } @@ -1142,7 +1169,7 @@ gst_gl_shader_set_uniform_matrix_3x2fv (GstGLShader * shader, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix3x2fv (location, count, transpose, value); } @@ -1160,7 +1187,7 @@ gst_gl_shader_set_uniform_matrix_3x4fv (GstGLShader * shader, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix3x4fv (location, count, transpose, value); } @@ -1178,7 +1205,7 @@ gst_gl_shader_set_uniform_matrix_4x2fv (GstGLShader * shader, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix4x2fv (location, count, transpose, value); } @@ -1196,7 +1223,7 @@ gst_gl_shader_set_uniform_matrix_4x3fv (GstGLShader * shader, g_return_if_fail (priv->program_handle != 0); gl = shader->context->gl_vtable; - location = gl->GetUniformLocation (priv->program_handle, name); + location = _get_uniform_location (shader, name); gl->UniformMatrix4x3fv (location, count, transpose, value); } |