Compare commits
6 Commits
css-variab
...
gdk-scale-
Author | SHA1 | Date | |
---|---|---|---|
|
2f137b212a | ||
|
8bbed27a5f | ||
|
05bd5c041a | ||
|
8aead765fe | ||
|
39a1d6cf56 | ||
|
c0d143395f |
@@ -94,6 +94,8 @@
|
|||||||
#include <epoxy/egl.h>
|
#include <epoxy/egl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
#define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES
|
#define DEFAULT_ALLOWED_APIS GDK_GL_API_GL | GDK_GL_API_GLES
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -586,8 +588,8 @@ gdk_gl_context_real_begin_frame (GdkDrawContext *draw_context,
|
|||||||
cairo_region_union (region, damage);
|
cairo_region_union (region, damage);
|
||||||
cairo_region_destroy (damage);
|
cairo_region_destroy (damage);
|
||||||
|
|
||||||
ww = gdk_surface_get_width (surface) * gdk_surface_get_scale_factor (surface);
|
ww = (int) ceil (gdk_surface_get_width (surface) * gdk_surface_get_scale (surface));
|
||||||
wh = gdk_surface_get_height (surface) * gdk_surface_get_scale_factor (surface);
|
wh = (int) ceil (gdk_surface_get_height (surface) * gdk_surface_get_scale (surface));
|
||||||
|
|
||||||
gdk_gl_context_make_current (context);
|
gdk_gl_context_make_current (context);
|
||||||
|
|
||||||
@@ -631,7 +633,7 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
|
|||||||
EGLint *heap_rects = NULL;
|
EGLint *heap_rects = NULL;
|
||||||
int i, j, n_rects = cairo_region_num_rectangles (painted);
|
int i, j, n_rects = cairo_region_num_rectangles (painted);
|
||||||
int surface_height = gdk_surface_get_height (surface);
|
int surface_height = gdk_surface_get_height (surface);
|
||||||
int scale = gdk_surface_get_scale_factor (surface);
|
double scale = gdk_surface_get_scale (surface);
|
||||||
EGLint *rects;
|
EGLint *rects;
|
||||||
|
|
||||||
if (n_rects < G_N_ELEMENTS (stack_rects) / 4)
|
if (n_rects < G_N_ELEMENTS (stack_rects) / 4)
|
||||||
@@ -644,10 +646,10 @@ gdk_gl_context_real_end_frame (GdkDrawContext *draw_context,
|
|||||||
cairo_rectangle_int_t rect;
|
cairo_rectangle_int_t rect;
|
||||||
|
|
||||||
cairo_region_get_rectangle (painted, i, &rect);
|
cairo_region_get_rectangle (painted, i, &rect);
|
||||||
rects[j++] = rect.x * scale;
|
rects[j++] = (int) floor (rect.x * scale);
|
||||||
rects[j++] = (surface_height - rect.height - rect.y) * scale;
|
rects[j++] = (int) floor ((surface_height - rect.height - rect.y) * scale);
|
||||||
rects[j++] = rect.width * scale;
|
rects[j++] = (int) ceil (rect.width * scale);
|
||||||
rects[j++] = rect.height * scale;
|
rects[j++] = (int) ceil (rect.height * scale);
|
||||||
}
|
}
|
||||||
priv->eglSwapBuffersWithDamage (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
|
priv->eglSwapBuffersWithDamage (gdk_display_get_egl_display (display), egl_surface, rects, n_rects);
|
||||||
g_free (heap_rects);
|
g_free (heap_rects);
|
||||||
|
@@ -58,6 +58,7 @@ struct _GdkFractionalScale
|
|||||||
|
|
||||||
#define GDK_FRACTIONAL_SCALE_INIT(fractional_scale) (GdkFractionalScale) { fractional_scale }
|
#define GDK_FRACTIONAL_SCALE_INIT(fractional_scale) (GdkFractionalScale) { fractional_scale }
|
||||||
#define GDK_FRACTIONAL_SCALE_INIT_INT(scale) GDK_FRACTIONAL_SCALE_INIT (scale * GDK_FRACTIONAL_SCALE_FACTOR)
|
#define GDK_FRACTIONAL_SCALE_INIT_INT(scale) GDK_FRACTIONAL_SCALE_INIT (scale * GDK_FRACTIONAL_SCALE_FACTOR)
|
||||||
|
#define GDK_FRACTIONAL_SCALE_INIT_FLOAT(scale) GDK_FRACTIONAL_SCALE_INIT ((int) (scale * GDK_FRACTIONAL_SCALE_FACTOR))
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
gdk_fractional_scale_to_int (const GdkFractionalScale *self)
|
gdk_fractional_scale_to_int (const GdkFractionalScale *self)
|
||||||
|
@@ -48,6 +48,7 @@ struct _GdkWaylandSurface
|
|||||||
unsigned int mapped : 1;
|
unsigned int mapped : 1;
|
||||||
unsigned int awaiting_frame : 1;
|
unsigned int awaiting_frame : 1;
|
||||||
unsigned int awaiting_frame_frozen : 1;
|
unsigned int awaiting_frame_frozen : 1;
|
||||||
|
unsigned int scale_overridden : 1;
|
||||||
|
|
||||||
int pending_buffer_offset_x;
|
int pending_buffer_offset_x;
|
||||||
int pending_buffer_offset_y;
|
int pending_buffer_offset_y;
|
||||||
|
@@ -172,6 +172,31 @@ gdk_wayland_surface_init (GdkWaylandSurface *impl)
|
|||||||
{
|
{
|
||||||
impl->scale = GDK_FRACTIONAL_SCALE_INIT_INT (1);
|
impl->scale = GDK_FRACTIONAL_SCALE_INIT_INT (1);
|
||||||
impl->viewport_dirty = TRUE;
|
impl->viewport_dirty = TRUE;
|
||||||
|
|
||||||
|
if (g_getenv ("GDK_SCALE"))
|
||||||
|
{
|
||||||
|
const char *scale_str;
|
||||||
|
char *endptr = NULL;
|
||||||
|
double scale;
|
||||||
|
|
||||||
|
scale_str = g_getenv ("GDK_SCALE");
|
||||||
|
|
||||||
|
scale = g_ascii_strtod (scale_str, &endptr);
|
||||||
|
|
||||||
|
if (endptr && *endptr != '\0')
|
||||||
|
{
|
||||||
|
if (strcmp (endptr, "%") == 0)
|
||||||
|
scale /= 100.;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_warning ("Failed to parse GDK_SCALE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl->scale = GDK_FRACTIONAL_SCALE_INIT_FLOAT (scale);
|
||||||
|
impl->scale_overridden = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -259,8 +284,9 @@ gdk_wayland_surface_update_size (GdkSurface *surface,
|
|||||||
|
|
||||||
if (impl->display_server.egl_window)
|
if (impl->display_server.egl_window)
|
||||||
wl_egl_window_resize (impl->display_server.egl_window,
|
wl_egl_window_resize (impl->display_server.egl_window,
|
||||||
width * gdk_fractional_scale_to_int (scale),
|
gdk_fractional_scale_scale (scale, width),
|
||||||
height * gdk_fractional_scale_to_int (scale), 0, 0);
|
gdk_fractional_scale_scale (scale, height),
|
||||||
|
0, 0);
|
||||||
|
|
||||||
gdk_surface_invalidate_rect (surface, NULL);
|
gdk_surface_invalidate_rect (surface, NULL);
|
||||||
|
|
||||||
@@ -463,6 +489,9 @@ gdk_wayland_surface_update_scale (GdkSurface *surface)
|
|||||||
wl_surface_get_version (impl->display_server.wl_surface) < WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION)
|
wl_surface_get_version (impl->display_server.wl_surface) < WL_SURFACE_SET_BUFFER_SCALE_SINCE_VERSION)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (impl->scale_overridden)
|
||||||
|
return;
|
||||||
|
|
||||||
/* scale is tracked by the fractional scale extension */
|
/* scale is tracked by the fractional scale extension */
|
||||||
if (impl->display_server.fractional_scale)
|
if (impl->display_server.fractional_scale)
|
||||||
return;
|
return;
|
||||||
@@ -831,6 +860,9 @@ gdk_wayland_surface_fractional_scale_preferred_scale_cb (void *data,
|
|||||||
GdkWaylandSurface *self = GDK_WAYLAND_SURFACE (data);
|
GdkWaylandSurface *self = GDK_WAYLAND_SURFACE (data);
|
||||||
GdkSurface *surface = GDK_SURFACE (self);
|
GdkSurface *surface = GDK_SURFACE (self);
|
||||||
|
|
||||||
|
if (self->scale_overridden)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Notify app that scale changed */
|
/* Notify app that scale changed */
|
||||||
gdk_wayland_surface_maybe_resize (surface,
|
gdk_wayland_surface_maybe_resize (surface,
|
||||||
surface->width, surface->height,
|
surface->width, surface->height,
|
||||||
@@ -1364,8 +1396,8 @@ gdk_wayland_surface_ensure_wl_egl_window (GdkSurface *surface)
|
|||||||
{
|
{
|
||||||
impl->display_server.egl_window =
|
impl->display_server.egl_window =
|
||||||
wl_egl_window_create (impl->display_server.wl_surface,
|
wl_egl_window_create (impl->display_server.wl_surface,
|
||||||
surface->width * gdk_fractional_scale_to_int (&impl->scale),
|
gdk_fractional_scale_scale (&impl->scale, surface->width),
|
||||||
surface->height * gdk_fractional_scale_to_int (&impl->scale));
|
gdk_fractional_scale_scale (&impl->scale, surface->height));
|
||||||
gdk_surface_set_egl_native_window (surface, impl->display_server.egl_window);
|
gdk_surface_set_egl_native_window (surface, impl->display_server.egl_window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -993,7 +993,7 @@ gsk_gl_command_queue_sort_batches (GskGLCommandQueue *self)
|
|||||||
* gsk_gl_command_queue_execute:
|
* gsk_gl_command_queue_execute:
|
||||||
* @self: a `GskGLCommandQueue`
|
* @self: a `GskGLCommandQueue`
|
||||||
* @surface_height: the height of the backing surface
|
* @surface_height: the height of the backing surface
|
||||||
* @scale_factor: the scale factor of the backing surface
|
* @scale: the scale of the backing surface
|
||||||
* @scissor: (nullable): the scissor clip if any
|
* @scissor: (nullable): the scissor clip if any
|
||||||
* @default_framebuffer: the default framebuffer id if not zero
|
* @default_framebuffer: the default framebuffer id if not zero
|
||||||
*
|
*
|
||||||
@@ -1009,7 +1009,7 @@ gsk_gl_command_queue_sort_batches (GskGLCommandQueue *self)
|
|||||||
void
|
void
|
||||||
gsk_gl_command_queue_execute (GskGLCommandQueue *self,
|
gsk_gl_command_queue_execute (GskGLCommandQueue *self,
|
||||||
guint surface_height,
|
guint surface_height,
|
||||||
guint scale_factor,
|
float scale,
|
||||||
const cairo_region_t *scissor,
|
const cairo_region_t *scissor,
|
||||||
guint default_framebuffer)
|
guint default_framebuffer)
|
||||||
{
|
{
|
||||||
@@ -1097,10 +1097,10 @@ gsk_gl_command_queue_execute (GskGLCommandQueue *self,
|
|||||||
g_assert (cairo_region_num_rectangles (scissor) == 1);
|
g_assert (cairo_region_num_rectangles (scissor) == 1);
|
||||||
cairo_region_get_rectangle (scissor, 0, &r);
|
cairo_region_get_rectangle (scissor, 0, &r);
|
||||||
|
|
||||||
scissor_test.origin.x = r.x * scale_factor;
|
scissor_test.origin.x = (int) floor (r.x * scale);
|
||||||
scissor_test.origin.y = surface_height - (r.height * scale_factor) - (r.y * scale_factor);
|
scissor_test.origin.y = (int) floor (surface_height - (r.height * scale) - (r.y * scale));
|
||||||
scissor_test.size.width = r.width * scale_factor;
|
scissor_test.size.width = (int) ceil (r.width * scale);
|
||||||
scissor_test.size.height = r.height * scale_factor;
|
scissor_test.size.height = (int) ceil (r.height * scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
next_batch_index = self->head_batch_index;
|
next_batch_index = self->head_batch_index;
|
||||||
|
@@ -288,7 +288,7 @@ void gsk_gl_command_queue_begin_frame (GskGLCommandQueue
|
|||||||
void gsk_gl_command_queue_end_frame (GskGLCommandQueue *self);
|
void gsk_gl_command_queue_end_frame (GskGLCommandQueue *self);
|
||||||
void gsk_gl_command_queue_execute (GskGLCommandQueue *self,
|
void gsk_gl_command_queue_execute (GskGLCommandQueue *self,
|
||||||
guint surface_height,
|
guint surface_height,
|
||||||
guint scale_factor,
|
float scale,
|
||||||
const cairo_region_t *scissor,
|
const cairo_region_t *scissor,
|
||||||
guint default_framebuffer);
|
guint default_framebuffer);
|
||||||
int gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
|
int gsk_gl_command_queue_upload_texture (GskGLCommandQueue *self,
|
||||||
|
@@ -282,18 +282,18 @@ gsk_gl_renderer_render (GskRenderer *renderer,
|
|||||||
GskGLRenderJob *job;
|
GskGLRenderJob *job;
|
||||||
GdkSurface *surface;
|
GdkSurface *surface;
|
||||||
gboolean clear_framebuffer;
|
gboolean clear_framebuffer;
|
||||||
float scale_factor;
|
float scale;
|
||||||
|
|
||||||
g_assert (GSK_IS_GL_RENDERER (renderer));
|
g_assert (GSK_IS_GL_RENDERER (renderer));
|
||||||
g_assert (root != NULL);
|
g_assert (root != NULL);
|
||||||
|
|
||||||
surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self->context));
|
surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self->context));
|
||||||
scale_factor = gdk_surface_get_scale_factor (surface);
|
scale = gdk_surface_get_scale (surface);
|
||||||
|
|
||||||
viewport.origin.x = 0;
|
viewport.origin.x = 0;
|
||||||
viewport.origin.y = 0;
|
viewport.origin.y = 0;
|
||||||
viewport.size.width = gdk_surface_get_width (surface) * scale_factor;
|
viewport.size.width = gdk_surface_get_width (surface) * scale;
|
||||||
viewport.size.height = gdk_surface_get_height (surface) * scale_factor;
|
viewport.size.height = gdk_surface_get_height (surface) * scale;
|
||||||
|
|
||||||
gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->context),
|
gdk_draw_context_begin_frame_full (GDK_DRAW_CONTEXT (self->context),
|
||||||
gsk_render_node_prefers_high_depth (root),
|
gsk_render_node_prefers_high_depth (root),
|
||||||
@@ -306,7 +306,7 @@ gsk_gl_renderer_render (GskRenderer *renderer,
|
|||||||
clear_framebuffer = update_area_requires_clear (surface, render_region);
|
clear_framebuffer = update_area_requires_clear (surface, render_region);
|
||||||
|
|
||||||
gsk_gl_driver_begin_frame (self->driver, self->command_queue);
|
gsk_gl_driver_begin_frame (self->driver, self->command_queue);
|
||||||
job = gsk_gl_render_job_new (self->driver, &viewport, scale_factor, render_region, 0, clear_framebuffer);
|
job = gsk_gl_render_job_new (self->driver, &viewport, scale, render_region, 0, clear_framebuffer);
|
||||||
#ifdef G_ENABLE_DEBUG
|
#ifdef G_ENABLE_DEBUG
|
||||||
if (GSK_RENDERER_DEBUG_CHECK (GSK_RENDERER (self), FALLBACK))
|
if (GSK_RENDERER_DEBUG_CHECK (GSK_RENDERER (self), FALLBACK))
|
||||||
gsk_gl_render_job_set_debug_fallback (job, TRUE);
|
gsk_gl_render_job_set_debug_fallback (job, TRUE);
|
||||||
|
@@ -4322,14 +4322,14 @@ gsk_gl_render_job_render (GskGLRenderJob *job,
|
|||||||
GskRenderNode *root)
|
GskRenderNode *root)
|
||||||
{
|
{
|
||||||
G_GNUC_UNUSED gint64 start_time;
|
G_GNUC_UNUSED gint64 start_time;
|
||||||
guint scale_factor;
|
float scale;
|
||||||
guint surface_height;
|
guint surface_height;
|
||||||
|
|
||||||
g_return_if_fail (job != NULL);
|
g_return_if_fail (job != NULL);
|
||||||
g_return_if_fail (root != NULL);
|
g_return_if_fail (root != NULL);
|
||||||
g_return_if_fail (GSK_IS_GL_DRIVER (job->driver));
|
g_return_if_fail (GSK_IS_GL_DRIVER (job->driver));
|
||||||
|
|
||||||
scale_factor = MAX (job->scale_x, job->scale_y);
|
scale = MAX (job->scale_x, job->scale_y);
|
||||||
surface_height = job->viewport.size.height;
|
surface_height = job->viewport.size.height;
|
||||||
|
|
||||||
gsk_gl_command_queue_make_current (job->command_queue);
|
gsk_gl_command_queue_make_current (job->command_queue);
|
||||||
@@ -4360,7 +4360,7 @@ gsk_gl_render_job_render (GskGLRenderJob *job,
|
|||||||
start_time = GDK_PROFILER_CURRENT_TIME;
|
start_time = GDK_PROFILER_CURRENT_TIME;
|
||||||
gsk_gl_command_queue_make_current (job->command_queue);
|
gsk_gl_command_queue_make_current (job->command_queue);
|
||||||
gdk_gl_context_push_debug_group (job->command_queue->context, "Executing command queue");
|
gdk_gl_context_push_debug_group (job->command_queue->context, "Executing command queue");
|
||||||
gsk_gl_command_queue_execute (job->command_queue, surface_height, scale_factor, job->region, job->default_framebuffer);
|
gsk_gl_command_queue_execute (job->command_queue, surface_height, scale, job->region, job->default_framebuffer);
|
||||||
gdk_gl_context_pop_debug_group (job->command_queue->context);
|
gdk_gl_context_pop_debug_group (job->command_queue->context);
|
||||||
gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Execute GL command queue", "");
|
gdk_profiler_add_mark (start_time, GDK_PROFILER_CURRENT_TIME-start_time, "Execute GL command queue", "");
|
||||||
}
|
}
|
||||||
@@ -4401,7 +4401,7 @@ get_framebuffer_format (GdkGLContext *context,
|
|||||||
GskGLRenderJob *
|
GskGLRenderJob *
|
||||||
gsk_gl_render_job_new (GskGLDriver *driver,
|
gsk_gl_render_job_new (GskGLDriver *driver,
|
||||||
const graphene_rect_t *viewport,
|
const graphene_rect_t *viewport,
|
||||||
float scale_factor,
|
float scale,
|
||||||
const cairo_region_t *region,
|
const cairo_region_t *region,
|
||||||
guint framebuffer,
|
guint framebuffer,
|
||||||
gboolean clear_framebuffer)
|
gboolean clear_framebuffer)
|
||||||
@@ -4414,7 +4414,7 @@ gsk_gl_render_job_new (GskGLDriver *driver,
|
|||||||
|
|
||||||
g_return_val_if_fail (GSK_IS_GL_DRIVER (driver), NULL);
|
g_return_val_if_fail (GSK_IS_GL_DRIVER (driver), NULL);
|
||||||
g_return_val_if_fail (viewport != NULL, NULL);
|
g_return_val_if_fail (viewport != NULL, NULL);
|
||||||
g_return_val_if_fail (scale_factor > 0, NULL);
|
g_return_val_if_fail (scale > 0, NULL);
|
||||||
|
|
||||||
/* Check for non-standard framebuffer binding as we might not be using
|
/* Check for non-standard framebuffer binding as we might not be using
|
||||||
* the default framebuffer on systems like macOS where we've bound an
|
* the default framebuffer on systems like macOS where we've bound an
|
||||||
@@ -4436,14 +4436,14 @@ gsk_gl_render_job_new (GskGLDriver *driver,
|
|||||||
job->default_framebuffer = default_framebuffer;
|
job->default_framebuffer = default_framebuffer;
|
||||||
job->offset_x = 0;
|
job->offset_x = 0;
|
||||||
job->offset_y = 0;
|
job->offset_y = 0;
|
||||||
job->scale_x = scale_factor;
|
job->scale_x = scale;
|
||||||
job->scale_y = scale_factor;
|
job->scale_y = scale;
|
||||||
job->viewport = *viewport;
|
job->viewport = *viewport;
|
||||||
job->target_format = get_framebuffer_format (job->command_queue->context, framebuffer);
|
job->target_format = get_framebuffer_format (job->command_queue->context, framebuffer);
|
||||||
|
|
||||||
gsk_gl_render_job_set_alpha (job, 1.0f);
|
gsk_gl_render_job_set_alpha (job, 1.0f);
|
||||||
gsk_gl_render_job_set_projection_from_rect (job, viewport, NULL);
|
gsk_gl_render_job_set_projection_from_rect (job, viewport, NULL);
|
||||||
gsk_gl_render_job_set_modelview (job, gsk_transform_scale (NULL, scale_factor, scale_factor));
|
gsk_gl_render_job_set_modelview (job, gsk_transform_scale (NULL, scale, scale));
|
||||||
|
|
||||||
/* Setup our initial clip. If region is NULL then we are drawing the
|
/* Setup our initial clip. If region is NULL then we are drawing the
|
||||||
* whole viewport. Otherwise, we need to convert the region to a
|
* whole viewport. Otherwise, we need to convert the region to a
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
GskGLRenderJob *gsk_gl_render_job_new (GskGLDriver *driver,
|
GskGLRenderJob *gsk_gl_render_job_new (GskGLDriver *driver,
|
||||||
const graphene_rect_t *viewport,
|
const graphene_rect_t *viewport,
|
||||||
float scale_factor,
|
float scale,
|
||||||
const cairo_region_t *region,
|
const cairo_region_t *region,
|
||||||
guint framebuffer,
|
guint framebuffer,
|
||||||
gboolean clear_framebuffer);
|
gboolean clear_framebuffer);
|
||||||
|
Reference in New Issue
Block a user