From e02f9fd89b059919baf3a8d8bf8b783470976a27 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 27 Apr 2024 01:16:21 +0200 Subject: Some work on Vulkan initialization --- deimos/core/allocator.h | 21 +++++++++++++++++++++ deimos/core/base.h | 19 ++++++++++++++++++- deimos/core/log.cpp | 8 +++++--- deimos/core/status.h | 14 ++++++++++++-- deimos/core/std.h | 1 + deimos/core/temp_allocator.cpp | 12 ++---------- 6 files changed, 59 insertions(+), 16 deletions(-) (limited to 'deimos/core') diff --git a/deimos/core/allocator.h b/deimos/core/allocator.h index 26374bd..5afb824 100644 --- a/deimos/core/allocator.h +++ b/deimos/core/allocator.h @@ -125,6 +125,27 @@ public: } Free(t, sizeof(T), source_location); } + + template + gsl::owner> NewArray(int64_t count, const SourceLocation& source_location = {}) + requires std::is_default_constructible_v + { + Expects(count > 0); + + auto* raw = Allocate((int64_t)sizeof(T) * count, source_location); + if constexpr (std::is_trivially_default_constructible_v) + { + MemoryZero(raw, (int64_t)sizeof(T) * count); + } + else + { + for (int64_t i = 0; i < count; ++i) + { + new((T*)raw + i) T{}; + } + } + return Span{ (T*)raw, count }; + } }; class AllocatorApi diff --git a/deimos/core/base.h b/deimos/core/base.h index 5cd3a40..70958a5 100644 --- a/deimos/core/base.h +++ b/deimos/core/base.h @@ -5,7 +5,13 @@ #define deimos_StaticAssert(...) static_assert(__VA_ARGS__, #__VA_ARGS__) -#define deimos_Panic(MSG) do { __builtin_trap(); } while (0) +[[noreturn]] +inline void deimos_Trap() +{ + __builtin_trap(); +} + +#define deimos_Panic(MSG) do { deimos_Trap(); } while (0) #define deimos_NO_COPY(TYPE) \ TYPE(const TYPE&) = delete; \ @@ -78,6 +84,11 @@ constexpr void MemoryCopy(void* dst, const void* src, int64_t size) __builtin_memcpy(dst, src, (size_t)size); } +inline void MemoryZero(void* dst, int64_t size) +{ + __builtin_memset(dst, 0, (size_t)size); +} + template constexpr int64_t ArraySize(const T (&)[N]) { return N; } @@ -117,6 +128,12 @@ public: constexpr T* end() const { return m_begin + m_size; } // NOLINT constexpr int64_t size() const { return m_size; } constexpr bool empty() const { return m_size == 0; } + + constexpr T& operator[](int64_t i) const + { + Expects(i >= 0 && i < m_size); + return m_begin[i]; // NOLINT + } }; template diff --git a/deimos/core/log.cpp b/deimos/core/log.cpp index e05c360..b8e7805 100644 --- a/deimos/core/log.cpp +++ b/deimos/core/log.cpp @@ -35,10 +35,12 @@ public: m_writer(os_console_api, OsConsoleType::kStdOut) {} - void Log(LogSeverity severity, const SourceLocation& location, StringView msg) override + void Log(LogSeverity severity, const SourceLocation& /* location */, StringView msg) override { - Format(&m_writer, "$[ $ ] $:$: $\033[0m\n", SeverityToColor(severity), - SeverityToStr(severity), location.file, location.line, msg); + // Format(&m_writer, "$[ $ ] $:$: $\033[0m\n", SeverityToColor(severity), + // SeverityToStr(severity), location.file, location.line, msg); + Format(&m_writer, "$[ $ ] $\033[0m\n", SeverityToColor(severity), + SeverityToStr(severity), msg); } }; diff --git a/deimos/core/status.h b/deimos/core/status.h index 912d4c8..8141dad 100644 --- a/deimos/core/status.h +++ b/deimos/core/status.h @@ -147,18 +147,18 @@ public: StatusOr(const Status& status) : m_status{status} // NOLINT { + Expects(!m_status.ok()); if (m_status.ok()) { - deimos_Panic("Cannot construct a StatusOr from OK"); m_status = InternalError("StatusOr constructed from OK"); } } StatusOr(Status&& status) : m_status{std::move(status)} // NOLINT { + Expects(!m_status.ok()); if (m_status.ok()) { - deimos_Panic("Cannot construct a StatusOr from OK"); m_status = InternalError("StatusOr constructed from OK"); } } @@ -229,6 +229,16 @@ public: } constexpr bool ok() const { return m_status.ok(); } + + constexpr StatusCode code() const { return m_status.code(); } + + constexpr const Status& status() const { return m_status; } + + constexpr const T& value() const & { Expects(m_status.ok()); return m_value; } + + constexpr T& value() & { Expects(m_status.ok()); return m_value; } + + constexpr T&& value() && { Expects(m_status.ok()); return std::move(m_value); } friend void DeimosFormat(IWriter* writer, const StatusOr& status) { diff --git a/deimos/core/std.h b/deimos/core/std.h index 47f161a..27b5bc4 100644 --- a/deimos/core/std.h +++ b/deimos/core/std.h @@ -26,6 +26,7 @@ template concept unsigned_integral = integral && __is_unsigned(T) template constexpr bool is_trivially_destructible_v = __is_trivially_destructible(T); template constexpr bool is_constructible_v = __is_constructible(T, Args...); template constexpr bool is_default_constructible_v = __is_constructible(T); +template constexpr bool is_trivially_default_constructible_v = __is_trivially_constructible(T); template constexpr bool is_copy_constructible_v = __is_constructible(T, const T&); template constexpr bool is_move_constructible_v = __is_constructible(T, T&&); template constexpr bool is_copy_assignable_v = __is_assignable(T, const T&); diff --git a/deimos/core/temp_allocator.cpp b/deimos/core/temp_allocator.cpp index d2b7900..99ee630 100644 --- a/deimos/core/temp_allocator.cpp +++ b/deimos/core/temp_allocator.cpp @@ -35,7 +35,6 @@ public: if (new_current > m_reserve_end) { deimos_Panic("Ran out of temporary memory"); - return nullptr; } if (new_current > m_commit_end) @@ -73,15 +72,8 @@ public: { void* rewind_base = std::bit_cast(tag.tag); Expects(rewind_base >= m_base && rewind_base <= m_commit_end); - - if (rewind_base < m_current) - { - m_current = rewind_base; - } - else - { - deimos_Panic("Invalid temporary allocator rewind"); - } + Expects(rewind_base <= m_current); + m_current = rewind_base; } }; -- cgit