[client] windows: add native clang-cl build

Build the Windows client against the MSVC ABI while retaining clang
language support. Use vcpkg for ANGLE and libsamplerate, and build
MsQuic with its bundled static OpenSSL.
This commit is contained in:
Geoffrey McRae
2026-10-02 18:52:45 +10:00
parent c456596bd7
commit 57f18d7e80
33 changed files with 583 additions and 205 deletions

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.10)
cmake_minimum_required(VERSION 3.20)
project(looking-glass-client C CXX)
get_filename_component(PROJECT_TOP "${PROJECT_SOURCE_DIR}/.." ABSOLUTE)
@@ -34,6 +34,14 @@ else()
"The Looking Glass client does not support ${CMAKE_SYSTEM_NAME}")
endif()
if(LG_CLIENT_PLATFORM_WINDOWS AND MSVC AND
(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" OR
NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
message(FATAL_ERROR
"The native Windows client currently requires clang-cl for both C and "
"C++; use the windows-clangcl configure preset")
endif()
set(OPTIMIZE_FOR_NATIVE_DEFAULT ON)
include(OptimizeForNative) # option(OPTIMIZE_FOR_NATIVE)
include(UninstallTarget)
@@ -145,34 +153,67 @@ if(ENABLE_USB_AUDIO)
endif()
add_feature_info(ENABLE_USB_AUDIO ENABLE_USB_AUDIO "USB audio support.")
add_compile_options(
"-Wall"
"-Wextra"
"-Wno-sign-compare"
"-Wno-unused-parameter"
"$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>"
"$<$<C_COMPILER_ID:GNU>:-Wimplicit-fallthrough=2>"
"-Werror"
"-Wfatal-errors"
"-g"
"-ffast-math"
"-fdata-sections"
"-ffunction-sections"
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)
if(ENABLE_BACKTRACE)
if(MSVC)
foreach(LG_CLIENT_COMPILE_OPTION
/W4
/WX
/utf-8
/fp:fast
/Gy
/Gw
/wd4100
/clang:-Wno-sign-compare
/clang:-Wno-unused-parameter
/clang:-Wfatal-errors)
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:${LG_CLIENT_COMPILE_OPTION}>"
"$<$<COMPILE_LANGUAGE:CXX>:${LG_CLIENT_COMPILE_OPTION}>")
endforeach()
add_compile_options(
"-fno-omit-frame-pointer"
"-fno-optimize-sibling-calls"
"$<$<COMPILE_LANGUAGE:C>:/clang:-Wstrict-prototypes>")
add_link_options(/OPT:REF /NXCOMPAT)
else()
add_compile_options(
"-Wall"
"-Wextra"
"-Wno-sign-compare"
"-Wno-unused-parameter"
"$<$<COMPILE_LANGUAGE:C>:-Wstrict-prototypes>"
"$<$<C_COMPILER_ID:GNU>:-Wimplicit-fallthrough=2>"
"-Werror"
"-Wfatal-errors"
"-g"
"-ffast-math"
"-fdata-sections"
"-ffunction-sections"
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)
if(LG_CLIENT_PLATFORM_WINDOWS)
add_link_options("-Wl,--gc-sections" "-Wl,--nxcompat")
else()
add_link_options("-Wl,--gc-sections" "-z" "noexecstack")
endif()
endif()
set(EXE_FLAGS "-Wl,--gc-sections -z noexecstack")
set(CMAKE_C_STANDARD 11)
if(ENABLE_BACKTRACE)
if(MSVC)
add_compile_options(
"$<$<COMPILE_LANGUAGE:C>:/Oy->"
"$<$<COMPILE_LANGUAGE:CXX>:/Oy->"
"$<$<COMPILE_LANGUAGE:C>:/clang:-fno-optimize-sibling-calls>"
"$<$<COMPILE_LANGUAGE:CXX>:/clang:-fno-optimize-sibling-calls>")
else()
add_compile_options(
"-fno-omit-frame-pointer"
"-fno-optimize-sibling-calls")
endif()
endif()
if(LG_CLIENT_PLATFORM_WINDOWS)
set(EXE_FLAGS "-Wl,--gc-sections -Wl,--nxcompat")
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
if(MINGW)
add_compile_options("-fdebug-prefix-map=${PROJECT_TOP}/=")
add_compile_definitions(__USE_MINGW_ANSI_STDIO=0)
endif()
@@ -186,13 +227,22 @@ if (ENABLE_EGL)
endif()
if(ENABLE_ASAN)
add_compile_options("-fno-omit-frame-pointer" "-fsanitize=address")
set(EXE_FLAGS "${EXE_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
if(MSVC)
message(FATAL_ERROR
"AddressSanitizer is not supported by the clang-cl build")
else()
add_compile_options("-fno-omit-frame-pointer" "-fsanitize=address")
add_link_options("-fno-omit-frame-pointer" "-fsanitize=address")
endif()
endif()
if(ENABLE_UBSAN)
if(MSVC)
message(FATAL_ERROR
"UndefinedBehaviorSanitizer is not supported by the clang-cl build")
endif()
add_compile_options("-fsanitize=undefined")
set(EXE_FLAGS "${EXE_FLAGS} -fsanitize=undefined")
add_link_options("-fsanitize=undefined")
endif()
add_definitions(-D ATOMIC_LOCKING)
@@ -266,9 +316,13 @@ if(ENABLE_EGL)
list(APPEND SOURCES src/egl_dynprocs.c)
endif()
if(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
if(MSVC)
set_source_files_properties(src/overlay/graphs.c PROPERTIES
COMPILE_FLAGS "-fno-fast-math"
COMPILE_OPTIONS "/fp:precise"
)
elseif(CMAKE_C_COMPILER_ID MATCHES "GNU|Clang")
set_source_files_properties(src/overlay/graphs.c PROPERTIES
COMPILE_OPTIONS "-fno-fast-math"
)
endif()
@@ -407,8 +461,6 @@ target_link_libraries(looking-glass-client
lg_gui
)
set_target_properties(looking-glass-client PROPERTIES LINK_FLAGS "${EXE_FLAGS}")
if(ENABLE_TESTS AND LG_CLIENT_PLATFORM_WINDOWS)
add_library(client_test_version OBJECT
"${CMAKE_BINARY_DIR}/version.c"

42
client/CMakePresets.json Normal file
View File

@@ -0,0 +1,42 @@
{
"version": 3,
"cmakeMinimumRequired": {
"major": 3,
"minor": 21,
"patch": 0
},
"configurePresets": [
{
"name": "windows-clangcl",
"displayName": "Windows clang-cl",
"description": "Build the Windows client with the MSVC ABI",
"generator": "Ninja",
"binaryDir": "${sourceDir}/build/windows-clangcl",
"toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
},
"cacheVariables": {
"CMAKE_C_COMPILER": "clang-cl",
"CMAKE_CXX_COMPILER": "clang-cl",
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
"CMAKE_MSVC_RUNTIME_LIBRARY": "MultiThreadedDLL",
"ENABLE_AUDIO": true,
"ENABLE_EGL": true,
"ENABLE_NETWORK": true,
"ENABLE_WASAPI": true,
"OPTIMIZE_FOR_NATIVE": "OFF",
"VCPKG_TARGET_TRIPLET": "x64-windows"
}
}
],
"buildPresets": [
{
"name": "windows-clangcl-release",
"displayName": "Windows clang-cl RelWithDebInfo",
"configurePreset": "windows-clangcl"
}
]
}

View File

@@ -11,11 +11,14 @@ add_library(audiodev_WASAPI STATIC
target_link_libraries(audiodev_WASAPI
avrt
lg_common
m
ole32
uuid
)
if(MINGW)
target_link_libraries(audiodev_WASAPI m)
endif()
target_include_directories(audiodev_WASAPI
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}"

View File

@@ -42,6 +42,18 @@ find_package_handle_standard_args(ANGLE
ANGLE_GLESV2_LIBRARY
)
if(ANGLE_FOUND AND MSVC)
foreach(_ANGLE_LIBRARY IN ITEMS
"${ANGLE_EGL_LIBRARY}"
"${ANGLE_GLESV2_LIBRARY}")
if(_ANGLE_LIBRARY MATCHES "\\.(a|dll\\.a)$")
message(FATAL_ERROR
"The clang-cl client requires MSVC-ABI ANGLE .lib files; found "
"${_ANGLE_LIBRARY}")
endif()
endforeach()
endif()
mark_as_advanced(
ANGLE_EGL_INCLUDE_DIR
ANGLE_GLES_INCLUDE_DIR
@@ -68,3 +80,4 @@ endif()
unset(_ANGLE_HINTS)
unset(_ANGLE_FIND_POLICY)
unset(_ANGLE_LIBRARY)

View File

@@ -27,6 +27,13 @@ find_package_handle_standard_args(SampleRate
SampleRate_LIBRARY
)
if(SampleRate_FOUND AND MSVC AND
SampleRate_LIBRARY MATCHES "\\.(a|dll\\.a)$")
message(FATAL_ERROR
"The clang-cl client requires an MSVC-ABI samplerate .lib; found "
"${SampleRate_LIBRARY}")
endif()
mark_as_advanced(
SampleRate_INCLUDE_DIR
SampleRate_LIBRARY

View File

@@ -22,6 +22,7 @@
#define _H_LG_OVERLAY_UTILS_
#include <stdbool.h>
#include <stddef.h>
#include "common/types.h"
@@ -41,7 +42,7 @@ void overlayTextURL(const char * url, const char * text);
void overlayTextMaybeURL(const char * text, bool wrapped);
// create a texture from a SVG and scale it to fit the supplied width & height
bool overlayLoadSVG(const char * data, unsigned int size, OverlayImage * image,
bool overlayLoadSVG(const char * data, size_t size, OverlayImage * image,
int width, int height);
void overlayFreeImage(OverlayImage * image);

View File

@@ -1,26 +1,23 @@
cmake_minimum_required(VERSION 3.10)
project(renderer_EGL LANGUAGES C CXX)
find_program(AWK NAMES gawk mawk original-awk awk)
if(AWK MATCHES ".+-NOTFOUND")
message(FATAL_ERROR "FATAL: some known version of awk couldn't be found (${AWK}).")
else()
message(STATUS "Using awk: ${AWK}")
endif()
include(MakeObject)
function(build_shaders header_dir)
file(GLOB headers "${header_dir}/*.h")
set(EGL_SHADER_PROCESSED)
set(include_dir "${CMAKE_CURRENT_SOURCE_DIR}/${header_dir}")
foreach(shader ${ARGN})
set(out_f "${CMAKE_CURRENT_BINARY_DIR}/${shader}")
add_custom_command(OUTPUT "${out_f}"
COMMAND "${AWK}" -f "${CMAKE_CURRENT_SOURCE_DIR}/glsl.include.awk"
"${CMAKE_CURRENT_SOURCE_DIR}/${shader}" > "${out_f}"
add_custom_command(
OUTPUT "${out_f}"
COMMAND "${CMAKE_COMMAND}"
"-DLG_MAKE_OBJECT_ACTION=PREPROCESS"
"-DLG_MAKE_OBJECT_INPUT=${CMAKE_CURRENT_SOURCE_DIR}/${shader}"
"-DLG_MAKE_OBJECT_OUTPUT=${out_f}"
"-DLG_MAKE_OBJECT_INCLUDE_DIR=${include_dir}"
-P "${LG_MAKE_OBJECT_SCRIPT}"
MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/${shader}"
DEPENDS ${headers}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/shader"
DEPENDS ${headers} "${LG_MAKE_OBJECT_SCRIPT}"
COMMENT "Preprocessing shader ${shader}"
VERBATIM
)

View File

@@ -18,7 +18,6 @@
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#define _GNU_SOURCE
#include "filter.h"
#include "effect.h"
#include "app.h"
@@ -45,7 +44,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#define GLSL_MAX_TEXTURES 16
#define GLSL_EXPR_STACK 128
@@ -633,11 +631,11 @@ static bool evaluateExpression(const GLSLContext * context,
if (!copy)
return false;
double stack[GLSL_EXPR_STACK];
double stack[GLSL_EXPR_STACK];
unsigned int count = 0;
char * state;
for (char * token = strtok_r(copy, " \t\r\n", &state); token;
token = strtok_r(NULL, " \t\r\n", &state))
char * state = NULL;
for (char * token = lg_strtok_r(copy, " \t\r\n", &state); token;
token = lg_strtok_r(NULL, " \t\r\n", &state))
{
if (!strcmp(token, "!"))
{
@@ -1077,7 +1075,7 @@ static bool createFilter(const char * root, const char * relative,
if (!this->relative || !this->base.ops.name)
goto fail;
char * extension = strrchr((char *)this->base.ops.name, '.');
if (extension && !strcasecmp(extension, ".glsl"))
if (extension && !lg_strcasecmp(extension, ".glsl"))
*extension = '\0';
app_registerImGuiText(this->base.ops.name);
@@ -1118,7 +1116,7 @@ static void glslFree(EGL_Filter * filter)
static bool hasGLSLExtension(const char * name)
{
const char * extension = strrchr(name, '.');
return extension && !strcasecmp(extension, ".glsl");
return extension && !lg_strcasecmp(extension, ".glsl");
}
static bool scanDirectory(const char * root, const char * relative,

View File

@@ -1,13 +0,0 @@
BEGIN { FS="\"" }
function process(line, second) {
if (line ~ /^#include[ \t]*".+"[ \t\r]*$/) {
while (getline < second) {
process($0, $2)
}
} else {
print line
}
}
{ process($0, $2) } END { print "\0"; }

View File

@@ -154,7 +154,7 @@ static void loadPresetList(struct EGL_PostProcess * this)
continue;
DEBUG_INFO("Found preset: %s", entry);
char * name = strdup(entry);
char * name = lg_strdup(entry);
if (!name)
{
DEBUG_ERROR("Failed to allocate memory");
@@ -260,7 +260,7 @@ static void reorderFilters(struct EGL_PostProcess * this)
return;
}
char * orderStr = strdup(option_get_string("eglFilter", "order"));
char * orderStr = lg_strdup(option_get_string("eglFilter", "order"));
if (!orderStr)
{
DEBUG_ERROR("Failed to allocate memory");
@@ -339,7 +339,8 @@ static void savePresetAs(struct EGL_PostProcess * this)
}
}
this->activePreset = stringlist_push(this->presets, strdup(this->presetEdit));
this->activePreset = stringlist_push(
this->presets, lg_strdup(this->presetEdit));
}
static void deletePreset(struct EGL_PostProcess * this)
@@ -396,7 +397,7 @@ static bool presetsUI(struct EGL_PostProcess * this)
if (this->activePreset >= 0)
savePreset(this, stringlist_at(this->presets, this->activePreset));
else
presetError(this, strdup("You must select a preset to save."));
presetError(this, lg_strdup("You must select a preset to save."));
}
if (igIsItemHovered(ImGuiHoveredFlags_None) && this->activePreset >= 0)

View File

@@ -738,14 +738,14 @@ static bool optRendererParse(struct Option * opt, const char * str)
if (!str)
return false;
if (strcasecmp(str, "auto") == 0)
if (lg_strcasecmp(str, "auto") == 0)
{
g_params.forceRenderer = false;
return true;
}
for(unsigned int i = 0; i < LG_RENDERER_COUNT; ++i)
if (strcasecmp(str, LG_Renderers[i]->getName()) == 0)
if (lg_strcasecmp(str, LG_Renderers[i]->getName()) == 0)
{
g_params.forceRenderer = true;
g_params.forceRendererIndex = i;
@@ -771,12 +771,12 @@ static StringList optRendererValues(struct Option * opt)
static char * optRendererToString(struct Option * opt)
{
if (!g_params.forceRenderer)
return strdup("auto");
return lg_strdup("auto");
if (g_params.forceRendererIndex >= LG_RENDERER_COUNT)
return NULL;
return strdup(LG_Renderers[g_params.forceRendererIndex]->getName());
return lg_strdup(LG_Renderers[g_params.forceRendererIndex]->getName());
}
static bool parsePair(const char * str, long long * first, long long * second)
@@ -838,7 +838,7 @@ static StringList optPosValues(struct Option * opt)
static char * optPosToString(struct Option * opt)
{
if (g_params.center)
return strdup("center");
return lg_strdup("center");
int len = snprintf(NULL, 0, "%dx%d", g_params.x, g_params.y);
char * str = malloc(len + 1);
@@ -919,7 +919,7 @@ static bool optScancodeParse(struct Option * opt, const char * str)
if (!lg_keycode_to_name[i])
continue;
if (strcasecmp(lg_keycode_to_name[i], str) == 0)
if (lg_strcasecmp(lg_keycode_to_name[i], str) == 0)
{
opt->value.x_int = i;
return true;
@@ -981,11 +981,11 @@ static bool optMicDefaultParse(struct Option * opt, const char * str)
if (!str)
return false;
if (strcasecmp(str, "prompt") == 0)
if (lg_strcasecmp(str, "prompt") == 0)
g_params.micDefaultState = MIC_DEFAULT_PROMPT;
else if (strcasecmp(str, "allow") == 0)
else if (lg_strcasecmp(str, "allow") == 0)
g_params.micDefaultState = MIC_DEFAULT_ALLOW;
else if (strcasecmp(str, "deny") == 0)
else if (lg_strcasecmp(str, "deny") == 0)
g_params.micDefaultState = MIC_DEFAULT_DENY;
else
return false;
@@ -1010,11 +1010,11 @@ static char * optMicDefaultToString(struct Option * opt)
switch (g_params.micDefaultState)
{
case MIC_DEFAULT_PROMPT:
return strdup("prompt");
return lg_strdup("prompt");
case MIC_DEFAULT_ALLOW:
return strdup("allow");
return lg_strdup("allow");
case MIC_DEFAULT_DENY:
return strdup("deny");
return lg_strdup("deny");
}
return NULL;
@@ -1026,11 +1026,11 @@ static bool optAudioResamplerParse(
if (!str)
return false;
if (strcasecmp(str, "auto") == 0)
if (lg_strcasecmp(str, "auto") == 0)
g_params.audioResampler = AUDIO_RESAMPLER_AUTO;
else if (strcasecmp(str, "libsamplerate") == 0)
else if (lg_strcasecmp(str, "libsamplerate") == 0)
g_params.audioResampler = AUDIO_RESAMPLER_LIBSAMPLERATE;
else if (strcasecmp(str, "backend") == 0)
else if (lg_strcasecmp(str, "backend") == 0)
g_params.audioResampler = AUDIO_RESAMPLER_BACKEND;
else
return false;
@@ -1055,11 +1055,11 @@ static char * optAudioResamplerToString(struct Option * opt)
switch (g_params.audioResampler)
{
case AUDIO_RESAMPLER_AUTO:
return strdup("auto");
return lg_strdup("auto");
case AUDIO_RESAMPLER_LIBSAMPLERATE:
return strdup("libsamplerate");
return lg_strdup("libsamplerate");
case AUDIO_RESAMPLER_BACKEND:
return strdup("backend");
return lg_strdup("backend");
}
return NULL;

View File

@@ -28,6 +28,7 @@
#include "common/debug.h"
#include "common/event.h"
#include "common/locking.h"
#include "common/stringutils.h"
#include "common/thread.h"
#include "common/util.h"
@@ -561,7 +562,7 @@ bool lgTransportFallback_start(const char * transportName,
atomic_init(&fallback->usable, false);
atomic_init(&fallback->videoAcceptingEvents, false);
fallback->transportName = strdup(transportName);
fallback->transportName = lg_strdup(transportName);
if (!fallback->transportName)
goto fail;

View File

@@ -24,6 +24,7 @@
#include "common/debug.h"
#include "common/filesystem.h"
#include "common/locking.h"
#include "common/stringutils.h"
#include "cimgui.h"
@@ -33,7 +34,7 @@
#include <stdlib.h>
#include <string.h>
#if defined(__GNUC__)
#if defined(__GNUC__) || defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"
#endif
@@ -43,7 +44,7 @@
#define STBTT_STATIC
#define STB_TRUETYPE_IMPLEMENTATION
#include "repos/gui/cimgui/imgui/imstb_truetype.h"
#if defined(__GNUC__)
#if defined(__GNUC__) || defined(__clang__)
#pragma GCC diagnostic pop
#endif
@@ -360,7 +361,7 @@ static FontPlatformFaceResult uiFontAddFace(void * opaque,
return FONT_PLATFORM_FACE_ERROR;
}
char * fileCopy = strdup(file);
char * fileCopy = lg_strdup(file);
if (!fileCopy ||
!uiFontGlyphReserve(
&UIFontResolved, UIFontResolved.count + glyphCount))

View File

@@ -38,7 +38,7 @@ static OverlayImage l_image[LG_USER_STATUS_MAX] = { 0 };
static bool l_recordToggle;
static double l_scale = 1.0;
static void status_loadImage(const char * data, unsigned int size,
static void status_loadImage(const char * data, size_t size,
OverlayImage * image, int width, int height)
{
overlayFreeImage(image);

View File

@@ -95,7 +95,7 @@ void overlayTextMaybeURL(const char * text, bool wrapped)
igTextUnformatted(text, NULL);
}
bool overlayLoadSVG(const char * data, unsigned int size, OverlayImage * image,
bool overlayLoadSVG(const char * data, size_t size, OverlayImage * image,
int width, int height)
{
image->tex = NULL;

View File

@@ -11,7 +11,6 @@ add_executable(common-platform-tests
common_platform_test.c
)
target_link_libraries(common-platform-tests
${EXE_FLAGS}
lg_common
)
target_compile_definitions(common-platform-tests PRIVATE
@@ -32,7 +31,6 @@ target_include_directories(event-source-tests PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(event-source-tests
${EXE_FLAGS}
lg_common
)
add_test(NAME event-source-tests
@@ -46,9 +44,6 @@ add_executable(windows-clipboard-files-tests
clipboard_files_windows_test.c
../platform/Windows/clipboard_files.c
)
target_link_libraries(windows-clipboard-files-tests
${EXE_FLAGS}
)
add_test(NAME windows-clipboard-files-tests
COMMAND windows-clipboard-files-tests
)
@@ -65,7 +60,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(config-platform-tests
${EXE_FLAGS}
lg_common
)
add_test(NAME config-platform-tests
@@ -79,7 +73,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
lgmp_platform_test.c
)
target_link_libraries(lgmp-platform-tests
${EXE_FLAGS}
lg_common
)
add_test(NAME lgmp-platform-tests
@@ -103,9 +96,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
process_test.c
../platform/Linux/process.c
)
target_link_libraries(process-tests
${EXE_FLAGS}
)
add_test(NAME process-tests
COMMAND process-tests
)
@@ -147,7 +137,6 @@ if(LG_CLIENT_PLATFORM_WINDOWS)
common_windows_test.c
)
target_link_libraries(common-windows-tests
${EXE_FLAGS}
lg_common
)
add_test(NAME common-windows-tests
@@ -169,7 +158,6 @@ target_include_directories(sw-surface-tests PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(sw-surface-tests
${EXE_FLAGS}
lg_common
)
add_test(NAME sw-surface-tests COMMAND sw-surface-tests)
@@ -183,7 +171,6 @@ target_include_directories(font-tests PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(font-tests
${EXE_FLAGS}
lg_common
lg_gui
)
@@ -200,7 +187,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
../src/kb_hid.c
)
target_link_libraries(lgmp-transport-tests
${EXE_FLAGS}
transport_LGMP
lg_common
lgmp
@@ -222,7 +208,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
../src/kb_hid.c
)
target_link_libraries(lgmp-frame-tests
${EXE_FLAGS}
transport_LGMP
lg_common
lgmp
@@ -252,7 +237,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(lgmp-input-tests
${EXE_FLAGS}
lg_common
lgmp
)
@@ -280,7 +264,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
"${CMAKE_CURRENT_SOURCE_DIR}/../transports/LGMP"
)
target_link_libraries(lgmp-clipboard-tests
${EXE_FLAGS}
lg_common
lgmp
)
@@ -322,7 +305,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
"${CMAKE_CURRENT_SOURCE_DIR}/../transports/LGMP"
)
target_link_libraries(lgmp-audio-tests
${EXE_FLAGS}
transport_LGMP
lg_common
lgmp
@@ -362,7 +344,6 @@ if(LG_CLIENT_PLATFORM_LINUX AND ENABLE_WAYLAND)
"${CMAKE_BINARY_DIR}/wayland"
)
target_link_libraries(wayland-presentation-tests
${EXE_FLAGS}
lg_common
)
set(WAYLAND_PRESENTATION_CASES
@@ -393,7 +374,6 @@ if(LG_CLIENT_PLATFORM_LINUX AND ENABLE_WAYLAND)
"${CMAKE_BINARY_DIR}/wayland"
)
target_link_libraries(wayland-clipboard-tests
${EXE_FLAGS}
lg_common
)
set(WAYLAND_CLIPBOARD_CASES
@@ -441,7 +421,6 @@ if(LG_CLIENT_PLATFORM_LINUX AND ENABLE_X11)
"${CMAKE_CURRENT_SOURCE_DIR}/../displayservers/X11"
)
target_link_libraries(x11-clipboard-tests
${EXE_FLAGS}
lg_common
pthread
)
@@ -561,7 +540,6 @@ target_include_directories(mouse-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(mouse-tests
${EXE_FLAGS}
lg_common
)
set(MOUSE_CASES
@@ -603,7 +581,6 @@ target_include_directories(input-tests PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(input-tests
${EXE_FLAGS}
lg_common
)
set(INPUT_CASES
@@ -636,7 +613,6 @@ target_include_directories(keybind-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(keybind-tests
${EXE_FLAGS}
lg_common
)
set(KEYBIND_CASES
@@ -668,7 +644,6 @@ target_include_directories(app-keybind-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(app-keybind-tests
${EXE_FLAGS}
lg_common
lg_gui
)
@@ -705,7 +680,6 @@ target_include_directories(clipboard-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(clipboard-tests
${EXE_FLAGS}
lg_common
)
set(CLIPBOARD_CASES
@@ -746,7 +720,6 @@ if(LG_CLIENT_PLATFORM_LINUX)
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(clipboard-files-tests
${EXE_FLAGS}
lg_common
PkgConfig::FUSE3
)
@@ -789,7 +762,6 @@ if(ENABLE_SPICE)
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(spice-clipboard-tests
${EXE_FLAGS}
lg_common
)
foreach(name IN ITEMS outbound inbound)
@@ -811,7 +783,6 @@ target_include_directories(transport-fallback-tests PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
)
target_link_libraries(transport-fallback-tests
${EXE_FLAGS}
lg_common
)
if(ENABLE_AUDIO)
@@ -861,7 +832,6 @@ if(ENABLE_SPICE)
"${PROJECT_TOP}/repos/PureSpice/include"
)
target_link_libraries(spice-tests
${EXE_FLAGS}
lg_common
)
set(SPICE_CASES
@@ -897,7 +867,6 @@ if(ENABLE_SPICE)
"$<TARGET_PROPERTY:purespice,INCLUDE_DIRECTORIES>"
)
target_link_libraries(purespice-connect-cancel-tests
${EXE_FLAGS}
purespice
pthread
)
@@ -923,7 +892,6 @@ target_include_directories(frame-scheduler-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(frame-scheduler-tests
${EXE_FLAGS}
lg_common
)
set(FRAME_SCHEDULER_CASES
@@ -950,17 +918,20 @@ add_executable(frame-timing-tests
target_compile_definitions(frame-timing-tests PRIVATE
CIMGUI_DEFINE_ENUMS_AND_STRUCTS=1
)
target_compile_options(frame-timing-tests PRIVATE
-O1
"$<$<C_COMPILER_ID:GNU>:-fwhole-program>"
)
if(MSVC)
target_compile_options(frame-timing-tests PRIVATE /clang:-O1)
else()
target_compile_options(frame-timing-tests PRIVATE
-O1
"$<$<C_COMPILER_ID:GNU>:-fwhole-program>"
)
endif()
target_include_directories(frame-timing-tests PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/../src"
"${PROJECT_TOP}/repos/gui/cimgui"
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(frame-timing-tests
${EXE_FLAGS}
lg_common
)
set(FRAME_TIMING_CASES
@@ -1005,7 +976,6 @@ target_include_directories(config-message-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(config-message-tests
${EXE_FLAGS}
lg_common
)
set(CONFIG_MESSAGE_CASES
@@ -1042,7 +1012,6 @@ if(ENABLE_AUDIO)
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(audio-tests
${EXE_FLAGS}
lg_common
${SAMPLERATE_TARGET}
)
@@ -1082,7 +1051,6 @@ target_include_directories(render-queue-tests PRIVATE
"${PROJECT_TOP}/repos/gui/cimgui/imgui"
)
target_link_libraries(render-queue-tests
${EXE_FLAGS}
lg_common
)
set(RENDER_QUEUE_CASES
@@ -1112,7 +1080,6 @@ if(ENABLE_EGL)
"${CMAKE_CURRENT_SOURCE_DIR}/../renderers/EGL"
)
target_link_libraries(desktop-rects-tests
${EXE_FLAGS}
renderer_EGL
)
set(DESKTOP_RECTS_CASES
@@ -1139,7 +1106,6 @@ if(ENABLE_EGL)
"${CMAKE_BINARY_DIR}/renderers/EGL/shader"
)
target_link_libraries(texture-dmabuf-tests
${EXE_FLAGS}
lg_common
)
set(TEXTURE_DMABUF_CASES
@@ -1167,7 +1133,6 @@ if(ENABLE_EGL)
"${CMAKE_CURRENT_SOURCE_DIR}/../renderers/EGL"
)
target_link_libraries(postprocess-order-tests
${EXE_FLAGS}
lg_common
lg_egl_provider
)
@@ -1188,7 +1153,6 @@ if(ENABLE_EGL)
"${PROJECT_TOP}/common/include"
)
target_link_libraries(texture-upload-tests
${EXE_FLAGS}
LGProtocol::LGProtocol
lg_egl_provider
)

View File

@@ -116,10 +116,10 @@ static void externalFrameInit(struct FakeExternalFrame * external)
struct EGLDynProcs g_egl_dynProcs;
_Thread_local EGL_StateCache g_eglState;
const char b_shader_hdr_compose_vert[] = "";
const char b_shader_hdr_compose_vert_end[] = "";
const char b_shader_downscale_linear_frag[] = "";
const char b_shader_downscale_linear_frag_end[] = "";
const char b_shader_hdr_compose_vert[] = "";
const size_t b_shader_hdr_compose_vert_size = 1;
const char b_shader_downscale_linear_frag[] = "";
const size_t b_shader_downscale_linear_frag_size = 1;
static struct FakeSync * syncPtr(GLsync sync)
{

View File

@@ -5,9 +5,11 @@ add_library(transport_Test STATIC
test.c
)
target_compile_options(transport_Test PRIVATE
-fno-fast-math
)
if(MSVC)
target_compile_options(transport_Test PRIVATE /fp:precise)
else()
target_compile_options(transport_Test PRIVATE -fno-fast-math)
endif()
target_link_libraries(transport_Test
lg_common

View File

@@ -29,7 +29,6 @@
#include <stdatomic.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define TEST_BUFFER_COUNT 2
#define TEST_PQ_LUT_SIZE 4096
@@ -610,7 +609,7 @@ static LG_TransportStatus test_nextFrame(LG_Transport * this, bool useDMA,
{
if (!this->holdLastFrame)
return LG_TRANSPORT_END;
usleep(1000);
nsleep(UINT64_C(1000000));
return LG_TRANSPORT_TIMEOUT;
}
@@ -620,7 +619,8 @@ static LG_TransportStatus test_nextFrame(LG_Transport * this, bool useDMA,
if (now < this->nextFrameTime)
{
const uint64_t remaining = this->nextFrameTime - now;
usleep((remaining > 1000000 ? 1000000 : remaining) / 1000);
nsleep(remaining > UINT64_C(1000000) ?
UINT64_C(1000000) : remaining);
return LG_TRANSPORT_TIMEOUT;
}
}
@@ -741,7 +741,7 @@ static LG_TransportStatus test_nextPointer(LG_Transport * this,
{
if (!this->connected)
return LG_TRANSPORT_DISCONNECTED;
usleep(1000);
nsleep(UINT64_C(1000000));
return LG_TRANSPORT_TIMEOUT;
}

15
client/vcpkg.json Normal file
View File

@@ -0,0 +1,15 @@
{
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
"name": "looking-glass-client",
"version-string": "0",
"dependencies": [
{
"name": "angle",
"platform": "windows"
},
{
"name": "libsamplerate",
"platform": "windows"
}
]
}