diff --git a/Includes/Pulse.h b/Includes/Pulse.h index 158faa3..8e1b147 100644 --- a/Includes/Pulse.h +++ b/Includes/Pulse.h @@ -12,6 +12,7 @@ extern "C" { #endif #include +#include #include "PulseProfile.h" @@ -31,6 +32,14 @@ PULSE_DEFINE_NULLABLE_HANDLE(PulseFence); PULSE_DEFINE_NULLABLE_HANDLE(PulseImage); // Flags +typedef enum PulseBackendBits +{ + PULSE_BACKEND_INVALID = PULSE_BIT(1), + PULSE_BACKEND_VULKAN = PULSE_BIT(2), + // More to come +} PulseBackendBits; +typedef PulseFlags PulseBackendFlags; + typedef enum PulseBufferUsageBits { PULSE_BUFFER_USAGE_TRANSFER_UPLOAD = PULSE_BIT(1), @@ -146,7 +155,6 @@ typedef enum PulseImageFormat } PulseImageFormat; // Structs - typedef struct PulseBufferCreateInfo { PulseBufferUsageFlags usage; @@ -221,6 +229,12 @@ typedef struct PulseImageRegion uint32_t depth; } PulseImageRegion; +// Functions +PULSE_API PulseDevice PulseCreateDevice(PulseBackendFlags backend_candidates, PulseShaderFormatsFlags shader_formats_used); +PULSE_API void PulseDestroyDevice(PulseDevice device); +PULSE_API PulseBackendBits PulseGetBackendInUseByDevice(PulseDevice device); +PULSE_API bool PulseSupportsBackend(PulseBackendFlags backend_candidates, PulseShaderFormatsFlags shader_formats_used); + #ifdef __cplusplus } #endif diff --git a/Includes/PulseProfile.h b/Includes/PulseProfile.h index 9843c63..e89c889 100644 --- a/Includes/PulseProfile.h +++ b/Includes/PulseProfile.h @@ -11,6 +11,71 @@ extern "C" { #endif +#if defined(__BORLANDC__) + #define PULSE_COMPILER_BORDLAND +#elif defined(__clang__) + #define PULSE_COMPILER_CLANG + #ifdef __MINGW32__ + #define PULSE_COMPILER_MINGW + #ifdef __MINGW64_VERSION_MAJOR + #define PULSE_COMPILER_MINGW_W64 + #endif + #endif +#elif defined(__GNUC__) || defined(__MINGW32__) + #define PULSE_COMPILER_GCC + #ifdef __MINGW32__ + #define PULSE_COMPILER_MINGW + #ifdef __MINGW64_VERSION_MAJOR + #define PULSE_COMPILER_MINGW_W64 + #endif + #endif +#elif defined(__INTEL_COMPILER) || defined(__ICL) + #define PULSE_COMPILER_INTEL +#elif defined(_MSC_VER) + #define PULSE_COMPILER_MSVC +#else + #define PULSE_COMPILER_UNKNOWN + #warning "This compiler is not fully supported" +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) + #define PULSE_PLAT_WINDOWS +#elif defined(__linux__) + #define PULSE_PLAT_LINUX +#elif defined(__APPLE__) && defined(__MACH__) + #define PULSE_PLAT_MACOS +#elif defined(unix) || defined(__unix__) || defined(__unix) + #define PULSE_PLAT_UNIX +#else + #error "Unknown environment (not Windows, not Linux, not MacOS, not Unix)" +#endif + +#ifndef PULSE_STATIC + #ifdef PULSE_PLAT_WINDOWS + #ifdef PULSE_COMPILER_MSVC + #ifdef PULSE_BUILD + #define PULSE_API __declspec(dllexport) + #else + #define PULSE_API __declspec(dllimport) + #endif + #elif defined(PULSE_COMPILER_GCC) + #ifdef PULSE_BUILD + #define PULSE_API __attribute__((dllexport)) + #else + #define PULSE_API __attribute__((dllimport)) + #endif + #else + #define PULSE_API + #endif + #elif defined(PULSE_COMPILER_GCC) + #define PULSE_API __attribute__((visibility("default"))) + #else + #define PULSE_API + #endif +#else + #define PULSE_API +#endif + #define PULSE_DEFINE_NULLABLE_HANDLE(object) typedef struct object##Handler* object #if (defined(__cplusplus) && (__cplusplus >= 201103L)) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L)) diff --git a/Sources/Backends/Vulkan/VulkanDevice.c b/Sources/Backends/Vulkan/VulkanDevice.c new file mode 100644 index 0000000..cee4dbc --- /dev/null +++ b/Sources/Backends/Vulkan/VulkanDevice.c @@ -0,0 +1,6 @@ +// Copyright (C) 2024 kanel +// This file is part of "Pulse" +// For conditions of distribution and use, see copyright notice in LICENSE + +#include + diff --git a/Sources/PulseDevice.c b/Sources/PulseDevice.c new file mode 100644 index 0000000..3c94ec0 --- /dev/null +++ b/Sources/PulseDevice.c @@ -0,0 +1,21 @@ +// Copyright (C) 2024 kanel +// This file is part of "Pulse" +// For conditions of distribution and use, see copyright notice in LICENSE + +#include + +PULSE_API PulseDevice PulseCreateDevice(PulseBackendFlags backend_candidates, PulseShaderFormatsFlags shader_formats_used) +{ +} + +PULSE_API void PulseDestroyDevice(PulseDevice device) +{ +} + +PULSE_API PulseBackendBits PulseGetBackendInUseByDevice(PulseDevice device) +{ +} + +PULSE_API bool PulseSupportsBackend(PulseBackendFlags backend_candidates, PulseShaderFormatsFlags shader_formats_used) +{ +} diff --git a/Sources/PulseDevice.h b/Sources/PulseDevice.h new file mode 100644 index 0000000..9f106f5 --- /dev/null +++ b/Sources/PulseDevice.h @@ -0,0 +1,10 @@ +// Copyright (C) 2024 kanel +// This file is part of "Pulse" +// For conditions of distribution and use, see copyright notice in LICENSE + +#include + +typedef struct PulseDeviceHandler +{ + +} PulseDeviceHandler; diff --git a/xmake.lua b/xmake.lua index e69de29..ea84101 100644 --- a/xmake.lua +++ b/xmake.lua @@ -0,0 +1,43 @@ +-- Copyright (C) 2024 kanel +-- This file is part of "Pulse" +-- For conditions of distribution and use, see copyright notice in LICENSE + +local sanitizers = { + asan = "address", + lsan = "leak", + tsan = "thread", +} + +for opt, policy in table.orderpairs(sanitizers) do + option(opt, { description = "Enable " .. opt, default = false }) + if has_config(opt) then + set_policy("build.sanitizer." .. policy, true) + end +end + +add_rules("mode.debug", "mode.release") + +add_includedirs("Includes") +set_languages("c99", "cxx20") + +set_objectdir("build/Objs/$(os)_$(arch)") +set_targetdir("build/Bin/$(os)_$(arch)") +set_rundir("build/Bin/$(os)_$(arch)") +set_dependir("build/.deps") + +set_optimize("fastest") + +target("pulse_gpu") + set_kind("$(kind)") + add_defines("PULSE_BUILD") + add_headerfiles("Includes/*.hpp)") + add_headerfiles("Sources/**.h", { prefixdir = "private", install = false }) + add_headerfiles("Sources/**.inl", { prefixdir = "private", install = false }) + add_files("Sources/**.c") + add_files("Sources/**.cpp") + on_load(function(target) + if target:kind() == "static" then + target:add("defines", "PULSE_STATIC", { public = true }) + end + end) +target_end()