Fix the remaining display size issues in GNOME, v2.6.0

This commit is contained in:
wheaney 2025-12-19 21:38:18 -08:00
parent 100ecac21b
commit ac53ff2298
4 changed files with 34 additions and 24 deletions

View File

@ -1 +1 @@
2.5.3 2.6.0

View File

@ -59,6 +59,9 @@ cp -r $VULKAN_DIR/config $PACKAGE_DIR
# build XR driver # build XR driver
XR_DRIVER_BINARY=$XR_DRIVER_DIR/out/xrDriver-$ARCH.tar.gz XR_DRIVER_BINARY=$XR_DRIVER_DIR/out/xrDriver-$ARCH.tar.gz
if [ -n "$STEAMOS" ]; then
XR_DRIVER_BINARY=$XR_DRIVER_DIR/out/xrDriver-$ARCH.steamos.tar.gz
fi
if [ ! -e "$XR_DRIVER_BINARY" ] || [ "$1" == "--rebuild-driver" ]; then if [ ! -e "$XR_DRIVER_BINARY" ] || [ "$1" == "--rebuild-driver" ]; then
# if a file exists at custom_banner_config.yml, copy it to the xrealAirLinuxDriver directory # if a file exists at custom_banner_config.yml, copy it to the xrealAirLinuxDriver directory
@ -70,7 +73,10 @@ if [ ! -e "$XR_DRIVER_BINARY" ] || [ "$1" == "--rebuild-driver" ]; then
# strange issue where the base library produces a .so file if the build is not cleaned # strange issue where the base library produces a .so file if the build is not cleaned
rm -rf build/ rm -rf build/
if [ -n "${STEAMOS:-}" ]; then
export STEAMOS
fi
docker-build/init.sh docker-build/init.sh
docker-build/run-build.sh $ARCH docker-build/run-build.sh $ARCH
popd popd

View File

