mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-14 14:20:21 +00:00
gl renderer: Implement cross fade nodes
This commit is contained in:
parent
bed03aa319
commit
a83037c440
@ -199,6 +199,7 @@ struct _GskGLRenderer
|
|||||||
Program outset_shadow_program;
|
Program outset_shadow_program;
|
||||||
Program shadow_program;
|
Program shadow_program;
|
||||||
Program border_program;
|
Program border_program;
|
||||||
|
Program cross_fade_program;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -992,6 +993,51 @@ render_shadow_node (GskGLRenderer *self,
|
|||||||
gsk_gl_renderer_add_render_ops (self, original_child, builder);
|
gsk_gl_renderer_add_render_ops (self, original_child, builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
render_cross_fade_node (GskGLRenderer *self,
|
||||||
|
GskRenderNode *node,
|
||||||
|
RenderOpBuilder *builder)
|
||||||
|
{
|
||||||
|
const float min_x = node->bounds.origin.x;
|
||||||
|
const float min_y = node->bounds.origin.y;
|
||||||
|
const float max_x = min_x + node->bounds.size.width;
|
||||||
|
const float max_y = min_y + node->bounds.size.height;
|
||||||
|
GskRenderNode *start_node = gsk_cross_fade_node_get_start_child (node);
|
||||||
|
GskRenderNode *end_node = gsk_cross_fade_node_get_end_child (node);
|
||||||
|
float progress = gsk_cross_fade_node_get_progress (node);
|
||||||
|
int start_texture_id;
|
||||||
|
int end_texture_id;
|
||||||
|
gboolean is_offscreen;
|
||||||
|
RenderOp op;
|
||||||
|
const GskQuadVertex vertex_data[GL_N_VERTICES] = {
|
||||||
|
{ { min_x, min_y }, { 0, 1 }, },
|
||||||
|
{ { min_x, max_y }, { 0, 0 }, },
|
||||||
|
{ { max_x, min_y }, { 1, 1 }, },
|
||||||
|
|
||||||
|
{ { max_x, max_y }, { 1, 0 }, },
|
||||||
|
{ { min_x, max_y }, { 0, 0 }, },
|
||||||
|
{ { max_x, min_y }, { 1, 1 }, },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* TODO: We create 2 textures here as big as the cross-fade node, but both the
|
||||||
|
* start and the end node might be a lot smaller than that. */
|
||||||
|
|
||||||
|
add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, start_node,
|
||||||
|
&start_texture_id, &is_offscreen);
|
||||||
|
|
||||||
|
add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y, end_node,
|
||||||
|
&end_texture_id, &is_offscreen);
|
||||||
|
|
||||||
|
ops_set_program (builder, &self->cross_fade_program);
|
||||||
|
op.op = OP_CHANGE_CROSS_FADE;
|
||||||
|
op.cross_fade.progress = progress;
|
||||||
|
op.cross_fade.source2 = end_texture_id;
|
||||||
|
ops_add (builder, &op);
|
||||||
|
ops_set_texture (builder, start_texture_id);
|
||||||
|
|
||||||
|
ops_draw (builder, vertex_data);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gsk_gl_renderer_dispose (GObject *gobject)
|
gsk_gl_renderer_dispose (GObject *gobject)
|
||||||
{
|
{
|
||||||
@ -1073,6 +1119,7 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
|
|||||||
{ "outset shadow", "blit.vs.glsl", "outset_shadow.fs.glsl" },
|
{ "outset shadow", "blit.vs.glsl", "outset_shadow.fs.glsl" },
|
||||||
{ "shadow", "blit.vs.glsl", "shadow.fs.glsl" },
|
{ "shadow", "blit.vs.glsl", "shadow.fs.glsl" },
|
||||||
{ "border", "blit.vs.glsl", "border.fs.glsl" },
|
{ "border", "blit.vs.glsl", "border.fs.glsl" },
|
||||||
|
{ "cross fade", "blit.vs.glsl", "cross_fade.fs.glsl" },
|
||||||
};
|
};
|
||||||
|
|
||||||
builder = gsk_shader_builder_new ();
|
builder = gsk_shader_builder_new ();
|
||||||
@ -1190,6 +1237,10 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
|
|||||||
INIT_PROGRAM_UNIFORM_LOCATION (border, color);
|
INIT_PROGRAM_UNIFORM_LOCATION (border, color);
|
||||||
INIT_PROGRAM_UNIFORM_LOCATION (border, widths);
|
INIT_PROGRAM_UNIFORM_LOCATION (border, widths);
|
||||||
|
|
||||||
|
/* cross fade */
|
||||||
|
INIT_PROGRAM_UNIFORM_LOCATION (cross_fade, progress);
|
||||||
|
INIT_PROGRAM_UNIFORM_LOCATION (cross_fade, source2);
|
||||||
|
|
||||||
g_object_unref (builder);
|
g_object_unref (builder);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -1510,8 +1561,11 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
|
|||||||
render_border_node (self, node, builder);
|
render_border_node (self, node, builder);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
|
||||||
case GSK_CROSS_FADE_NODE:
|
case GSK_CROSS_FADE_NODE:
|
||||||
|
render_cross_fade_node (self, node, builder);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
||||||
case GSK_BLEND_NODE:
|
case GSK_BLEND_NODE:
|
||||||
case GSK_REPEAT_NODE:
|
case GSK_REPEAT_NODE:
|
||||||
default:
|
default:
|
||||||
@ -1770,6 +1824,16 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OP_CHANGE_CROSS_FADE:
|
||||||
|
g_assert (program == &self->cross_fade_program);
|
||||||
|
/* End texture id */
|
||||||
|
glUniform1i (program->cross_fade.source2_location, 1);
|
||||||
|
glActiveTexture (GL_TEXTURE0 + 1);
|
||||||
|
glBindTexture (GL_TEXTURE_2D, op->cross_fade.source2);
|
||||||
|
/* progress */
|
||||||
|
glUniform1f (program->cross_fade.progress_location, op->cross_fade.progress);
|
||||||
|
break;
|
||||||
|
|
||||||
case OP_CHANGE_LINEAR_GRADIENT:
|
case OP_CHANGE_LINEAR_GRADIENT:
|
||||||
OP_PRINT (" -> Linear gradient");
|
OP_PRINT (" -> Linear gradient");
|
||||||
glUniform1i (program->linear_gradient.num_color_stops_location,
|
glUniform1i (program->linear_gradient.num_color_stops_location,
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#include "gskglrendererprivate.h"
|
#include "gskglrendererprivate.h"
|
||||||
|
|
||||||
#define GL_N_VERTICES 6
|
#define GL_N_VERTICES 6
|
||||||
#define GL_N_PROGRAMS 11
|
#define GL_N_PROGRAMS 12
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
OP_NONE,
|
OP_NONE,
|
||||||
@ -31,8 +31,9 @@ enum {
|
|||||||
OP_CHANGE_OUTSET_SHADOW = 15,
|
OP_CHANGE_OUTSET_SHADOW = 15,
|
||||||
OP_CHANGE_BORDER = 16,
|
OP_CHANGE_BORDER = 16,
|
||||||
OP_CHANGE_BORDER_COLOR = 17,
|
OP_CHANGE_BORDER_COLOR = 17,
|
||||||
OP_CLEAR = 18,
|
OP_CHANGE_CROSS_FADE = 18,
|
||||||
OP_DRAW = 19,
|
OP_CLEAR = 19,
|
||||||
|
OP_DRAW = 20,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
@ -99,6 +100,10 @@ typedef struct
|
|||||||
int color_location;
|
int color_location;
|
||||||
int widths_location;
|
int widths_location;
|
||||||
} border;
|
} border;
|
||||||
|
struct {
|
||||||
|
int source2_location;
|
||||||
|
int progress_location;
|
||||||
|
} cross_fade;
|
||||||
};
|
};
|
||||||
|
|
||||||
} Program;
|
} Program;
|
||||||
@ -162,6 +167,10 @@ typedef struct
|
|||||||
float widths[4];
|
float widths[4];
|
||||||
float color[4];
|
float color[4];
|
||||||
} border;
|
} border;
|
||||||
|
struct {
|
||||||
|
float progress;
|
||||||
|
int source2;
|
||||||
|
} cross_fade;
|
||||||
};
|
};
|
||||||
} RenderOp;
|
} RenderOp;
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ gsk_private_source_shaders = [
|
|||||||
'resources/glsl/outset_shadow.fs.glsl',
|
'resources/glsl/outset_shadow.fs.glsl',
|
||||||
'resources/glsl/shadow.fs.glsl',
|
'resources/glsl/shadow.fs.glsl',
|
||||||
'resources/glsl/border.fs.glsl',
|
'resources/glsl/border.fs.glsl',
|
||||||
|
'resources/glsl/cross_fade.fs.glsl',
|
||||||
'resources/glsl/es2_common.fs.glsl',
|
'resources/glsl/es2_common.fs.glsl',
|
||||||
'resources/glsl/es2_common.vs.glsl',
|
'resources/glsl/es2_common.vs.glsl',
|
||||||
'resources/glsl/gl3_common.fs.glsl',
|
'resources/glsl/gl3_common.fs.glsl',
|
||||||
|
12
gsk/resources/glsl/cross_fade.fs.glsl
Normal file
12
gsk/resources/glsl/cross_fade.fs.glsl
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
uniform float u_progress;
|
||||||
|
uniform sampler2D u_source2;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec4 source1 = Texture(u_source, vUv); // start child
|
||||||
|
vec4 source2 = Texture(u_source2, vUv); // end child
|
||||||
|
|
||||||
|
float p = u_progress;
|
||||||
|
vec4 color = ((1 - p) * source1) + (p * source2);
|
||||||
|
setOutputColor(color);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user