gsk: Add 'blit' program
For the root node we do not need to use blending, as it does not have any backdrop to blend into. We can use a simpler 'blit' program that only takes the content of the source and fills the texture quad with it.
This commit is contained in:
@@ -90,6 +90,7 @@ struct _GskGLRenderer
|
||||
GskShaderBuilder *shader_builder;
|
||||
|
||||
int blend_program_id;
|
||||
int blit_program_id;
|
||||
|
||||
guint vao_id;
|
||||
|
||||
@@ -344,12 +345,25 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self)
|
||||
gsk_shader_builder_create_program (builder, "blend.vs.glsl", "blend.fs.glsl", &error);
|
||||
if (error != NULL)
|
||||
{
|
||||
g_critical ("Unable to create program: %s", error->message);
|
||||
g_critical ("Unable to create 'blend' program: %s", error->message);
|
||||
g_error_free (error);
|
||||
g_object_unref (builder);
|
||||
goto out;
|
||||
}
|
||||
|
||||
self->blit_program_id =
|
||||
gsk_shader_builder_create_program (builder, "blit.vs.glsl", "blit.fs.glsl", &error);
|
||||
if (error != NULL)
|
||||
{
|
||||
g_critical ("Unable to create 'blit' program: %s", error->message);
|
||||
g_error_free (error);
|
||||
g_object_unref (builder);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Keep a pointer to query for the uniform and attribute locations
|
||||
* when rendering the scene
|
||||
*/
|
||||
self->shader_builder = builder;
|
||||
|
||||
res = TRUE;
|
||||
@@ -731,8 +745,11 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
|
||||
item.render_data.vao_id = self->vao_id;
|
||||
item.render_data.buffer_id = 0;
|
||||
|
||||
program_id = self->blend_program_id;
|
||||
item.render_data.program_id = program_id;
|
||||
/* Select the program to use */
|
||||
if (parent != NULL)
|
||||
program_id = self->blend_program_id;
|
||||
else
|
||||
program_id = self->blit_program_id;
|
||||
|
||||
item.render_data.map_location =
|
||||
gsk_shader_builder_get_uniform_location (self->shader_builder, program_id, self->uniforms[MAP]);
|
||||
@@ -750,6 +767,8 @@ gsk_gl_renderer_add_render_item (GskGLRenderer *self,
|
||||
item.render_data.uv_location =
|
||||
gsk_shader_builder_get_attribute_location (self->shader_builder, program_id, self->attributes[UV]);
|
||||
|
||||
item.render_data.program_id = program_id;
|
||||
|
||||
if (parent != NULL)
|
||||
item.parent_data = &(parent->render_data);
|
||||
else
|
||||
|
||||
@@ -2,5 +2,5 @@ void main() {
|
||||
gl_Position = mvp * vec4(position, 0.0, 1.0);
|
||||
|
||||
// Flip the sampling
|
||||
vUv = vec2(uv.x, 1 - uv.y);
|
||||
vUv = vec2(uv.x, 1.0 - uv.y);
|
||||
}
|
||||
|
||||
5
gsk/resources/glsl/blit.fs.glsl
Normal file
5
gsk/resources/glsl/blit.fs.glsl
Normal file
@@ -0,0 +1,5 @@
|
||||
void main() {
|
||||
vec4 diffuse = Texture(map, vUv);
|
||||
|
||||
setOutputColor(vec4(diffuse.xyz, diffuse.a * alpha));
|
||||
}
|
||||
6
gsk/resources/glsl/blit.vs.glsl
Normal file
6
gsk/resources/glsl/blit.vs.glsl
Normal file
@@ -0,0 +1,6 @@
|
||||
void main() {
|
||||
gl_Position = mvp * vec4(position, 0.0, 1.0);
|
||||
|
||||
// Flip the sampling
|
||||
vUv = vec2(uv.x, 1.0 - uv.y);
|
||||
}
|
||||
Reference in New Issue
Block a user