@ -31,7 +31,7 @@ function createVertexMesh(fovDetails, monitorDetails, positionVectorNWU) {
let fovConversions = fovDetails.curvedDisplay ? fovConversionFns.curved : fovConversionFns.flat; let fovConversions = fovDetails.curvedDisplay ? fovConversionFns.curved : fovConversionFns.flat;
const sideEdgeDistancePixels = fovConversions.centerToFovEdgeDistance( const sideEdgeDistancePixels = fovConversions.centerToFovEdgeDistance(
fovDetails.completeScreenDistancePixels, fovDetails.completeScreenDistancePixels,
fovDetails.widthPixels fovDetails.sizeAdjustedWidthPixels
); );
const horizontalRadians = fovConversions.lengthToRadians( const horizontalRadians = fovConversions.lengthToRadians(
fovDetails.defaultDistanceHorizontalRadians, fovDetails.defaultDistanceHorizontalRadians,
@ -42,7 +42,7 @@ function createVertexMesh(fovDetails, monitorDetails, positionVectorNWU) {
const topEdgeDistancePixels = fovConversions.centerToFovEdgeDistance( const topEdgeDistancePixels = fovConversions.centerToFovEdgeDistance(
fovDetails.completeScreenDistancePixels, fovDetails.completeScreenDistancePixels,
fovDetails.heightPixels fovDetails.sizeAdjustedHeightPixels
); );
const verticalRadians = fovConversions.lengthToRadians( const verticalRadians = fovConversions.lengthToRadians(
fovDetails.defaultDistanceVerticalRadians, fovDetails.defaultDistanceVerticalRadians,
@ -585,7 +585,7 @@ export const VirtualDisplayEffect = GObject.registerClass({
this.set_uniform_float(this.get_uniform_location('u_look_ahead_ms'), 1, [0.0]); this.set_uniform_float(this.get_uniform_location('u_look_ahead_ms'), 1, [0.0]);
lookAheadSet = true; lookAheadSet = true;
} }
const posePositionPixels = this.imu_snapshots.pose_position.map(coord => coord * this.fov_details.completeScreenDistancePixels); const posePositionPixels = this.imu_snapshots.pose_position.map(coord => coord * this.fov_details.fullScreenDistancePixels);
this.set_uniform_matrix(this.get_uniform_location("u_pose_orientation"), false, 4, this.imu_snapshots.pose_orientation); this.set_uniform_matrix(this.get_uniform_location("u_pose_orientation"), false, 4, this.imu_snapshots.pose_orientation);
this.set_uniform_float(this.get_uniform_location("u_pose_position"), 3, posePositionPixels); this.set_uniform_float(this.get_uniform_location("u_pose_position"), 3, posePositionPixels);
} else { } else {

View File

@ -206,8 +206,8 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorSpacing) {
if (fovDetails.monitorWrappingScheme === 'horizontal') { if (fovDetails.monitorWrappingScheme === 'horizontal') {
// monitors wrap around us horizontally // monitors wrap around us horizontally
const sideEdgeRadius = conversionFns.centerToFovEdgeDistance(fovDetails.completeScreenDistancePixels, fovDetails.widthPixels); const sideEdgeRadius = conversionFns.centerToFovEdgeDistance(fovDetails.completeScreenDistancePixels, fovDetails.sizeAdjustedWidthPixels);
const monitorSpacingPixels = monitorSpacing * fovDetails.widthPixels; const monitorSpacingPixels = monitorSpacing * fovDetails.sizeAdjustedWidthPixels;
const lengthToRadianFn = (targetWidth) => conversionFns.lengthToRadians( const lengthToRadianFn = (targetWidth) => conversionFns.lengthToRadians(
fovDetails.defaultDistanceHorizontalRadians, fovDetails.defaultDistanceHorizontalRadians,
fovDetails.widthPixels, fovDetails.widthPixels,
@ -215,14 +215,14 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorSpacing) {
targetWidth targetWidth
); );
cachedMonitorRadians[0] = -fovDetails.defaultDistanceHorizontalRadians / 2; cachedMonitorRadians[0] = -lengthToRadianFn(fovDetails.sizeAdjustedWidthPixels) / 2;
horizontalMonitorSort(monitorDetailsList).forEach(({monitorDetails, originalIndex}) => { horizontalMonitorSort(monitorDetailsList).forEach(({monitorDetails, originalIndex}) => {
const monitorWrapDetails = monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorDetails.x, monitorDetails.width, lengthToRadianFn); const monitorWrapDetails = monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorDetails.x, monitorDetails.width, lengthToRadianFn);
const monitorCenterRadius = conversionFns.fovEdgeToScreenCenterDistance(sideEdgeRadius, monitorDetails.width); const monitorCenterRadius = conversionFns.fovEdgeToScreenCenterDistance(sideEdgeRadius, monitorDetails.width);
const upTopPixels = -monitorDetails.y - (monitorDetails.y / fovDetails.heightPixels) * monitorSpacingPixels; const upTopPixels = -monitorDetails.y - (monitorDetails.y / fovDetails.sizeAdjustedHeightPixels) * monitorSpacingPixels;
// offset for aligning this monitor's center with the fov-sized viewport's center // offset for aligning this monitor's center with the fov-sized viewport's center
const upCenterOffsetPixels = (monitorDetails.height - fovDetails.heightPixels) / 2; const upCenterOffsetPixels = (monitorDetails.height - fovDetails.sizeAdjustedHeightPixels) / 2;
// this is where our monitor's center is in relation to an fov-sized viewport centered about (0, 0) // this is where our monitor's center is in relation to an fov-sized viewport centered about (0, 0)
const upCenterPixels = upTopPixels - upCenterOffsetPixels; const upCenterPixels = upTopPixels - upCenterOffsetPixels;
@ -257,8 +257,8 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorSpacing) {
} else if (fovDetails.monitorWrappingScheme === 'vertical') { } else if (fovDetails.monitorWrappingScheme === 'vertical') {
// monitors wrap around us vertically // monitors wrap around us vertically
const topEdgeRadius = conversionFns.centerToFovEdgeDistance(fovDetails.completeScreenDistancePixels, fovDetails.heightPixels); const topEdgeRadius = conversionFns.centerToFovEdgeDistance(fovDetails.completeScreenDistancePixels, fovDetails.sizeAdjustedHeightPixels);
const monitorSpacingPixels = monitorSpacing * fovDetails.heightPixels; const monitorSpacingPixels = monitorSpacing * fovDetails.sizeAdjustedHeightPixels;
const lengthToRadianFn = (targetHeight) => conversionFns.lengthToRadians( const lengthToRadianFn = (targetHeight) => conversionFns.lengthToRadians(
fovDetails.defaultDistanceVerticalRadians, fovDetails.defaultDistanceVerticalRadians,
fovDetails.heightPixels, fovDetails.heightPixels,
@ -266,14 +266,14 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorSpacing) {
targetHeight targetHeight
); );
cachedMonitorRadians[0] = -fovDetails.defaultDistanceVerticalRadians / 2; cachedMonitorRadians[0] = -lengthToRadianFn(fovDetails.sizeAdjustedHeightPixels) / 2;
verticalMonitorSort(monitorDetailsList).forEach(({monitorDetails, originalIndex}) => { verticalMonitorSort(monitorDetailsList).forEach(({monitorDetails, originalIndex}) => {
const monitorWrapDetails = monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorDetails.y, monitorDetails.height, lengthToRadianFn); const monitorWrapDetails = monitorWrap(cachedMonitorRadians, monitorSpacingPixels, monitorDetails.y, monitorDetails.height, lengthToRadianFn);
const monitorCenterRadius = conversionFns.fovEdgeToScreenCenterDistance(topEdgeRadius, monitorDetails.height); const monitorCenterRadius = conversionFns.fovEdgeToScreenCenterDistance(topEdgeRadius, monitorDetails.height);
const westLeftPixels = -monitorDetails.x - (monitorDetails.x / fovDetails.widthPixels) * monitorSpacingPixels; const westLeftPixels = -monitorDetails.x - (monitorDetails.x / fovDetails.sizeAdjustedWidthPixels) * monitorSpacingPixels;
// offset for aligning this monitor's center with the fov-sized viewport's center // offset for aligning this monitor's center with the fov-sized viewport's center
const westCenterOffsetPixels = (monitorDetails.width - fovDetails.widthPixels) / 2; const westCenterOffsetPixels = (monitorDetails.width - fovDetails.sizeAdjustedWidthPixels) / 2;
// this is where our monitor's center is in relation to an fov-sized viewport centered about (0, 0) // this is where our monitor's center is in relation to an fov-sized viewport centered about (0, 0)
const westCenterPixels = westLeftPixels - westCenterOffsetPixels; const westCenterPixels = westLeftPixels - westCenterOffsetPixels;
@ -306,17 +306,16 @@ function monitorsToPlacements(fovDetails, monitorDetailsList, monitorSpacing) {
}); });
}); });
} else { } else {
const monitorSpacingPixels = monitorSpacing * fovDetails.widthPixels; const monitorSpacingPixels = monitorSpacing * fovDetails.sizeAdjustedWidthPixels;
// monitors make a flat wall in front of us, no wrapping // monitors make a flat wall in front of us, no wrapping
monitorDetailsList.forEach((monitorDetails, index) => { monitorDetailsList.forEach((monitorDetails, index) => {
const upTopPixels = -monitorDetails.y - (monitorDetails.y / fovDetails.heightPixels) * monitorSpacingPixels; const upTopPixels = -monitorDetails.y - (monitorDetails.y / fovDetails.sizeAdjustedHeightPixels) * monitorSpacingPixels;
const westLeftPixels = -monitorDetails.x - (monitorDetails.x / fovDetails.widthPixels) * monitorSpacingPixels; const westLeftPixels = -monitorDetails.x - (monitorDetails.x / fovDetails.sizeAdjustedWidthPixels) * monitorSpacingPixels;
// offsets for aligning this monitor's center with the fov-sized viewport's center // offsets for aligning this monitor's center with the fov-sized viewport's center
const westCenterOffsetPixels = (monitorDetails.width - fovDetails.widthPixels) / 2; const westCenterOffsetPixels = (monitorDetails.width - fovDetails.sizeAdjustedWidthPixels) / 2;
const upCenterOffsetPixels = (monitorDetails.height - fovDetails.heightPixels) / 2; const upCenterOffsetPixels = (monitorDetails.height - fovDetails.sizeAdjustedHeightPixels) / 2;
const westCenterPixels = westLeftPixels - westCenterOffsetPixels; const westCenterPixels = westLeftPixels - westCenterOffsetPixels;
const upCenterPixels = upTopPixels - upCenterOffsetPixels; const upCenterPixels = upTopPixels - upCenterOffsetPixels;
@ -846,19 +845,24 @@ export const VirtualDisplaysActor = GObject.registerClass({
const defaultDistanceHorizontalRadians = 2 * Math.atan(Math.tan(fovRadians.horizontal / 2) / this._display_distance_default()); const defaultDistanceHorizontalRadians = 2 * Math.atan(Math.tan(fovRadians.horizontal / 2) / this._display_distance_default());
// distance needed for the FOV-sized monitor to fill up the screen // distance needed for the FOV-sized monitor to fill up the screen
const fullScreenDistance = this.target_monitor.height / 2 / Math.tan(fovRadians.vertical / 2); const fullScreenDistancePixels = this.target_monitor.height / 2 / Math.tan(fovRadians.vertical / 2);
const lensDistancePixels = fullScreenDistance / (1.0 - Globals.data_stream.device_data.lensDistanceRatio) - fullScreenDistance; const lensDistancePixels = fullScreenDistancePixels / (1.0 - Globals.data_stream.device_data.lensDistanceRatio) - fullScreenDistancePixels;
// distance of a display at the default (most zoomed out) distance, plus the lens distance constant // distance of a display at the default (most zoomed out) distance, plus the lens distance constant
const lensToScreenDistance = this.target_monitor.height / 2 / Math.tan(defaultDistanceVerticalRadians / 2); const lensToScreenDistance = this.target_monitor.height / 2 / Math.tan(defaultDistanceVerticalRadians / 2);
const completeScreenDistancePixels = lensToScreenDistance + lensDistancePixels; const completeScreenDistancePixels = lensToScreenDistance + lensDistancePixels;
const sizeAdjustedWidthPixels = this.target_monitor.width * this.display_size;
const sizeAdjustedHeightPixels = this.target_monitor.height * this.display_size;
return { return {
widthPixels: this.target_monitor.width, widthPixels: this.target_monitor.width,
sizeAdjustedWidthPixels,
heightPixels: this.target_monitor.height, heightPixels: this.target_monitor.height,
sizeAdjustedHeightPixels,
defaultDistanceVerticalRadians, defaultDistanceVerticalRadians,
defaultDistanceHorizontalRadians, defaultDistanceHorizontalRadians,
lensDistancePixels, lensDistancePixels,
fullScreenDistancePixels,
completeScreenDistancePixels, completeScreenDistancePixels,
monitorWrappingScheme: this._actual_wrap_scheme(), monitorWrappingScheme: this._actual_wrap_scheme(),
curvedDisplay: this.curved_display curvedDisplay: this.curved_display
@ -926,7 +930,7 @@ export const VirtualDisplaysActor = GObject.registerClass({
} }
_handle_display_size_change(update_placements = true) { _handle_display_size_change(update_placements = true) {
const sizeComplement = 1.0 - this.display_size; const sizeComplement = (1.0 - this.display_size) / 2.0;
const sizeViewportOffsetX = sizeComplement * this.target_monitor.width; const sizeViewportOffsetX = sizeComplement * this.target_monitor.width;
const sizeViewportOffsetY = sizeComplement * this.target_monitor.height; const sizeViewportOffsetY = sizeComplement * this.target_monitor.height;
this._all_monitors = this._all_monitors_unmodified.map(monitor => ({ this._all_monitors = this._all_monitors_unmodified.map(monitor => ({