mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-12 20:00:09 +00:00
gl renderer: Keep track of source
We have an optimization that depends on having the source be a glyph atlas, so keep track of that information in the render job.
This commit is contained in:
parent
1502c21e97
commit
8f4fb45715
@ -142,6 +142,8 @@ struct _GskGLRenderJob
|
||||
const GskGLRenderModelview *current_modelview;
|
||||
GskGLProgram *current_program;
|
||||
|
||||
guint source_is_glyph_atlas : 1;
|
||||
|
||||
/* If we should be rendering red zones over fallback nodes */
|
||||
guint debug_fallback : 1;
|
||||
|
||||
@ -1260,6 +1262,7 @@ done:
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen_rect (job, &node->bounds);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
|
||||
@ -1325,6 +1328,7 @@ blur_offscreen (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen->texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform1f (job->current_program,
|
||||
UNIFORM_BLUR_RADIUS, 0,
|
||||
blur_radius_x);
|
||||
@ -1354,6 +1358,7 @@ blur_offscreen (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
pass1->texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform1f (job->current_program,
|
||||
UNIFORM_BLUR_RADIUS, 0,
|
||||
blur_radius_y);
|
||||
@ -1668,6 +1673,7 @@ gsk_gl_render_job_visit_clipped_child (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen_rect (job, clip);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -1758,6 +1764,7 @@ gsk_gl_render_job_visit_rounded_clip_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen (job, &node->bounds, &offscreen);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -2123,6 +2130,7 @@ gsk_gl_render_job_visit_transform_node (GskGLRenderJob *job,
|
||||
offscreen.texture_id,
|
||||
linear_filter ? GL_LINEAR : GL_NEAREST,
|
||||
linear_filter ? GL_LINEAR : GL_NEAREST);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen (job, &child->bounds, &offscreen);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -2332,6 +2340,7 @@ gsk_gl_render_job_visit_blurred_inset_shadow_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
blurred_texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen (job, &node->bounds, &offscreen);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -2597,6 +2606,7 @@ gsk_gl_render_job_visit_blurred_outset_shadow_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
blurred_texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform_rounded_rect (job->current_program,
|
||||
UNIFORM_OUTSET_SHADOW_OUTLINE_RECT, 0,
|
||||
&transformed_outline);
|
||||
@ -2622,6 +2632,7 @@ gsk_gl_render_job_visit_blurred_outset_shadow_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
blurred_texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform_rounded_rect (job->current_program,
|
||||
UNIFORM_OUTSET_SHADOW_OUTLINE_RECT, 0,
|
||||
&transformed_outline);
|
||||
@ -2859,6 +2870,7 @@ gsk_gl_render_job_visit_cross_fade_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE1,
|
||||
offscreen_end.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform1f (job->current_program,
|
||||
UNIFORM_CROSS_FADE_PROGRESS, 0,
|
||||
progress);
|
||||
@ -2905,6 +2917,7 @@ gsk_gl_render_job_visit_opacity_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen (job, &node->bounds, &offscreen);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -3046,6 +3059,7 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
texture_id);
|
||||
job->source_is_glyph_atlas = TRUE;
|
||||
last_texture = texture_id;
|
||||
}
|
||||
|
||||
@ -3166,6 +3180,7 @@ gsk_gl_render_job_visit_shadow_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
rgba_to_half (&shadow->color, color);
|
||||
gsk_gl_render_job_draw_offscreen_with_color (job, &bounds, &offscreen, color);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
@ -3222,6 +3237,7 @@ gsk_gl_render_job_visit_blur_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_coords (job,
|
||||
min_x, min_y, max_x, max_y,
|
||||
0, 1, 1, 0,
|
||||
@ -3272,6 +3288,7 @@ gsk_gl_render_job_visit_blend_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
bottom_offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen (job, &node->bounds, &bottom_offscreen);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -3294,6 +3311,7 @@ gsk_gl_render_job_visit_blend_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE1,
|
||||
top_offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform1i (job->current_program,
|
||||
UNIFORM_BLEND_MODE, 0,
|
||||
gsk_blend_node_get_blend_mode (node));
|
||||
@ -3356,6 +3374,7 @@ gsk_gl_render_job_visit_mask_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE1,
|
||||
mask_offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform1i (job->current_program,
|
||||
UNIFORM_MASK_MODE, 0,
|
||||
gsk_mask_node_get_mask_mode (node));
|
||||
@ -3392,6 +3411,7 @@ gsk_gl_render_job_visit_color_matrix_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform_matrix (job->current_program,
|
||||
UNIFORM_COLOR_MATRIX_COLOR_MATRIX, 0,
|
||||
gsk_color_matrix_node_get_color_matrix (node));
|
||||
@ -3474,6 +3494,7 @@ gsk_gl_render_job_visit_gl_shader_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0 + i,
|
||||
offscreens[i].texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform2f (program,
|
||||
UNIFORM_CUSTOM_SIZE, 0,
|
||||
node->bounds.size.width,
|
||||
@ -3608,6 +3629,7 @@ gsk_gl_render_job_visit_texture (GskGLRenderJob *job,
|
||||
offscreen.has_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR,
|
||||
GL_LINEAR,
|
||||
offscreen.sync);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_offscreen (job, bounds, &offscreen);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
@ -3645,6 +3667,7 @@ gsk_gl_render_job_visit_texture (GskGLRenderJob *job,
|
||||
slice->texture_id,
|
||||
use_mipmap ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR,
|
||||
GL_LINEAR);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
|
||||
gsk_gl_render_job_draw_coords (job,
|
||||
x1, y1, x2, y2,
|
||||
@ -3763,6 +3786,7 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob *job,
|
||||
min_filter,
|
||||
mag_filter,
|
||||
sync);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_coords (job,
|
||||
0, 0, clip_rect.size.width, clip_rect.size.height,
|
||||
u0, v0, u1, v1,
|
||||
@ -3804,6 +3828,7 @@ gsk_gl_render_job_visit_texture_scale_node (GskGLRenderJob *job,
|
||||
slice->texture_id,
|
||||
min_filter,
|
||||
mag_filter);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_coords (job,
|
||||
slice_bounds.origin.x,
|
||||
slice_bounds.origin.y,
|
||||
@ -3836,6 +3861,7 @@ render_texture:
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_coords (job,
|
||||
job->offset_x + clip_rect.origin.x,
|
||||
job->offset_y + clip_rect.origin.y,
|
||||
@ -3888,6 +3914,7 @@ gsk_gl_render_job_visit_repeat_node (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
offscreen.texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_program_set_uniform4f (job->current_program,
|
||||
UNIFORM_REPEAT_CHILD_BOUNDS, 0,
|
||||
(node->bounds.origin.x - child_bounds->origin.x) / child_bounds->size.width,
|
||||
@ -4382,6 +4409,7 @@ gsk_gl_render_job_render_flipped (GskGLRenderJob *job,
|
||||
GL_TEXTURE_2D,
|
||||
GL_TEXTURE0,
|
||||
texture_id);
|
||||
job->source_is_glyph_atlas = FALSE;
|
||||
gsk_gl_render_job_draw_rect (job, &job->viewport);
|
||||
gsk_gl_render_job_end_draw (job);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user