void Background::draw() { _shader_program->use_program(); _update_uniforms(); glBindBuffer(GL_ARRAY_BUFFER, _vertex_buffer); glVertexAttribPointer(VERTEX_ATTRIB_POSITION, 3, GL_FLOAT, GL_FALSE, 0, nullptr); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }
static GstGLShader * _maybe_recompile_shader (GstGLFilterShader * filtershader) { GstGLContext *context = GST_GL_BASE_FILTER (filtershader)->context; GstGLShader *shader; GError *error = NULL; GST_OBJECT_LOCK (filtershader); if (!filtershader->shader || filtershader->update_shader) { filtershader->update_shader = FALSE; GST_OBJECT_UNLOCK (filtershader); g_signal_emit (filtershader, gst_gl_shader_signals[SIGNAL_CREATE_SHADER], 0, &shader); GST_OBJECT_LOCK (filtershader); if (shader) { if (filtershader->shader) gst_object_unref (filtershader->shader); filtershader->new_source = FALSE; filtershader->shader = gst_object_ref (shader); filtershader->new_uniforms = TRUE; _update_uniforms (filtershader); GST_OBJECT_UNLOCK (filtershader); return shader; } } if (filtershader->shader) { shader = gst_object_ref (filtershader->shader); _update_uniforms (filtershader); GST_OBJECT_UNLOCK (filtershader); return shader; } if (filtershader->new_source) { GstGLSLStage *stage; shader = gst_gl_shader_new (context); if (filtershader->vertex) { if (!(stage = gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE, filtershader->vertex))) { g_set_error (&error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE, "Failed to create shader vertex stage"); goto print_error; } } else { stage = gst_glsl_stage_new_default_vertex (context); } if (!gst_gl_shader_compile_attach_stage (shader, stage, &error)) { gst_object_unref (stage); goto print_error; } if (filtershader->fragment) { if (!(stage = gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE, filtershader->fragment))) { g_set_error (&error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE, "Failed to create shader fragment stage"); goto print_error; } } else { stage = gst_glsl_stage_new_default_fragment (context); } if (!gst_gl_shader_compile_attach_stage (shader, stage, &error)) { gst_object_unref (stage); goto print_error; } if (!gst_gl_shader_link (shader, &error)) { goto print_error; } if (filtershader->shader) gst_object_unref (filtershader->shader); filtershader->shader = gst_object_ref (shader); filtershader->new_source = FALSE; filtershader->new_uniforms = TRUE; _update_uniforms (filtershader); GST_OBJECT_UNLOCK (filtershader); return shader; } else if (filtershader->shader) { _update_uniforms (filtershader); shader = gst_object_ref (filtershader->shader); GST_OBJECT_UNLOCK (filtershader); return shader; } return NULL; print_error: if (shader) { gst_object_unref (shader); shader = NULL; } GST_OBJECT_UNLOCK (filtershader); GST_ELEMENT_ERROR (filtershader, RESOURCE, NOT_FOUND, ("%s", error->message), (NULL)); return NULL; }