271 fl_renderer_get_instance_private(
self));
273 g_return_if_fail(FL_IS_RENDERER(
self));
275 GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
277 glCompileShader(vertex_shader);
278 int vertex_compile_status;
279 glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &vertex_compile_status);
280 if (vertex_compile_status == GL_FALSE) {
282 g_warning(
"Failed to compile vertex shader: %s", shader_log);
285 GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
287 glCompileShader(fragment_shader);
288 int fragment_compile_status;
289 glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &fragment_compile_status);
290 if (fragment_compile_status == GL_FALSE) {
292 g_warning(
"Failed to compile fragment shader: %s", shader_log);
295 priv->program = glCreateProgram();
296 glAttachShader(
priv->program, vertex_shader);
297 glAttachShader(
priv->program, fragment_shader);
298 glLinkProgram(
priv->program);
301 glGetProgramiv(
priv->program, GL_LINK_STATUS, &link_status);
302 if (link_status == GL_FALSE) {
304 g_warning(
"Failed to link program: %s", program_log);
307 glDeleteShader(vertex_shader);
308 glDeleteShader(fragment_shader);
313 fl_renderer_get_instance_private(
self));
315 g_return_if_fail(FL_IS_RENDERER(
self));
320 GLint saved_texture_binding;
321 glGetIntegerv(GL_TEXTURE_BINDING_2D, &saved_texture_binding);
322 GLint saved_vao_binding;
323 glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &saved_vao_binding);
324 GLint saved_array_buffer_binding;
325 glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &saved_array_buffer_binding);
327 glClearColor(0.0, 0.0, 0.0, 1.0);
328 glClear(GL_COLOR_BUFFER_BIT);
330 glUseProgram(
priv->program);
332 for (guint i = 0; i <
priv->textures->len; i++) {
333 FlBackingStoreProvider*
texture =
334 FL_BACKING_STORE_PROVIDER(g_ptr_array_index(
priv->textures, i));
340 GdkRectangle texture_geometry =
342 GLfloat texture_x = texture_geometry.x;
343 GLfloat texture_y = texture_geometry.y;
344 GLfloat texture_width = texture_geometry.width;
345 GLfloat texture_height = texture_geometry.height;
351 GLfloat vertex_data[] = {x0, y0, 0, 0, x1, y1, 1, 1, x0, y1, 0, 1,
352 x0, y0, 0, 0, x1, y0, 1, 0, x1, y1, 1, 1};
354 GLuint vao, vertex_buffer;
355 glGenVertexArrays(1, &vao);
356 glBindVertexArray(vao);
357 glGenBuffers(1, &vertex_buffer);
358 glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
359 glBufferData(GL_ARRAY_BUFFER,
sizeof(vertex_data), vertex_data,
361 GLint position_index = glGetAttribLocation(
priv->program,
"position");
362 glEnableVertexAttribArray(position_index);
363 glVertexAttribPointer(position_index, 2, GL_FLOAT, GL_FALSE,
364 sizeof(GLfloat) * 4, 0);
365 GLint texcoord_index = glGetAttribLocation(
priv->program,
"in_texcoord");
366 glEnableVertexAttribArray(texcoord_index);
367 glVertexAttribPointer(texcoord_index, 2, GL_FLOAT, GL_FALSE,
368 sizeof(GLfloat) * 4, (
void*)(
sizeof(GLfloat) * 2));
370 glDrawArrays(GL_TRIANGLES, 0, 6);
372 glDeleteVertexArrays(1, &vao);
373 glDeleteBuffers(1, &vertex_buffer);
378 glBindTexture(GL_TEXTURE_2D, saved_texture_binding);
379 glBindVertexArray(saved_vao_binding);
380 glBindBuffer(GL_ARRAY_BUFFER, saved_array_buffer_binding);
FlPixelBufferTexturePrivate * priv
uint32_t uint32_t * format