diff --git a/.derivedData/Logs/Launch/LogStoreManifest.plist b/.derivedData/Logs/Launch/LogStoreManifest.plist
new file mode 100644
index 000000000..f38de4428
--- /dev/null
+++ b/.derivedData/Logs/Launch/LogStoreManifest.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ logFormatVersion
+ 11
+ logs
+
+
+
diff --git a/.derivedData/Logs/Localization/LogStoreManifest.plist b/.derivedData/Logs/Localization/LogStoreManifest.plist
new file mode 100644
index 000000000..f38de4428
--- /dev/null
+++ b/.derivedData/Logs/Localization/LogStoreManifest.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ logFormatVersion
+ 11
+ logs
+
+
+
diff --git a/.derivedData/Logs/Package/LogStoreManifest.plist b/.derivedData/Logs/Package/LogStoreManifest.plist
new file mode 100644
index 000000000..f38de4428
--- /dev/null
+++ b/.derivedData/Logs/Package/LogStoreManifest.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ logFormatVersion
+ 11
+ logs
+
+
+
diff --git a/.derivedData/Logs/Test/LogStoreManifest.plist b/.derivedData/Logs/Test/LogStoreManifest.plist
new file mode 100644
index 000000000..f38de4428
--- /dev/null
+++ b/.derivedData/Logs/Test/LogStoreManifest.plist
@@ -0,0 +1,10 @@
+
+
+
+
+ logFormatVersion
+ 11
+ logs
+
+
+
diff --git a/Modules/glslang/Package.swift b/Modules/glslang/Package.swift
index 4f99da172..d5aba620f 100644
--- a/Modules/glslang/Package.swift
+++ b/Modules/glslang/Package.swift
@@ -60,17 +60,32 @@ let package = Package(
.library(
name: "glslang",
targets: ["glslang"]
+ ),
+ .library(
+ name: "SPIRVCompiler",
+ targets: ["SPIRVCompiler"]
)
],
targets: [
.target(
name: "glslang",
- path: ".",
+ path: "Sources",
sources: glslangSources,
publicHeadersPath: ".",
cxxSettings: [
.define("ENABLE_OPT", to: "0"),
]
+ ),
+ .target(
+ name: "SPIRVCompiler",
+ dependencies: [
+ "glslang"
+ ],
+ path: "SPIRVCompiler",
+ cxxSettings: [
+ .headerSearchPath("../Sources/glslang/Include/"),
+ .headerSearchPath("../Sources/glslang/SPIRV/")
+ ]
)
],
cxxLanguageStandard: .cxx17
diff --git a/Sources/SPIRVCompiler/BUILD.bazel b/Modules/glslang/SPIRVCompiler/BUILD.bazel
similarity index 100%
rename from Sources/SPIRVCompiler/BUILD.bazel
rename to Modules/glslang/SPIRVCompiler/BUILD.bazel
diff --git a/Sources/SPIRVCompiler/spirv_compiler.h b/Modules/glslang/SPIRVCompiler/include/spirv_compiler.h
similarity index 100%
rename from Sources/SPIRVCompiler/spirv_compiler.h
rename to Modules/glslang/SPIRVCompiler/include/spirv_compiler.h
diff --git a/Sources/SPIRVCompiler/spirv_compiler.cpp b/Modules/glslang/SPIRVCompiler/spirv_compiler.cpp
similarity index 97%
rename from Sources/SPIRVCompiler/spirv_compiler.cpp
rename to Modules/glslang/SPIRVCompiler/spirv_compiler.cpp
index 954b6f313..12befc3e6 100644
--- a/Sources/SPIRVCompiler/spirv_compiler.cpp
+++ b/Modules/glslang/SPIRVCompiler/spirv_compiler.cpp
@@ -5,12 +5,12 @@
// Created by v.prusakov on 3/11/23.
//
-#include "spirv_compiler.h"
+#include "include/spirv_compiler.h"
-#include
-#include
-#include
-#include
+#include "glslang/Include/ResourceLimits.h"
+#include "glslang/Include/Types.h"
+#include "glslang/Public/ShaderLang.h"
+#include "SPIRV/GlslangToSpv.h"
const TBuiltInResource DefaultTBuiltInResource = {
/* .MaxLights = */ 32,
diff --git a/Modules/glslang/OGLCompilersDLL/CMakeLists.txt b/Modules/glslang/Sources/OGLCompilersDLL/CMakeLists.txt
similarity index 100%
rename from Modules/glslang/OGLCompilersDLL/CMakeLists.txt
rename to Modules/glslang/Sources/OGLCompilersDLL/CMakeLists.txt
diff --git a/Modules/glslang/OGLCompilersDLL/InitializeDll.cpp b/Modules/glslang/Sources/OGLCompilersDLL/InitializeDll.cpp
similarity index 100%
rename from Modules/glslang/OGLCompilersDLL/InitializeDll.cpp
rename to Modules/glslang/Sources/OGLCompilersDLL/InitializeDll.cpp
diff --git a/Modules/glslang/OGLCompilersDLL/InitializeDll.h b/Modules/glslang/Sources/OGLCompilersDLL/InitializeDll.h
similarity index 100%
rename from Modules/glslang/OGLCompilersDLL/InitializeDll.h
rename to Modules/glslang/Sources/OGLCompilersDLL/InitializeDll.h
diff --git a/Modules/glslang/SPIRV/GLSL.ext.AMD.h b/Modules/glslang/Sources/SPIRV/GLSL.ext.AMD.h
similarity index 100%
rename from Modules/glslang/SPIRV/GLSL.ext.AMD.h
rename to Modules/glslang/Sources/SPIRV/GLSL.ext.AMD.h
diff --git a/Modules/glslang/SPIRV/GLSL.ext.EXT.h b/Modules/glslang/Sources/SPIRV/GLSL.ext.EXT.h
similarity index 100%
rename from Modules/glslang/SPIRV/GLSL.ext.EXT.h
rename to Modules/glslang/Sources/SPIRV/GLSL.ext.EXT.h
diff --git a/Modules/glslang/SPIRV/GLSL.ext.KHR.h b/Modules/glslang/Sources/SPIRV/GLSL.ext.KHR.h
similarity index 100%
rename from Modules/glslang/SPIRV/GLSL.ext.KHR.h
rename to Modules/glslang/Sources/SPIRV/GLSL.ext.KHR.h
diff --git a/Modules/glslang/SPIRV/GLSL.ext.NV.h b/Modules/glslang/Sources/SPIRV/GLSL.ext.NV.h
similarity index 100%
rename from Modules/glslang/SPIRV/GLSL.ext.NV.h
rename to Modules/glslang/Sources/SPIRV/GLSL.ext.NV.h
diff --git a/Modules/glslang/SPIRV/GLSL.std.450.h b/Modules/glslang/Sources/SPIRV/GLSL.std.450.h
similarity index 100%
rename from Modules/glslang/SPIRV/GLSL.std.450.h
rename to Modules/glslang/Sources/SPIRV/GLSL.std.450.h
diff --git a/Modules/glslang/SPIRV/GlslangToSpv.cpp b/Modules/glslang/Sources/SPIRV/GlslangToSpv.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/GlslangToSpv.cpp
rename to Modules/glslang/Sources/SPIRV/GlslangToSpv.cpp
diff --git a/Modules/glslang/SPIRV/GlslangToSpv.h b/Modules/glslang/Sources/SPIRV/GlslangToSpv.h
similarity index 100%
rename from Modules/glslang/SPIRV/GlslangToSpv.h
rename to Modules/glslang/Sources/SPIRV/GlslangToSpv.h
diff --git a/Modules/glslang/SPIRV/InReadableOrder.cpp b/Modules/glslang/Sources/SPIRV/InReadableOrder.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/InReadableOrder.cpp
rename to Modules/glslang/Sources/SPIRV/InReadableOrder.cpp
diff --git a/Modules/glslang/SPIRV/Logger.cpp b/Modules/glslang/Sources/SPIRV/Logger.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/Logger.cpp
rename to Modules/glslang/Sources/SPIRV/Logger.cpp
diff --git a/Modules/glslang/SPIRV/Logger.h b/Modules/glslang/Sources/SPIRV/Logger.h
similarity index 100%
rename from Modules/glslang/SPIRV/Logger.h
rename to Modules/glslang/Sources/SPIRV/Logger.h
diff --git a/Modules/glslang/SPIRV/NonSemanticDebugPrintf.h b/Modules/glslang/Sources/SPIRV/NonSemanticDebugPrintf.h
similarity index 100%
rename from Modules/glslang/SPIRV/NonSemanticDebugPrintf.h
rename to Modules/glslang/Sources/SPIRV/NonSemanticDebugPrintf.h
diff --git a/Modules/glslang/SPIRV/NonSemanticShaderDebugInfo100.h b/Modules/glslang/Sources/SPIRV/NonSemanticShaderDebugInfo100.h
similarity index 100%
rename from Modules/glslang/SPIRV/NonSemanticShaderDebugInfo100.h
rename to Modules/glslang/Sources/SPIRV/NonSemanticShaderDebugInfo100.h
diff --git a/Modules/glslang/SPIRV/SPVRemapper.cpp b/Modules/glslang/Sources/SPIRV/SPVRemapper.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/SPVRemapper.cpp
rename to Modules/glslang/Sources/SPIRV/SPVRemapper.cpp
diff --git a/Modules/glslang/SPIRV/SPVRemapper.h b/Modules/glslang/Sources/SPIRV/SPVRemapper.h
similarity index 100%
rename from Modules/glslang/SPIRV/SPVRemapper.h
rename to Modules/glslang/Sources/SPIRV/SPVRemapper.h
diff --git a/Modules/glslang/SPIRV/SpvBuilder.cpp b/Modules/glslang/Sources/SPIRV/SpvBuilder.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/SpvBuilder.cpp
rename to Modules/glslang/Sources/SPIRV/SpvBuilder.cpp
diff --git a/Modules/glslang/SPIRV/SpvBuilder.h b/Modules/glslang/Sources/SPIRV/SpvBuilder.h
similarity index 100%
rename from Modules/glslang/SPIRV/SpvBuilder.h
rename to Modules/glslang/Sources/SPIRV/SpvBuilder.h
diff --git a/Modules/glslang/SPIRV/SpvPostProcess.cpp b/Modules/glslang/Sources/SPIRV/SpvPostProcess.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/SpvPostProcess.cpp
rename to Modules/glslang/Sources/SPIRV/SpvPostProcess.cpp
diff --git a/Modules/glslang/SPIRV/SpvTools.cpp b/Modules/glslang/Sources/SPIRV/SpvTools.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/SpvTools.cpp
rename to Modules/glslang/Sources/SPIRV/SpvTools.cpp
diff --git a/Modules/glslang/SPIRV/SpvTools.h b/Modules/glslang/Sources/SPIRV/SpvTools.h
similarity index 100%
rename from Modules/glslang/SPIRV/SpvTools.h
rename to Modules/glslang/Sources/SPIRV/SpvTools.h
diff --git a/Modules/glslang/SPIRV/bitutils.h b/Modules/glslang/Sources/SPIRV/bitutils.h
similarity index 100%
rename from Modules/glslang/SPIRV/bitutils.h
rename to Modules/glslang/Sources/SPIRV/bitutils.h
diff --git a/Modules/glslang/SPIRV/disassemble.cpp b/Modules/glslang/Sources/SPIRV/disassemble.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/disassemble.cpp
rename to Modules/glslang/Sources/SPIRV/disassemble.cpp
diff --git a/Modules/glslang/SPIRV/disassemble.h b/Modules/glslang/Sources/SPIRV/disassemble.h
similarity index 100%
rename from Modules/glslang/SPIRV/disassemble.h
rename to Modules/glslang/Sources/SPIRV/disassemble.h
diff --git a/Modules/glslang/SPIRV/doc.cpp b/Modules/glslang/Sources/SPIRV/doc.cpp
similarity index 100%
rename from Modules/glslang/SPIRV/doc.cpp
rename to Modules/glslang/Sources/SPIRV/doc.cpp
diff --git a/Modules/glslang/SPIRV/doc.h b/Modules/glslang/Sources/SPIRV/doc.h
similarity index 100%
rename from Modules/glslang/SPIRV/doc.h
rename to Modules/glslang/Sources/SPIRV/doc.h
diff --git a/Modules/glslang/SPIRV/hex_float.h b/Modules/glslang/Sources/SPIRV/hex_float.h
similarity index 100%
rename from Modules/glslang/SPIRV/hex_float.h
rename to Modules/glslang/Sources/SPIRV/hex_float.h
diff --git a/Modules/glslang/SPIRV/spirv.hpp b/Modules/glslang/Sources/SPIRV/spirv.hpp
similarity index 100%
rename from Modules/glslang/SPIRV/spirv.hpp
rename to Modules/glslang/Sources/SPIRV/spirv.hpp
diff --git a/Modules/glslang/SPIRV/spvIR.h b/Modules/glslang/Sources/SPIRV/spvIR.h
similarity index 100%
rename from Modules/glslang/SPIRV/spvIR.h
rename to Modules/glslang/Sources/SPIRV/spvIR.h
diff --git a/Modules/glslang/glslang/CInterface/glslang_c_interface.cpp b/Modules/glslang/Sources/glslang/CInterface/glslang_c_interface.cpp
similarity index 100%
rename from Modules/glslang/glslang/CInterface/glslang_c_interface.cpp
rename to Modules/glslang/Sources/glslang/CInterface/glslang_c_interface.cpp
diff --git a/Modules/glslang/glslang/CMakeLists.txt b/Modules/glslang/Sources/glslang/CMakeLists.txt
similarity index 100%
rename from Modules/glslang/glslang/CMakeLists.txt
rename to Modules/glslang/Sources/glslang/CMakeLists.txt
diff --git a/Modules/glslang/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl b/Modules/glslang/Sources/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl
similarity index 100%
rename from Modules/glslang/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl
rename to Modules/glslang/Sources/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl
diff --git a/Modules/glslang/glslang/GenericCodeGen/CodeGen.cpp b/Modules/glslang/Sources/glslang/GenericCodeGen/CodeGen.cpp
similarity index 100%
rename from Modules/glslang/glslang/GenericCodeGen/CodeGen.cpp
rename to Modules/glslang/Sources/glslang/GenericCodeGen/CodeGen.cpp
diff --git a/Modules/glslang/glslang/GenericCodeGen/Link.cpp b/Modules/glslang/Sources/glslang/GenericCodeGen/Link.cpp
similarity index 100%
rename from Modules/glslang/glslang/GenericCodeGen/Link.cpp
rename to Modules/glslang/Sources/glslang/GenericCodeGen/Link.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslAttributes.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslAttributes.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslAttributes.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslAttributes.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslAttributes.h b/Modules/glslang/Sources/glslang/HLSL/hlslAttributes.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslAttributes.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslAttributes.h
diff --git a/Modules/glslang/glslang/HLSL/hlslGrammar.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslGrammar.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslGrammar.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslGrammar.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslGrammar.h b/Modules/glslang/Sources/glslang/HLSL/hlslGrammar.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslGrammar.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslGrammar.h
diff --git a/Modules/glslang/glslang/HLSL/hlslOpMap.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslOpMap.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslOpMap.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslOpMap.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslOpMap.h b/Modules/glslang/Sources/glslang/HLSL/hlslOpMap.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslOpMap.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslOpMap.h
diff --git a/Modules/glslang/glslang/HLSL/hlslParseHelper.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslParseHelper.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslParseHelper.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslParseHelper.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslParseHelper.h b/Modules/glslang/Sources/glslang/HLSL/hlslParseHelper.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslParseHelper.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslParseHelper.h
diff --git a/Modules/glslang/glslang/HLSL/hlslParseables.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslParseables.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslParseables.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslParseables.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslParseables.h b/Modules/glslang/Sources/glslang/HLSL/hlslParseables.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslParseables.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslParseables.h
diff --git a/Modules/glslang/glslang/HLSL/hlslScanContext.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslScanContext.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslScanContext.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslScanContext.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslScanContext.h b/Modules/glslang/Sources/glslang/HLSL/hlslScanContext.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslScanContext.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslScanContext.h
diff --git a/Modules/glslang/glslang/HLSL/hlslTokenStream.cpp b/Modules/glslang/Sources/glslang/HLSL/hlslTokenStream.cpp
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslTokenStream.cpp
rename to Modules/glslang/Sources/glslang/HLSL/hlslTokenStream.cpp
diff --git a/Modules/glslang/glslang/HLSL/hlslTokenStream.h b/Modules/glslang/Sources/glslang/HLSL/hlslTokenStream.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslTokenStream.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslTokenStream.h
diff --git a/Modules/glslang/glslang/HLSL/hlslTokens.h b/Modules/glslang/Sources/glslang/HLSL/hlslTokens.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/hlslTokens.h
rename to Modules/glslang/Sources/glslang/HLSL/hlslTokens.h
diff --git a/Modules/glslang/glslang/HLSL/pch.h b/Modules/glslang/Sources/glslang/HLSL/pch.h
similarity index 100%
rename from Modules/glslang/glslang/HLSL/pch.h
rename to Modules/glslang/Sources/glslang/HLSL/pch.h
diff --git a/Modules/glslang/glslang/Include/BaseTypes.h b/Modules/glslang/Sources/glslang/Include/BaseTypes.h
similarity index 100%
rename from Modules/glslang/glslang/Include/BaseTypes.h
rename to Modules/glslang/Sources/glslang/Include/BaseTypes.h
diff --git a/Modules/glslang/glslang/Include/Common.h b/Modules/glslang/Sources/glslang/Include/Common.h
similarity index 100%
rename from Modules/glslang/glslang/Include/Common.h
rename to Modules/glslang/Sources/glslang/Include/Common.h
diff --git a/Modules/glslang/glslang/Include/ConstantUnion.h b/Modules/glslang/Sources/glslang/Include/ConstantUnion.h
similarity index 100%
rename from Modules/glslang/glslang/Include/ConstantUnion.h
rename to Modules/glslang/Sources/glslang/Include/ConstantUnion.h
diff --git a/Modules/glslang/glslang/Include/InfoSink.h b/Modules/glslang/Sources/glslang/Include/InfoSink.h
similarity index 100%
rename from Modules/glslang/glslang/Include/InfoSink.h
rename to Modules/glslang/Sources/glslang/Include/InfoSink.h
diff --git a/Modules/glslang/glslang/Include/InitializeGlobals.h b/Modules/glslang/Sources/glslang/Include/InitializeGlobals.h
similarity index 100%
rename from Modules/glslang/glslang/Include/InitializeGlobals.h
rename to Modules/glslang/Sources/glslang/Include/InitializeGlobals.h
diff --git a/Modules/glslang/glslang/Include/PoolAlloc.h b/Modules/glslang/Sources/glslang/Include/PoolAlloc.h
similarity index 100%
rename from Modules/glslang/glslang/Include/PoolAlloc.h
rename to Modules/glslang/Sources/glslang/Include/PoolAlloc.h
diff --git a/Modules/glslang/glslang/Include/ResourceLimits.h b/Modules/glslang/Sources/glslang/Include/ResourceLimits.h
similarity index 100%
rename from Modules/glslang/glslang/Include/ResourceLimits.h
rename to Modules/glslang/Sources/glslang/Include/ResourceLimits.h
diff --git a/Modules/glslang/glslang/Include/ShHandle.h b/Modules/glslang/Sources/glslang/Include/ShHandle.h
similarity index 100%
rename from Modules/glslang/glslang/Include/ShHandle.h
rename to Modules/glslang/Sources/glslang/Include/ShHandle.h
diff --git a/Modules/glslang/glslang/Include/SpirvIntrinsics.h b/Modules/glslang/Sources/glslang/Include/SpirvIntrinsics.h
similarity index 100%
rename from Modules/glslang/glslang/Include/SpirvIntrinsics.h
rename to Modules/glslang/Sources/glslang/Include/SpirvIntrinsics.h
diff --git a/Modules/glslang/glslang/Include/Types.h b/Modules/glslang/Sources/glslang/Include/Types.h
similarity index 100%
rename from Modules/glslang/glslang/Include/Types.h
rename to Modules/glslang/Sources/glslang/Include/Types.h
diff --git a/Modules/glslang/glslang/Include/arrays.h b/Modules/glslang/Sources/glslang/Include/arrays.h
similarity index 100%
rename from Modules/glslang/glslang/Include/arrays.h
rename to Modules/glslang/Sources/glslang/Include/arrays.h
diff --git a/Modules/glslang/glslang/Include/glslang_c_interface.h b/Modules/glslang/Sources/glslang/Include/glslang_c_interface.h
similarity index 100%
rename from Modules/glslang/glslang/Include/glslang_c_interface.h
rename to Modules/glslang/Sources/glslang/Include/glslang_c_interface.h
diff --git a/Modules/glslang/glslang/Include/glslang_c_shader_types.h b/Modules/glslang/Sources/glslang/Include/glslang_c_shader_types.h
similarity index 100%
rename from Modules/glslang/glslang/Include/glslang_c_shader_types.h
rename to Modules/glslang/Sources/glslang/Include/glslang_c_shader_types.h
diff --git a/Modules/glslang/glslang/Include/intermediate.h b/Modules/glslang/Sources/glslang/Include/intermediate.h
similarity index 100%
rename from Modules/glslang/glslang/Include/intermediate.h
rename to Modules/glslang/Sources/glslang/Include/intermediate.h
diff --git a/Modules/glslang/glslang/MachineIndependent/Constant.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/Constant.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Constant.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/Constant.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/InfoSink.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/InfoSink.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/InfoSink.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/InfoSink.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/Initialize.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/Initialize.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Initialize.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/Initialize.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/Initialize.h b/Modules/glslang/Sources/glslang/MachineIndependent/Initialize.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Initialize.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/Initialize.h
diff --git a/Modules/glslang/glslang/MachineIndependent/IntermTraverse.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/IntermTraverse.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/IntermTraverse.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/IntermTraverse.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/Intermediate.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/Intermediate.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Intermediate.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/Intermediate.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/LiveTraverser.h b/Modules/glslang/Sources/glslang/MachineIndependent/LiveTraverser.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/LiveTraverser.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/LiveTraverser.h
diff --git a/Modules/glslang/glslang/MachineIndependent/ParseContextBase.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/ParseContextBase.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/ParseContextBase.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/ParseContextBase.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/ParseHelper.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/ParseHelper.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/ParseHelper.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/ParseHelper.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/ParseHelper.h b/Modules/glslang/Sources/glslang/MachineIndependent/ParseHelper.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/ParseHelper.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/ParseHelper.h
diff --git a/Modules/glslang/glslang/MachineIndependent/PoolAlloc.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/PoolAlloc.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/PoolAlloc.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/PoolAlloc.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/RemoveTree.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/RemoveTree.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/RemoveTree.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/RemoveTree.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/RemoveTree.h b/Modules/glslang/Sources/glslang/MachineIndependent/RemoveTree.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/RemoveTree.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/RemoveTree.h
diff --git a/Modules/glslang/glslang/MachineIndependent/Scan.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/Scan.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Scan.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/Scan.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/Scan.h b/Modules/glslang/Sources/glslang/MachineIndependent/Scan.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Scan.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/Scan.h
diff --git a/Modules/glslang/glslang/MachineIndependent/ScanContext.h b/Modules/glslang/Sources/glslang/MachineIndependent/ScanContext.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/ScanContext.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/ScanContext.h
diff --git a/Modules/glslang/glslang/MachineIndependent/ShaderLang.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/ShaderLang.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/ShaderLang.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/ShaderLang.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/SpirvIntrinsics.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/SpirvIntrinsics.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/SymbolTable.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/SymbolTable.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/SymbolTable.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/SymbolTable.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/SymbolTable.h b/Modules/glslang/Sources/glslang/MachineIndependent/SymbolTable.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/SymbolTable.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/SymbolTable.h
diff --git a/Modules/glslang/glslang/MachineIndependent/Versions.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/Versions.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Versions.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/Versions.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/Versions.h b/Modules/glslang/Sources/glslang/MachineIndependent/Versions.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/Versions.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/Versions.h
diff --git a/Modules/glslang/glslang/MachineIndependent/attribute.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/attribute.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/attribute.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/attribute.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/attribute.h b/Modules/glslang/Sources/glslang/MachineIndependent/attribute.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/attribute.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/attribute.h
diff --git a/Modules/glslang/glslang/MachineIndependent/gl_types.h b/Modules/glslang/Sources/glslang/MachineIndependent/gl_types.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/gl_types.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/gl_types.h
diff --git a/Modules/glslang/glslang/MachineIndependent/glslang.m4 b/Modules/glslang/Sources/glslang/MachineIndependent/glslang.m4
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/glslang.m4
rename to Modules/glslang/Sources/glslang/MachineIndependent/glslang.m4
diff --git a/Modules/glslang/glslang/MachineIndependent/glslang.y b/Modules/glslang/Sources/glslang/MachineIndependent/glslang.y
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/glslang.y
rename to Modules/glslang/Sources/glslang/MachineIndependent/glslang.y
diff --git a/Modules/glslang/glslang/MachineIndependent/glslang_tab.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/glslang_tab.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/glslang_tab.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/glslang_tab.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/glslang_tab.cpp.h b/Modules/glslang/Sources/glslang/MachineIndependent/glslang_tab.cpp.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/glslang_tab.cpp.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/glslang_tab.cpp.h
diff --git a/Modules/glslang/glslang/MachineIndependent/intermOut.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/intermOut.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/intermOut.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/intermOut.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/iomapper.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/iomapper.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/iomapper.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/iomapper.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/iomapper.h b/Modules/glslang/Sources/glslang/MachineIndependent/iomapper.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/iomapper.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/iomapper.h
diff --git a/Modules/glslang/glslang/MachineIndependent/limits.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/limits.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/limits.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/limits.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/linkValidate.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/linkValidate.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/linkValidate.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/linkValidate.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/localintermediate.h b/Modules/glslang/Sources/glslang/MachineIndependent/localintermediate.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/localintermediate.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/localintermediate.h
diff --git a/Modules/glslang/glslang/MachineIndependent/parseConst.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/parseConst.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/parseConst.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/parseConst.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/parseVersions.h b/Modules/glslang/Sources/glslang/MachineIndependent/parseVersions.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/parseVersions.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/parseVersions.h
diff --git a/Modules/glslang/glslang/MachineIndependent/pch.h b/Modules/glslang/Sources/glslang/MachineIndependent/pch.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/pch.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/pch.h
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/Pp.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/Pp.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpAtom.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpAtom.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpContext.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpContext.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/PpContext.h b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpContext.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/PpContext.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpContext.h
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpScanner.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpScanner.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpTokens.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpTokens.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h b/Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpTokens.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/preprocessor/PpTokens.h
diff --git a/Modules/glslang/glslang/MachineIndependent/propagateNoContraction.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/propagateNoContraction.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/propagateNoContraction.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/propagateNoContraction.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/propagateNoContraction.h b/Modules/glslang/Sources/glslang/MachineIndependent/propagateNoContraction.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/propagateNoContraction.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/propagateNoContraction.h
diff --git a/Modules/glslang/glslang/MachineIndependent/reflection.cpp b/Modules/glslang/Sources/glslang/MachineIndependent/reflection.cpp
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/reflection.cpp
rename to Modules/glslang/Sources/glslang/MachineIndependent/reflection.cpp
diff --git a/Modules/glslang/glslang/MachineIndependent/reflection.h b/Modules/glslang/Sources/glslang/MachineIndependent/reflection.h
similarity index 100%
rename from Modules/glslang/glslang/MachineIndependent/reflection.h
rename to Modules/glslang/Sources/glslang/MachineIndependent/reflection.h
diff --git a/Modules/glslang/glslang/OSDependent/Unix/CMakeLists.txt b/Modules/glslang/Sources/glslang/OSDependent/Unix/CMakeLists.txt
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Unix/CMakeLists.txt
rename to Modules/glslang/Sources/glslang/OSDependent/Unix/CMakeLists.txt
diff --git a/Modules/glslang/glslang/OSDependent/Unix/ossource.cpp b/Modules/glslang/Sources/glslang/OSDependent/Unix/ossource.cpp
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Unix/ossource.cpp
rename to Modules/glslang/Sources/glslang/OSDependent/Unix/ossource.cpp
diff --git a/Modules/glslang/glslang/OSDependent/Web/CMakeLists.txt b/Modules/glslang/Sources/glslang/OSDependent/Web/CMakeLists.txt
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Web/CMakeLists.txt
rename to Modules/glslang/Sources/glslang/OSDependent/Web/CMakeLists.txt
diff --git a/Modules/glslang/glslang/OSDependent/Web/glslang.after.js b/Modules/glslang/Sources/glslang/OSDependent/Web/glslang.after.js
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Web/glslang.after.js
rename to Modules/glslang/Sources/glslang/OSDependent/Web/glslang.after.js
diff --git a/Modules/glslang/glslang/OSDependent/Web/glslang.js.cpp b/Modules/glslang/Sources/glslang/OSDependent/Web/glslang.js.cpp
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Web/glslang.js.cpp
rename to Modules/glslang/Sources/glslang/OSDependent/Web/glslang.js.cpp
diff --git a/Modules/glslang/glslang/OSDependent/Web/glslang.pre.js b/Modules/glslang/Sources/glslang/OSDependent/Web/glslang.pre.js
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Web/glslang.pre.js
rename to Modules/glslang/Sources/glslang/OSDependent/Web/glslang.pre.js
diff --git a/Modules/glslang/glslang/OSDependent/Windows/CMakeLists.txt b/Modules/glslang/Sources/glslang/OSDependent/Windows/CMakeLists.txt
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Windows/CMakeLists.txt
rename to Modules/glslang/Sources/glslang/OSDependent/Windows/CMakeLists.txt
diff --git a/Modules/glslang/glslang/OSDependent/Windows/ossource.cpp b/Modules/glslang/Sources/glslang/OSDependent/Windows/ossource.cpp
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/Windows/ossource.cpp
rename to Modules/glslang/Sources/glslang/OSDependent/Windows/ossource.cpp
diff --git a/Modules/glslang/glslang/OSDependent/osinclude.h b/Modules/glslang/Sources/glslang/OSDependent/osinclude.h
similarity index 100%
rename from Modules/glslang/glslang/OSDependent/osinclude.h
rename to Modules/glslang/Sources/glslang/OSDependent/osinclude.h
diff --git a/Modules/glslang/glslang/Public/ResourceLimits.h b/Modules/glslang/Sources/glslang/Public/ResourceLimits.h
similarity index 100%
rename from Modules/glslang/glslang/Public/ResourceLimits.h
rename to Modules/glslang/Sources/glslang/Public/ResourceLimits.h
diff --git a/Modules/glslang/glslang/Public/ShaderLang.h b/Modules/glslang/Sources/glslang/Public/ShaderLang.h
similarity index 100%
rename from Modules/glslang/glslang/Public/ShaderLang.h
rename to Modules/glslang/Sources/glslang/Public/ShaderLang.h
diff --git a/Modules/glslang/glslang/Public/resource_limits_c.h b/Modules/glslang/Sources/glslang/Public/resource_limits_c.h
similarity index 100%
rename from Modules/glslang/glslang/Public/resource_limits_c.h
rename to Modules/glslang/Sources/glslang/Public/resource_limits_c.h
diff --git a/Modules/glslang/glslang/ResourceLimits/ResourceLimits.cpp b/Modules/glslang/Sources/glslang/ResourceLimits/ResourceLimits.cpp
similarity index 100%
rename from Modules/glslang/glslang/ResourceLimits/ResourceLimits.cpp
rename to Modules/glslang/Sources/glslang/ResourceLimits/ResourceLimits.cpp
diff --git a/Modules/glslang/glslang/ResourceLimits/resource_limits_c.cpp b/Modules/glslang/Sources/glslang/ResourceLimits/resource_limits_c.cpp
similarity index 100%
rename from Modules/glslang/glslang/ResourceLimits/resource_limits_c.cpp
rename to Modules/glslang/Sources/glslang/ResourceLimits/resource_limits_c.cpp
diff --git a/Modules/glslang/glslang/build_info.h b/Modules/glslang/Sources/glslang/build_info.h
similarity index 100%
rename from Modules/glslang/glslang/build_info.h
rename to Modules/glslang/Sources/glslang/build_info.h
diff --git a/Modules/glslang/glslang/updateGrammar b/Modules/glslang/Sources/glslang/updateGrammar
similarity index 100%
rename from Modules/glslang/glslang/updateGrammar
rename to Modules/glslang/Sources/glslang/updateGrammar
diff --git a/Modules/libpng/Package.swift b/Modules/libpng/Package.swift
index 94c4f8d25..3c40442cd 100644
--- a/Modules/libpng/Package.swift
+++ b/Modules/libpng/Package.swift
@@ -48,6 +48,10 @@ let package = Package(
publicHeadersPath: "include",
cSettings: [
.define("PNG_ARM_NEON_OPT", to: useNeon ? "2" : "0")
- ])
+ ],
+ linkerSettings: [
+ .linkedFramework("z", .when(platforms: [.linux]))
+ ]
+ )
]
)
diff --git a/Sources/AtlasFontGenerator/AtlasFontGenerator.cpp b/Modules/msdf-atlas-gen/AtlasFontGenerator/AtlasFontGenerator.cpp
similarity index 100%
rename from Sources/AtlasFontGenerator/AtlasFontGenerator.cpp
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/AtlasFontGenerator.cpp
diff --git a/Sources/AtlasFontGenerator/AtlasFontGenerator.h b/Modules/msdf-atlas-gen/AtlasFontGenerator/AtlasFontGenerator.h
similarity index 100%
rename from Sources/AtlasFontGenerator/AtlasFontGenerator.h
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/AtlasFontGenerator.h
diff --git a/Sources/AtlasFontGenerator/BUILD.bazel b/Modules/msdf-atlas-gen/AtlasFontGenerator/BUILD.bazel
similarity index 100%
rename from Sources/AtlasFontGenerator/BUILD.bazel
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/BUILD.bazel
diff --git a/Sources/AtlasFontGenerator/FontHolder.cpp b/Modules/msdf-atlas-gen/AtlasFontGenerator/FontHolder.cpp
similarity index 100%
rename from Sources/AtlasFontGenerator/FontHolder.cpp
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/FontHolder.cpp
diff --git a/Sources/AtlasFontGenerator/FontHolder.h b/Modules/msdf-atlas-gen/AtlasFontGenerator/FontHolder.h
similarity index 100%
rename from Sources/AtlasFontGenerator/FontHolder.h
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/FontHolder.h
diff --git a/Sources/AtlasFontGenerator/atlas_font_gen.cpp b/Modules/msdf-atlas-gen/AtlasFontGenerator/atlas_font_gen.cpp
similarity index 100%
rename from Sources/AtlasFontGenerator/atlas_font_gen.cpp
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/atlas_font_gen.cpp
diff --git a/Sources/AtlasFontGenerator/include/atlas_font_gen.h b/Modules/msdf-atlas-gen/AtlasFontGenerator/include/atlas_font_gen.h
similarity index 100%
rename from Sources/AtlasFontGenerator/include/atlas_font_gen.h
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/include/atlas_font_gen.h
diff --git a/Sources/AtlasFontGenerator/module.modulemap b/Modules/msdf-atlas-gen/AtlasFontGenerator/module.modulemap
similarity index 100%
rename from Sources/AtlasFontGenerator/module.modulemap
rename to Modules/msdf-atlas-gen/AtlasFontGenerator/module.modulemap
diff --git a/Modules/msdf-atlas-gen/Package.swift b/Modules/msdf-atlas-gen/Package.swift
index abf8a708b..b2f1b9881 100644
--- a/Modules/msdf-atlas-gen/Package.swift
+++ b/Modules/msdf-atlas-gen/Package.swift
@@ -14,13 +14,20 @@ let package = Package(
],
products: [
.library(
- name: "MSDFAtlasGen",
- targets: ["MSDFAtlasGen"]
+ name: "AtlasFontGenerator",
+ targets: ["AtlasFontGenerator"]
)
],
targets: [
.target(
- name: "MSDFGen",
+ name: "AtlasFontGenerator",
+ dependencies: [
+ "MSDFAtlasGen",
+ ],
+ path: "AtlasFontGenerator"
+ ),
+ .target(
+ name: "msdfgen",
dependencies: [
"freetype",
"tinyxml"
@@ -35,7 +42,7 @@ let package = Package(
.target(
name: "MSDFAtlasGen",
dependencies: [
- "MSDFGen"
+ "msdfgen"
],
path: "msdf-atlas-gen",
publicHeadersPath: ".",
diff --git a/Package.swift b/Package.swift
index 6c8e5c217..5878ac1ea 100644
--- a/Package.swift
+++ b/Package.swift
@@ -23,7 +23,7 @@ import Glibc
import WinSDK
#endif
-let isVulkanEnabled = false
+let isVulkanEnabled = true
#endif
let applePlatforms: [Platform] = [.iOS, .macOS, .tvOS, .watchOS, .visionOS]
@@ -92,7 +92,9 @@ var swiftSettings: [SwiftSetting] = [
if isVulkanEnabled {
swiftSettings.append(.define("VULKAN"))
} else {
+ #if canImport(Metal)
swiftSettings.append(.define("METAL"))
+ #endif
}
let editorTarget: Target = .executableTarget(
@@ -129,18 +131,21 @@ var adaEngineDependencies: [Target.Dependency] = [
.product(name: "Collections", package: "swift-collections"),
.product(name: "BitCollections", package: "swift-collections"),
.product(name: "Logging", package: "swift-log"),
+ .product(name: "AtlasFontGenerator", package: "msdf-atlas-gen"),
+ .product(name: "SPIRVCompiler", package: "glslang"),
"miniaudio",
- "AtlasFontGenerator",
"Yams",
"libpng",
"SPIRV-Cross",
- "SPIRVCompiler",
"box2d",
"AdaEngineMacros"
]
#if os(Linux)
-adaEngineDependencies += ["X11"]
+adaEngineDependencies += [
+ "Wayland",
+ // "OpenGL"
+]
#endif
let adaEngineTarget: Target = .target(
@@ -155,7 +160,8 @@ let adaEngineTarget: Target = .target(
.copy("Assets/Images")
],
cSettings: [
- .define("GL_SILENCE_DEPRECATION")
+ .define("GL_SILENCE_DEPRECATION", .when(platforms: applePlatforms)),
+ .define("GL_GLEXT_PROTOTYPES", .when(platforms: [.android, .linux, .windows])),
],
swiftSettings: adaEngineSwiftSettings,
plugins: commonPlugins
@@ -200,38 +206,25 @@ var targets: [Target] = [
// MARK: Extra
-#if os(Android) || os(Linux)
+#if os(Linux)
targets += [
.systemLibrary(
- name: "X11",
- pkgConfig: "x11",
- providers: [
- .apt(["libx11-dev"])
- ]),
-]
-#endif
-
-// MARK: - CXX Internal Targets
-
-targets += [
- .target(
- name: "AtlasFontGenerator",
- dependencies: [
- .product(name: "MSDFAtlasGen", package: "msdf-atlas-gen")
- ],
- publicHeadersPath: "include"
+ name: "Wayland",
+ pkgConfig: "wayland-client",
+ providers: [.apt(["libwayland-dev"])]
),
- .target(
- name: "SPIRVCompiler",
- dependencies: [
- "glslang"
- ],
- publicHeadersPath: ".",
- linkerSettings: [
- .linkedLibrary("m", .when(platforms: [.linux]))
- ]
- )
+ // .systemLibrary(
+ // name: "X11",
+ // pkgConfig: "x11",
+ // providers: [.apt(["libx11-dev"])]
+ // ),
+ // .systemLibrary(
+ // name: "OpenGL",
+ // pkgConfig: "gl",
+ // providers: [.apt(["libglu1-mesa-dev", "mesa-common-dev"])]
+ // ),
]
+#endif
// MARK: - Tests
@@ -315,6 +308,10 @@ if isVulkanEnabled {
// Windows
.define("VK_USE_PLATFORM_WIN32_KHR", .when(platforms: [.windows])),
+
+ // Linux
+ .define("VK_USE_PLATFORM_XCB_KHR", .when(platforms: [.linux])),
+ .define("VK_USE_PLATFORM_WAYLAND_KHR", .when(platforms: [.linux])),
]
),
.systemLibrary(
diff --git a/Sources/AdaEngine/Application/AppCreate/AppContext.swift b/Sources/AdaEngine/Application/AppCreate/AppContext.swift
index 1467728cc..c9e620126 100644
--- a/Sources/AdaEngine/Application/AppCreate/AppContext.swift
+++ b/Sources/AdaEngine/Application/AppCreate/AppContext.swift
@@ -15,6 +15,12 @@ public final class AppContext {
private var application: Application!
init() throws {
+ #if METAL
+ /// By default, the render backend is set to Vulkan.
+ /// But if the Metal backend is available, it will be used instead.
+ RenderEngine.configurations.renderBackend = .metal
+ #endif
+
self.app = T.init()
let argc = CommandLine.argc
@@ -46,6 +52,7 @@ public final class AppContext {
}
@_spi(Internal)
+ @MainActor
public func setup() async throws {
try ResourceManager.initialize()
try AudioServer.initialize()
diff --git a/Sources/AdaEngine/Application/Application.swift b/Sources/AdaEngine/Application/Application.swift
index e168f98b7..d7da4018d 100644
--- a/Sources/AdaEngine/Application/Application.swift
+++ b/Sources/AdaEngine/Application/Application.swift
@@ -10,9 +10,6 @@
/// To get access to the application instance, use static property `shared`
@MainActor
open class Application {
-
- // MARK: - Public
-
/// Contains application instance if application created from ``App``.
@MainActor public internal(set) static var shared: Application!
@@ -38,10 +35,14 @@ open class Application {
return .android
#endif
}
+
+ public class var windowManagerClass: UIWindowManager.Type {
+ UIWindowManager.self
+ }
@_spi(Internal)
- @MainActor @preconcurrency
- public var windowManager: UIWindowManager = UIWindowManager()
+ @preconcurrency
+ public let windowManager: UIWindowManager
/// Contains world which can render on screen.
public let renderWorld = RenderWorld()
@@ -51,7 +52,9 @@ open class Application {
public init(
argc: Int32,
argv: UnsafeMutablePointer?>
- ) throws { }
+ ) throws {
+ self.windowManager = Self.windowManagerClass.init()
+ }
/// Call this method to start main loop.
func run() throws {
@@ -61,13 +64,11 @@ open class Application {
// MARK: - Public methods
/// Call this method to terminate app execution with 0 status code.
- @MainActor
open func terminate() {
exit(EXIT_SUCCESS)
}
/// Method to open url.
- @MainActor
@discardableResult
open func openURL(_ url: URL) -> Bool {
assertionFailure("Not implemented")
@@ -75,7 +76,6 @@ open class Application {
}
/// Call this method to show specific alert.
- @MainActor
open func showAlert(_ alert: Alert) {
assertionFailure("Not implemented")
}
diff --git a/Sources/AdaEngine/GameLoop.swift b/Sources/AdaEngine/GameLoop.swift
index aa0344ade..3b3eaaa52 100644
--- a/Sources/AdaEngine/GameLoop.swift
+++ b/Sources/AdaEngine/GameLoop.swift
@@ -13,7 +13,7 @@ public final class GameLoop {
public private(set) static var current: GameLoop = GameLoop()
private var lastUpdate: LongTimeInterval = 0
-
+ private var error: Error?
private(set) var isIterating = false
private var isFirstTick: Bool = true
@@ -24,36 +24,46 @@ public final class GameLoop {
let physicsTickPerSecond = Engine.shared.physicsTickPerSecond
self.fixedTimestep.step = 1 / TimeInterval(physicsTickPerSecond)
}
-
- public func iterate() async throws {
- if self.isIterating {
- return
+
+ public func iterate() throws {
+ if let error = self.error {
+ throw error
}
- self.isIterating = true
- defer { self.isIterating = false }
+ Task { @MainActor in
+ do {
+ if self.isIterating {
+ return
+ }
- let now = Time.absolute
- let deltaTime = TimeInterval(max(0, now - self.lastUpdate))
- self.lastUpdate = now
+ self.isIterating = true
+ defer { self.isIterating = false }
- // that little hack to avoid big delta in the first tick, because delta is equals Time.absolute value.
- if self.isFirstTick {
- self.isFirstTick = false
- return
- }
+ let now = Time.absolute
+ let deltaTime = TimeInterval(max(0, now - self.lastUpdate))
+ self.lastUpdate = now
- EventManager.default.send(EngineEvents.GameLoopBegan(deltaTime: deltaTime))
+ // that little hack to avoid big delta in the first tick, because delta is equals Time.absolute value.
+ if self.isFirstTick {
+ self.isFirstTick = false
+ return
+ }
- try RenderEngine.shared.beginFrame()
+ EventManager.default.send(EngineEvents.GameLoopBegan(deltaTime: deltaTime))
- try await Application.shared.renderWorld.update(deltaTime)
- await Application.shared.windowManager.update(deltaTime)
+ try RenderEngine.shared.beginFrame()
- try RenderEngine.shared.endFrame()
+ try await Application.shared.renderWorld.update(deltaTime)
+ await Application.shared.windowManager.update(deltaTime)
- Input.shared.removeEvents()
+ try RenderEngine.shared.endFrame()
- FPSCounter.shared.tick()
+ Input.shared.removeEvents()
+
+ FPSCounter.shared.tick()
+ } catch {
+ self.error = error
+ }
+ }
}
}
diff --git a/Sources/AdaEngine/Platforms/Apple/iOS/iOSApplication.swift b/Sources/AdaEngine/Platforms/Apple/iOS/iOSApplication.swift
index e2d61e0a3..f08a65302 100644
--- a/Sources/AdaEngine/Platforms/Apple/iOS/iOSApplication.swift
+++ b/Sources/AdaEngine/Platforms/Apple/iOS/iOSApplication.swift
@@ -12,8 +12,12 @@ import UIKit
@MainActor
final class iOSApplication: Application {
- let argc: Int32
- let argv: UnsafeMutablePointer?>
+ private let argc: Int32
+ private let argv: UnsafeMutablePointer?>
+
+ override class var windowManagerClass: UIWindowManager.Type {
+ iOSWindowManager.self
+ }
var displayLink: CADisplayLink!
@@ -22,7 +26,6 @@ final class iOSApplication: Application {
self.argc = argc
try super.init(argc: argc, argv: argv)
- self.windowManager = iOSWindowManager()
}
override func run() throws {
diff --git a/Sources/AdaEngine/Platforms/Apple/iOS/iOSWindowManager.swift b/Sources/AdaEngine/Platforms/Apple/iOS/iOSWindowManager.swift
index f14baf553..54880a2df 100644
--- a/Sources/AdaEngine/Platforms/Apple/iOS/iOSWindowManager.swift
+++ b/Sources/AdaEngine/Platforms/Apple/iOS/iOSWindowManager.swift
@@ -12,7 +12,6 @@ import UIKit
final class iOSWindowManager: WindowManager {
override func createWindow(for window: Window) {
-
let screen = UIScreen.main
let frame = screen.bounds.toEngineRect
@@ -46,9 +45,7 @@ final class iOSWindowManager: WindowManager {
}
uiWindow.makeKeyAndVisible()
-
window.windowDidAppear()
-
self.setActiveWindow(window)
}
diff --git a/Sources/AdaEngine/Platforms/Apple/macOS/MacAppDelegate.swift b/Sources/AdaEngine/Platforms/Apple/macOS/MacAppDelegate.swift
index bca5b4830..feb47f678 100644
--- a/Sources/AdaEngine/Platforms/Apple/macOS/MacAppDelegate.swift
+++ b/Sources/AdaEngine/Platforms/Apple/macOS/MacAppDelegate.swift
@@ -10,7 +10,13 @@ import AppKit
import MetalKit
final class MacAppDelegate: NSObject, NSApplicationDelegate {
-
+ func applicationDidFinishLaunching(_ aNotification: Notification) {
+ print("applicationDidFinishLaunching")
+ }
+
+ func applicationWillTerminate(_ aNotification: Notification) {
+ print("applicationWillTerminate")
+ }
}
#endif
diff --git a/Sources/AdaEngine/Platforms/Apple/macOS/MacApplication.swift b/Sources/AdaEngine/Platforms/Apple/macOS/MacApplication.swift
index 2d6f2c995..33f6d7ded 100644
--- a/Sources/AdaEngine/Platforms/Apple/macOS/MacApplication.swift
+++ b/Sources/AdaEngine/Platforms/Apple/macOS/MacApplication.swift
@@ -9,13 +9,35 @@
import AppKit
import MetalKit
+// This hack to avoid using NSApplication.shared.run().
+func runLoopObserverCallback(
+ observer: CFRunLoopObserver?,
+ activity: CFRunLoopActivity,
+ info: UnsafeMutableRawPointer?
+) {
+ MainActor.assumeIsolated {
+ let gameLoop = Application.shared.gameLoop
+ do {
+ if !gameLoop.isIterating {
+ try gameLoop.iterate()
+ }
+ } catch {
+ print("error", error)
+ }
+ }
+ CFRunLoopWakeUp(CFRunLoopGetCurrent())
+}
+
final class MacApplication: Application {
private let delegate = MacAppDelegate()
+ override class var windowManagerClass: UIWindowManager.Type {
+ MacOSWindowManager.self
+ }
+
override init(argc: Int32, argv: UnsafeMutablePointer?>) throws {
try super.init(argc: argc, argv: argv)
- self.windowManager = MacOSWindowManager()
// Create application
let app = AdaApplication.shared
@@ -24,36 +46,43 @@ final class MacApplication: Application {
app.finishLaunching()
app.delegate = self.delegate
- self.processEvents()
+ let observer = CFRunLoopObserverCreate(
+ kCFAllocatorDefault,
+ CFRunLoopActivity.beforeWaiting.rawValue,
+ true,
+ 0,
+ runLoopObserverCallback,
+ nil
+ )
+ CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, CFRunLoopMode.defaultMode)
+ self.processEvents()
app.activate(ignoringOtherApps: true)
}
- private var task: Task?
-
override func run() throws {
- task = Task { @MainActor in
- self.gameLoop.setup()
- do {
- while true {
- try Task.checkCancellation()
- self.processEvents()
- try await self.gameLoop.iterate()
- }
- } catch {
- let alert = Alert(title: "AdaEngine finished with Error", message: error.localizedDescription, buttons: [.cancel("OK", action: {
- exit(EXIT_FAILURE)
- })])
-
- Application.shared.showAlert(alert)
+ self.gameLoop.setup()
+ do {
+ while true {
+ self.processEvents()
+ try self.gameLoop.iterate()
}
+ } catch {
+ let alert = Alert(
+ title: "AdaEngine finished with Error", message: error.localizedDescription,
+ buttons: [
+ .cancel(
+ "OK",
+ action: {
+ exit(EXIT_FAILURE)
+ })
+ ])
+
+ Application.shared.showAlert(alert)
}
-
- NSApplication.shared.run()
}
override func terminate() {
- self.task?.cancel()
NSApplication.shared.terminate(nil)
}
@@ -77,7 +106,7 @@ final class MacApplication: Application {
}
}
- let result = nsAlert.runModal() // synchronous call
+ let result = nsAlert.runModal() // synchronous call
// hack from that thread: https://stackoverflow.com/a/59245758
let index = result.rawValue - 1000
@@ -88,7 +117,7 @@ final class MacApplication: Application {
// MARK: - Private
- func processEvents() {
+ func processEvents(_ until: Date = .distantPast) {
while true {
let event = NSApp.nextEvent(
matching: .any,
diff --git a/Sources/AdaEngine/Platforms/Apple/macOS/MacOSWindowManager.swift b/Sources/AdaEngine/Platforms/Apple/macOS/MacOSWindowManager.swift
index 243fdf88b..cee6b9fff 100644
--- a/Sources/AdaEngine/Platforms/Apple/macOS/MacOSWindowManager.swift
+++ b/Sources/AdaEngine/Platforms/Apple/macOS/MacOSWindowManager.swift
@@ -14,8 +14,6 @@ final class MacOSWindowManager: UIWindowManager {
private lazy var nsWindowDelegate = NSWindowDelegateObject(windowManager: self)
- public nonisolated override init() { }
-
private var menus: [UIWindow.ID: MacOSUIMenuBuilder] = [:]
override func createWindow(for window: UIWindow) {
diff --git a/Sources/AdaEngine/Platforms/Linux/LinuxApplication.swift b/Sources/AdaEngine/Platforms/Linux/LinuxApplication.swift
index 9d0675119..4b332d830 100644
--- a/Sources/AdaEngine/Platforms/Linux/LinuxApplication.swift
+++ b/Sources/AdaEngine/Platforms/Linux/LinuxApplication.swift
@@ -6,13 +6,64 @@
//
#if LINUX
-import X11
+import Wayland
final class LinuxApplication: Application {
- override init(argc: Int32, argv: UnsafeMutablePointer?>) throws {
- try super.init(argc: argc, argv: argv)
-
- self.windowManager = LinuxWindowManager()
+ override class var windowManagerClass: UIWindowManager.Type {
+ LinuxWindowManager.self
+ }
+
+ private var linuxWindowManager: LinuxWindowManager {
+ windowManager as! LinuxWindowManager
+ }
+
+ override func run() {
+ print("run")
+ guard let display = linuxWindowManager.display else {
+ fatalError("Display is not set")
+ }
+
+ self.gameLoop.setup()
+
+ print("setup")
+
+ do {
+ while true {
+ while wl_display_prepare_read(display) != 0 {
+ wl_display_dispatch_pending(display)
+ print("dispatch")
+ }
+ wl_display_flush(display)
+ wl_display_read_events(display)
+ wl_display_dispatch_pending(display)
+
+ try self.gameLoop.iterate()
+ print("tick")
+
+ let next = RunLoop.main.limitDate(forMode: .default)
+ let s = next?.timeIntervalSinceNow ?? 1.0
+ if s > 0.0 {
+ sleep(10)
+ }
+ }
+ } catch {
+ print("error", error)
+ }
+
+ print("Finished")
+ }
+
+ override func openURL(_ url: URL) -> Bool {
+ // TODO: Implement Wayland URL opening
+ return false
+ }
+
+ override func showAlert(_ alert: Alert) {
+ // TODO: Implement Wayland alert
+ }
+
+ func processEvents() {
+ // TODO: Implement Wayland events processing
}
}
diff --git a/Sources/AdaEngine/Platforms/Linux/LinuxWindowManager.swift b/Sources/AdaEngine/Platforms/Linux/LinuxWindowManager.swift
index d346a6189..1f9555b5b 100644
--- a/Sources/AdaEngine/Platforms/Linux/LinuxWindowManager.swift
+++ b/Sources/AdaEngine/Platforms/Linux/LinuxWindowManager.swift
@@ -6,14 +6,128 @@
//
#if LINUX
-import X11
+import Wayland
-final class LinuxWindowManager: WindowManager {
+@MainActor
+final class LinuxWindowManager: UIWindowManager {
+ private(set) var display: OpaquePointer?
+ private(set) var registry: OpaquePointer?
+ var compositor: OpaquePointer?
+ var shell: OpaquePointer?
+ var shm: OpaquePointer?
+
+ // Wayland registry listener
+ private var registryListener = wl_registry_listener(
+ global: { data, registry, id, interface, version in
+ let windowManager = Unmanaged.fromOpaque(data!).takeUnretainedValue()
+ let interfaceName = String(cString: interface!)
+ print("Wayland interface name", interfaceName)
+ switch interfaceName {
+ case "wl_compositor":
+ var wl_compositor_interface_ptr = wl_compositor_interface
+ windowManager.compositor = OpaquePointer(
+ wl_registry_bind(registry, id, &wl_compositor_interface_ptr, min(version, 4))
+ )
+ print("new compositor", windowManager.compositor)
+ case "wl_shell":
+ var wl_shell_interface_ptr = wl_shell_interface
+ windowManager.shell = OpaquePointer(
+ wl_registry_bind(registry, id, &wl_shell_interface_ptr, min(version, 1))
+ )
+ print("new shell", windowManager.shell)
+ case "wl_shm":
+ var wl_shm_interface_ptr = wl_shm_interface
+ windowManager.shm = OpaquePointer(
+ wl_registry_bind(registry, id, &wl_shm_interface_ptr, min(version, 1))
+ )
+ print("new shm", windowManager.shm)
+ default:
+ break
+ }
+ },
+ global_remove: { _, _, _ in }
+ )
+
+ required init() {
+ super.init()
+ setupWayland()
+ }
+
+ private func setupWayland() {
+ display = wl_display_connect(nil)
+ guard display != nil else {
+ fatalError("Failed to connect to Wayland display")
+ }
+
+ registry = wl_display_get_registry(display)
+ wl_registry_add_listener(registry, ®istryListener, UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()))
+ wl_display_roundtrip(display)
+ }
+
+ override func createWindow(for window: UIWindow) {
+ let minSize = UIWindow.defaultMinimumSize
+ let frame = window.frame
+ let size = frame.size == .zero ? minSize : frame.size
+
+ let waylandView = WaylandView(
+ windowId: window.id,
+ frame: frame,
+ windowManager: self
+ )
+ let sizeInt = SizeInt(width: Int(size.width), height: Int(size.height))
+
+ try? RenderEngine.shared.createWindow(window.id, for: waylandView, size: sizeInt)
+
+ window.systemWindow = waylandView
+ window.minSize = minSize
+
+ super.createWindow(for: window)
+ }
+
+ override func resizeWindow(_ window: UIWindow, size: Size) {
+ guard let waylandView = window.systemWindow as? WaylandView else { return }
+ waylandView.resize(to: size)
+ }
+
+ override func setWindowMode(_ window: UIWindow, mode: UIWindow.Mode) {
+ guard let waylandView = window.systemWindow as? WaylandView else { return }
+ waylandView.setWindowMode(mode)
+ }
- override func createWindow(for window: Window) {
- fatalErrorMethodNotImplemented()
+ override func closeWindow(_ window: UIWindow) {
+ guard let waylandView = window.systemWindow as? WaylandView else { return }
+ waylandView.close()
}
+ override func showWindow(_ window: UIWindow, isFocused: Bool) {
+ guard let waylandView = window.systemWindow as? WaylandView else { return }
+ waylandView.show(isFocused: isFocused)
+ }
+
+ override func setMinimumSize(_ size: Size, for window: UIWindow) {
+ guard let waylandView = window.systemWindow as? WaylandView else { return }
+ waylandView.setMinimumSize(size)
+ }
+
+ override func updateCursor() {
+ // Implement cursor updates for Wayland
+ }
+
+ override func getScreen(for window: UIWindow) -> Screen? {
+ // Implement screen information for Wayland
+ return nil
+ }
+
+ deinit {
+ // if let registry = registry {
+ // wl_registry_destroy(registry)
+ // }
+ // if let display = display {
+ // wl_display_disconnect(display)
+ // }
+ }
}
+extension WaylandView: RenderSurface {}
+
#endif
diff --git a/Sources/AdaEngine/Platforms/Linux/WaylandView.swift b/Sources/AdaEngine/Platforms/Linux/WaylandView.swift
new file mode 100644
index 000000000..666e2d54f
--- /dev/null
+++ b/Sources/AdaEngine/Platforms/Linux/WaylandView.swift
@@ -0,0 +1,135 @@
+#if LINUX
+import Wayland
+import Math
+
+@MainActor
+final class WaylandView: SystemWindow {
+ private(set) var surface: OpaquePointer?
+ private(set) var shellSurface: OpaquePointer?
+ private(set) var window: OpaquePointer?
+ private var frame: Rect
+ private var _title: String = ""
+ private var _position: Point = .zero
+ private var _minSize: Size = .zero
+
+ weak var windowManager: LinuxWindowManager?
+
+ let windowId: UIWindow.ID
+
+ init(
+ windowId: UIWindow.ID,
+ frame: Rect,
+ windowManager: LinuxWindowManager
+ ) {
+ self.windowId = windowId
+ self.frame = frame
+ self.windowManager = windowManager
+ setupWaylandSurface()
+ }
+
+ private func setupWaylandSurface() {
+ guard let windowManager = windowManager else {
+ fatalError("Window manager is not set")
+ }
+
+ print(#function)
+ print("Setup surface compositor", windowManager.compositor)
+
+ // Create surface
+ surface = wl_compositor_create_surface(windowManager.compositor)
+ guard surface != nil else {
+ fatalError("Failed to create Wayland surface")
+ }
+
+ // Create shell surface
+ shellSurface = wl_shell_get_shell_surface(windowManager.shell, surface)
+ guard shellSurface != nil else {
+ fatalError("Failed to create shell surface")
+ }
+
+ // Set up shell surface callbacks
+ wl_shell_surface_add_listener(shellSurface, &shellSurfaceListener, UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()))
+
+ // Set initial window properties
+ wl_shell_surface_set_title(shellSurface, _title)
+ wl_shell_surface_set_toplevel(shellSurface)
+ }
+
+ // MARK: - SystemWindow Protocol
+
+ var title: String {
+ get { _title }
+ set {
+ _title = newValue
+ wl_shell_surface_set_title(shellSurface, newValue)
+ }
+ }
+
+ var size: Size {
+ get { frame.size }
+ set {
+ frame.size = newValue
+ wl_surface_commit(surface)
+ }
+ }
+
+ var position: Point {
+ get { _position }
+ set {
+ _position = newValue
+ frame.origin = newValue
+ wl_surface_commit(surface)
+ }
+ }
+
+ func resize(to size: Size) {
+ self.size = size
+ }
+
+ func setWindowMode(_ mode: UIWindow.Mode) {
+ switch mode {
+ case .windowed:
+ wl_shell_surface_set_toplevel(shellSurface)
+ case .fullscreen:
+ fatalError("fullscreen")
+ // wl_shell_surface_set_fullscreen(shellSurface, WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, nil)
+ }
+ }
+
+ func close() {
+ if let shellSurface = shellSurface {
+ wl_shell_surface_destroy(shellSurface)
+ }
+ if let surface = surface {
+ wl_surface_destroy(surface)
+ }
+ }
+
+ func show(isFocused: Bool) {
+ wl_surface_commit(surface)
+ }
+
+ func setMinimumSize(_ size: Size) {
+ _minSize = size
+ }
+
+ deinit {
+ // close()
+ }
+}
+
+// Wayland shell surface listener
+nonisolated(unsafe)
+private var shellSurfaceListener = wl_shell_surface_listener(
+ ping: { _, shellSurface, serial in
+ wl_shell_surface_pong(shellSurface, serial)
+ },
+ configure: { _, shellSurface, edges, width, height in
+ // Handle window configuration changes
+ },
+ popup_done: { _, _ in
+ // Handle popup done event
+ }
+)
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLBuffer.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLBuffer.swift
index eff911fa5..a4a5edcc5 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLBuffer.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -73,3 +75,5 @@ extension ResourceOptions {
}
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLFramebuffer.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLFramebuffer.swift
index aa05bd3e7..7d38b8c94 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLFramebuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLFramebuffer.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -179,3 +181,5 @@ final class OpenGLFramebuffer: Framebuffer, @unchecked Sendable {
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), 0)
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLRenderPipeline.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLRenderPipeline.swift
index f6bf65d46..5f904833f 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLRenderPipeline.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLRenderPipeline.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -38,3 +40,5 @@ final class OpenGLRenderPipeline: RenderPipeline {
self.program.validate()
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLSampler.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLSampler.swift
index 5842ae924..9e23abaac 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLSampler.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLSampler.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -43,3 +45,5 @@ final class OpenGLSampler: Sampler {
glBindSampler(0, sampler)
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLShader.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLShader.swift
index 47fe0a5d7..7b87a60b3 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLShader.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLShader.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -124,3 +126,5 @@ final class OpenGLProgram: @unchecked Sendable {
glDeleteProgram(program)
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLTexture.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLTexture.swift
index 75f6f0b2d..51e44d68b 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLTexture.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLTexture.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -107,6 +109,7 @@ final class OpenGLTexture: GPUTexture {
pointer?.baseAddress
)
case .texture2DMultisample, .texture2DMultisampleArray:
+ #if !os(Linux)
glTexImage2DMultisample(
glType,
GLsizei(0),
@@ -115,6 +118,7 @@ final class OpenGLTexture: GPUTexture {
GLsizei(descriptor.height),
GLboolean(GL_TRUE)
)
+ #endif
default:
fatalErrorMethodNotImplemented()
}
@@ -272,3 +276,5 @@ struct OpenGLError: LocalizedError {
return "OpenGL error \(error)"
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLUniformBuffer.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLUniformBuffer.swift
index 30aff1491..06a2ab3bd 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLUniformBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLUniformBuffer.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -32,3 +34,4 @@ final class OpenGLUniformBuffer: OpenGLBuffer, UniformBuffer, @unchecked Sendabl
}
}
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLVertexBuffer.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLVertexBuffer.swift
index f965961c5..281fafc41 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLVertexBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/Misc/OpenGLVertexBuffer.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -28,3 +30,5 @@ final class OpenGLVertexBuffer: OpenGLBuffer, VertexBuffer, @unchecked Sendable
glBindBufferBase(target, GLuint(binding), buffer)
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLBackend.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLBackend.swift
index 3d1af04e8..0c81993ed 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLBackend.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLBackend.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -34,17 +36,6 @@ final class OpenGLBackend: RenderBackend {
init(appName: String) {
self.context = Context()
self.renderDevice = OpenGLRenderDevice(context: context)
-
- #if !METAL && DEBUG
- glEnable(GLenum(GL_DEBUG_OUTPUT))
- glEnable(GLenum(GL_DEBUG_OUTPUT_SYNCHRONOUS))
- glDebugMessageCallback({ (source: GLenum, type: GLenum, id: GLuint, severity: GLenum, length: GLsizei, message: UnsafePointer?, userParam: UnsafeMutableRawPointer?) in
- let msg = String(cString: message!)
- print("OpenGL Debug Message: \(msg)")
- }, nil)
-
- glDebugMessageControl(GLenum(GL_DONT_CARE), GLenum(GL_DONT_CARE), GLenum(GL_DEBUG_SEVERITY_NOTIFICATION), 0, nil, GLboolean(GL_FALSE))
- #endif
}
func createLocalRenderDevice() -> any RenderDevice {
@@ -76,3 +67,5 @@ final class OpenGLBackend: RenderBackend {
currentFrameIndex = (currentFrameIndex + 1) % RenderEngine.configurations.maxFramesInFlight
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLContext.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLContext.swift
index bfd4c989e..e857d229a 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLContext.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLContext.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -148,3 +150,5 @@ extension NSOpenGLContext: OpenGLContext {
}
}
#endif
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLRenderDevice.swift b/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLRenderDevice.swift
index a8aa30b83..1cc3eae11 100644
--- a/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLRenderDevice.swift
+++ b/Sources/AdaEngine/Rendering/Backends/OpenGL/OpenGLRenderDevice.swift
@@ -5,6 +5,8 @@
// Created by vladislav.prusakov on 13.03.2025.
//
+#if ENABLE_OPENGL
+
#if WASM
import WebGL
#endif
@@ -260,3 +262,5 @@ extension TriangleFillMode {
}
}
}
+
+#endif
\ No newline at end of file
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanBuffer.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanBuffer.swift
index 1bd7784e0..836f9e58f 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanBuffer.swift
@@ -9,7 +9,7 @@
import CVulkan
import Vulkan
-class VulkanBuffer: Buffer {
+class VulkanBuffer: Buffer, @unchecked Sendable {
private let buffer: Vulkan.Buffer
private unowned let logicalDevice: Device
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanFramebuffer.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanFramebuffer.swift
index 321e78bbe..17fa72071 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanFramebuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanFramebuffer.swift
@@ -10,7 +10,7 @@ import CVulkan
import Vulkan
import Math
-final class VulkanFramebuffer: Framebuffer {
+final class VulkanFramebuffer: Framebuffer, @unchecked Sendable {
private(set) var attachments: [FramebufferAttachment]
private(set) var descriptor: FramebufferDescriptor
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanIndexBuffer.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanIndexBuffer.swift
index 6a7250137..199995ce2 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanIndexBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanIndexBuffer.swift
@@ -9,7 +9,7 @@
import CVulkan
import Vulkan
-final class VulkanIndexBuffer: VulkanBuffer, IndexBuffer {
+final class VulkanIndexBuffer: VulkanBuffer, IndexBuffer, @unchecked Sendable {
let indexFormat: IndexBufferFormat
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanRenderPipeline.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanRenderPipeline.swift
index f739e79d6..ef1f9d2fe 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanRenderPipeline.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanRenderPipeline.swift
@@ -10,7 +10,7 @@
import CVulkan
import Vulkan
-class VulkanRenderPipeline: RenderPipeline {
+final class VulkanRenderPipeline: RenderPipeline, @unchecked Sendable {
let descriptor: RenderPipelineDescriptor
private unowned let device: Device
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanSampler.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanSampler.swift
index adf61b8e8..99662eeb5 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanSampler.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanSampler.swift
@@ -6,7 +6,6 @@
//
#if VULKAN
-
import CVulkan
import Vulkan
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanShader.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanShader.swift
index 13b04d22e..7d8034318 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanShader.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanShader.swift
@@ -10,7 +10,7 @@
import CVulkan
import Vulkan
-final class VulkanShader: CompiledShader {
+final class VulkanShader: CompiledShader, @unchecked Sendable {
private(set) var shaderModule: VkShaderModule
private unowned let device: Device
@@ -122,18 +122,20 @@ final class VulkanShader: CompiledShader {
layoutBindings.append(layout)
writeDescriptorSet.append(set)
}
-
- var createInfo = VkDescriptorSetLayoutCreateInfo(
- sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
- pNext: nil,
- flags: 0,
- bindingCount: UInt32(layoutBindings.count),
- pBindings: &layoutBindings
- )
-
+
var descriptorSetLayout: VkDescriptorSetLayout?
- let result = vkCreateDescriptorSetLayout(self.device.rawPointer, &createInfo, nil, &descriptorSetLayout)
+ let result = layoutBindings.withUnsafeBufferPointer { pBindings in
+ var createInfo = VkDescriptorSetLayoutCreateInfo(
+ sType: VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
+ pNext: nil,
+ flags: 0,
+ bindingCount: UInt32(layoutBindings.count),
+ pBindings: pBindings.baseAddress
+ )
+ return vkCreateDescriptorSetLayout(self.device.rawPointer, &createInfo, nil, &descriptorSetLayout)
+ }
+
if let descriptorSetLayout, result == VK_SUCCESS {
descriptorSetLayouts.append(descriptorSetLayout)
} else {
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanUniformBuffer.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanUniformBuffer.swift
index e8c3d8e5f..1afdf24de 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanUniformBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanUniformBuffer.swift
@@ -9,7 +9,7 @@
import CVulkan
import Vulkan
-final class VulkanUniformBuffer: VulkanBuffer, UniformBuffer {
+final class VulkanUniformBuffer: VulkanBuffer, UniformBuffer, @unchecked Sendable {
let binding: Int
init(
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanVertexBuffer.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanVertexBuffer.swift
index 5fcba0b32..797b88802 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanVertexBuffer.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/Misc/VulkanVertexBuffer.swift
@@ -9,7 +9,7 @@
import CVulkan
import Vulkan
-class VulkanVertexBuffer: VulkanBuffer, VertexBuffer {
+final class VulkanVertexBuffer: VulkanBuffer, VertexBuffer, @unchecked Sendable {
var binding: Int
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderBackend.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderBackend.swift
index 668270db1..88034721a 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderBackend.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderBackend.swift
@@ -126,7 +126,7 @@ extension Texture.TextureType {
}
}
-class VulkanRenderCommandBuffer: DrawCommandBuffer {
+final class VulkanRenderCommandBuffer: DrawCommandBuffer, @unchecked Sendable {
let framebuffer: VulkanFramebuffer
init(framebuffer: VulkanFramebuffer) {
diff --git a/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderContext.swift b/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderContext.swift
index c26d36b8d..234a0b0ee 100644
--- a/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderContext.swift
+++ b/Sources/AdaEngine/Rendering/Backends/Vulkan/VulkanRenderContext.swift
@@ -10,7 +10,22 @@ import Foundation
import Vulkan
import CVulkan
import Math
+
+#if canImport(WinSDK)
+import WinSDK
+#endif
+
+#if canImport(X11)
+import X11
+#endif
+
+#if canImport(Wayland)
+import Wayland
+#endif
+
+#if canImport(MetalKit)
import MetalKit
+#endif
extension VulkanRenderBackend {
@@ -273,14 +288,14 @@ extension VulkanRenderBackend {
#endif
}
+ @MainActor
func createRenderWindow(with id: UIWindow.ID, view: RenderSurface, size: Math.SizeInt) throws {
if self.windows[id] != nil {
throw ContextError.creationWindowAlreadyExists
}
let holder = VulkanUtils.TemporaryBufferHolder(label: "Create Vulkan Window")
-
- let surface = try Surface(vulkan: self.instance, view: view as! MTKView)
+ let surface = try Surface.createSurface(vulkan: self.instance, view: view)
let formats = try self.physicalDevice.surfaceFormats(for: surface)
var format: VkFormat = VK_FORMAT_UNDEFINED
@@ -462,4 +477,110 @@ extension VulkanRenderBackend {
}
}
}
+
+private extension Surface {
+ @MainActor
+ static func createSurface(vulkan: VulkanInstance, view: RenderSurface) throws -> Surface {
+ #if canImport(MetalKit)
+ guard let layer = (view as? MTKView)?.layer as? CAMetalLayer else {
+ throw VKError(code: VK_ERROR_INITIALIZATION_FAILED, message: "Can't cast layer to CAMetalLayer")
+ }
+
+ var createInfo = VkMacOSSurfaceCreateInfoMVK()
+ createInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
+ createInfo.pView = UnsafeRawPointer(Unmanaged.passUnretained(layer).toOpaque())
+
+ var surface: VkSurfaceKHR?
+ let result = withUnsafePointer(to: &createInfo) { ptr in
+ vkCreateMacOSSurfaceMVK(vulkan.pointer, ptr, nil, &surface)
+ }
+
+ guard let surface = surface, result == VK_SUCCESS else {
+ throw VKError(code: result, message: "Can't create macOS surface")
+ }
+
+ return Surface(vulkan: vulkan, surface: surface)
+ #elseif os(Linux)
+ return try makeSurfaceLinux(vulkan: vulkan, view: view)
+ #elseif os(Windows)
+ var createInfo = VkWin32SurfaceCreateInfoKHR()
+ createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR
+ createInfo.hinstance = display
+ createInfo.hwnd = window
+
+ var surface: VkSurfaceKHR?
+ let result = withUnsafePointer(to: &createInfo) { ptr in
+ vkCreateWin32SurfaceKHR(vulkan.pointer, ptr, nil, &surface)
+ }
+
+ guard let surface = surface, result == VK_SUCCESS else {
+ throw VKError(code: result, message: "Can't create Windows surface")
+ }
+
+ return Surface(vulkan: vulkan, surface: surface)
+ #elseif os(Android)
+ var createInfo = VkAndroidSurfaceCreateInfoKHR()
+ createInfo.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR
+ // createInfo.window = window
+
+ var surface: VkSurfaceKHR?
+ let result = withUnsafePointer(to: &createInfo) { ptr in
+ vkCreateAndroidSurfaceKHR(vulkan.pointer, ptr, nil, &surface)
+ }
+
+ guard let surface = surface, result == VK_SUCCESS else {
+ throw VKError(code: result, message: "Can't create Android surface")
+ }
+
+ return Surface(vulkan: vulkan, surface: surface)
+ #else
+ fatalError("No render surface selected")
+ #endif
+ }
+
+ #if os(Linux)
+ @MainActor
+ private static func makeSurfaceLinux(vulkan: VulkanInstance, view: RenderSurface) throws -> Surface {
+ #if canImport(X11)
+ var createInfo = VkXlibSurfaceCreateInfoKHR()
+ createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR
+ createInfo.dpy = display
+ createInfo.window = window
+
+ var surface: VkSurfaceKHR?
+ let result = withUnsafePointer(to: &createInfo) { ptr in
+ vkCreateXlibSurfaceKHR(vulkan.pointer, ptr, nil, &surface)
+ }
+
+ guard let surface = surface, result == VK_SUCCESS else {
+ throw VKError(code: result, message: "Can't create Linux X11 surface")
+ }
+
+ self.init(vulkan: vulkan, surface: surface)
+ #elseif canImport(Wayland)
+ let waylandView = view as! WaylandView
+
+ var createInfo = VkWaylandSurfaceCreateInfoKHR()
+ createInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR
+ createInfo.surface = waylandView.surface
+ createInfo.display = waylandView.windowManager?.display
+
+ var surface: VkSurfaceKHR?
+ let result = withUnsafePointer(to: &createInfo) { ptr in
+ vkCreateWaylandSurfaceKHR(vulkan.pointer, ptr, nil, &surface)
+ }
+
+ guard let surface = surface, result == VK_SUCCESS else {
+ throw VKError(code: result, message: "Can't create Linux Wayland surface")
+ }
+
+ return Surface(vulkan: vulkan, surface: surface)
+ #else
+ #error("Not supported surface")
+ fatalError("Not supported surface")
+ #endif
+ }
+ #endif
+}
+
#endif
diff --git a/Sources/AdaEngine/Rendering/RenderEngine.swift b/Sources/AdaEngine/Rendering/RenderEngine.swift
index 708f5aed3..fbf21a4bb 100644
--- a/Sources/AdaEngine/Rendering/RenderEngine.swift
+++ b/Sources/AdaEngine/Rendering/RenderEngine.swift
@@ -17,6 +17,8 @@ public final class RenderEngine: RenderBackend {
public struct Configuration {
public var maxFramesInFlight: Int = 3
+ /// Select render backend.
+ public var renderBackend: RenderBackendType = .vulkan
public init() {}
}
@@ -29,13 +31,27 @@ public final class RenderEngine: RenderBackend {
let appName = "AdaEngine"
- #if METAL
- renderBackend = MetalRenderBackend(appName: appName)
- #elseif VULKAN
- renderBackend = VulkanRenderBackend(appName: appName)
- #else
- renderBackend = OpenGLBackend(appName: appName)
- #endif
+ /// Select render backend based on the platform.
+ switch configurations.renderBackend {
+ case .metal:
+ #if METAL
+ renderBackend = MetalRenderBackend(appName: appName)
+ #else
+ fatalError("Metal is not enabled")
+ #endif
+ case .vulkan:
+ #if ENABLE_VULKAN
+ renderBackend = VulkanRenderBackend(appName: appName)
+ #else
+ fatalError("Vulkan is not enabled")
+ #endif
+ case .opengl:
+ #if ENABLE_OPENGL
+ renderBackend = OpenGLBackend(appName: appName)
+ #else
+ fatalError("No render backend selected")
+ #endif
+ }
return RenderEngine(renderBackend: renderBackend)
}()
diff --git a/Sources/AdaEngine/Scene/Physics/Physics2D/Body2D.swift b/Sources/AdaEngine/Scene/Physics/Physics2D/Body2D.swift
index e61e4a32b..6ff27d0b0 100644
--- a/Sources/AdaEngine/Scene/Physics/Physics2D/Body2D.swift
+++ b/Sources/AdaEngine/Scene/Physics/Physics2D/Body2D.swift
@@ -5,7 +5,7 @@
// Created by v.prusakov on 3/19/23.
//
-@_implementationOnly import box2d
+import box2d
import Math
// An object that represents physics 2D body.
diff --git a/Sources/AdaEngine/Scene/Physics/Physics2D/DebugPhysics2DSystem.swift b/Sources/AdaEngine/Scene/Physics/Physics2D/DebugPhysics2DSystem.swift
index 5d6d76ae5..daba79668 100644
--- a/Sources/AdaEngine/Scene/Physics/Physics2D/DebugPhysics2DSystem.swift
+++ b/Sources/AdaEngine/Scene/Physics/Physics2D/DebugPhysics2DSystem.swift
@@ -5,7 +5,7 @@
// Created by v.prusakov on 2/26/23.
//
-@_implementationOnly import box2d
+import box2d
import Math
@Component
diff --git a/Sources/AdaEngine/Scene/Physics/Physics2D/Physics2DSystem.swift b/Sources/AdaEngine/Scene/Physics/Physics2D/Physics2DSystem.swift
index be56af71e..667a143e5 100644
--- a/Sources/AdaEngine/Scene/Physics/Physics2D/Physics2DSystem.swift
+++ b/Sources/AdaEngine/Scene/Physics/Physics2D/Physics2DSystem.swift
@@ -5,7 +5,7 @@
// Created by v.prusakov on 7/8/22.
//
-@_implementationOnly import box2d
+import box2d
import Math
// - TODO: (Vlad) Runtime update shape resource
diff --git a/Sources/AdaEngine/Scene/Physics/Physics2D/PhysicsWorld2D.swift b/Sources/AdaEngine/Scene/Physics/Physics2D/PhysicsWorld2D.swift
index 7ea1e8ad2..59ce4af35 100644
--- a/Sources/AdaEngine/Scene/Physics/Physics2D/PhysicsWorld2D.swift
+++ b/Sources/AdaEngine/Scene/Physics/Physics2D/PhysicsWorld2D.swift
@@ -5,7 +5,7 @@
// Created by v.prusakov on 7/6/22.
//
-@_implementationOnly import box2d
+import box2d
import Math
public protocol PhysicsWorld2DDelegate: AnyObject {
diff --git a/Sources/AdaEngine/Scene/Resources/AssetsCodable/TextAssetEncoder.swift b/Sources/AdaEngine/Scene/Resources/AssetsCodable/TextAssetEncoder.swift
index 2b98b4ef4..548e90f6a 100644
--- a/Sources/AdaEngine/Scene/Resources/AssetsCodable/TextAssetEncoder.swift
+++ b/Sources/AdaEngine/Scene/Resources/AssetsCodable/TextAssetEncoder.swift
@@ -33,19 +33,19 @@ public final class TextAssetEncoder: AssetEncoder, @unchecked Sendable {
}
protocol AnyEncoder: Sendable {
- func encode(_ value: T, userInfo: [CodingUserInfoKey: Any]) throws -> Data
+ func encode(_ value: T, userInfo: [CodingUserInfoKey: any Sendable]) throws -> Data
}
extension YAMLEncoder: @unchecked @retroactive Sendable {}
extension YAMLEncoder: AnyEncoder {
- func encode(_ value: T, userInfo: [CodingUserInfoKey : Any]) throws -> Data where T : Encodable {
+ func encode(_ value: T, userInfo: [CodingUserInfoKey : any Sendable]) throws -> Data where T : Encodable {
return try self.encode(value, userInfo: userInfo).data(using: .utf8)!
}
}
extension JSONEncoder: AnyEncoder {
- func encode(_ value: T, userInfo: [CodingUserInfoKey : Any]) throws -> Data where T : Encodable {
+ func encode(_ value: T, userInfo: [CodingUserInfoKey : any Sendable]) throws -> Data where T : Encodable {
self.userInfo = userInfo
return try self.encode(value)
}
diff --git a/Sources/AdaEngine/Text/Font/FontAtlasGenerator.swift b/Sources/AdaEngine/Text/Font/FontAtlasGenerator.swift
index baf88101d..b4e11ee2d 100644
--- a/Sources/AdaEngine/Text/Font/FontAtlasGenerator.swift
+++ b/Sources/AdaEngine/Text/Font/FontAtlasGenerator.swift
@@ -5,7 +5,7 @@
// Created by v.prusakov on 3/5/23.
//
-@_implementationOnly import AtlasFontGenerator
+import AtlasFontGenerator
import Foundation
public struct FontDescriptor {
@@ -139,12 +139,12 @@ final class FontAtlasGenerator {
var header = AtlasHeader(width: width, height: height, dataSize: data.count)
withUnsafeBytes(of: &header) { ptr in
let bytes = ptr.baseAddress!.assumingMemoryBound(to: UInt8.self)
- stream.write(bytes, maxLength: MemoryLayout.stride)
+ _ = stream.write(bytes, maxLength: MemoryLayout.stride)
}
data.withUnsafeBytes { (bufferPtr: UnsafeRawBufferPointer) in
let bytes = bufferPtr.baseAddress!.assumingMemoryBound(to: UInt8.self)
- stream.write(bytes, maxLength: data.count)
+ _ = stream.write(bytes, maxLength: data.count)
}
stream.close()
@@ -170,11 +170,11 @@ final class FontAtlasGenerator {
stream.open()
let headerData: UnsafeMutablePointer = UnsafeMutablePointer.allocate(capacity: MemoryLayout.stride)
- stream.read(headerData, maxLength: MemoryLayout.size)
+ _ = stream.read(headerData, maxLength: MemoryLayout.size)
let atlasHeader = UnsafeRawPointer(headerData).load(as: AtlasHeader.self)
let atlasData: UnsafeMutablePointer = UnsafeMutablePointer.allocate(capacity: atlasHeader.dataSize)
- stream.read(atlasData, maxLength: atlasHeader.dataSize)
+ _ = stream.read(atlasData, maxLength: atlasHeader.dataSize)
let data = Data(bytes: UnsafeRawPointer(atlasData), count: atlasHeader.dataSize)
defer {
diff --git a/Sources/AdaEngine/Text/Font/FontHandle.swift b/Sources/AdaEngine/Text/Font/FontHandle.swift
index 3f8237392..e41cec909 100644
--- a/Sources/AdaEngine/Text/Font/FontHandle.swift
+++ b/Sources/AdaEngine/Text/Font/FontHandle.swift
@@ -5,7 +5,7 @@
// Created by v.prusakov on 3/19/23.
//
-@_implementationOnly import AtlasFontGenerator
+import AtlasFontGenerator
/// Hold information about font data and atlas.
final class FontHandle: Hashable, @unchecked Sendable {
diff --git a/Sources/AdaEngine/UI/DSL/Modifiers/View+Observable.swift b/Sources/AdaEngine/UI/DSL/Modifiers/View+Observable.swift
index 007c9f9c1..e6b5ea664 100644
--- a/Sources/AdaEngine/UI/DSL/Modifiers/View+Observable.swift
+++ b/Sources/AdaEngine/UI/DSL/Modifiers/View+Observable.swift
@@ -7,6 +7,13 @@
@preconcurrency import Observation
+// https://github.com/swiftlang/swift/pull/77890#issuecomment-2645596313
+// FIXME: This is a little hack to avoid crash
+#if os(Android) || os(Linux)
+@_cdecl("_ZN5swift9threading5fatalEPKcz")
+func swiftThreadingFatal() { }
+#endif
+
public extension View {
/// Places an observable object in the view's environment.
diff --git a/Sources/AdaEngine/UI/DSL/ScrollViewReader.swift b/Sources/AdaEngine/UI/DSL/ScrollViewReader.swift
index b57871119..7c4bc58ae 100644
--- a/Sources/AdaEngine/UI/DSL/ScrollViewReader.swift
+++ b/Sources/AdaEngine/UI/DSL/ScrollViewReader.swift
@@ -5,6 +5,8 @@
// Created by Vladislav Prusakov on 26.07.2024.
//
+import Observation
+
/// A proxy value that supports programmatic scrolling of the scrollable views within a view hierarchy.
///
/// You don’t create instances of ScrollViewProxy directly.
diff --git a/Sources/AdaEngine/UI/UIWindowManager.swift b/Sources/AdaEngine/UI/UIWindowManager.swift
index 47ab4ce1f..6a9f38f14 100644
--- a/Sources/AdaEngine/UI/UIWindowManager.swift
+++ b/Sources/AdaEngine/UI/UIWindowManager.swift
@@ -29,7 +29,7 @@ open class UIWindowManager {
/// Contains active window if available.
public private(set) var activeWindow: UIWindow?
- public nonisolated init() { }
+ public required init() { }
/// Called each frame to update windows.
func update(_ deltaTime: TimeInterval) async {
diff --git a/Sources/AdaEngine/Utils/FileWatcher.swift b/Sources/AdaEngine/Utils/FileWatcher.swift
index e74c509b7..e0b467582 100644
--- a/Sources/AdaEngine/Utils/FileWatcher.swift
+++ b/Sources/AdaEngine/Utils/FileWatcher.swift
@@ -28,6 +28,7 @@ public final class FileWatcher {
}
public func observe(on queue: DispatchQueue? = nil, block: @escaping (FileWatcher.Event) -> Void) throws -> Cancellable {
+ #if !os(Linux)
let handle = open(url.path(), O_EVTONLY)
if handle == -1 {
@@ -78,6 +79,8 @@ public final class FileWatcher {
source.resume()
return AnyCancellable(cancel)
+ #else
+ fatalError("FileWatcher is not supported on Linux")
+ #endif
}
-
}
diff --git a/Sources/AdaEngineEmbeddable/ApplePlatforms/AppleWindowManager.swift b/Sources/AdaEngineEmbeddable/ApplePlatforms/AppleWindowManager.swift
index 8708b631e..857f996b0 100644
--- a/Sources/AdaEngineEmbeddable/ApplePlatforms/AppleWindowManager.swift
+++ b/Sources/AdaEngineEmbeddable/ApplePlatforms/AppleWindowManager.swift
@@ -14,7 +14,7 @@ final class AppleWindowManager: UIWindowManager {
weak var nativeView: MetalView?
- override init() { }
+ override required init() { }
override func resizeWindow(_ window: UIWindow, size: Size) {
diff --git a/Sources/AdaEngineMacros/ComponentMacro.swift b/Sources/AdaEngineMacros/ComponentMacro.swift
index d57d735d9..7c066f3af 100644
--- a/Sources/AdaEngineMacros/ComponentMacro.swift
+++ b/Sources/AdaEngineMacros/ComponentMacro.swift
@@ -5,6 +5,7 @@
// Created by v.prusakov on 2/14/24.
//
+import Foundation
import SwiftDiagnostics
import SwiftOperators
import SwiftSyntax
diff --git a/Sources/CVulkan/cvulkan.h b/Sources/CVulkan/cvulkan.h
index a25fcfc60..14c3536e6 100644
--- a/Sources/CVulkan/cvulkan.h
+++ b/Sources/CVulkan/cvulkan.h
@@ -14,11 +14,35 @@
#include
#endif
+#if __has_include()
+#include
+#include
+#endif
+
+#if __has_include()
+#include
+
+typedef struct VkMetalSurfaceCreateInfoEXT_Swift {
+ VkStructureType sType;
+ const void* pNext;
+ VkFlags flags;
+ const void* pLayer;
+} VkMetalSurfaceCreateInfoEXT_Swift;
+
+#endif
+
+#if __has_include()
+#include
+#endif
+
+#if __has_include()
+#include
+#endif
+
#else
#include "/usr/local/include/vulkan/vulkan.h"
#endif
-
static uint32_t vkApiVersion_1_2() {
return VK_API_VERSION_1_2;
}
@@ -41,11 +65,4 @@ static uint32_t vkVersionMinor(uint32_t version) {
static uint32_t vkVersionPatch(uint32_t version) {
return VK_VERSION_PATCH(version);
-}
-
-typedef struct VkMetalSurfaceCreateInfoEXT_Swift {
- VkStructureType sType;
- const void* pNext;
- VkFlags flags;
- const void* pLayer;
-} VkMetalSurfaceCreateInfoEXT_Swift;
+}
\ No newline at end of file
diff --git a/Sources/OpenGL/OpenGL.h b/Sources/OpenGL/OpenGL.h
new file mode 100644
index 000000000..d0b466c46
--- /dev/null
+++ b/Sources/OpenGL/OpenGL.h
@@ -0,0 +1,8 @@
+#ifdef __APPLE__
+#include
+#else
+#include
+#include
+#include
+#include
+#endif
\ No newline at end of file
diff --git a/Sources/OpenGL/module.modulemap b/Sources/OpenGL/module.modulemap
new file mode 100644
index 000000000..1fc2528d5
--- /dev/null
+++ b/Sources/OpenGL/module.modulemap
@@ -0,0 +1,5 @@
+module OpenGL [system] {
+ umbrella header "OpenGL.h"
+ link "GL"
+ export *
+}
\ No newline at end of file
diff --git a/Sources/Vulkan/Buffer.swift b/Sources/Vulkan/Buffer.swift
index 75a225b16..8fa3f5e30 100644
--- a/Sources/Vulkan/Buffer.swift
+++ b/Sources/Vulkan/Buffer.swift
@@ -109,7 +109,7 @@ public final class Buffer {
}
public extension Buffer {
- struct Usage: OptionSet {
+ struct Usage: OptionSet, Sendable {
public var rawValue: UInt32
public init(rawValue: UInt32) {
diff --git a/Sources/Vulkan/CommandBuffer.swift b/Sources/Vulkan/CommandBuffer.swift
index 855d67a90..17e7cbe9d 100644
--- a/Sources/Vulkan/CommandBuffer.swift
+++ b/Sources/Vulkan/CommandBuffer.swift
@@ -152,7 +152,7 @@ public extension CommandBuffer {
}
}
- struct BeginFlags: OptionSet {
+ struct BeginFlags: OptionSet, Sendable {
public var rawValue: UInt32
public init(rawValue: UInt32) {
diff --git a/Sources/Vulkan/Definitions/DeviceQueueCreateInfo.swift b/Sources/Vulkan/Definitions/DeviceQueueCreateInfo.swift
index 16b6499f3..494534149 100644
--- a/Sources/Vulkan/Definitions/DeviceQueueCreateInfo.swift
+++ b/Sources/Vulkan/Definitions/DeviceQueueCreateInfo.swift
@@ -12,7 +12,7 @@ public struct DeviceQueueCreateInfo {
public let queuePriorities: [Float]
public let flags: Flags
- public struct Flags: OptionSet {
+ public struct Flags: OptionSet, Sendable {
public let rawValue: UInt32
public init(rawValue: UInt32) {
diff --git a/Sources/Vulkan/Definitions/QueueFamilyProperties.swift b/Sources/Vulkan/Definitions/QueueFamilyProperties.swift
index 72abdcc2c..60f941615 100644
--- a/Sources/Vulkan/Definitions/QueueFamilyProperties.swift
+++ b/Sources/Vulkan/Definitions/QueueFamilyProperties.swift
@@ -26,7 +26,7 @@ public struct QueueFamilyProperties {
self.minImageTransferGranularity = minImageTransferGranularity
}
- public struct Flags: OptionSet {
+ public struct Flags: OptionSet, Sendable {
public let rawValue: UInt32
public init(rawValue: UInt32) {
diff --git a/Sources/Vulkan/Definitions/VKError.swift b/Sources/Vulkan/Definitions/VKError.swift
index 41251ad07..fce10a43c 100644
--- a/Sources/Vulkan/Definitions/VKError.swift
+++ b/Sources/Vulkan/Definitions/VKError.swift
@@ -13,6 +13,11 @@ public struct VKError: LocalizedError {
public let code: VkResult
public let message: String
+ public init(code: VkResult, message: String) {
+ self.code = code
+ self.message = message
+ }
+
public var errorDescription: String? {
return "Vulkan Error \(code.rawValue): \(self.message)"
}
diff --git a/Sources/Vulkan/Surface.swift b/Sources/Vulkan/Surface.swift
index 46b423970..e5fb32683 100644
--- a/Sources/Vulkan/Surface.swift
+++ b/Sources/Vulkan/Surface.swift
@@ -28,38 +28,4 @@ public final class Surface {
self.rawValue = rawValue
}
}
-}
-
-// TODO: Make common surface for Metal family
-
-#if os(iOS) || os(tvOS) || os(macOS)
-
-import MetalKit
-
-public extension Surface {
- convenience init(
- vulkan: VulkanInstance,
- view: MTKView
- ) throws {
- guard let layer = view.layer as? CAMetalLayer else {
- throw VKError(code: VK_ERROR_INITIALIZATION_FAILED, message: "Can't cast layer to CAMetalLayer")
- }
-
- var createInfo = VkMetalSurfaceCreateInfoEXT()
- createInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
- createInfo.pLayer = layer
-
- var surface: VkSurfaceKHR?
- let result = withUnsafePointer(to: &createInfo) { ptr in
- vkCreateMetalSurfaceEXT(vulkan.pointer, ptr, nil, &surface)
- }
-
- guard let surface = surface, result == VK_SUCCESS else {
- throw VKError(code: result, message: "Can't create macOS surface")
- }
-
- self.init(vulkan: vulkan, surface: surface)
- }
-}
-
-#endif
+}
\ No newline at end of file
diff --git a/Sources/Wayland/module.modulemap b/Sources/Wayland/module.modulemap
new file mode 100644
index 000000000..25c14114f
--- /dev/null
+++ b/Sources/Wayland/module.modulemap
@@ -0,0 +1,5 @@
+module Wayland [system] {
+ header "wayland.h"
+ link "wayland-client"
+ export *
+}
\ No newline at end of file
diff --git a/Sources/Wayland/wayland.h b/Sources/Wayland/wayland.h
new file mode 100644
index 000000000..d4d349ffa
--- /dev/null
+++ b/Sources/Wayland/wayland.h
@@ -0,0 +1 @@
+#include
\ No newline at end of file
diff --git a/Sources/X11/x11-umbrella b/Sources/X11/macros.h
similarity index 100%
rename from Sources/X11/x11-umbrella
rename to Sources/X11/macros.h
diff --git a/Sources/X11/module.modulemap b/Sources/X11/module.modulemap
index 3370c9cd4..da445eb3f 100644
--- a/Sources/X11/module.modulemap
+++ b/Sources/X11/module.modulemap
@@ -1,6 +1,6 @@
module X11 [system] {
- umbrella header "x11-umbrella.h"
+ umbrella header "macros.h"
link "X11"
export *
module * { export * }
-}
+}
\ No newline at end of file
diff --git a/Tests/AdaEngineTests/TestApplication.swift b/Tests/AdaEngineTests/TestApplication.swift
index a1f2ec605..702a284f0 100644
--- a/Tests/AdaEngineTests/TestApplication.swift
+++ b/Tests/AdaEngineTests/TestApplication.swift
@@ -8,9 +8,8 @@
@_spi(Internal) @testable import AdaEngine
class TestApplication: Application {
- override init(argc: Int32, argv: UnsafeMutablePointer?>) throws {
- try super.init(argc: argc, argv: argv)
- self.windowManager = MockUIWindowManager()
+ override class var windowManagerClass: UIWindowManager.Type {
+ MockUIWindowManager.self
}
convenience init() throws {
diff --git a/utils/scripts/install_vulkan_macos.sh b/utils/scripts/install_vulkan_macos.sh
new file mode 100755
index 000000000..a63268e02
--- /dev/null
+++ b/utils/scripts/install_vulkan_macos.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+
+# Colors for output
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+NC='\033[0m' # No Color
+
+# Function to print colored messages
+print_message() {
+ echo -e "${2}${1}${NC}"
+}
+
+# Function to check if a command exists
+command_exists() {
+ command -v "$1" >/dev/null 2>&1
+}
+
+# Check if running on macOS
+if [[ "$OSTYPE" != "darwin"* ]]; then
+ print_message "This script is intended for macOS only." "$RED"
+ exit 1
+fi
+
+# Check if Vulkan SDK is installed
+if [ -d "/usr/local/share/vulkan" ] || [ -d "$HOME/vulkansdk" ]; then
+ print_message "Vulkan SDK is already installed." "$GREEN"
+ exit 0
+fi
+
+print_message "Vulkan SDK not found. Starting installation..." "$YELLOW"
+
+# Create temporary directory
+TEMP_DIR=$(mktemp -d)
+cd "$TEMP_DIR" || exit 1
+
+# Get the latest Vulkan SDK version
+print_message "Fetching latest Vulkan SDK version..." "$YELLOW"
+LATEST_VERSION=$(curl -s https://vulkan.lunarg.com/sdk/latest/mac.json | grep -o '"version": "[^"]*' | cut -d'"' -f4)
+
+if [ -z "$LATEST_VERSION" ]; then
+ print_message "Failed to fetch latest version. Please check your internet connection." "$RED"
+ rm -rf "$TEMP_DIR"
+ exit 1
+fi
+
+# Download the SDK
+DOWNLOAD_URL="https://sdk.lunarg.com/sdk/download/${LATEST_VERSION}/mac/vulkansdk-macos-${LATEST_VERSION}.dmg"
+print_message "Downloading Vulkan SDK ${LATEST_VERSION}..." "$YELLOW"
+
+if ! curl -L -o vulkansdk.dmg "$DOWNLOAD_URL"; then
+ print_message "Failed to download Vulkan SDK." "$RED"
+ rm -rf "$TEMP_DIR"
+ exit 1
+fi
+
+# Mount the DMG
+print_message "Installing Vulkan SDK..." "$YELLOW"
+hdiutil attach vulkansdk.dmg
+
+# Find the mounted volume
+VOLUME_PATH=$(hdiutil info | grep "VulkanSDK" | awk '{print $3}')
+
+if [ -z "$VOLUME_PATH" ]; then
+ print_message "Failed to mount Vulkan SDK installer." "$RED"
+ rm -rf "$TEMP_DIR"
+ exit 1
+fi
+
+# Install the SDK
+if ! cp -R "$VOLUME_PATH/VulkanSDK" "$HOME/"; then
+ print_message "Failed to install Vulkan SDK." "$RED"
+ hdiutil detach "$VOLUME_PATH"
+ rm -rf "$TEMP_DIR"
+ exit 1
+fi
+
+# Unmount the DMG
+hdiutil detach "$VOLUME_PATH"
+
+# Clean up
+rm -rf "$TEMP_DIR"
+
+# Set up environment variables
+print_message "Setting up environment variables..." "$YELLOW"
+echo 'export VULKAN_SDK=$HOME/vulkansdk/macOS' >> ~/.zshrc
+echo 'export PATH=$VULKAN_SDK/bin:$PATH' >> ~/.zshrc
+echo 'export DYLD_LIBRARY_PATH=$VULKAN_SDK/lib:$DYLD_LIBRARY_PATH' >> ~/.zshrc
+echo 'export VK_ICD_FILENAMES=$VULKAN_SDK/share/vulkan/icd.d/MoltenVK_icd.json' >> ~/.zshrc
+
+print_message "Vulkan SDK ${LATEST_VERSION} has been successfully installed!" "$GREEN"
+print_message "Please restart your terminal or run 'source ~/.zshrc' to apply the changes." "$YELLOW"