mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-12 05:20:17 +00:00
gpu: Move global syncing out
This is necessary so that fallback code can properly sync itself, instead of just add_node(). Fixes a bunch of glitches when fallbacks would be used.
This commit is contained in:
parent
73ac2d0a1c
commit
0ed45c5f40
@ -142,6 +142,20 @@ gsk_gpu_node_processor_emit_scissor_op (GskGpuNodeProcessor *self)
|
|||||||
self->pending_globals &= ~GSK_GPU_GLOBAL_SCISSOR;
|
self->pending_globals &= ~GSK_GPU_GLOBAL_SCISSOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gsk_gpu_node_processor_sync_globals (GskGpuNodeProcessor *self,
|
||||||
|
GskGpuGlobals ignored)
|
||||||
|
{
|
||||||
|
GskGpuGlobals required;
|
||||||
|
|
||||||
|
required = self->pending_globals & ~ignored;
|
||||||
|
|
||||||
|
if (required & (GSK_GPU_GLOBAL_MATRIX | GSK_GPU_GLOBAL_SCALE | GSK_GPU_GLOBAL_CLIP))
|
||||||
|
gsk_gpu_node_processor_emit_globals_op (self);
|
||||||
|
if (required & GSK_GPU_GLOBAL_SCISSOR)
|
||||||
|
gsk_gpu_node_processor_emit_scissor_op (self);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gsk_gpu_node_processor_process (GskGpuFrame *frame,
|
gsk_gpu_node_processor_process (GskGpuFrame *frame,
|
||||||
GskGpuImage *target,
|
GskGpuImage *target,
|
||||||
@ -273,6 +287,8 @@ gsk_gpu_node_processor_add_fallback_node (GskGpuNodeProcessor *self,
|
|||||||
{
|
{
|
||||||
GskGpuImage *image;
|
GskGpuImage *image;
|
||||||
|
|
||||||
|
gsk_gpu_node_processor_sync_globals (self, 0);
|
||||||
|
|
||||||
image = gsk_gpu_upload_cairo_op (self->frame,
|
image = gsk_gpu_upload_cairo_op (self->frame,
|
||||||
node,
|
node,
|
||||||
&self->scale,
|
&self->scale,
|
||||||
@ -669,7 +685,6 @@ gsk_gpu_node_processor_add_node (GskGpuNodeProcessor *self,
|
|||||||
GskRenderNode *node)
|
GskRenderNode *node)
|
||||||
{
|
{
|
||||||
GskRenderNodeType node_type;
|
GskRenderNodeType node_type;
|
||||||
GskGpuGlobals required_globals;
|
|
||||||
|
|
||||||
/* This catches the corner cases of empty nodes, so after this check
|
/* This catches the corner cases of empty nodes, so after this check
|
||||||
* there's quaranteed to be at least 1 pixel that needs to be drawn */
|
* there's quaranteed to be at least 1 pixel that needs to be drawn */
|
||||||
@ -686,11 +701,7 @@ gsk_gpu_node_processor_add_node (GskGpuNodeProcessor *self,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
required_globals = self->pending_globals & ~nodes_vtable[node_type].ignored_globals;
|
gsk_gpu_node_processor_sync_globals (self, nodes_vtable[node_type].ignored_globals);
|
||||||
if (required_globals & (GSK_GPU_GLOBAL_MATRIX | GSK_GPU_GLOBAL_SCALE | GSK_GPU_GLOBAL_CLIP))
|
|
||||||
gsk_gpu_node_processor_emit_globals_op (self);
|
|
||||||
if (required_globals & GSK_GPU_GLOBAL_SCISSOR)
|
|
||||||
gsk_gpu_node_processor_emit_scissor_op (self);
|
|
||||||
g_assert ((self->pending_globals & ~nodes_vtable[node_type].ignored_globals) == 0);
|
g_assert ((self->pending_globals & ~nodes_vtable[node_type].ignored_globals) == 0);
|
||||||
|
|
||||||
if (nodes_vtable[node_type].process_node)
|
if (nodes_vtable[node_type].process_node)
|
||||||
|
Loading…
Reference in New Issue
Block a user