gdk: Add a request_hdr argument to begin_frame()
authorBenjamin Otte <otte@redhat.com>
Sat, 2 Oct 2021 20:21:23 +0000 (22:21 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 6 Oct 2021 01:44:58 +0000 (03:44 +0200)
It's not used by anyone, it's just there.

gdk_draw_context_begin_frame_full() has been added so renderers can
make use of it.

16 files changed:
gdk/broadway/gdkcairocontext-broadway.c
gdk/broadway/gdkdrawcontext-broadway.c
gdk/gdkdrawcontext.c
gdk/gdkdrawcontextprivate.h
gdk/gdkglcontext.c
gdk/gdkvulkancontext.c
gdk/macos/gdkmacoscairocontext.c
gdk/macos/gdkmacosglcontext.c
gdk/wayland/gdkcairocontext-wayland.c
gdk/wayland/gdkglcontext-wayland.c
gdk/win32/gdkcairocontext-win32.c
gdk/win32/gdkglcontext-win32-egl.c
gdk/win32/gdkglcontext-win32-wgl.c
gdk/win32/gdkvulkancontext-win32.c
gdk/x11/gdkcairocontext-x11.c
gdk/x11/gdkglcontext-egl.c

index bc45b5094ac8719187f15de63d8ab9542e2891e8..46fdbaf637904fbc81722b54802de672641475b2 100644 (file)
@@ -34,6 +34,7 @@ gdk_broadway_cairo_context_dispose (GObject *object)
 
 static void
 gdk_broadway_cairo_context_begin_frame (GdkDrawContext *draw_context,
+                                        gboolean        request_hdr,
                                         cairo_region_t *region)
 {
   GdkBroadwayCairoContext *self = GDK_BROADWAY_CAIRO_CONTEXT (draw_context);
index 473488396a4834adce9359654e97cf7afdb7ca32..660976bff5aabdf016113b0b0982b758d334dd3d 100644 (file)
@@ -34,6 +34,7 @@ gdk_broadway_draw_context_dispose (GObject *object)
 
 static void
 gdk_broadway_draw_context_begin_frame (GdkDrawContext *draw_context,
+                                       gboolean        request_hdr,
                                        cairo_region_t *region)
 {
   GdkBroadwayDrawContext *self = GDK_BROADWAY_DRAW_CONTEXT (draw_context);
index fdd6fc9c9d9bc4521e40388eeca21165ccc4fb1a..1515917b0791527b2b64275e165bf1ea43ecc944 100644 (file)
@@ -307,11 +307,39 @@ void
 gdk_draw_context_begin_frame (GdkDrawContext       *context,
                               const cairo_region_t *region)
 {
-  GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context);
-
   g_return_if_fail (GDK_IS_DRAW_CONTEXT (context));
   g_return_if_fail (region != NULL);
 
+  gdk_draw_context_begin_frame_full (context, FALSE, region);
+}
+
+/*
+ * @request_hdr: %TRUE to request high dynamic range.
+ *
+ * If HDR is requested, GDK will see about providing a rendering target
+ * that supports high dynamic range. Typically this means a target supporting
+ * 16bit floating point pixels, but that is not guaranteed.
+ *
+ * This is only a request and if the GDK backend does not support HDR rendering
+ * or does not consider it worthwhile, it may choose to not honor the request.
+ * It may also choose to provide HDR even if it was not requested.
+ * Typically the steps undertaken by a backend are:
+ * 1. Check if HDR is supported by this drawing backend.
+ * 2. Check if the compositor supports HDR.
+ * 3. Check if the compositor prefers SDR. This is usually the case when the attached
+ *    monitors do not support HDR content or when the system is resource constrained.
+ * In either of those cases, the context will usually choose to not honor the request.
+ *
+ * The rendering code must be able to deal with HDR and SDR content, no matter if HDR
+ * was requested. The request is only a hint and GDK is free to choose.
+ */
+void
+gdk_draw_context_begin_frame_full (GdkDrawContext       *context,
+                                   gboolean              request_hdr,
+                                   const cairo_region_t *region)
+{
+  GdkDrawContextPrivate *priv = gdk_draw_context_get_instance_private (context);
+
   if (GDK_SURFACE_DESTROYED (priv->surface))
     return;
 
@@ -336,7 +364,7 @@ gdk_draw_context_begin_frame (GdkDrawContext       *context,
   priv->frame_region = cairo_region_copy (region);
   priv->surface->paint_context = g_object_ref (context);
 
-  GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context, priv->frame_region);
+  GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context, request_hdr, priv->frame_region);
 }
 
 #ifdef HAVE_SYSPROF
index 8ae1d0e8f88b60211d1bc35ba3f243f681dfe8fd..0171876d9d106d39bb6ec4a132780942df2f203c 100644 (file)
@@ -41,6 +41,7 @@ struct _GdkDrawContextClass
   GObjectClass parent_class;
 
   void                  (* begin_frame)                         (GdkDrawContext         *context,
+                                                                 gboolean                request_hdr,
                                                                  cairo_region_t         *update_area);
   void                  (* end_frame)                           (GdkDrawContext         *context,
                                                                  cairo_region_t         *painted);
@@ -49,6 +50,9 @@ struct _GdkDrawContextClass
 
 void                    gdk_draw_context_surface_resized        (GdkDrawContext         *context);
 
+void                    gdk_draw_context_begin_frame_full       (GdkDrawContext         *context,
+                                                                 gboolean                request_hdr,
+                                                                 const cairo_region_t   *region);
 G_END_DECLS
 
 #endif /* __GDK__DRAW_CONTEXT_PRIVATE__ */
index 0fc8b689cc54f13ca3f6274bdaee01dc290b8f41..73b82e8d41eecd4c075b661f6b8cdb6aac3309d3 100644 (file)
@@ -629,6 +629,7 @@ gdk_gl_context_real_make_current (GdkGLContext *context,
 
 static void
 gdk_gl_context_real_begin_frame (GdkDrawContext *draw_context,
+                                 gboolean        request_hdr,
                                  cairo_region_t *region)
 {
   GdkGLContext *context = GDK_GL_CONTEXT (draw_context);
index c3f54bbb7c69ded462ec6fed502c4fd42da6cc92..2466c317b8613b2e620009a3db57ed19cafeb157 100644 (file)
@@ -425,6 +425,7 @@ device_supports_incremental_present (VkPhysicalDevice device)
 
 static void
 gdk_vulkan_context_begin_frame (GdkDrawContext *draw_context,
+                                gboolean        request_hdr,
                                 cairo_region_t *region)
 {
   GdkVulkanContext *context = GDK_VULKAN_CONTEXT (draw_context);
index d33f195e5c04c2b02e20809db05637b1e5b6a50b..7a195ab063026bec9fe20baf787e729e47cf2a49 100644 (file)
@@ -82,6 +82,7 @@ _gdk_macos_cairo_context_cairo_create (GdkCairoContext *cairo_context)
 
 static void
 _gdk_macos_cairo_context_begin_frame (GdkDrawContext *draw_context,
+                                      gboolean        request_hdr,
                                       cairo_region_t *region)
 {
   GdkMacosCairoContext *self = (GdkMacosCairoContext *)draw_context;
index 77391b9eaac7827d180e23137eeddcc32aabe0e9..967648626c6b3f6423ef1cb06c8db4692720de0e 100644 (file)
@@ -291,6 +291,7 @@ opaque_region_covers_surface (GdkMacosGLContext *self)
 
 static void
 gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
+                                  gboolean        request_hdr,
                                   cairo_region_t *painted)
 {
   GdkMacosGLContext *self = (GdkMacosGLContext *)context;
@@ -344,7 +345,7 @@ gdk_macos_gl_context_begin_frame (GdkDrawContext *context,
       [self->gl_context update];
     }
 
-  GDK_DRAW_CONTEXT_CLASS (gdk_macos_gl_context_parent_class)->begin_frame (context, painted);
+  GDK_DRAW_CONTEXT_CLASS (gdk_macos_gl_context_parent_class)->begin_frame (context, request_hdr, painted);
 
   if (!self->is_attached)
     {
index 4ce71343271ddf463b713a5c1abb2ac2c1f3d494..e06eaa109630330501282f156e80894c5eedd470 100644 (file)
@@ -144,6 +144,7 @@ gdk_wayland_cairo_context_create_surface (GdkWaylandCairoContext *self)
 
 static void
 gdk_wayland_cairo_context_begin_frame (GdkDrawContext *draw_context,
+                                       gboolean        request_hdr,
                                        cairo_region_t *region)
 {
   GdkWaylandCairoContext *self = GDK_WAYLAND_CAIRO_CONTEXT (draw_context);
index 97b5bcbbbe92b793dcf5ede8380a63068f08b286..9fc887367a04dff8d008dff816f9fdc0a2adc066 100644 (file)
@@ -47,11 +47,12 @@ G_DEFINE_TYPE (GdkWaylandGLContext, gdk_wayland_gl_context, GDK_TYPE_GL_CONTEXT)
 
 static void
 gdk_wayland_gl_context_begin_frame (GdkDrawContext *draw_context,
+                                    gboolean        request_hdr,
                                     cairo_region_t *region)
 {
   gdk_wayland_surface_ensure_wl_egl_window (gdk_draw_context_get_surface (draw_context));
 
-  GDK_DRAW_CONTEXT_CLASS (gdk_wayland_gl_context_parent_class)->begin_frame (draw_context, region);
+  GDK_DRAW_CONTEXT_CLASS (gdk_wayland_gl_context_parent_class)->begin_frame (draw_context, request_hdr, region);
 
   glDrawBuffers (1, (GLenum[1]) { GL_BACK });
 }
index 0f9dbbca1a2d1d5bbcbb3fed40db49c012e47177..65aef46b4849760c061bae510bee7db306f76e12 100644 (file)
@@ -53,6 +53,7 @@ create_cairo_surface_for_surface (GdkSurface *surface,
 
 static void
 gdk_win32_cairo_context_begin_frame (GdkDrawContext *draw_context,
+                                     gboolean        request_hdr,
                                      cairo_region_t *region)
 {
   GdkWin32CairoContext *self = GDK_WIN32_CAIRO_CONTEXT (draw_context);
index 0b30a8b481832d018b4c0824f33560dd10dd18ad..8d6bef9e1728c9d042c033f0ce4ad71b51183adf 100644 (file)
@@ -471,16 +471,12 @@ gdk_win32_gl_context_egl_make_current (GdkGLContext *context,
 
 static void
 gdk_win32_gl_context_egl_begin_frame (GdkDrawContext *draw_context,
+                                      gboolean        request_hdr,
                                       cairo_region_t *update_area)
 {
-  GdkGLContext *context = GDK_GL_CONTEXT (draw_context);
-  GdkSurface *surface;
-
-  surface = gdk_gl_context_get_surface (context);
-
   gdk_win32_surface_handle_queued_move_resize (draw_context);
 
-  GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_egl_parent_class)->begin_frame (draw_context, update_area);
+  GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_egl_parent_class)->begin_frame (draw_context, request_hdr, update_area);
 }
 
 static void
index 73ced98673990ff56ab294ae83e5a56ca0cf991c..9f9bc257a365ec725626735caf5ffcca8506cab0 100644 (file)
@@ -118,11 +118,12 @@ gdk_win32_gl_context_wgl_end_frame (GdkDrawContext *draw_context,
 
 static void
 gdk_win32_gl_context_wgl_begin_frame (GdkDrawContext *draw_context,
+                                      gboolean        request_hdr,
                                       cairo_region_t *update_area)
 {
   gdk_win32_surface_handle_queued_move_resize (draw_context);
 
-  GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_wgl_parent_class)->begin_frame (draw_context, update_area);
+  GDK_DRAW_CONTEXT_CLASS (gdk_win32_gl_context_wgl_parent_class)->begin_frame (draw_context, request_hdr, update_area);
 }
 
 static int
index 478299c31e13b860d90098a98fd979af4dd7b569..d82cb15d2721bf62e5231e215068c3cdd41c1ad2 100644 (file)
@@ -68,11 +68,12 @@ gdk_win32_vulkan_context_create_surface (GdkVulkanContext *context,
 
 static void
 gdk_win32_vulkan_context_begin_frame (GdkDrawContext *draw_context,
+                                      gboolean        request_hdr,
                                       cairo_region_t *update_area)
 {
   gdk_win32_surface_handle_queued_move_resize (draw_context);
 
-  GDK_DRAW_CONTEXT_CLASS (gdk_win32_vulkan_context_parent_class)->begin_frame (draw_context, update_area);
+  GDK_DRAW_CONTEXT_CLASS (gdk_win32_vulkan_context_parent_class)->begin_frame (draw_context, request_hdr, update_area);
 }
 
 static void
index 36bf1ae0ba8c0405480e5767a9731191f36c0d4a..e6accbb6ad910637e355da3fb4ba00fdf3b49e81 100644 (file)
@@ -55,6 +55,7 @@ create_cairo_surface_for_surface (GdkSurface *surface)
 
 static void
 gdk_x11_cairo_context_begin_frame (GdkDrawContext *draw_context,
+                                   gboolean        request_hdr,
                                    cairo_region_t *region)
 {
   GdkX11CairoContext *self = GDK_X11_CAIRO_CONTEXT (draw_context);
index b417718c289bb48ff015ef844a89256629f71be0..39255ac881aaea7caa9aadd34b8d006f8945d6d5 100644 (file)
@@ -61,9 +61,10 @@ gdk_x11_display_get_egl_display (GdkDisplay *display)
 
 static void
 gdk_x11_gl_context_egl_begin_frame (GdkDrawContext *draw_context,
+                                    gboolean        request_hdr,
                                     cairo_region_t *region)
 {
-  GDK_DRAW_CONTEXT_CLASS (gdk_x11_gl_context_egl_parent_class)->begin_frame (draw_context, region);
+  GDK_DRAW_CONTEXT_CLASS (gdk_x11_gl_context_egl_parent_class)->begin_frame (draw_context, request_hdr, region);
 
   glDrawBuffers (1, (GLenum[1]) { GL_BACK });
 }