summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deimos/core/os.h16
-rw-r--r--deimos/core/os_win32.cpp16
-rw-r--r--deimos/core/std.h8
-rw-r--r--main/main.cpp14
4 files changed, 49 insertions, 5 deletions
diff --git a/deimos/core/os.h b/deimos/core/os.h
index 88b1c55..3cff6ba 100644
--- a/deimos/core/os.h
+++ b/deimos/core/os.h
@@ -17,20 +17,32 @@ class OsConsoleApi
{
public:
OsConsoleApi() = default;
-
deimos_NO_COPY_MOVE(OsConsoleApi);
-
virtual ~OsConsoleApi() = default;
virtual void Write(OsConsoleType, Span<const std::byte> data) = 0;
};
+struct OsDll;
+
+class OsDllApi
+{
+public:
+ OsDllApi() = default;
+ deimos_NO_COPY_MOVE(OsDllApi);
+ virtual ~OsDllApi() = default;
+
+ virtual OsDll* Open(gsl::czstring) = 0;
+ virtual void* GetSymbol(OsDll*, gsl::czstring) = 0;
+};
+
class OsApi
{
public:
static constexpr IdName kApiName{"deimos::OsApi"};
OsConsoleApi* console{};
+ OsDllApi* dll{};
};
class OsConsoleWriter : public IWriter
diff --git a/deimos/core/os_win32.cpp b/deimos/core/os_win32.cpp
index ca608d8..1c6b664 100644
--- a/deimos/core/os_win32.cpp
+++ b/deimos/core/os_win32.cpp
@@ -35,14 +35,30 @@ public:
}
};
+class Win32OsDllApiImpl : public OsDllApi
+{
+public:
+ OsDll* Open(gsl::czstring name) override
+ {
+ return std::bit_cast<OsDll*>(::LoadLibraryA(name));
+ }
+
+ void* GetSymbol(OsDll* dll, gsl::czstring name) override
+ {
+ return std::bit_cast<void*>(::GetProcAddress(std::bit_cast<HMODULE>(dll), name));
+ }
+};
+
class Win32OsApiImpl : public OsApi
{
Win32OsConsoleApiImpl m_console_api;
+ Win32OsDllApiImpl m_dll_api;
public:
Win32OsApiImpl()
{
console = &m_console_api;
+ dll = &m_dll_api;
}
};
diff --git a/deimos/core/std.h b/deimos/core/std.h
index 89d7da5..42bedbe 100644
--- a/deimos/core/std.h
+++ b/deimos/core/std.h
@@ -22,6 +22,7 @@ template<typename T> concept signed_integral = integral<T> && __is_signed(T);
template<typename T> concept unsigned_integral = integral<T> && __is_unsigned(T);
template<typename T> constexpr bool is_trivially_destructible_v = __is_trivially_destructible(T);
+template<typename T> constexpr bool is_trivially_copyable_v = __is_trivially_copyable(T);
template<typename U, typename V> constexpr bool _is_same_helper = false;
template<typename T> constexpr bool _is_same_helper<T, T> = true;
@@ -78,6 +79,13 @@ constexpr T exchange(T& obj, U&& new_value)
enum __attribute__((__may_alias__)) byte : uint8_t {};
static_assert(sizeof(byte) == 1, "");
+template<typename To, typename From>
+requires (sizeof(To) == sizeof(From)) && is_trivially_copyable_v<To> && is_trivially_copyable_v<From>
+constexpr To bit_cast(const From& from) noexcept
+{
+ return __builtin_bit_cast(To, from);
+}
+
template<typename T>
class initializer_list
{
diff --git a/main/main.cpp b/main/main.cpp
index 03c2097..4d1834d 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -1,5 +1,6 @@
#include <deimos/core/api_registry.h>
#include <deimos/core/log.h>
+#include <deimos/core/os.h>
using namespace deimos;
@@ -7,10 +8,17 @@ int main(int /* argc */, char* /* argv */[])
{
auto* api_registry = InitializeGlobalApiRegistry();
auto* log_api = api_registry->Get<LogApi>();
+ auto* os_api = api_registry->Get<OsApi>();
- log_api->LogInfo("Hello, world!");
- log_api->LogDebug("Hello, $!", "world");
- log_api->LogError("This is an error OMG $ $ $", 1, 2, 3);
+ log_api->LogInfo("Hello");
+
+ auto* vulkan_dll = os_api->dll->Open("vulkan-1.dll");
+ Ensures(vulkan_dll != nullptr);
+ log_api->LogInfo("Vulkan DLL loaded");
+
+ auto* vkGetInstanceProcAddr = os_api->dll->GetSymbol(vulkan_dll, "vkGetInstanceProcAddr");
+ Ensures(vkGetInstanceProcAddr != nullptr);
+ log_api->LogInfo("vkGetInstanceProcAddr found");
return 0;
}