/* Called in the gl thread */ static void gst_glimage_sink_thread_init_redisplay (GstGLImageSink * gl_sink) { GError *error = NULL; gl_sink->redisplay_shader = gst_gl_shader_new (gl_sink->context); gst_gl_shader_set_vertex_source (gl_sink->redisplay_shader, redisplay_vertex_shader_str_gles2); gst_gl_shader_set_fragment_source (gl_sink->redisplay_shader, redisplay_fragment_shader_str_gles2); gst_gl_shader_compile (gl_sink->redisplay_shader, &error); if (error) { gst_gl_context_set_error (gl_sink->context, "%s", error->message); g_error_free (error); error = NULL; gst_gl_context_clear_shader (gl_sink->context); } else { gl_sink->redisplay_attr_position_loc = gst_gl_shader_get_attribute_location (gl_sink->redisplay_shader, "a_position"); gl_sink->redisplay_attr_texture_loc = gst_gl_shader_get_attribute_location (gl_sink->redisplay_shader, "a_texCoord"); } }
static void init (gpointer data) { GstGLContext *context = data; /* has to be called in the thread that is going to use the framebuffer */ fbo = gst_gl_framebuffer_new (context); gst_gl_framebuffer_generate (fbo, 320, 240, &fbo_id, &rbo); fail_if (fbo == NULL || fbo_id == 0, "failed to create framebuffer object"); gst_gl_context_gen_texture (context, &tex, GST_VIDEO_FORMAT_RGBA, 320, 240); fail_if (tex == 0, "failed to create texture"); #if GST_GL_HAVE_GLES2 if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) { shader = gst_gl_shader_new (context); fail_if (shader == NULL, "failed to create shader object"); gst_gl_shader_set_vertex_source (shader, vertex_shader_str_gles2); gst_gl_shader_set_fragment_source (shader, fragment_shader_str_gles2); error = NULL; gst_gl_shader_compile (shader, &error); fail_if (error != NULL, "Error compiling shader %s\n", error ? error->message : "Unknown Error"); shader_attr_position_loc = gst_gl_shader_get_attribute_location (shader, "a_position"); shader_attr_texture_loc = gst_gl_shader_get_attribute_location (shader, "a_texCoord"); } #endif }
/* Called by glfilter */ gboolean gst_gl_context_gen_shader (GstGLContext * context, const gchar * vert_src, const gchar * frag_src, GstGLShader ** shader) { g_return_val_if_fail (frag_src != NULL || vert_src != NULL, FALSE); g_return_val_if_fail (shader != NULL, FALSE); *shader = gst_gl_shader_new (context); if (frag_src) gst_gl_shader_set_fragment_source (*shader, frag_src); if (vert_src) gst_gl_shader_set_vertex_source (*shader, vert_src); gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _compile_shader, shader); return *shader != NULL; }
static void init (gpointer data) { #if GST_GL_HAVE_GLES2 if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) { shader = gst_gl_shader_new (context); fail_if (shader == NULL, "failed to create shader object"); gst_gl_shader_set_vertex_source (shader, vertex_shader_str_gles2); gst_gl_shader_set_fragment_source (shader, fragment_shader_str_gles2); error = NULL; gst_gl_shader_compile (shader, &error); fail_if (error != NULL, "Error compiling shader %s\n", error ? error->message : "Unknown Error"); shader_attr_position_loc = gst_gl_shader_get_attribute_location (shader, "a_position"); shader_attr_texture_loc = gst_gl_shader_get_attribute_location (shader, "a_texCoord"); } #endif }