static void draw_render (gpointer data) { GstGLContext *context = data; GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context); const GstGLFuncs *gl = context->gl_vtable; gl->Clear (GL_COLOR_BUFFER_BIT); gst_gl_shader_use (shader); if (gl->GenVertexArrays) gl->BindVertexArray (vao); else _bind_buffer (context); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, tex_id); gst_gl_shader_set_uniform_1i (shader, "s_texture", 0); gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices); if (gl->GenVertexArrays) gl->BindVertexArray (0); else _unbind_buffer (context); context_class->swap_buffers (context); }
static gboolean _src_shader_fill_bound_fbo (gpointer impl) { struct SrcShader *src = impl; const GstGLFuncs *gl; g_return_val_if_fail (src->base.context, FALSE); g_return_val_if_fail (src->shader, FALSE); gl = src->base.context->gl_vtable; gst_gl_shader_use (src->shader); if (gl->GenVertexArrays) gl->BindVertexArray (src->vao); else _bind_buffer (src); gl->DrawElements (GL_TRIANGLES, src->n_indices, GL_UNSIGNED_SHORT, (gpointer) (gintptr) src->index_offset); if (gl->GenVertexArrays) gl->BindVertexArray (0); else _unbind_buffer (src); gst_gl_context_clear_shader (src->base.context); return TRUE; }
static gboolean _src_shader_init (gpointer impl, GstGLContext * context, GstVideoInfo * v_info) { struct SrcShader *src = impl; const GstGLFuncs *gl = context->gl_vtable; src->base.context = context; if (!src->vbo) { if (gl->GenVertexArrays) { gl->GenVertexArrays (1, &src->vao); gl->BindVertexArray (src->vao); } gl->GenBuffers (1, &src->vbo); gl->BindBuffer (GL_ARRAY_BUFFER, src->vbo); gl->BufferData (GL_ARRAY_BUFFER, src->vertices_size, src->vertices, GL_STATIC_DRAW); gl->GenBuffers (1, &src->vbo_indices); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, src->vbo_indices); gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, src->n_indices * sizeof (gushort), src->indices, GL_STATIC_DRAW); if (gl->GenVertexArrays) { _bind_buffer (src); gl->BindVertexArray (0); } gl->BindBuffer (GL_ARRAY_BUFFER, 0); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); } return TRUE; }
static gboolean blit_tex (gpointer data) { GstGLContext *context = data; const GstGLFuncs *gl = context->gl_vtable; gl->Clear (GL_COLOR_BUFFER_BIT); gst_gl_shader_use (shader); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, gst_gl_memory_get_texture_id (gl_tex)); gst_gl_shader_set_uniform_1i (shader, "s_texture", 0); if (gl->GenVertexArrays) gl->BindVertexArray (vao); _bind_buffer (context); gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); if (gl->GenVertexArrays) gl->BindVertexArray (0); _unbind_buffer (context); return TRUE; }
static void init_blit (gpointer data) { GstGLContext *context = data; const GstGLFuncs *gl = context->gl_vtable; if (!vbo) { if (gl->GenVertexArrays) { gl->GenVertexArrays (1, &vao); gl->BindVertexArray (vao); } gl->GenBuffers (1, &vbo); gl->BindBuffer (GL_ARRAY_BUFFER, vbo); gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), vertices, GL_STATIC_DRAW); gl->GenBuffers (1, &vbo_indices); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo_indices); gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices, GL_STATIC_DRAW); if (gl->GenVertexArrays) { _bind_buffer (context); gl->BindVertexArray (0); } gl->BindBuffer (GL_ARRAY_BUFFER, 0); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); } /* has to be called in the thread that is going to use the framebuffer */ fbo2 = gst_gl_framebuffer_new_with_default_depth (context, 320, 240); fail_if (fbo2 == NULL, "failed to create framebuffer object"); }
static void init (gpointer data) { const GstGLFuncs *gl = context->gl_vtable; GError *error = NULL; shader = gst_gl_shader_new_default (context, &error); fail_if (shader == NULL, "failed to create shader object %s", error->message); 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"); if (!vbo) { if (gl->GenVertexArrays) { gl->GenVertexArrays (1, &vao); gl->BindVertexArray (vao); } gl->GenBuffers (1, &vbo); gl->BindBuffer (GL_ARRAY_BUFFER, vbo); gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), vertices, GL_STATIC_DRAW); gl->GenBuffers (1, &vbo_indices); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo_indices); gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices, GL_STATIC_DRAW); if (gl->GenVertexArrays) { _bind_buffer (context); gl->BindVertexArray (0); } gl->BindBuffer (GL_ARRAY_BUFFER, 0); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); } }
static void gst_gl_transformation_callback (gpointer stuff) { GstGLFilter *filter = GST_GL_FILTER (stuff); GstGLTransformation *transformation = GST_GL_TRANSFORMATION (filter); GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; GLfloat temp_matrix[16]; gst_gl_context_clear_shader (GST_GL_BASE_FILTER (filter)->context); gl->BindTexture (GL_TEXTURE_2D, 0); gl->ClearColor (0.f, 0.f, 0.f, 1.f); gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gst_gl_shader_use (transformation->shader); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, transformation->in_tex); gst_gl_shader_set_uniform_1i (transformation->shader, "texture", 0); graphene_matrix_to_float (&transformation->mvp_matrix, temp_matrix); gst_gl_shader_set_uniform_matrix_4fv (transformation->shader, "mvp", 1, GL_FALSE, temp_matrix); if (!transformation->vertex_buffer) { transformation->attr_position = gst_gl_shader_get_attribute_location (transformation->shader, "position"); transformation->attr_texture = gst_gl_shader_get_attribute_location (transformation->shader, "uv"); if (gl->GenVertexArrays) { gl->GenVertexArrays (1, &transformation->vao); gl->BindVertexArray (transformation->vao); } gl->GenBuffers (1, &transformation->vertex_buffer); gl->GenBuffers (1, &transformation->vbo_indices); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, transformation->vbo_indices); gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices, GL_STATIC_DRAW); transformation->caps_change = TRUE; } if (gl->GenVertexArrays) gl->BindVertexArray (transformation->vao); if (transformation->caps_change) { _upload_vertices (transformation); _bind_buffer (transformation); if (gl->GenVertexArrays) { gl->BindVertexArray (0); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); gl->BindBuffer (GL_ARRAY_BUFFER, 0); } } else if (!gl->GenVertexArrays) { _bind_buffer (transformation); } gl->DrawElements (GL_TRIANGLE_STRIP, 5, GL_UNSIGNED_SHORT, indices); if (gl->GenVertexArrays) gl->BindVertexArray (0); else _unbind_buffer (transformation); gst_gl_context_clear_shader (GST_GL_BASE_FILTER (filter)->context); transformation->caps_change = FALSE; }
static gboolean _callback (gpointer stuff) { GstGLFilter *filter = GST_GL_FILTER (stuff); GstGLFilterCube *cube_filter = GST_GL_FILTER_CUBE (filter); GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable; static GLfloat xrot = 0; static GLfloat yrot = 0; static GLfloat zrot = 0; const GLfloat matrix[] = { 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; gl->Enable (GL_DEPTH_TEST); gl->ClearColor (cube_filter->red, cube_filter->green, cube_filter->blue, 0.0); gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); gst_gl_shader_use (cube_filter->shader); gl->ActiveTexture (GL_TEXTURE0); gl->BindTexture (GL_TEXTURE_2D, cube_filter->in_tex->tex_id); gst_gl_shader_set_uniform_1i (cube_filter->shader, "s_texture", 0); gst_gl_shader_set_uniform_1f (cube_filter->shader, "xrot_degree", xrot); gst_gl_shader_set_uniform_1f (cube_filter->shader, "yrot_degree", yrot); gst_gl_shader_set_uniform_1f (cube_filter->shader, "zrot_degree", zrot); gst_gl_shader_set_uniform_matrix_4fv (cube_filter->shader, "u_matrix", 1, GL_FALSE, matrix); if (!cube_filter->vertex_buffer) { if (gl->GenVertexArrays) { gl->GenVertexArrays (1, &cube_filter->vao); gl->BindVertexArray (cube_filter->vao); } gl->GenBuffers (1, &cube_filter->vertex_buffer); gl->BindBuffer (GL_ARRAY_BUFFER, cube_filter->vertex_buffer); gl->BufferData (GL_ARRAY_BUFFER, 6 * 4 * 5 * sizeof (GLfloat), vertices, GL_STATIC_DRAW); gl->GenBuffers (1, &cube_filter->vbo_indices); gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, cube_filter->vbo_indices); gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices, GL_STATIC_DRAW); if (gl->GenVertexArrays) { _bind_buffer (cube_filter); gl->BindVertexArray (0); } gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); gl->BindBuffer (GL_ARRAY_BUFFER, 0); } if (gl->GenVertexArrays) gl->BindVertexArray (cube_filter->vao); _bind_buffer (cube_filter); gl->DrawElements (GL_TRIANGLES, 36, GL_UNSIGNED_SHORT, 0); if (gl->GenVertexArrays) gl->BindVertexArray (0); _unbind_buffer (cube_filter); gl->Disable (GL_DEPTH_TEST); xrot += 0.3f; yrot += 0.2f; zrot += 0.4f; return TRUE; }