mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-07-15 20:02:05 +00:00
Compare commits
1 Commits
gnif-hdr-e
...
idd-defaul
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e6f21f91e |
1
AUTHORS
1
AUTHORS
@@ -74,4 +74,3 @@ rs189 <35667100+rs189@users.noreply.github.com> (rs189)
|
|||||||
Jérôme Poulin <jeromepoulin@gmail.com> (ticpu)
|
Jérôme Poulin <jeromepoulin@gmail.com> (ticpu)
|
||||||
Marco Rodolfi <marco.rodolfi@tuta.io> (RodoMa92)
|
Marco Rodolfi <marco.rodolfi@tuta.io> (RodoMa92)
|
||||||
Stewart Borle <stewi1014@gmail.com> (stewi1014)
|
Stewart Borle <stewi1014@gmail.com> (stewi1014)
|
||||||
Jannis Lübke <business.janrupf@gmail.com> (Janrupf)
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ find_program(WAYLAND_SCANNER_EXECUTABLE NAMES wayland-scanner)
|
|||||||
add_library(displayserver_Wayland STATIC
|
add_library(displayserver_Wayland STATIC
|
||||||
activation.c
|
activation.c
|
||||||
clipboard.c
|
clipboard.c
|
||||||
colormgmt.c
|
|
||||||
cursor.c
|
cursor.c
|
||||||
gl.c
|
gl.c
|
||||||
idle.c
|
idle.c
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/**
|
|
||||||
* Looking Glass
|
|
||||||
* Copyright (C) 2017-2026 The Looking Glass Authors
|
|
||||||
* https://looking-glass.io
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License as published by the Free
|
|
||||||
* Software Foundation; either version 2 of the License, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "wayland.h"
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include <wayland-client.h>
|
|
||||||
|
|
||||||
#include "common/debug.h"
|
|
||||||
|
|
||||||
static void cmIntent(void * data, struct wp_color_manager_v1 * cm, uint32_t intent)
|
|
||||||
{
|
|
||||||
if (intent == WP_COLOR_MANAGER_V1_RENDER_INTENT_PERCEPTUAL)
|
|
||||||
wlWm.cmHasPerceptualIntent = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmFeature(void * data, struct wp_color_manager_v1 * cm, uint32_t feature)
|
|
||||||
{
|
|
||||||
switch (feature)
|
|
||||||
{
|
|
||||||
case WP_COLOR_MANAGER_V1_FEATURE_PARAMETRIC:
|
|
||||||
wlWm.cmHasParametric = true;
|
|
||||||
break;
|
|
||||||
case WP_COLOR_MANAGER_V1_FEATURE_SET_LUMINANCES:
|
|
||||||
wlWm.cmHasLuminances = true;
|
|
||||||
break;
|
|
||||||
case WP_COLOR_MANAGER_V1_FEATURE_SET_MASTERING_DISPLAY_PRIMARIES:
|
|
||||||
wlWm.cmHasMasteringPrimaries = true;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmTFNamed(void * data, struct wp_color_manager_v1 * cm, uint32_t tf)
|
|
||||||
{
|
|
||||||
if (tf == WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ)
|
|
||||||
wlWm.cmHasTFSt2084PQ = true;
|
|
||||||
else if (tf == WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR)
|
|
||||||
wlWm.cmHasTFExtLinear = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmPrimariesNamed(void * data, struct wp_color_manager_v1 * cm,
|
|
||||||
uint32_t primaries)
|
|
||||||
{
|
|
||||||
if (primaries == WP_COLOR_MANAGER_V1_PRIMARIES_BT2020)
|
|
||||||
wlWm.cmHasPrimariesBT2020 = true;
|
|
||||||
else if (primaries == WP_COLOR_MANAGER_V1_PRIMARIES_SRGB)
|
|
||||||
wlWm.cmHasPrimariesSRGB = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cmDone(void * data, struct wp_color_manager_v1 * cm)
|
|
||||||
{
|
|
||||||
wlWm.cmFeaturesDone = true;
|
|
||||||
wlWm.cmCanDoHDR = wlWm.cmHasParametric &&
|
|
||||||
((wlWm.cmHasTFSt2084PQ && wlWm.cmHasPrimariesBT2020) ||
|
|
||||||
(wlWm.cmHasTFExtLinear && wlWm.cmHasPrimariesSRGB));
|
|
||||||
DEBUG_INFO("Color management features: parametric:%d luminances:%d "
|
|
||||||
"mastering_primaries:%d st2084_pq:%d ext_linear:%d bt2020:%d srgb:%d "
|
|
||||||
"can_do_hdr:%d",
|
|
||||||
wlWm.cmHasParametric, wlWm.cmHasLuminances,
|
|
||||||
wlWm.cmHasMasteringPrimaries,
|
|
||||||
wlWm.cmHasTFSt2084PQ, wlWm.cmHasTFExtLinear,
|
|
||||||
wlWm.cmHasPrimariesBT2020, wlWm.cmHasPrimariesSRGB,
|
|
||||||
wlWm.cmCanDoHDR);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct wp_color_manager_v1_listener cmListener = {
|
|
||||||
.supported_intent = cmIntent,
|
|
||||||
.supported_feature = cmFeature,
|
|
||||||
.supported_tf_named = cmTFNamed,
|
|
||||||
.supported_primaries_named = cmPrimariesNamed,
|
|
||||||
.done = cmDone,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool waylandColorMgmtInit(void)
|
|
||||||
{
|
|
||||||
if (!wlWm.colorManager)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
wp_color_manager_v1_add_listener(wlWm.colorManager, &cmListener, NULL);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void waylandColorMgmtFree(void)
|
|
||||||
{
|
|
||||||
if (!wlWm.colorManager)
|
|
||||||
return;
|
|
||||||
|
|
||||||
wp_color_manager_v1_destroy(wlWm.colorManager);
|
|
||||||
wlWm.colorManager = NULL;
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -183,7 +183,7 @@ void waylandCursorFree(void)
|
|||||||
|
|
||||||
void waylandCursorScaleChange(void)
|
void waylandCursorScaleChange(void)
|
||||||
{
|
{
|
||||||
int newScale = waylandScaleCeil(wlWm.scale);
|
int newScale = ceil(wl_fixed_to_double(wlWm.scale));
|
||||||
if (newScale == wlWm.cursorScale)
|
if (newScale == wlWm.cursorScale)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -263,11 +263,6 @@ void libdecor_pollWait(struct wl_display * display, int epollFd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool libdecor_configured(void)
|
|
||||||
{
|
|
||||||
return state.configured;
|
|
||||||
}
|
|
||||||
|
|
||||||
WL_DesktopOps WLD_libdecor =
|
WL_DesktopOps WLD_libdecor =
|
||||||
{
|
{
|
||||||
.name = "libdecor",
|
.name = "libdecor",
|
||||||
@@ -282,6 +277,5 @@ WL_DesktopOps WLD_libdecor =
|
|||||||
.getSize = libdecor_getSize,
|
.getSize = libdecor_getSize,
|
||||||
.registryGlobalHandler = libdecor_registryGlobalHandler,
|
.registryGlobalHandler = libdecor_registryGlobalHandler,
|
||||||
.pollInit = libdecor_pollInit,
|
.pollInit = libdecor_pollInit,
|
||||||
.pollWait = libdecor_pollWait,
|
.pollWait = libdecor_pollWait
|
||||||
.configured = libdecor_configured
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -304,11 +304,6 @@ void xdg_pollWait(struct wl_display * display, int epollFd,
|
|||||||
wl_display_cancel_read(display);
|
wl_display_cancel_read(display);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool xdg_configured(void)
|
|
||||||
{
|
|
||||||
return state.configured;
|
|
||||||
}
|
|
||||||
|
|
||||||
WL_DesktopOps WLD_xdg =
|
WL_DesktopOps WLD_xdg =
|
||||||
{
|
{
|
||||||
.name = "xdg",
|
.name = "xdg",
|
||||||
@@ -323,6 +318,5 @@ WL_DesktopOps WLD_xdg =
|
|||||||
.getSize = xdg_getSize,
|
.getSize = xdg_getSize,
|
||||||
.registryGlobalHandler = xdg_registryGlobalHandler,
|
.registryGlobalHandler = xdg_registryGlobalHandler,
|
||||||
.pollInit = xdg_pollInit,
|
.pollInit = xdg_pollInit,
|
||||||
.pollWait = xdg_pollWait,
|
.pollWait = xdg_pollWait
|
||||||
.configured = xdg_configured
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -70,52 +70,6 @@ EGLDisplay waylandGetEGLDisplay(void)
|
|||||||
return eglGetDisplay(native);
|
return eglGetDisplay(native);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void applyHDRPending(void)
|
|
||||||
{
|
|
||||||
if (wlWm.pendingHDRApply)
|
|
||||||
{
|
|
||||||
wlWm.pendingHDRApply = false;
|
|
||||||
atomic_thread_fence(memory_order_acquire);
|
|
||||||
waylandSetHDRImageDescription(
|
|
||||||
wlWm.pendingHDRDisplayPrimary, wlWm.pendingHDRWhitePoint,
|
|
||||||
wlWm.pendingHDRMaxDisplayLuminance,
|
|
||||||
wlWm.pendingHDRMinDisplayLuminance,
|
|
||||||
wlWm.pendingHDRMaxCLL,
|
|
||||||
wlWm.pendingHDRMaxFALL,
|
|
||||||
wlWm.pendingHDRPQ);
|
|
||||||
}
|
|
||||||
else if (wlWm.pendingHDRClear)
|
|
||||||
{
|
|
||||||
wlWm.pendingHDRClear = false;
|
|
||||||
waylandClearHDRImageDescription();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void waylandClearHDRImageDescription(void)
|
|
||||||
{
|
|
||||||
if (!wlWm.hdrActive)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (wlWm.hdrImageCreator)
|
|
||||||
{
|
|
||||||
wp_image_description_creator_params_v1_destroy(wlWm.hdrImageCreator);
|
|
||||||
wlWm.hdrImageCreator = NULL;
|
|
||||||
}
|
|
||||||
if (wlWm.hdrImageDesc)
|
|
||||||
{
|
|
||||||
wp_image_description_v1_destroy(wlWm.hdrImageDesc);
|
|
||||||
wlWm.hdrImageDesc = NULL;
|
|
||||||
}
|
|
||||||
if (wlWm.colorSurface)
|
|
||||||
{
|
|
||||||
wp_color_management_surface_v1_destroy(wlWm.colorSurface);
|
|
||||||
wlWm.colorSurface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
wlWm.hdrActive = false;
|
|
||||||
DEBUG_INFO("HDR image description cleared");
|
|
||||||
}
|
|
||||||
|
|
||||||
void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct Rect * damage, int count)
|
void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct Rect * damage, int count)
|
||||||
{
|
{
|
||||||
if (!wlWm.swapWithDamage.init)
|
if (!wlWm.swapWithDamage.init)
|
||||||
@@ -130,7 +84,6 @@ void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct
|
|||||||
}
|
}
|
||||||
|
|
||||||
waylandPresentationFrame();
|
waylandPresentationFrame();
|
||||||
applyHDRPending();
|
|
||||||
swapWithDamage(&wlWm.swapWithDamage, display, surface, damage, count);
|
swapWithDamage(&wlWm.swapWithDamage, display, surface, damage, count);
|
||||||
|
|
||||||
if (wlWm.needsResize)
|
if (wlWm.needsResize)
|
||||||
@@ -139,8 +92,8 @@ void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct
|
|||||||
|
|
||||||
int width, height;
|
int width, height;
|
||||||
wlWm.desktop->getSize(&width, &height);
|
wlWm.desktop->getSize(&width, &height);
|
||||||
wl_egl_window_resize(wlWm.eglWindow, waylandScaleMulInt(wlWm.scale, width),
|
wl_egl_window_resize(wlWm.eglWindow, wl_fixed_to_int(width * wlWm.scale),
|
||||||
waylandScaleMulInt(wlWm.scale, height), 0, 0);
|
wl_fixed_to_int(height * wlWm.scale), 0, 0);
|
||||||
|
|
||||||
if (width == 0 || height == 0)
|
if (width == 0 || height == 0)
|
||||||
skipResize = true;
|
skipResize = true;
|
||||||
@@ -170,7 +123,7 @@ void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct
|
|||||||
wp_viewport_destroy(wlWm.viewport);
|
wp_viewport_destroy(wlWm.viewport);
|
||||||
wlWm.viewport = NULL;
|
wlWm.viewport = NULL;
|
||||||
}
|
}
|
||||||
wl_surface_set_buffer_scale(wlWm.surface, waylandScaleFloor(wlWm.scale));
|
wl_surface_set_buffer_scale(wlWm.surface, wl_fixed_to_int(wlWm.scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct wl_region * region = wl_compositor_create_region(wlWm.compositor);
|
struct wl_region * region = wl_compositor_create_region(wlWm.compositor);
|
||||||
@@ -178,7 +131,7 @@ void waylandEGLSwapBuffers(EGLDisplay display, EGLSurface surface, const struct
|
|||||||
wl_surface_set_opaque_region(wlWm.surface, region);
|
wl_surface_set_opaque_region(wlWm.surface, region);
|
||||||
wl_region_destroy(region);
|
wl_region_destroy(region);
|
||||||
|
|
||||||
app_handleResizeEvent(width, height, waylandScaleToDouble(wlWm.scale),
|
app_handleResizeEvent(width, height, wl_fixed_to_double(wlWm.scale),
|
||||||
(struct Border) {0, 0, 0, 0});
|
(struct Border) {0, 0, 0, 0});
|
||||||
app_invalidateWindow(true);
|
app_invalidateWindow(true);
|
||||||
waylandStopWaitFrame();
|
waylandStopWaitFrame();
|
||||||
@@ -196,227 +149,23 @@ EGLNativeWindowType waylandGetEGLNativeWindow(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// HDR color management support
|
|
||||||
void waylandSetHDRImageDescription(const uint16_t displayPrimary[3][2],
|
|
||||||
const uint16_t whitePoint[2], uint32_t maxDisplayLuminance,
|
|
||||||
uint32_t minDisplayLuminance, uint32_t maxCLL, uint32_t maxFALL,
|
|
||||||
bool hdrPQ)
|
|
||||||
{
|
|
||||||
if (!wlWm.colorManager)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!wlWm.cmFeaturesDone)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Color management features not yet advertised, deferring HDR");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wlWm.cmHasParametric)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Compositor does not support parametric image descriptions");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify the compositor supports the transfer function we need
|
|
||||||
if (hdrPQ && !wlWm.cmHasTFSt2084PQ)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Compositor does not support ST2084_PQ transfer function");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!hdrPQ && !wlWm.cmHasTFExtLinear)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Compositor does not support EXT_LINEAR transfer function");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify primaries support for the target color space
|
|
||||||
if (hdrPQ && !wlWm.cmHasPrimariesBT2020)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Compositor does not support BT.2020 primaries");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!hdrPQ && !wlWm.cmHasPrimariesSRGB)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Compositor does not support sRGB primaries");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clean up any previous description (allows re-application with updated metadata)
|
|
||||||
if (wlWm.hdrImageCreator)
|
|
||||||
{
|
|
||||||
wp_image_description_creator_params_v1_destroy(wlWm.hdrImageCreator);
|
|
||||||
wlWm.hdrImageCreator = NULL;
|
|
||||||
}
|
|
||||||
if (wlWm.hdrImageDesc)
|
|
||||||
{
|
|
||||||
wp_image_description_v1_destroy(wlWm.hdrImageDesc);
|
|
||||||
wlWm.hdrImageDesc = NULL;
|
|
||||||
}
|
|
||||||
if (wlWm.colorSurface)
|
|
||||||
{
|
|
||||||
wp_color_management_surface_v1_destroy(wlWm.colorSurface);
|
|
||||||
wlWm.colorSurface = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
wlWm.hdrActive = false;
|
|
||||||
|
|
||||||
wlWm.hdrImageCreator =
|
|
||||||
wp_color_manager_v1_create_parametric_creator(wlWm.colorManager);
|
|
||||||
if (!wlWm.hdrImageCreator)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Failed to create parametric image description creator");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set primaries: BT.2020 for PQ HDR10, sRGB for scRGB/FP16
|
|
||||||
wp_image_description_creator_params_v1_set_primaries_named(
|
|
||||||
wlWm.hdrImageCreator,
|
|
||||||
hdrPQ ? WP_COLOR_MANAGER_V1_PRIMARIES_BT2020
|
|
||||||
: WP_COLOR_MANAGER_V1_PRIMARIES_SRGB);
|
|
||||||
|
|
||||||
// Select transfer function: PQ for PQ-encoded content, linear for scRGB/FP16
|
|
||||||
wp_image_description_creator_params_v1_set_tf_named(
|
|
||||||
wlWm.hdrImageCreator,
|
|
||||||
hdrPQ ? WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_ST2084_PQ
|
|
||||||
: WP_COLOR_MANAGER_V1_TRANSFER_FUNCTION_EXT_LINEAR);
|
|
||||||
|
|
||||||
// Set luminance range from metadata (values already in 0.0001 cd/m² units)
|
|
||||||
if (wlWm.cmHasLuminances)
|
|
||||||
wp_image_description_creator_params_v1_set_luminances(
|
|
||||||
wlWm.hdrImageCreator,
|
|
||||||
minDisplayLuminance > 0 ? minDisplayLuminance : 50,
|
|
||||||
maxDisplayLuminance > 0 ? maxDisplayLuminance : 10000000,
|
|
||||||
hdrPQ ? 2030000 : 800000);
|
|
||||||
|
|
||||||
// Set mastering display primaries from frame HDR metadata.
|
|
||||||
// Always set when the compositor supports it, falling back to the
|
|
||||||
// primaries from the metadata (even if zero, in which case the
|
|
||||||
// compositor uses its own defaults).
|
|
||||||
if (wlWm.cmHasMasteringPrimaries)
|
|
||||||
wp_image_description_creator_params_v1_set_mastering_display_primaries(
|
|
||||||
wlWm.hdrImageCreator,
|
|
||||||
displayPrimary[0][0], displayPrimary[0][1],
|
|
||||||
displayPrimary[1][0], displayPrimary[1][1],
|
|
||||||
displayPrimary[2][0], displayPrimary[2][1],
|
|
||||||
whitePoint[0], whitePoint[1]);
|
|
||||||
|
|
||||||
if (maxCLL > 0)
|
|
||||||
wp_image_description_creator_params_v1_set_max_cll(wlWm.hdrImageCreator, maxCLL);
|
|
||||||
if (maxFALL > 0)
|
|
||||||
wp_image_description_creator_params_v1_set_max_fall(wlWm.hdrImageCreator, maxFALL);
|
|
||||||
|
|
||||||
wlWm.hdrImageDesc =
|
|
||||||
wp_image_description_creator_params_v1_create(wlWm.hdrImageCreator);
|
|
||||||
wlWm.hdrImageCreator = NULL; // consumed by create
|
|
||||||
|
|
||||||
if (!wlWm.hdrImageDesc)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Failed to create HDR image description");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wlWm.colorSurface =
|
|
||||||
wp_color_manager_v1_get_surface(wlWm.colorManager, wlWm.surface);
|
|
||||||
if (!wlWm.colorSurface)
|
|
||||||
{
|
|
||||||
DEBUG_WARN("Failed to get color management surface");
|
|
||||||
wp_image_description_v1_destroy(wlWm.hdrImageDesc);
|
|
||||||
wlWm.hdrImageDesc = NULL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
wp_color_management_surface_v1_set_image_description(
|
|
||||||
wlWm.colorSurface, wlWm.hdrImageDesc,
|
|
||||||
WP_COLOR_MANAGER_V1_RENDER_INTENT_PERCEPTUAL);
|
|
||||||
|
|
||||||
wlWm.hdrActive = true;
|
|
||||||
DEBUG_INFO("HDR image description set on surface (%s, %s, %u nits)",
|
|
||||||
hdrPQ ? "PQ" : "scRGB", hdrPQ ? "BT.2020" : "sRGB", maxDisplayLuminance);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool waylandRequestHDR(const uint16_t displayPrimary[3][2],
|
|
||||||
const uint16_t whitePoint[2], uint32_t maxDisplayLuminance,
|
|
||||||
uint32_t minDisplayLuminance, uint32_t maxCLL, uint32_t maxFALL,
|
|
||||||
bool hdrPQ)
|
|
||||||
{
|
|
||||||
if (!wlWm.cmFeaturesDone || !wlWm.cmHasParametric)
|
|
||||||
return false;
|
|
||||||
if (hdrPQ && !wlWm.cmHasTFSt2084PQ)
|
|
||||||
return false;
|
|
||||||
if (!hdrPQ && !wlWm.cmHasTFExtLinear)
|
|
||||||
return false;
|
|
||||||
if (hdrPQ && !wlWm.cmHasPrimariesBT2020)
|
|
||||||
return false;
|
|
||||||
if (!hdrPQ && !wlWm.cmHasPrimariesSRGB)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
wlWm.pendingHDRPQ = hdrPQ;
|
|
||||||
|
|
||||||
// Write all metadata before setting the apply flag to ensure the
|
|
||||||
// render thread sees the complete HDR metadata when it observes
|
|
||||||
// pendingHDRApply == true.
|
|
||||||
memcpy(wlWm.pendingHDRDisplayPrimary, displayPrimary,
|
|
||||||
sizeof(wlWm.pendingHDRDisplayPrimary));
|
|
||||||
memcpy(wlWm.pendingHDRWhitePoint, whitePoint,
|
|
||||||
sizeof(wlWm.pendingHDRWhitePoint));
|
|
||||||
wlWm.pendingHDRMaxDisplayLuminance = maxDisplayLuminance;
|
|
||||||
wlWm.pendingHDRMinDisplayLuminance = minDisplayLuminance;
|
|
||||||
wlWm.pendingHDRMaxCLL = maxCLL;
|
|
||||||
wlWm.pendingHDRMaxFALL = maxFALL;
|
|
||||||
|
|
||||||
wlWm.pendingHDRClear = false;
|
|
||||||
atomic_thread_fence(memory_order_release);
|
|
||||||
wlWm.pendingHDRApply = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void waylandRequestClearHDR(void)
|
|
||||||
{
|
|
||||||
wlWm.pendingHDRClear = true;
|
|
||||||
wlWm.pendingHDRApply = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ENABLE_OPENGL
|
#ifdef ENABLE_OPENGL
|
||||||
|
bool waylandOpenGLInit(void)
|
||||||
static const EGLint eglBaseAttrs[] =
|
|
||||||
{
|
{
|
||||||
|
EGLint attr[] =
|
||||||
|
{
|
||||||
|
EGL_BUFFER_SIZE , 24,
|
||||||
EGL_CONFORMANT , EGL_OPENGL_BIT,
|
EGL_CONFORMANT , EGL_OPENGL_BIT,
|
||||||
EGL_RENDERABLE_TYPE , EGL_OPENGL_BIT,
|
EGL_RENDERABLE_TYPE , EGL_OPENGL_BIT,
|
||||||
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
|
EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,
|
||||||
|
EGL_RED_SIZE , 8,
|
||||||
|
EGL_GREEN_SIZE , 8,
|
||||||
|
EGL_BLUE_SIZE , 8,
|
||||||
EGL_SAMPLE_BUFFERS , 0,
|
EGL_SAMPLE_BUFFERS , 0,
|
||||||
EGL_SAMPLES , 0,
|
EGL_SAMPLES , 0,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool eglChooseConfigWithDepth(EGLDisplay display, EGLint red,
|
|
||||||
EGLint green, EGLint blue, EGLint alpha, EGLint depth,
|
|
||||||
EGLConfig * config, const char ** desc)
|
|
||||||
{
|
|
||||||
// Build attr array with the base attrs plus color depth
|
|
||||||
EGLint attr[32];
|
|
||||||
int ai = 0;
|
|
||||||
attr[ai++] = EGL_RED_SIZE ; attr[ai++] = red;
|
|
||||||
attr[ai++] = EGL_GREEN_SIZE; attr[ai++] = green;
|
|
||||||
attr[ai++] = EGL_BLUE_SIZE ; attr[ai++] = blue;
|
|
||||||
attr[ai++] = EGL_ALPHA_SIZE; attr[ai++] = alpha;
|
|
||||||
attr[ai++] = EGL_BUFFER_SIZE; attr[ai++] = depth;
|
|
||||||
for (int i = 0; eglBaseAttrs[i] != EGL_NONE; ++i)
|
|
||||||
attr[ai++] = eglBaseAttrs[i];
|
|
||||||
attr[ai] = EGL_NONE;
|
|
||||||
|
|
||||||
EGLint num_config;
|
|
||||||
if (eglChooseConfig(display, attr, config, 1, &num_config) && num_config > 0)
|
|
||||||
{
|
|
||||||
if (desc)
|
|
||||||
*desc = red >= 16 ? "FP16 (RGBA16F)" :
|
|
||||||
red >= 10 ? "10-bit (RGBA10)" : "8-bit (RGBA8)";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool waylandOpenGLInit(void)
|
|
||||||
{
|
|
||||||
wlWm.glDisplay = waylandGetEGLDisplay();
|
wlWm.glDisplay = waylandGetEGLDisplay();
|
||||||
|
|
||||||
int maj, min;
|
int maj, min;
|
||||||
@@ -432,31 +181,13 @@ bool waylandOpenGLInit(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
EGLConfig config;
|
EGLint num_config;
|
||||||
const char * configDesc = NULL;
|
if (!eglChooseConfig(wlWm.glDisplay, attr, &wlWm.glConfig, 1, &num_config))
|
||||||
|
|
||||||
// Probe for best available color depth: FP16 → 10-bit → 8-bit
|
|
||||||
if (!eglChooseConfigWithDepth(wlWm.glDisplay,
|
|
||||||
16, 16, 16, 0, 48, &config, &configDesc) &&
|
|
||||||
!eglChooseConfigWithDepth(wlWm.glDisplay,
|
|
||||||
10, 10, 10, 2, 32, &config, &configDesc) &&
|
|
||||||
!eglChooseConfigWithDepth(wlWm.glDisplay,
|
|
||||||
8, 8, 8, 0, 24, &config, &configDesc))
|
|
||||||
{
|
{
|
||||||
DEBUG_ERROR("Failed to choose any EGL config");
|
DEBUG_ERROR("Failed to choose config (eglError: 0x%x)", eglGetError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
wlWm.glConfig = config;
|
|
||||||
DEBUG_INFO("EGL config: %s", configDesc);
|
|
||||||
|
|
||||||
// Also store the 8-bit fallback for SDR contexts
|
|
||||||
if (configDesc && strcmp(configDesc, "8-bit (RGBA8)") != 0)
|
|
||||||
eglChooseConfigWithDepth(wlWm.glDisplay,
|
|
||||||
8, 8, 8, 0, 24, &wlWm.glConfigSDR, NULL);
|
|
||||||
else
|
|
||||||
wlWm.glConfigSDR = wlWm.glConfig;
|
|
||||||
|
|
||||||
wlWm.glSurface = eglCreateWindowSurface(wlWm.glDisplay, wlWm.glConfig, wlWm.eglWindow, NULL);
|
wlWm.glSurface = eglCreateWindowSurface(wlWm.glDisplay, wlWm.glConfig, wlWm.eglWindow, NULL);
|
||||||
if (wlWm.glSurface == EGL_NO_SURFACE)
|
if (wlWm.glSurface == EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -32,9 +32,6 @@
|
|||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
|
|
||||||
const double WL_SCROLL_STEP = 15.0;
|
|
||||||
const double WL_HALF_SCROLL_STEP = WL_SCROLL_STEP / 2.0;
|
|
||||||
|
|
||||||
// Mouse-handling listeners.
|
// Mouse-handling listeners.
|
||||||
|
|
||||||
static void pointerMotionHandler(void * data, struct wl_pointer * pointer,
|
static void pointerMotionHandler(void * data, struct wl_pointer * pointer,
|
||||||
@@ -94,25 +91,12 @@ static void pointerAxisHandler(void * data, struct wl_pointer * pointer,
|
|||||||
if (axis != WL_POINTER_AXIS_VERTICAL_SCROLL)
|
if (axis != WL_POINTER_AXIS_VERTICAL_SCROLL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
double delta = wl_fixed_to_double(value);
|
int button = value > 0 ?
|
||||||
|
5 /* SPICE_MOUSE_BUTTON_DOWN */ :
|
||||||
wlWm.scrollState += delta;
|
4 /* SPICE_MOUSE_BUTTON_UP */;
|
||||||
|
app_handleButtonPress(button);
|
||||||
while (wlWm.scrollState > WL_HALF_SCROLL_STEP)
|
app_handleButtonRelease(button);
|
||||||
{
|
app_handleWheelMotion(wl_fixed_to_double(value) / 15.0);
|
||||||
app_handleButtonPress(5 /* SPICE_MOUSE_BUTTON_DOWN */);
|
|
||||||
app_handleButtonRelease(5 /* SPICE_MOUSE_BUTTON_DOWN */);
|
|
||||||
wlWm.scrollState -= WL_SCROLL_STEP;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (wlWm.scrollState < -WL_HALF_SCROLL_STEP)
|
|
||||||
{
|
|
||||||
app_handleButtonPress(4 /* SPICE_MOUSE_BUTTON_UP */);
|
|
||||||
app_handleButtonRelease(4 /* SPICE_MOUSE_BUTTON_UP */);
|
|
||||||
wlWm.scrollState += WL_SCROLL_STEP;
|
|
||||||
}
|
|
||||||
|
|
||||||
app_handleWheelMotion(delta / WL_SCROLL_STEP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mapWaylandToSpiceButton(uint32_t button)
|
static int mapWaylandToSpiceButton(uint32_t button)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -58,8 +58,6 @@ typedef struct WL_DesktopOps
|
|||||||
bool (*pollInit)(struct wl_display * display);
|
bool (*pollInit)(struct wl_display * display);
|
||||||
|
|
||||||
void (*pollWait)(struct wl_display * display, int epollFd, unsigned int time);
|
void (*pollWait)(struct wl_display * display, int epollFd, unsigned int time);
|
||||||
|
|
||||||
bool (*configured)(void);
|
|
||||||
}
|
}
|
||||||
WL_DesktopOps;
|
WL_DesktopOps;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -29,17 +29,17 @@
|
|||||||
|
|
||||||
static void outputUpdateScale(struct WaylandOutput * node)
|
static void outputUpdateScale(struct WaylandOutput * node)
|
||||||
{
|
{
|
||||||
struct WaylandScale original = node->scale;
|
wl_fixed_t original = node->scale;
|
||||||
|
|
||||||
if (!wlWm.useFractionalScale || !wlWm.viewporter || !node->logicalWidth)
|
if (!wlWm.useFractionalScale || !wlWm.viewporter || !node->logicalWidth)
|
||||||
node->scale = waylandScaleFromInt(node->scaleInt);
|
node->scale = wl_fixed_from_int(node->scaleInt);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int32_t modeWidth = node->modeRotate ? node->modeHeight : node->modeWidth;
|
int32_t modeWidth = node->modeRotate ? node->modeHeight : node->modeWidth;
|
||||||
node->scale = waylandScaleFromRatio(modeWidth, node->logicalWidth);
|
node->scale = wl_fixed_from_double(1.0 * modeWidth / node->logicalWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!waylandScaleEqual(original, node->scale))
|
if (original != node->scale)
|
||||||
waylandWindowUpdateScale();
|
waylandWindowUpdateScale();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +167,7 @@ void waylandOutputBind(uint32_t name, uint32_t version)
|
|||||||
}
|
}
|
||||||
|
|
||||||
node->name = name;
|
node->name = name;
|
||||||
node->scale = waylandScaleFromInt(0);
|
node->scale = 0;
|
||||||
node->version = version;
|
node->version = version;
|
||||||
node->output = wl_registry_bind(wlWm.registry, name,
|
node->output = wl_registry_bind(wlWm.registry, name,
|
||||||
&wl_output_interface, version >= 3 ? 3 : 2);
|
&wl_output_interface, version >= 3 ? 3 : 2);
|
||||||
@@ -209,12 +209,12 @@ void waylandOutputTryUnbind(uint32_t name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct WaylandScale waylandOutputGetScale(struct wl_output * output)
|
wl_fixed_t waylandOutputGetScale(struct wl_output * output)
|
||||||
{
|
{
|
||||||
struct WaylandOutput * node;
|
struct WaylandOutput * node;
|
||||||
|
|
||||||
wl_list_for_each(node, &wlWm.outputs, link)
|
wl_list_for_each(node, &wlWm.outputs, link)
|
||||||
if (node->output == output)
|
if (node->output == output)
|
||||||
return node->scale;
|
return node->scale;
|
||||||
return waylandScaleFromInt(0);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -60,15 +60,6 @@ wayland_generate(
|
|||||||
wayland_generate(
|
wayland_generate(
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/staging/xdg-activation/xdg-activation-v1.xml"
|
"${WAYLAND_PROTOCOLS_BASE}/staging/xdg-activation/xdg-activation-v1.xml"
|
||||||
"${CMAKE_BINARY_DIR}/wayland/wayland-xdg-activation-v1-client-protocol")
|
"${CMAKE_BINARY_DIR}/wayland/wayland-xdg-activation-v1-client-protocol")
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/staging/fractional-scale/fractional-scale-v1.xml"
|
|
||||||
"${CMAKE_BINARY_DIR}/wayland/wayland-fractional-scale-v1-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/staging/content-type/content-type-v1.xml"
|
|
||||||
"${CMAKE_BINARY_DIR}/wayland/wayland-content-type-v1-client-protocol")
|
|
||||||
wayland_generate(
|
|
||||||
"${WAYLAND_PROTOCOLS_BASE}/staging/color-management/color-management-v1.xml"
|
|
||||||
"${CMAKE_BINARY_DIR}/wayland/wayland-color-management-v1-client-protocol")
|
|
||||||
|
|
||||||
target_link_libraries(wayland_protocol
|
target_link_libraries(wayland_protocol
|
||||||
PkgConfig::WAYLAND
|
PkgConfig::WAYLAND
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -46,9 +46,6 @@ static void registryGlobalHandler(void * data, struct wl_registry * registry,
|
|||||||
else if (!strcmp(interface, wp_viewporter_interface.name))
|
else if (!strcmp(interface, wp_viewporter_interface.name))
|
||||||
wlWm.viewporter = wl_registry_bind(wlWm.registry, name,
|
wlWm.viewporter = wl_registry_bind(wlWm.registry, name,
|
||||||
&wp_viewporter_interface, 1);
|
&wp_viewporter_interface, 1);
|
||||||
else if (!strcmp(interface, wp_fractional_scale_manager_v1_interface.name))
|
|
||||||
wlWm.fractionalScaleManager = wl_registry_bind(wlWm.registry, name,
|
|
||||||
&wp_fractional_scale_manager_v1_interface, 1);
|
|
||||||
else if (!strcmp(interface, zwp_relative_pointer_manager_v1_interface.name))
|
else if (!strcmp(interface, zwp_relative_pointer_manager_v1_interface.name))
|
||||||
wlWm.relativePointerManager = wl_registry_bind(wlWm.registry, name,
|
wlWm.relativePointerManager = wl_registry_bind(wlWm.registry, name,
|
||||||
&zwp_relative_pointer_manager_v1_interface, 1);
|
&zwp_relative_pointer_manager_v1_interface, 1);
|
||||||
@@ -71,12 +68,6 @@ static void registryGlobalHandler(void * data, struct wl_registry * registry,
|
|||||||
else if (!strcmp(interface, xdg_activation_v1_interface.name))
|
else if (!strcmp(interface, xdg_activation_v1_interface.name))
|
||||||
wlWm.xdgActivation = wl_registry_bind(wlWm.registry, name,
|
wlWm.xdgActivation = wl_registry_bind(wlWm.registry, name,
|
||||||
&xdg_activation_v1_interface, 1);
|
&xdg_activation_v1_interface, 1);
|
||||||
else if (!strcmp(interface, wp_content_type_manager_v1_interface.name))
|
|
||||||
wlWm.contentTypeManager = wl_registry_bind(wlWm.registry, name,
|
|
||||||
&wp_content_type_manager_v1_interface, 1);
|
|
||||||
else if (!strcmp(interface, wp_color_manager_v1_interface.name))
|
|
||||||
wlWm.colorManager = wl_registry_bind(wlWm.registry, name,
|
|
||||||
&wp_color_manager_v1_interface, 1);
|
|
||||||
else if (wlWm.desktop->registryGlobalHandler(
|
else if (wlWm.desktop->registryGlobalHandler(
|
||||||
data, registry, name, interface, version))
|
data, registry, name, interface, version))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
/**
|
|
||||||
* Looking Glass
|
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
|
||||||
* https://looking-glass.io
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License as published by the Free
|
|
||||||
* Software Foundation; either version 2 of the License, or (at your option)
|
|
||||||
* any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
* more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along
|
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc., 59
|
|
||||||
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
struct WaylandScale
|
|
||||||
{
|
|
||||||
int32_t num;
|
|
||||||
int32_t den;
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline struct WaylandScale waylandScaleFromInt(int32_t scale)
|
|
||||||
{
|
|
||||||
return (struct WaylandScale) { scale, 1 };
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct WaylandScale waylandScaleFromRatio(int32_t num, int32_t den)
|
|
||||||
{
|
|
||||||
return (struct WaylandScale) { num, den };
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool waylandScaleValid(struct WaylandScale scale)
|
|
||||||
{
|
|
||||||
return scale.num > 0 && scale.den > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool waylandScaleEqual(struct WaylandScale a, struct WaylandScale b)
|
|
||||||
{
|
|
||||||
return (int64_t)a.num * b.den == (int64_t)b.num * a.den;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int waylandScaleCmp(struct WaylandScale a, struct WaylandScale b)
|
|
||||||
{
|
|
||||||
int64_t lhs = (int64_t)a.num * b.den;
|
|
||||||
int64_t rhs = (int64_t)b.num * a.den;
|
|
||||||
|
|
||||||
return (lhs > rhs) - (lhs < rhs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool waylandScaleIsFractional(struct WaylandScale scale)
|
|
||||||
{
|
|
||||||
return waylandScaleValid(scale) && scale.num % scale.den != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int waylandScaleFloor(struct WaylandScale scale)
|
|
||||||
{
|
|
||||||
return scale.num / scale.den;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int waylandScaleCeil(struct WaylandScale scale)
|
|
||||||
{
|
|
||||||
return (scale.num + scale.den - 1) / scale.den;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int waylandScaleMulInt(struct WaylandScale scale, int value)
|
|
||||||
{
|
|
||||||
return (int)(((int64_t)value * scale.num + scale.den / 2) / scale.den);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline double waylandScaleToDouble(struct WaylandScale scale)
|
|
||||||
{
|
|
||||||
return (double)scale.num / (double)scale.den;
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -28,7 +28,6 @@
|
|||||||
|
|
||||||
#include "common/debug.h"
|
#include "common/debug.h"
|
||||||
#include "common/option.h"
|
#include "common/option.h"
|
||||||
#include "interface/renderer.h"
|
|
||||||
|
|
||||||
#include "dynamic/wayland_desktops.h"
|
#include "dynamic/wayland_desktops.h"
|
||||||
|
|
||||||
@@ -144,9 +143,6 @@ static bool waylandInit(const LG_DSInitParams params)
|
|||||||
if (!waylandRegistryInit())
|
if (!waylandRegistryInit())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!waylandColorMgmtInit())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!waylandActivationInit())
|
if (!waylandActivationInit())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -193,7 +189,6 @@ static void waylandFree(void)
|
|||||||
waylandPresentationFree();
|
waylandPresentationFree();
|
||||||
waylandInputFree();
|
waylandInputFree();
|
||||||
waylandOutputFree();
|
waylandOutputFree();
|
||||||
waylandColorMgmtFree();
|
|
||||||
waylandRegistryFree();
|
waylandRegistryFree();
|
||||||
waylandCursorFree();
|
waylandCursorFree();
|
||||||
wl_display_disconnect(wlWm.display);
|
wl_display_disconnect(wlWm.display);
|
||||||
@@ -207,12 +202,6 @@ static bool waylandGetProp(LG_DSProperty prop, void * ret)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prop == LG_DS_NATIVE_HDR)
|
|
||||||
{
|
|
||||||
*(bool *)ret = wlWm.cmCanDoHDR;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,22 +227,6 @@ static void waylandMinimize(void)
|
|||||||
wlWm.desktop->minimize();
|
wlWm.desktop->minimize();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool waylandHDRCallback(const void * rendererFormat)
|
|
||||||
{
|
|
||||||
if (!wlWm.colorManager)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
const LG_RendererFormat * format = (const LG_RendererFormat *)rendererFormat;
|
|
||||||
if (format->hdr)
|
|
||||||
return waylandRequestHDR(format->hdrDisplayPrimary, format->hdrWhitePoint,
|
|
||||||
format->hdrMaxDisplayLuminance, format->hdrMinDisplayLuminance,
|
|
||||||
format->hdrMaxContentLightLevel, format->hdrMaxFrameAverageLightLevel,
|
|
||||||
format->hdrPQ);
|
|
||||||
else
|
|
||||||
waylandRequestClearHDR();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LG_DisplayServerOps LGDS_Wayland =
|
struct LG_DisplayServerOps LGDS_Wayland =
|
||||||
{
|
{
|
||||||
.name = "Wayland",
|
.name = "Wayland",
|
||||||
@@ -303,8 +276,6 @@ struct LG_DisplayServerOps LGDS_Wayland =
|
|||||||
.getFullscreen = waylandGetFullscreen,
|
.getFullscreen = waylandGetFullscreen,
|
||||||
.minimize = waylandMinimize,
|
.minimize = waylandMinimize,
|
||||||
|
|
||||||
.setHDRImageDescription = waylandHDRCallback,
|
|
||||||
|
|
||||||
.cbInit = waylandCBInit,
|
.cbInit = waylandCBInit,
|
||||||
.cbNotice = waylandCBNotice,
|
.cbNotice = waylandCBNotice,
|
||||||
.cbRelease = waylandCBRelease,
|
.cbRelease = waylandCBRelease,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -47,11 +47,6 @@
|
|||||||
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
#include "wayland-idle-inhibit-unstable-v1-client-protocol.h"
|
||||||
#include "wayland-xdg-output-unstable-v1-client-protocol.h"
|
#include "wayland-xdg-output-unstable-v1-client-protocol.h"
|
||||||
#include "wayland-xdg-activation-v1-client-protocol.h"
|
#include "wayland-xdg-activation-v1-client-protocol.h"
|
||||||
#include "wayland-fractional-scale-v1-client-protocol.h"
|
|
||||||
#include "wayland-content-type-v1-client-protocol.h"
|
|
||||||
#include "wayland-color-management-v1-client-protocol.h"
|
|
||||||
|
|
||||||
#include "scale.h"
|
|
||||||
|
|
||||||
typedef void (*WaylandPollCallback)(uint32_t events, void * opaque);
|
typedef void (*WaylandPollCallback)(uint32_t events, void * opaque);
|
||||||
|
|
||||||
@@ -67,7 +62,7 @@ struct WaylandPoll
|
|||||||
struct WaylandOutput
|
struct WaylandOutput
|
||||||
{
|
{
|
||||||
uint32_t name;
|
uint32_t name;
|
||||||
struct WaylandScale scale;
|
wl_fixed_t scale;
|
||||||
int32_t scaleInt;
|
int32_t scaleInt;
|
||||||
int32_t logicalWidth;
|
int32_t logicalWidth;
|
||||||
int32_t logicalHeight;
|
int32_t logicalHeight;
|
||||||
@@ -86,6 +81,13 @@ struct SurfaceOutput
|
|||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum EGLSwapWithDamageState {
|
||||||
|
SWAP_WITH_DAMAGE_UNKNOWN,
|
||||||
|
SWAP_WITH_DAMAGE_UNSUPPORTED,
|
||||||
|
SWAP_WITH_DAMAGE_KHR,
|
||||||
|
SWAP_WITH_DAMAGE_EXT,
|
||||||
|
};
|
||||||
|
|
||||||
struct xkb_context;
|
struct xkb_context;
|
||||||
struct xkb_keymap;
|
struct xkb_keymap;
|
||||||
struct xkb_state;
|
struct xkb_state;
|
||||||
@@ -106,13 +108,12 @@ struct WaylandDSState
|
|||||||
struct wl_shm * shm;
|
struct wl_shm * shm;
|
||||||
struct wl_compositor * compositor;
|
struct wl_compositor * compositor;
|
||||||
|
|
||||||
struct WaylandScale scale;
|
wl_fixed_t scale;
|
||||||
bool fractionalScale;
|
bool fractionalScale;
|
||||||
bool needsResize;
|
bool needsResize;
|
||||||
bool configured;
|
bool configured;
|
||||||
bool warpSupport;
|
bool warpSupport;
|
||||||
double cursorX, cursorY;
|
double cursorX, cursorY;
|
||||||
double scrollState;
|
|
||||||
|
|
||||||
#if defined(ENABLE_EGL) || defined(ENABLE_OPENGL)
|
#if defined(ENABLE_EGL) || defined(ENABLE_OPENGL)
|
||||||
struct wl_egl_window * eglWindow;
|
struct wl_egl_window * eglWindow;
|
||||||
@@ -121,8 +122,7 @@ struct WaylandDSState
|
|||||||
|
|
||||||
#ifdef ENABLE_OPENGL
|
#ifdef ENABLE_OPENGL
|
||||||
EGLDisplay glDisplay;
|
EGLDisplay glDisplay;
|
||||||
EGLConfig glConfig; // primary config (best bit depth probed)
|
EGLConfig glConfig;
|
||||||
EGLConfig glConfigSDR; // fallback 8-bit SDR config
|
|
||||||
EGLSurface glSurface;
|
EGLSurface glSurface;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -172,52 +172,11 @@ struct WaylandDSState
|
|||||||
|
|
||||||
struct wp_viewporter * viewporter;
|
struct wp_viewporter * viewporter;
|
||||||
struct wp_viewport * viewport;
|
struct wp_viewport * viewport;
|
||||||
struct wp_fractional_scale_manager_v1 * fractionalScaleManager;
|
|
||||||
struct wp_fractional_scale_v1 * fractionalScaleInterface;
|
|
||||||
struct zxdg_output_manager_v1 * xdgOutputManager;
|
struct zxdg_output_manager_v1 * xdgOutputManager;
|
||||||
struct wl_list outputs; // WaylandOutput::link
|
struct wl_list outputs; // WaylandOutput::link
|
||||||
struct wl_list surfaceOutputs; // SurfaceOutput::link
|
struct wl_list surfaceOutputs; // SurfaceOutput::link
|
||||||
bool useFractionalScale;
|
bool useFractionalScale;
|
||||||
|
|
||||||
struct wp_content_type_manager_v1 * contentTypeManager;
|
|
||||||
struct wp_content_type_v1 * contentType;
|
|
||||||
|
|
||||||
// Color management (HDR)
|
|
||||||
struct wp_color_manager_v1 * colorManager;
|
|
||||||
struct wp_color_management_surface_v1 * colorSurface;
|
|
||||||
struct wp_image_description_v1 * hdrImageDesc;
|
|
||||||
struct wp_image_description_creator_params_v1 * hdrImageCreator;
|
|
||||||
|
|
||||||
// Set to true when an HDR image description is active on the surface
|
|
||||||
bool hdrActive;
|
|
||||||
|
|
||||||
// wp_color_manager_v1 feature advertisement tracking.
|
|
||||||
// Set to true after the done event for the color-manager has been received
|
|
||||||
// and all compositor capabilities have been recorded.
|
|
||||||
bool cmFeaturesDone;
|
|
||||||
bool cmHasParametric;
|
|
||||||
bool cmHasLuminances;
|
|
||||||
bool cmHasMasteringPrimaries;
|
|
||||||
bool cmHasTFSt2084PQ;
|
|
||||||
bool cmHasTFExtLinear;
|
|
||||||
bool cmHasPrimariesBT2020;
|
|
||||||
bool cmHasPrimariesSRGB;
|
|
||||||
bool cmHasPerceptualIntent;
|
|
||||||
bool cmCanDoHDR; // true if compositor supports features needed for HDR
|
|
||||||
|
|
||||||
// Pending HDR format to apply (set by frame thread, applied in swap buffers).
|
|
||||||
// pendingHDRApply and pendingHDRClear are accessed from multiple threads
|
|
||||||
// without a lock, so they must be atomic.
|
|
||||||
_Atomic(bool) pendingHDRApply;
|
|
||||||
_Atomic(bool) pendingHDRClear;
|
|
||||||
bool pendingHDRPQ;
|
|
||||||
uint16_t pendingHDRDisplayPrimary[3][2];
|
|
||||||
uint16_t pendingHDRWhitePoint[2];
|
|
||||||
uint32_t pendingHDRMaxDisplayLuminance;
|
|
||||||
uint32_t pendingHDRMinDisplayLuminance;
|
|
||||||
uint32_t pendingHDRMaxCLL;
|
|
||||||
uint32_t pendingHDRMaxFALL;
|
|
||||||
|
|
||||||
LGEvent * frameEvent;
|
LGEvent * frameEvent;
|
||||||
|
|
||||||
struct wl_list poll; // WaylandPoll::link
|
struct wl_list poll; // WaylandPoll::link
|
||||||
@@ -300,24 +259,6 @@ void waylandGLSetSwapInterval(int interval);
|
|||||||
void waylandGLSwapBuffers(void);
|
void waylandGLSwapBuffers(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// HDR color management (Wayland color-management-v1)
|
|
||||||
bool waylandColorMgmtInit(void);
|
|
||||||
void waylandColorMgmtFree(void);
|
|
||||||
void waylandSetHDRImageDescription(const uint16_t displayPrimary[3][2],
|
|
||||||
const uint16_t whitePoint[2], uint32_t maxDisplayLuminance,
|
|
||||||
uint32_t minDisplayLuminance, uint32_t maxCLL, uint32_t maxFALL,
|
|
||||||
bool hdrPQ);
|
|
||||||
void waylandClearHDRImageDescription(void);
|
|
||||||
|
|
||||||
// Queue HDR change from any thread (applied in waylandEGLSwapBuffers).
|
|
||||||
// Returns true if the request was queued, false if HDR is not available
|
|
||||||
// (no color manager, missing features, or unsupported TF/primaries).
|
|
||||||
bool waylandRequestHDR(const uint16_t displayPrimary[3][2],
|
|
||||||
const uint16_t whitePoint[2], uint32_t maxDisplayLuminance,
|
|
||||||
uint32_t minDisplayLuminance, uint32_t maxCLL, uint32_t maxFALL,
|
|
||||||
bool hdrPQ);
|
|
||||||
void waylandRequestClearHDR(void);
|
|
||||||
|
|
||||||
// idle module
|
// idle module
|
||||||
bool waylandIdleInit(void);
|
bool waylandIdleInit(void);
|
||||||
void waylandIdleFree(void);
|
void waylandIdleFree(void);
|
||||||
@@ -343,7 +284,7 @@ bool waylandOutputInit(void);
|
|||||||
void waylandOutputFree(void);
|
void waylandOutputFree(void);
|
||||||
void waylandOutputBind(uint32_t name, uint32_t version);
|
void waylandOutputBind(uint32_t name, uint32_t version);
|
||||||
void waylandOutputTryUnbind(uint32_t name);
|
void waylandOutputTryUnbind(uint32_t name);
|
||||||
struct WaylandScale waylandOutputGetScale(struct wl_output * output);
|
wl_fixed_t waylandOutputGetScale(struct wl_output * output);
|
||||||
|
|
||||||
// poll module
|
// poll module
|
||||||
bool waylandPollInit(void);
|
bool waylandPollInit(void);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -31,37 +31,27 @@
|
|||||||
|
|
||||||
// Surface-handling listeners.
|
// Surface-handling listeners.
|
||||||
|
|
||||||
static void setScale(struct WaylandScale newScale)
|
|
||||||
{
|
|
||||||
wlWm.scale = newScale;
|
|
||||||
wlWm.fractionalScale = waylandScaleIsFractional(newScale);
|
|
||||||
wlWm.needsResize = true;
|
|
||||||
|
|
||||||
if (wlWm.desktop->configured())
|
|
||||||
{
|
|
||||||
waylandCursorScaleChange();
|
|
||||||
app_invalidateWindow(true);
|
|
||||||
waylandStopWaitFrame();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void waylandWindowUpdateScale(void)
|
void waylandWindowUpdateScale(void)
|
||||||
{
|
{
|
||||||
if (wlWm.fractionalScaleInterface)
|
wl_fixed_t maxScale = 0;
|
||||||
return;
|
|
||||||
|
|
||||||
struct WaylandScale maxScale = waylandScaleFromInt(0);
|
|
||||||
struct SurfaceOutput * node;
|
struct SurfaceOutput * node;
|
||||||
|
|
||||||
wl_list_for_each(node, &wlWm.surfaceOutputs, link)
|
wl_list_for_each(node, &wlWm.surfaceOutputs, link)
|
||||||
{
|
{
|
||||||
struct WaylandScale scale = waylandOutputGetScale(node->output);
|
wl_fixed_t scale = waylandOutputGetScale(node->output);
|
||||||
if (waylandScaleCmp(scale, maxScale) > 0)
|
if (scale > maxScale)
|
||||||
maxScale = scale;
|
maxScale = scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (waylandScaleValid(maxScale))
|
if (maxScale)
|
||||||
setScale(maxScale);
|
{
|
||||||
|
wlWm.scale = maxScale;
|
||||||
|
wlWm.fractionalScale = wl_fixed_from_int(wl_fixed_to_int(maxScale)) != maxScale;
|
||||||
|
wlWm.needsResize = true;
|
||||||
|
waylandCursorScaleChange();
|
||||||
|
app_invalidateWindow(true);
|
||||||
|
waylandStopWaitFrame();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wlSurfaceEnterHandler(void * data, struct wl_surface * surface, struct wl_output * output)
|
static void wlSurfaceEnterHandler(void * data, struct wl_surface * surface, struct wl_output * output)
|
||||||
@@ -95,19 +85,9 @@ static const struct wl_surface_listener wlSurfaceListener = {
|
|||||||
.leave = wlSurfaceLeaveHandler,
|
.leave = wlSurfaceLeaveHandler,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void fractionalScalePreferredScale(void * data,
|
|
||||||
struct wp_fractional_scale_v1 * fractionalScale, uint32_t scale)
|
|
||||||
{
|
|
||||||
setScale(waylandScaleFromRatio(scale, 120));
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct wp_fractional_scale_v1_listener fractionalScaleListener = {
|
|
||||||
.preferred_scale = fractionalScalePreferredScale,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool waylandWindowInit(const char * title, const char * appId, bool fullscreen, bool maximize, bool borderless, bool resizable)
|
bool waylandWindowInit(const char * title, const char * appId, bool fullscreen, bool maximize, bool borderless, bool resizable)
|
||||||
{
|
{
|
||||||
wlWm.scale = waylandScaleFromInt(1);
|
wlWm.scale = wl_fixed_from_int(1);
|
||||||
|
|
||||||
wlWm.frameEvent = lgCreateEvent(true, 0);
|
wlWm.frameEvent = lgCreateEvent(true, 0);
|
||||||
if (!wlWm.frameEvent)
|
if (!wlWm.frameEvent)
|
||||||
@@ -130,23 +110,8 @@ bool waylandWindowInit(const char * title, const char * appId, bool fullscreen,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wlWm.fractionalScaleManager)
|
|
||||||
{
|
|
||||||
wlWm.fractionalScaleInterface = wp_fractional_scale_manager_v1_get_fractional_scale(
|
|
||||||
wlWm.fractionalScaleManager, wlWm.surface);
|
|
||||||
wp_fractional_scale_v1_add_listener(wlWm.fractionalScaleInterface,
|
|
||||||
&fractionalScaleListener, NULL);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
wl_surface_add_listener(wlWm.surface, &wlSurfaceListener, NULL);
|
wl_surface_add_listener(wlWm.surface, &wlSurfaceListener, NULL);
|
||||||
|
|
||||||
if (wlWm.contentTypeManager)
|
|
||||||
{
|
|
||||||
wlWm.contentType = wp_content_type_manager_v1_get_surface_content_type(
|
|
||||||
wlWm.contentTypeManager, wlWm.surface);
|
|
||||||
wp_content_type_v1_set_content_type(wlWm.contentType, WP_CONTENT_TYPE_V1_TYPE_GAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!wlWm.desktop->shellInit(wlWm.display, wlWm.surface,
|
if (!wlWm.desktop->shellInit(wlWm.display, wlWm.surface,
|
||||||
title, appId, fullscreen, maximize, borderless, resizable))
|
title, appId, fullscreen, maximize, borderless, resizable))
|
||||||
return false;
|
return false;
|
||||||
@@ -157,10 +122,6 @@ bool waylandWindowInit(const char * title, const char * appId, bool fullscreen,
|
|||||||
|
|
||||||
void waylandWindowFree(void)
|
void waylandWindowFree(void)
|
||||||
{
|
{
|
||||||
if (wlWm.fractionalScaleInterface)
|
|
||||||
wp_fractional_scale_v1_destroy(wlWm.fractionalScaleInterface);
|
|
||||||
if (wlWm.contentType)
|
|
||||||
wp_content_type_v1_destroy(wlWm.contentType);
|
|
||||||
wl_surface_destroy(wlWm.surface);
|
wl_surface_destroy(wlWm.surface);
|
||||||
lgFreeEvent(wlWm.frameEvent);
|
lgFreeEvent(wlWm.frameEvent);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -72,13 +72,6 @@ void app_setFullscreen(bool fs);
|
|||||||
bool app_getFullscreen(void);
|
bool app_getFullscreen(void);
|
||||||
bool app_getProp(LG_DSProperty prop, void * ret);
|
bool app_getProp(LG_DSProperty prop, void * ret);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the last call to setHDRImageDescription() failed.
|
|
||||||
* When this returns true, the renderer should fall back to software
|
|
||||||
* tone-mapping even on a compositor that reports LG_DS_NATIVE_HDR.
|
|
||||||
*/
|
|
||||||
bool app_getHDRDescFailed(void);
|
|
||||||
|
|
||||||
#ifdef ENABLE_EGL
|
#ifdef ENABLE_EGL
|
||||||
EGLDisplay app_getEGLDisplay(void);
|
EGLDisplay app_getEGLDisplay(void);
|
||||||
EGLNativeWindowType app_getEGLNativeWindow(void);
|
EGLNativeWindowType app_getEGLNativeWindow(void);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -53,14 +53,6 @@ typedef enum LG_DSProperty
|
|||||||
* return data type: bool
|
* return data type: bool
|
||||||
*/
|
*/
|
||||||
LG_DS_WARP_SUPPORT,
|
LG_DS_WARP_SUPPORT,
|
||||||
|
|
||||||
/**
|
|
||||||
* returns true if the display server supports native HDR via
|
|
||||||
* setHDRImageDescription (i.e., the compositor actually has the
|
|
||||||
* required color-management features to process HDR content).
|
|
||||||
* return data type: bool
|
|
||||||
*/
|
|
||||||
LG_DS_NATIVE_HDR,
|
|
||||||
}
|
}
|
||||||
LG_DSProperty;
|
LG_DSProperty;
|
||||||
|
|
||||||
@@ -221,13 +213,6 @@ struct LG_DisplayServerOps
|
|||||||
void (*setFullscreen)(bool fs);
|
void (*setFullscreen)(bool fs);
|
||||||
void (*minimize)(void);
|
void (*minimize)(void);
|
||||||
|
|
||||||
/* HDR color management - set display image description.
|
|
||||||
* Optional, if not supported set to NULL.
|
|
||||||
* Returns true on success, false if the description could not be applied
|
|
||||||
* (e.g., compositor doesn't support the required transfer function or
|
|
||||||
* primaries, or the image description creation failed). */
|
|
||||||
bool (*setHDRImageDescription)(const void * rendererFormat);
|
|
||||||
|
|
||||||
/* clipboard support, optional, if not supported set to NULL */
|
/* clipboard support, optional, if not supported set to NULL */
|
||||||
bool (*cbInit)(void);
|
bool (*cbInit)(void);
|
||||||
void (*cbNotice)(LG_ClipboardData type);
|
void (*cbNotice)(LG_ClipboardData type);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -84,14 +84,6 @@ typedef struct LG_RendererFormat
|
|||||||
unsigned int pitch; // scanline bytes (or compressed size)
|
unsigned int pitch; // scanline bytes (or compressed size)
|
||||||
unsigned int bpp; // bits per pixel (zero if compressed)
|
unsigned int bpp; // bits per pixel (zero if compressed)
|
||||||
LG_RendererRotate rotate; // guest rotation
|
LG_RendererRotate rotate; // guest rotation
|
||||||
|
|
||||||
// HDR static metadata (from KVMFRFrame, valid when hdr is true)
|
|
||||||
uint16_t hdrDisplayPrimary[3][2];
|
|
||||||
uint16_t hdrWhitePoint[2];
|
|
||||||
uint32_t hdrMaxDisplayLuminance;
|
|
||||||
uint32_t hdrMinDisplayLuminance;
|
|
||||||
uint32_t hdrMaxContentLightLevel;
|
|
||||||
uint32_t hdrMaxFrameAverageLightLevel;
|
|
||||||
}
|
}
|
||||||
LG_RendererFormat;
|
LG_RendererFormat;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -91,7 +91,6 @@ struct EGL_Desktop
|
|||||||
|
|
||||||
// map HDR content to SDR
|
// map HDR content to SDR
|
||||||
bool mapHDRtoSDR;
|
bool mapHDRtoSDR;
|
||||||
bool nativeHDR;
|
|
||||||
int peakLuminance;
|
int peakLuminance;
|
||||||
int maxCLL;
|
int maxCLL;
|
||||||
|
|
||||||
@@ -549,7 +548,7 @@ bool egl_desktopRender(EGL_Desktop * desktop, unsigned int outputWidth,
|
|||||||
{
|
{
|
||||||
.type = EGL_UNIFORM_TYPE_1I,
|
.type = EGL_UNIFORM_TYPE_1I,
|
||||||
.location = shader->uCBMode,
|
.location = shader->uCBMode,
|
||||||
.i = { desktop->cbMode }
|
.f = { desktop->cbMode }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.type = EGL_UNIFORM_TYPE_1I,
|
.type = EGL_UNIFORM_TYPE_1I,
|
||||||
@@ -559,7 +558,7 @@ bool egl_desktopRender(EGL_Desktop * desktop, unsigned int outputWidth,
|
|||||||
{
|
{
|
||||||
.type = EGL_UNIFORM_TYPE_1I,
|
.type = EGL_UNIFORM_TYPE_1I,
|
||||||
.location = shader->uMapHDRtoSDR,
|
.location = shader->uMapHDRtoSDR,
|
||||||
.i = { desktop->mapHDRtoSDR && !desktop->nativeHDR }
|
.i = { desktop->mapHDRtoSDR }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.type = EGL_UNIFORM_TYPE_1F,
|
.type = EGL_UNIFORM_TYPE_1F,
|
||||||
@@ -569,7 +568,7 @@ bool egl_desktopRender(EGL_Desktop * desktop, unsigned int outputWidth,
|
|||||||
{
|
{
|
||||||
.type = EGL_UNIFORM_TYPE_1I,
|
.type = EGL_UNIFORM_TYPE_1I,
|
||||||
.location = shader->uMapHDRPQ,
|
.location = shader->uMapHDRPQ,
|
||||||
.i = { desktop->hdrPQ }
|
.f = { desktop->hdrPQ }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -580,11 +579,6 @@ bool egl_desktopRender(EGL_Desktop * desktop, unsigned int outputWidth,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void egl_desktopSetNativeHDR(EGL_Desktop * desktop, bool nativeHDR)
|
|
||||||
{
|
|
||||||
desktop->nativeHDR = nativeHDR;
|
|
||||||
}
|
|
||||||
|
|
||||||
void egl_desktopSpiceConfigure(EGL_Desktop * desktop, int width, int height)
|
void egl_desktopSpiceConfigure(EGL_Desktop * desktop, int width, int height)
|
||||||
{
|
{
|
||||||
if (!desktop->spiceTexture)
|
if (!desktop->spiceTexture)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -42,7 +42,6 @@ bool egl_desktopInit(EGL * egl, EGL_Desktop ** desktop, EGLDisplay * display,
|
|||||||
void egl_desktopFree(EGL_Desktop ** desktop);
|
void egl_desktopFree(EGL_Desktop ** desktop);
|
||||||
|
|
||||||
void egl_desktopConfigUI(EGL_Desktop * desktop);
|
void egl_desktopConfigUI(EGL_Desktop * desktop);
|
||||||
void egl_desktopSetNativeHDR(EGL_Desktop * desktop, bool nativeHDR);
|
|
||||||
bool egl_desktopSetup (EGL_Desktop * desktop, const LG_RendererFormat format);
|
bool egl_desktopSetup (EGL_Desktop * desktop, const LG_RendererFormat format);
|
||||||
bool egl_desktopUpdate(EGL_Desktop * desktop, const FrameBuffer * frame, int dmaFd,
|
bool egl_desktopUpdate(EGL_Desktop * desktop, const FrameBuffer * frame, int dmaFd,
|
||||||
const FrameDamageRect * damageRects, int damageRectsCount);
|
const FrameDamageRect * damageRects, int damageRectsCount);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -121,9 +121,6 @@ struct Inst
|
|||||||
|
|
||||||
bool showSpice;
|
bool showSpice;
|
||||||
int spiceWidth, spiceHeight;
|
int spiceWidth, spiceHeight;
|
||||||
|
|
||||||
bool configSupportsHDR; // true if we probed FP16 or 10-bit EGL config
|
|
||||||
bool hdr; // true if current frame format is HDR
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct Option egl_options[] =
|
static struct Option egl_options[] =
|
||||||
@@ -610,26 +607,6 @@ static bool egl_onFrameFormat(LG_Renderer * renderer, const LG_RendererFormat fo
|
|||||||
egl_cursorSetScale(this->cursor, scale);
|
egl_cursorSetScale(this->cursor, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Track HDR state and warn if HDR frames arrive without any HDR path
|
|
||||||
this->hdr = format.hdr;
|
|
||||||
if (format.hdr)
|
|
||||||
{
|
|
||||||
bool nativeHDR = false;
|
|
||||||
app_getProp(LG_DS_NATIVE_HDR, &nativeHDR);
|
|
||||||
if (!this->configSupportsHDR && !nativeHDR)
|
|
||||||
DEBUG_WARN("HDR frames being displayed on an 8-bit EGL surface "
|
|
||||||
"without a color-managed compositor; tones may be incorrect");
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the display server supports native HDR (via setHDRImageDescription),
|
|
||||||
// disable software tone-mapping to avoid double tone-mapping.
|
|
||||||
// However, if the last call to setHDRImageDescription actually failed
|
|
||||||
// (e.g., compositor missing required primaries), keep tone-mapping on.
|
|
||||||
bool nativeHDR = false;
|
|
||||||
app_getProp(LG_DS_NATIVE_HDR, &nativeHDR);
|
|
||||||
egl_desktopSetNativeHDR(this->desktop,
|
|
||||||
format.hdr && nativeHDR && !app_getHDRDescFailed());
|
|
||||||
|
|
||||||
egl_update_scale_type(this);
|
egl_update_scale_type(this);
|
||||||
egl_damageSetup(this->damage, format.frameWidth, format.frameHeight);
|
egl_damageSetup(this->damage, format.frameWidth, format.frameHeight);
|
||||||
|
|
||||||
@@ -797,51 +774,22 @@ static bool egl_renderStartup(LG_Renderer * renderer, bool useDMA)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Probe for best available color depth: FP16 → 10-bit → 8-bit
|
|
||||||
static const struct { EGLint r, g, b, a, depth; const char * desc; } configs[] =
|
|
||||||
{
|
|
||||||
{ 16, 16, 16, 0, 48, "FP16 (RGBA16F)" },
|
|
||||||
{ 10, 10, 10, 2, 32, "10-bit (RGBA10)" },
|
|
||||||
{ 8, 8, 8, 0, 24, "8-bit (RGBA8)" },
|
|
||||||
};
|
|
||||||
EGLint num_config;
|
|
||||||
const char * configDesc = NULL;
|
|
||||||
int chosen = -1;
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)(sizeof(configs) / sizeof(configs[0])); ++i)
|
|
||||||
{
|
|
||||||
EGLint attr[] =
|
EGLint attr[] =
|
||||||
{
|
{
|
||||||
EGL_RED_SIZE , configs[i].r,
|
EGL_BUFFER_SIZE , 30,
|
||||||
EGL_GREEN_SIZE , configs[i].g,
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||||
EGL_BLUE_SIZE , configs[i].b,
|
|
||||||
EGL_ALPHA_SIZE , configs[i].a,
|
|
||||||
EGL_BUFFER_SIZE , configs[i].depth,
|
|
||||||
EGL_RENDERABLE_TYPE , EGL_OPENGL_ES2_BIT,
|
|
||||||
EGL_SAMPLE_BUFFERS , maxSamples > 0 ? 1 : 0,
|
EGL_SAMPLE_BUFFERS , maxSamples > 0 ? 1 : 0,
|
||||||
EGL_SAMPLES , maxSamples,
|
EGL_SAMPLES , maxSamples,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
if (eglChooseConfig(this->display, attr, &this->configs, 1, &num_config) &&
|
EGLint num_config;
|
||||||
num_config > 0)
|
if (!eglChooseConfig(this->display, attr, &this->configs, 1, &num_config))
|
||||||
{
|
{
|
||||||
configDesc = configs[i].desc;
|
DEBUG_ERROR("Failed to choose config (eglError: 0x%x)", eglGetError());
|
||||||
chosen = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chosen < 0)
|
|
||||||
{
|
|
||||||
DEBUG_ERROR("Failed to choose any EGL config");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->configSupportsHDR = chosen <= 1; // FP16 or 10-bit
|
|
||||||
DEBUG_INFO("EGL config: %s%s", configDesc,
|
|
||||||
this->configSupportsHDR ? " (HDR capable)" : "");
|
|
||||||
|
|
||||||
const EGLint surfattr[] =
|
const EGLint surfattr[] =
|
||||||
{
|
{
|
||||||
EGL_RENDER_BUFFER, this->opt.doubleBuffer ? EGL_BACK_BUFFER : EGL_SINGLE_BUFFER,
|
EGL_RENDER_BUFFER, this->opt.doubleBuffer ? EGL_BACK_BUFFER : EGL_SINGLE_BUFFER,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -618,11 +618,6 @@ bool app_getProp(LG_DSProperty prop, void * ret)
|
|||||||
return g_state.ds->getProp(prop, ret);
|
return g_state.ds->getProp(prop, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_getHDRDescFailed(void)
|
|
||||||
{
|
|
||||||
return atomic_load(&g_state.hdrDescFailed);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef ENABLE_EGL
|
#ifdef ENABLE_EGL
|
||||||
EGLDisplay app_getEGLDisplay(void)
|
EGLDisplay app_getEGLDisplay(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -782,7 +782,7 @@ static void doLicense(void)
|
|||||||
// BEGIN LICENSE BLOCK
|
// BEGIN LICENSE BLOCK
|
||||||
"\n"
|
"\n"
|
||||||
"Looking Glass\n"
|
"Looking Glass\n"
|
||||||
"Copyright © 2017-2026 The Looking Glass Authors\n"
|
"Copyright © 2017-2025 The Looking Glass Authors\n"
|
||||||
"https://looking-glass.io\n"
|
"https://looking-glass.io\n"
|
||||||
"\n"
|
"\n"
|
||||||
"This program is free software; you can redistribute it and/or modify it under\n"
|
"This program is free software; you can redistribute it and/or modify it under\n"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
@@ -221,8 +221,8 @@ void core_updatePositionInfo(void)
|
|||||||
.type = LG_MSG_WINDOWSIZE,
|
.type = LG_MSG_WINDOWSIZE,
|
||||||
.windowSize =
|
.windowSize =
|
||||||
{
|
{
|
||||||
.width = round(g_state.windowW * g_state.windowScale),
|
.width = g_state.windowW,
|
||||||
.height = round(g_state.windowH * g_state.windowScale)
|
.height = g_state.windowH
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
lgMessage_post(&msg);
|
lgMessage_post(&msg);
|
||||||
@@ -554,7 +554,6 @@ void core_handleMouseNormal(double ex, double ey)
|
|||||||
{
|
{
|
||||||
/* wait for the move request to be processed */
|
/* wait for the move request to be processed */
|
||||||
g_cursor.realigning = true;
|
g_cursor.realigning = true;
|
||||||
unsigned timeout = 200;
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
LG_LOCK(g_state.pointerQueueLock);
|
LG_LOCK(g_state.pointerQueueLock);
|
||||||
@@ -578,14 +577,6 @@ void core_handleMouseNormal(double ex, double ey)
|
|||||||
if (hostSerial >= setPosSerial)
|
if (hostSerial >= setPosSerial)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (--timeout == 0)
|
|
||||||
{
|
|
||||||
DEBUG_ERROR(
|
|
||||||
"pointerQueue serial not updating, expected %u but stuck at %u",
|
|
||||||
setPosSerial, hostSerial);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_state.ds->wait(1);
|
g_state.ds->wait(1);
|
||||||
}
|
}
|
||||||
while(app_isRunning());
|
while(app_isRunning());
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
* Looking Glass
|
* Looking Glass
|
||||||
* Copyright © 2017-2026 The Looking Glass Authors
|
* Copyright © 2017-2025 The Looking Glass Authors
|
||||||
* https://looking-glass.io
|
* https://looking-glass.io
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user