Compare commits

...

7 Commits

19 changed files with 129 additions and 82 deletions

27
deps/ox/src/ox/logconn/def.hpp vendored Normal file
View File

@ -0,0 +1,27 @@
/*
* Copyright 2015 - 2023 gary@drinkingtea.net
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#pragma once
#if defined(DEBUG) && !defined(OX_BARE_METAL)
#define OX_INIT_DEBUG_LOGGER(loggerName, appName) \
ox::LoggerConn loggerName; \
{ \
const auto loggerErr = (loggerName).initConn(appName); \
if (loggerErr) { \
oxErrf("Could not connect to logger: {} ({}:{})\n", toStr(loggerErr), loggerErr.file, loggerErr.line); \
} else { \
ox::trace::setLogger(&(loggerName)); \
} \
ox::trace::init(); \
}
#else
#define OX_INIT_DEBUG_LOGGER(loggerName, appName)
#endif

View File

@ -34,7 +34,7 @@ LoggerConn::~LoggerConn() noexcept {
} }
} }
ox::Error LoggerConn::initConn(const char *appName) noexcept { ox::Error LoggerConn::initConn(ox::CRStringView appName) noexcept {
sockaddr_in addr{}; sockaddr_in addr{};
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

View File

@ -38,7 +38,7 @@ class LoggerConn: public trace::Logger {
LoggerConn &operator=(const LoggerConn&) noexcept = delete; LoggerConn &operator=(const LoggerConn&) noexcept = delete;
ox::Error send(const trace::TraceMsg&) noexcept final; ox::Error send(const trace::TraceMsg&) noexcept final;
ox::Error sendInit(const trace::InitTraceMsg&) noexcept final; ox::Error sendInit(const trace::InitTraceMsg&) noexcept final;
ox::Error initConn(const char *appName = "") noexcept; ox::Error initConn(ox::CRStringView appName) noexcept;
ox::Error send(const char *buff, std::size_t len) const noexcept; ox::Error send(const char *buff, std::size_t len) const noexcept;
private: private:
void msgSend() noexcept; void msgSend() noexcept;

View File

@ -197,6 +197,14 @@ struct [[nodiscard]] Result {
} }
return value; return value;
} }
constexpr ox::Result<T> to(const auto &f) noexcept {
if (error) [[unlikely]] {
return OxError(1);
}
return f(value);
}
}; };
namespace detail { namespace detail {
@ -206,8 +214,8 @@ constexpr Error toError(const Error &e) noexcept {
} }
template<typename T> template<typename T>
constexpr Error toError(const Result<T> &ve) noexcept { constexpr Error toError(const Result<T> &r) noexcept {
return ve.error; return r.error;
} }
} }

View File

@ -95,14 +95,14 @@ constexpr Error model(T *io, ox::CommonPtrWith<InitTraceMsgRcv> auto *obj) noexc
struct InitTraceMsg { struct InitTraceMsg {
static constexpr auto TypeName = "net.drinkingtea.ox.trace.InitTraceMsg"; static constexpr auto TypeName = "net.drinkingtea.ox.trace.InitTraceMsg";
static constexpr auto TypeVersion = 1; static constexpr auto TypeVersion = 2;
const char *appName = ""; ox::BasicString<128> appName;
}; };
template<typename T> template<typename T>
constexpr Error model(T *io, ox::CommonPtrWith<InitTraceMsg> auto *obj) noexcept { constexpr Error model(T *io, ox::CommonPtrWith<InitTraceMsg> auto *obj) noexcept {
oxReturnError(io->template setTypeInfo<InitTraceMsg>()); oxReturnError(io->template setTypeInfo<InitTraceMsg>());
oxReturnError(io->fieldCString("appName", &obj->appName)); oxReturnError(io->field("appName", &obj->appName));
return {}; return {};
} }

View File

@ -236,6 +236,7 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
private: private:
static constexpr auto initialCap = SmallVectorSize > 0 ? SmallVectorSize : 50; static constexpr auto initialCap = SmallVectorSize > 0 ? SmallVectorSize : 50;
static constexpr auto useNoexcept = ox::is_integral_v<T> || ox::is_pointer_v<T>;
std::size_t m_size = 0; std::size_t m_size = 0;
std::size_t m_cap = 0; std::size_t m_cap = 0;
T *m_items = nullptr; T *m_items = nullptr;
@ -247,7 +248,7 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
constexpr Vector(std::initializer_list<T> list) noexcept; constexpr Vector(std::initializer_list<T> list) noexcept;
constexpr Vector(const Vector &other) noexcept(ox::is_integral_v<T>); constexpr Vector(const Vector &other) noexcept(useNoexcept);
constexpr Vector(Vector &&other) noexcept; constexpr Vector(Vector &&other) noexcept;
@ -311,9 +312,9 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
return iterator<const T&, const T*, true>(m_items, MaxValue<size_type>, m_size); return iterator<const T&, const T*, true>(m_items, MaxValue<size_type>, m_size);
} }
constexpr bool operator==(const Vector &other) const noexcept(ox::is_integral_v<T>); constexpr bool operator==(const Vector &other) const noexcept(useNoexcept);
constexpr Vector &operator=(const Vector &other) noexcept(ox::is_integral_v<T>); constexpr Vector &operator=(const Vector &other) noexcept(useNoexcept);
constexpr Vector &operator=(Vector &&other) noexcept; constexpr Vector &operator=(Vector &&other) noexcept;
@ -339,9 +340,9 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
[[nodiscard]] [[nodiscard]]
constexpr bool empty() const noexcept; constexpr bool empty() const noexcept;
constexpr void clear() noexcept(ox::is_integral_v<T>); constexpr void clear() noexcept(useNoexcept);
constexpr void resize(std::size_t size) noexcept(ox::is_integral_v<T>); constexpr void resize(std::size_t size) noexcept(useNoexcept);
[[nodiscard]] [[nodiscard]]
constexpr T *data() noexcept { constexpr T *data() noexcept {
@ -354,36 +355,36 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
} }
[[nodiscard]] [[nodiscard]]
constexpr bool contains(const T&) const noexcept(ox::is_integral_v<T>); constexpr bool contains(const T&) const noexcept(useNoexcept);
constexpr iterator<> insert( constexpr iterator<> insert(
std::size_t pos, std::size_t cnt, const T &val) noexcept(ox::is_integral_v<T>); std::size_t pos, std::size_t cnt, const T &val) noexcept(useNoexcept);
constexpr iterator<> insert(std::size_t pos, const T &val) noexcept(ox::is_integral_v<T>); constexpr iterator<> insert(std::size_t pos, const T &val) noexcept(useNoexcept);
template<typename... Args> template<typename... Args>
constexpr iterator<> emplace(std::size_t pos, Args&&... args) noexcept(ox::is_integral_v<T>); constexpr iterator<> emplace(std::size_t pos, Args&&... args) noexcept(useNoexcept);
template<typename... Args> template<typename... Args>
constexpr T &emplace_back(Args&&... args) noexcept(ox::is_integral_v<T>); constexpr T &emplace_back(Args&&... args) noexcept(useNoexcept);
constexpr void push_back(const T &item) noexcept(ox::is_integral_v<T>); constexpr void push_back(const T &item) noexcept(useNoexcept);
constexpr void pop_back() noexcept(ox::is_integral_v<T>); constexpr void pop_back() noexcept(useNoexcept);
/** /**
* Removes an item from the Vector. * Removes an item from the Vector.
* @param pos iterator at the point to remove * @param pos iterator at the point to remove
* @return Error if index is out of bounds * @return Error if index is out of bounds
*/ */
constexpr Result<iterator<>> erase(const iterator<> &pos) noexcept(ox::is_integral_v<T>); constexpr Result<iterator<>> erase(const iterator<> &pos) noexcept(useNoexcept);
/** /**
* Removes an item from the Vector. * Removes an item from the Vector.
* @param pos position of item to remove * @param pos position of item to remove
* @return Error if index is out of bounds * @return Error if index is out of bounds
*/ */
constexpr Result<iterator<>> erase(std::size_t pos) noexcept(ox::is_integral_v<T>); constexpr Result<iterator<>> erase(std::size_t pos) noexcept(useNoexcept);
/** /**
* Moves the last item in the Vector to position pos and decrements the * Moves the last item in the Vector to position pos and decrements the
@ -391,13 +392,13 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
* @param pos position of item to remove * @param pos position of item to remove
* @return Error if index is out of bounds * @return Error if index is out of bounds
*/ */
constexpr Error unordered_erase(std::size_t pos) noexcept(ox::is_integral_v<T>); constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept);
constexpr void reserve(std::size_t cap) noexcept(ox::is_integral_v<T>); constexpr void reserve(std::size_t cap) noexcept(useNoexcept);
private: private:
constexpr void reserveInsert( constexpr void reserveInsert(
std::size_t cap, std::size_t pos, std::size_t offset = 1) noexcept(ox::is_integral_v<T>); std::size_t cap, std::size_t pos, std::size_t offset = 1) noexcept(useNoexcept);
}; };
@ -429,7 +430,7 @@ constexpr Vector<T, SmallVectorSize, Allocator>::Vector(std::initializer_list<T>
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr Vector<T, SmallVectorSize, Allocator>::Vector(const Vector &other) noexcept(ox::is_integral_v<T>) { constexpr Vector<T, SmallVectorSize, Allocator>::Vector(const Vector &other) noexcept(useNoexcept) {
m_size = other.m_size; m_size = other.m_size;
m_cap = other.m_cap; m_cap = other.m_cap;
this->allocate(&m_items, other.m_cap); this->allocate(&m_items, other.m_cap);
@ -458,7 +459,7 @@ constexpr Vector<T, SmallVectorSize, Allocator>::~Vector() {
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr bool Vector<T, SmallVectorSize, Allocator>::operator==( constexpr bool Vector<T, SmallVectorSize, Allocator>::operator==(
const Vector &other) const noexcept(ox::is_integral_v<T>) { const Vector &other) const noexcept(useNoexcept) {
if (m_size != other.m_size) { if (m_size != other.m_size) {
return false; return false;
} }
@ -472,7 +473,7 @@ constexpr bool Vector<T, SmallVectorSize, Allocator>::operator==(
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr Vector<T, SmallVectorSize, Allocator> &Vector<T, SmallVectorSize, Allocator>::operator=( constexpr Vector<T, SmallVectorSize, Allocator> &Vector<T, SmallVectorSize, Allocator>::operator=(
const Vector &other) noexcept(ox::is_integral_v<T>) { const Vector &other) noexcept(useNoexcept) {
if (this != &other) { if (this != &other) {
clear(); clear();
this->deallocate(m_items, m_cap); this->deallocate(m_items, m_cap);
@ -557,7 +558,7 @@ constexpr bool Vector<T, SmallVectorSize, Allocator>::empty() const noexcept {
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr void Vector<T, SmallVectorSize, Allocator>::clear() noexcept(ox::is_integral_v<T>) { constexpr void Vector<T, SmallVectorSize, Allocator>::clear() noexcept(useNoexcept) {
if constexpr(is_class<T>()) { if constexpr(is_class<T>()) {
for (std::size_t i = 0; i < m_size; ++i) { for (std::size_t i = 0; i < m_size; ++i) {
m_items[i].~T(); m_items[i].~T();
@ -567,7 +568,7 @@ constexpr void Vector<T, SmallVectorSize, Allocator>::clear() noexcept(ox::is_in
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr void Vector<T, SmallVectorSize, Allocator>::resize(std::size_t size) noexcept(ox::is_integral_v<T>) { constexpr void Vector<T, SmallVectorSize, Allocator>::resize(std::size_t size) noexcept(useNoexcept) {
if (m_cap < size) { if (m_cap < size) {
reserve(size * 2); reserve(size * 2);
} }
@ -584,7 +585,7 @@ constexpr void Vector<T, SmallVectorSize, Allocator>::resize(std::size_t size) n
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr bool Vector<T, SmallVectorSize, Allocator>::contains(const T &v) const noexcept(ox::is_integral_v<T>) { constexpr bool Vector<T, SmallVectorSize, Allocator>::contains(const T &v) const noexcept(useNoexcept) {
for (std::size_t i = 0; i < m_size; i++) { for (std::size_t i = 0; i < m_size; i++) {
if (m_items[i] == v) { if (m_items[i] == v) {
return true; return true;
@ -596,7 +597,7 @@ constexpr bool Vector<T, SmallVectorSize, Allocator>::contains(const T &v) const
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr typename Vector<T, SmallVectorSize, Allocator>::template iterator<> constexpr typename Vector<T, SmallVectorSize, Allocator>::template iterator<>
Vector<T, SmallVectorSize, Allocator>::insert( Vector<T, SmallVectorSize, Allocator>::insert(
std::size_t pos, std::size_t cnt, const T &val) noexcept(ox::is_integral_v<T>) { std::size_t pos, std::size_t cnt, const T &val) noexcept(useNoexcept) {
if (m_size + cnt > m_cap) { if (m_size + cnt > m_cap) {
reserveInsert(m_cap ? m_size + cnt : initialCap, pos, cnt); reserveInsert(m_cap ? m_size + cnt : initialCap, pos, cnt);
if (pos < m_size) { if (pos < m_size) {
@ -624,7 +625,7 @@ Vector<T, SmallVectorSize, Allocator>::insert(
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr typename Vector<T, SmallVectorSize, Allocator>::template iterator<> constexpr typename Vector<T, SmallVectorSize, Allocator>::template iterator<>
Vector<T, SmallVectorSize, Allocator>::insert(std::size_t pos, const T &val) noexcept(ox::is_integral_v<T>) { Vector<T, SmallVectorSize, Allocator>::insert(std::size_t pos, const T &val) noexcept(useNoexcept) {
if (m_size == m_cap) { if (m_size == m_cap) {
reserveInsert(m_cap ? m_cap * 2 : initialCap, pos); reserveInsert(m_cap ? m_cap * 2 : initialCap, pos);
if (pos < m_size) { if (pos < m_size) {
@ -649,7 +650,7 @@ Vector<T, SmallVectorSize, Allocator>::insert(std::size_t pos, const T &val) noe
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
template<typename... Args> template<typename... Args>
constexpr typename Vector<T, SmallVectorSize, Allocator>::template iterator<> constexpr typename Vector<T, SmallVectorSize, Allocator>::template iterator<>
Vector<T, SmallVectorSize, Allocator>::emplace(std::size_t pos, Args&&... args) noexcept(ox::is_integral_v<T>) { Vector<T, SmallVectorSize, Allocator>::emplace(std::size_t pos, Args&&... args) noexcept(useNoexcept) {
if (m_size == m_cap) { if (m_size == m_cap) {
reserveInsert(m_cap ? m_cap * 2 : initialCap); reserveInsert(m_cap ? m_cap * 2 : initialCap);
if (pos < m_size) { if (pos < m_size) {
@ -671,8 +672,7 @@ Vector<T, SmallVectorSize, Allocator>::emplace(std::size_t pos, Args&&... args)
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
template<typename... Args> template<typename... Args>
constexpr T &Vector<T, SmallVectorSize, Allocator>::emplace_back(Args&&... args) constexpr T &Vector<T, SmallVectorSize, Allocator>::emplace_back(Args&&... args) noexcept(useNoexcept) {
noexcept(ox::is_integral_v<T>) {
if (m_size == m_cap) { if (m_size == m_cap) {
reserve(m_cap ? m_cap * 2 : initialCap); reserve(m_cap ? m_cap * 2 : initialCap);
} }
@ -682,7 +682,7 @@ noexcept(ox::is_integral_v<T>) {
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(const T &item) noexcept(ox::is_integral_v<T>) { constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(const T &item) noexcept(useNoexcept) {
if (m_size == m_cap) { if (m_size == m_cap) {
reserve(m_cap ? m_cap * 2 : initialCap); reserve(m_cap ? m_cap * 2 : initialCap);
} }
@ -691,20 +691,20 @@ constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(const T &item) n
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr void Vector<T, SmallVectorSize, Allocator>::pop_back() noexcept(ox::is_integral_v<T>) { constexpr void Vector<T, SmallVectorSize, Allocator>::pop_back() noexcept(useNoexcept) {
--m_size; --m_size;
m_items[m_size].~T(); m_items[m_size].~T();
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr Result<typename Vector<T, SmallVectorSize, Allocator>::template iterator<T&, T*, false>> constexpr Result<typename Vector<T, SmallVectorSize, Allocator>::template iterator<T&, T*, false>>
Vector<T, SmallVectorSize, Allocator>::erase(const iterator<> &pos) noexcept(ox::is_integral_v<T>) { Vector<T, SmallVectorSize, Allocator>::erase(const iterator<> &pos) noexcept(useNoexcept) {
return erase(pos.offset()); return erase(pos.offset());
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr Result<typename Vector<T, SmallVectorSize, Allocator>::template iterator<T&, T*, false>> constexpr Result<typename Vector<T, SmallVectorSize, Allocator>::template iterator<T&, T*, false>>
Vector<T, SmallVectorSize, Allocator>::erase(std::size_t pos) noexcept(ox::is_integral_v<T>) { Vector<T, SmallVectorSize, Allocator>::erase(std::size_t pos) noexcept(useNoexcept) {
if (pos >= m_size) { if (pos >= m_size) {
return OxError(1, "Vector::erase failed: pos is greater than Vector size"); return OxError(1, "Vector::erase failed: pos is greater than Vector size");
} }
@ -718,7 +718,7 @@ Vector<T, SmallVectorSize, Allocator>::erase(std::size_t pos) noexcept(ox::is_in
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr Error Vector<T, SmallVectorSize, Allocator>::unordered_erase(std::size_t pos) constexpr Error Vector<T, SmallVectorSize, Allocator>::unordered_erase(std::size_t pos)
noexcept(ox::is_integral_v<T>) { noexcept(useNoexcept) {
if (pos >= m_size) { if (pos >= m_size) {
return OxError(1); return OxError(1);
} }
@ -729,7 +729,7 @@ constexpr Error Vector<T, SmallVectorSize, Allocator>::unordered_erase(std::size
} }
template<typename T, std::size_t SmallVectorSize, typename Allocator> template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr void Vector<T, SmallVectorSize, Allocator>::reserve(std::size_t cap) noexcept(ox::is_integral_v<T>) { constexpr void Vector<T, SmallVectorSize, Allocator>::reserve(std::size_t cap) noexcept(useNoexcept) {
if (cap <= m_cap) { if (cap <= m_cap) {
return; return;
} }
@ -751,7 +751,7 @@ template<typename T, std::size_t SmallVectorSize, typename Allocator>
constexpr void Vector<T, SmallVectorSize, Allocator>::reserveInsert( constexpr void Vector<T, SmallVectorSize, Allocator>::reserveInsert(
std::size_t cap, std::size_t cap,
std::size_t pos, std::size_t pos,
std::size_t offset) noexcept(ox::is_integral_v<T>) { std::size_t offset) noexcept(useNoexcept) {
if (cap <= m_cap) { if (cap <= m_cap) {
return; return;
} }

View File

@ -23,6 +23,7 @@ class Context {
Context(Context &other) noexcept = delete; Context(Context &other) noexcept = delete;
Context(const Context &other) noexcept = delete; Context(const Context &other) noexcept = delete;
Context(const Context &&other) noexcept = delete; Context(const Context &&other) noexcept = delete;
virtual ~Context() noexcept = default;
}; };

View File

@ -53,12 +53,16 @@ void setBgCbb(Context *ctx, unsigned bgIdx, unsigned cbb) noexcept;
/** /**
* @param section describes which section of the selected TileSheetSpace to use (e.g. MEM_PALLETE_BG[section]) * @param section describes which section of the selected TileSheetSpace to use (e.g. MEM_PALLETE_BG[section])
*/ */
ox::Error loadBgTileSheet(Context *ctx, unsigned cbb, const ox::FileAddress &tilesheetAddr, ox::Error loadBgTileSheet(
const ox::FileAddress &paletteAddr = nullptr) noexcept; Context *ctx,
unsigned cbb,
ox::FileAddress const&tilesheetAddr,
ox::FileAddress const&paletteAddr = nullptr) noexcept;
ox::Error loadSpriteTileSheet(Context *ctx, ox::Error loadSpriteTileSheet(
const ox::FileAddress &tilesheetAddr, Context *ctx,
const ox::FileAddress &paletteAddr) noexcept; ox::FileAddress const&tilesheetAddr,
ox::FileAddress const&paletteAddr) noexcept;
ox::Error initConsole(Context *ctx) noexcept; ox::Error initConsole(Context *ctx) noexcept;
@ -73,7 +77,7 @@ void hideSprite(Context *ctx, unsigned) noexcept;
void setSprite(Context *ctx, unsigned idx, int x, int y, unsigned tileIdx, void setSprite(Context *ctx, unsigned idx, int x, int y, unsigned tileIdx,
unsigned spriteShape = 0, unsigned spriteSize = 0, unsigned flipX = 0) noexcept; unsigned spriteShape = 0, unsigned spriteSize = 0, unsigned flipX = 0) noexcept;
void setSprite(Context *ctx, const Sprite &s) noexcept; void setSprite(Context *ctx, Sprite const&s) noexcept;
} }

View File

@ -11,9 +11,9 @@ namespace nostalgia::core {
GbaContext::GbaContext(turbine::Context *tctx) noexcept: turbineCtx(tctx) { GbaContext::GbaContext(turbine::Context *tctx) noexcept: turbineCtx(tctx) {
} }
ox::Error initGfx(Context *ctx, const InitParams&) noexcept; ox::Error initGfx(Context *ctx, InitParams const&) noexcept;
ox::Result<ox::UniquePtr<Context>> init(turbine::Context *tctx, const InitParams &params) noexcept { ox::Result<ox::UniquePtr<Context>> init(turbine::Context *tctx, InitParams const&params) noexcept {
auto ctx = ox::make_unique<GbaContext>(tctx); auto ctx = ox::make_unique<GbaContext>(tctx);
oxReturnError(initGfx(ctx.get(), params)); oxReturnError(initGfx(ctx.get(), params));
return ox::UPtr<Context>(ctx.release()); return ox::UPtr<Context>(ctx.release());

View File

@ -15,7 +15,7 @@ struct GbaContext: public core::Context {
explicit GbaContext(turbine::Context *tctx) noexcept; explicit GbaContext(turbine::Context *tctx) noexcept;
[[nodiscard]] [[nodiscard]]
const auto &rom() const noexcept { auto const&rom() const noexcept {
return *turbine::rom(*turbineCtx); return *turbine::rom(*turbineCtx);
} }

View File

@ -69,7 +69,7 @@ constexpr ox::Error model(auto *io, ox::CommonPtrWith<GbaTileMapTarget> auto *t)
return io->template field<uint8_t, decltype(handleTileMap)>("tileMap", handleTileMap); return io->template field<uint8_t, decltype(handleTileMap)>("tileMap", handleTileMap);
} }
ox::Error initGfx(Context*, const InitParams&) noexcept { ox::Error initGfx(Context*, InitParams const&) noexcept {
for (auto bgCtl = &REG_BG0CTL; bgCtl <= &REG_BG3CTL; bgCtl += 2) { for (auto bgCtl = &REG_BG0CTL; bgCtl <= &REG_BG3CTL; bgCtl += 2) {
teagba::bgSetSbb(bgCtl, 28); teagba::bgSetSbb(bgCtl, 28);
} }
@ -108,8 +108,8 @@ void setBgCbb(Context*, unsigned bgIdx, unsigned cbb) noexcept {
static ox::Error loadBgTileSheet( static ox::Error loadBgTileSheet(
const ox::MemFS &rom, const ox::MemFS &rom,
unsigned cbb, unsigned cbb,
const ox::FileAddress &tilesheetAddr, ox::FileAddress const&tilesheetAddr,
const ox::FileAddress &paletteAddr) noexcept { ox::FileAddress const&paletteAddr) noexcept {
oxRequire(tsStat, rom.stat(tilesheetAddr)); oxRequire(tsStat, rom.stat(tilesheetAddr));
oxRequire(ts, rom.directAccess(tilesheetAddr)); oxRequire(ts, rom.directAccess(tilesheetAddr));
GbaTileMapTarget target; GbaTileMapTarget target;
@ -136,8 +136,8 @@ static ox::Error loadBgTileSheet(
ox::Error loadBgTileSheet( ox::Error loadBgTileSheet(
Context *ctx, Context *ctx,
unsigned cbb, unsigned cbb,
const ox::FileAddress &tilesheetAddr, ox::FileAddress const&tilesheetAddr,
const ox::FileAddress &paletteAddr) noexcept { ox::FileAddress const&paletteAddr) noexcept {
auto &gctx = static_cast<GbaContext&>(*ctx); auto &gctx = static_cast<GbaContext&>(*ctx);
auto &rom = static_cast<const ox::MemFS&>(gctx.rom()); auto &rom = static_cast<const ox::MemFS&>(gctx.rom());
return loadBgTileSheet(rom, cbb, tilesheetAddr, paletteAddr); return loadBgTileSheet(rom, cbb, tilesheetAddr, paletteAddr);
@ -145,8 +145,8 @@ ox::Error loadBgTileSheet(
ox::Error loadSpriteTileSheet( ox::Error loadSpriteTileSheet(
Context *ctx, Context *ctx,
const ox::FileAddress &tilesheetAddr, ox::FileAddress const&tilesheetAddr,
const ox::FileAddress &paletteAddr) noexcept { ox::FileAddress const&paletteAddr) noexcept {
auto &gctx = static_cast<GbaContext&>(*ctx); auto &gctx = static_cast<GbaContext&>(*ctx);
auto &rom = static_cast<const ox::MemFS&>(gctx.rom()); auto &rom = static_cast<const ox::MemFS&>(gctx.rom());
oxRequire(tsStat, gctx.rom().stat(tilesheetAddr)); oxRequire(tsStat, gctx.rom().stat(tilesheetAddr));
@ -164,7 +164,7 @@ ox::Error loadSpriteTileSheet(
return {}; return {};
} }
ox::Error loadBgPalette(Context *ctx, unsigned, const ox::FileAddress &paletteAddr) noexcept { ox::Error loadBgPalette(Context *ctx, unsigned, ox::FileAddress const&paletteAddr) noexcept {
auto &gctx = static_cast<GbaContext&>(*ctx); auto &gctx = static_cast<GbaContext&>(*ctx);
auto &rom = static_cast<const ox::MemFS&>(gctx.rom()); auto &rom = static_cast<const ox::MemFS&>(gctx.rom());
GbaPaletteTarget target; GbaPaletteTarget target;
@ -175,7 +175,7 @@ ox::Error loadBgPalette(Context *ctx, unsigned, const ox::FileAddress &paletteAd
return {}; return {};
} }
ox::Error loadSpritePalette(Context *ctx, unsigned cbb, const ox::FileAddress &paletteAddr) noexcept { ox::Error loadSpritePalette(Context *ctx, unsigned cbb, ox::FileAddress const&paletteAddr) noexcept {
auto &gctx = static_cast<GbaContext&>(*ctx); auto &gctx = static_cast<GbaContext&>(*ctx);
auto &rom = static_cast<const ox::MemFS&>(gctx.rom()); auto &rom = static_cast<const ox::MemFS&>(gctx.rom());
GbaPaletteTarget target; GbaPaletteTarget target;

View File

@ -7,5 +7,5 @@
#include <nostalgia/core/context.hpp> #include <nostalgia/core/context.hpp>
namespace nostalgia::core { namespace nostalgia::core {
ox::Error initGfx(Context *ctx, const InitParams&) noexcept; ox::Error initGfx(Context *ctx, InitParams const&) noexcept;
} }

View File

@ -15,7 +15,7 @@ namespace ox {
using namespace nostalgia::core; using namespace nostalgia::core;
void panic(const char *file, int line, const char *panicMsg, const ox::Error &err) noexcept { void panic(const char *file, int line, const char *panicMsg, ox::Error const&err) noexcept {
oxIgnoreError(initGfx(nullptr, {})); oxIgnoreError(initGfx(nullptr, {}));
oxIgnoreError(initConsole(nullptr)); oxIgnoreError(initConsole(nullptr));
// enable only BG 0 // enable only BG 0

View File

@ -16,7 +16,7 @@ GlContext::~GlContext() noexcept {
shutdownGfx(*this); shutdownGfx(*this);
} }
ox::Result<ox::UniquePtr<Context>> init(turbine::Context *tctx, const InitParams &params) noexcept { ox::Result<ox::UniquePtr<Context>> init(turbine::Context *tctx, InitParams const&params) noexcept {
auto ctx = ox::make_unique<GlContext>(*tctx); auto ctx = ox::make_unique<GlContext>(*tctx);
oxReturnError(initGfx(ctx.get(), params)); oxReturnError(initGfx(ctx.get(), params));
return ox::UPtr<Context>(ctx.release()); return ox::UPtr<Context>(ctx.release());

View File

@ -26,7 +26,7 @@ struct GlContext: public core::Context {
ox::Optional<ox::Size> renderSize; ox::Optional<ox::Size> renderSize;
renderer::Drawer drawer; renderer::Drawer drawer;
explicit GlContext(turbine::Context &tctx) noexcept; explicit GlContext(turbine::Context &tctx) noexcept;
~GlContext() noexcept; ~GlContext() noexcept override;
}; };
} }

View File

@ -108,7 +108,7 @@ static void setSpriteBufferObject(
memcpy(ebo, elms.data(), sizeof(elms)); memcpy(ebo, elms.data(), sizeof(elms));
} }
static void setTileBufferObject( void setTileBufferObject(
unsigned vi, unsigned vi,
float x, float x,
float y, float y,
@ -124,10 +124,10 @@ static void setTileBufferObject(
y += 1.0f - ymod; y += 1.0f - ymod;
const auto textureRowf = static_cast<float>(textureRow); const auto textureRowf = static_cast<float>(textureRow);
const ox::Array<float, BgVertexVboLength> vertices { const ox::Array<float, BgVertexVboLength> vertices {
x, y, 0, textureRowf + 1, // bottom left x, y, 0, textureRowf + 1, // bottom left
x + xmod, y, 1, textureRowf + 1, // bottom right x + xmod, y, 1, textureRowf + 1, // bottom right
x + xmod, y + ymod, 1, textureRowf + 0, // top right x + xmod, y + ymod, 1, textureRowf + 0, // top right
x, y + ymod, 0, textureRowf + 0, // top left x, y + ymod, 0, textureRowf + 0, // top left
}; };
memcpy(vbo, vertices.data(), sizeof(vertices)); memcpy(vbo, vertices.data(), sizeof(vertices));
const ox::Array<GLuint, BgVertexEboLength> elms { const ox::Array<GLuint, BgVertexEboLength> elms {
@ -204,8 +204,9 @@ static void initBackgroundBufferset(
glVertexAttribPointer(posAttr, 2, GL_FLOAT, GL_FALSE, BgVertexVboRowLength * sizeof(float), nullptr); glVertexAttribPointer(posAttr, 2, GL_FLOAT, GL_FALSE, BgVertexVboRowLength * sizeof(float), nullptr);
auto texCoordAttr = static_cast<GLuint>(glGetAttribLocation(shader, "vTexCoord")); auto texCoordAttr = static_cast<GLuint>(glGetAttribLocation(shader, "vTexCoord"));
glEnableVertexAttribArray(texCoordAttr); glEnableVertexAttribArray(texCoordAttr);
glVertexAttribPointer(texCoordAttr, 2, GL_FLOAT, GL_FALSE, BgVertexVboRowLength * sizeof(float), glVertexAttribPointer(
reinterpret_cast<void*>(2 * sizeof(float))); texCoordAttr, 2, GL_FLOAT, GL_FALSE, BgVertexVboRowLength * sizeof(bg->vertices[0]),
reinterpret_cast<void*>(2 * sizeof(bg->vertices[0])));
} }
static glutils::GLTexture loadTexture( static glutils::GLTexture loadTexture(
@ -283,7 +284,7 @@ static void drawSprites(GlContext *gctx, ox::Size const&renderSz) noexcept {
static void loadPalette( static void loadPalette(
GLuint shaderPgrm, GLuint shaderPgrm,
const Palette &pal, Palette const&pal,
bool firstIsTransparent = false) noexcept { bool firstIsTransparent = false) noexcept {
static constexpr std::size_t ColorCnt = 256; static constexpr std::size_t ColorCnt = 256;
ox::Array<GLfloat, ColorCnt * 4> palette{}; ox::Array<GLfloat, ColorCnt * 4> palette{};
@ -301,11 +302,11 @@ static void loadPalette(
glUniform4fv(uniformPalette, ColorCnt, palette.data()); glUniform4fv(uniformPalette, ColorCnt, palette.data());
} }
static void loadBgPalette(GlContext *gctx, const Palette &pal) noexcept { static void loadBgPalette(GlContext *gctx, Palette const&pal) noexcept {
loadPalette(gctx->bgShader, pal); loadPalette(gctx->bgShader, pal);
} }
static void loadSpritePalette(GlContext *gctx, const Palette &pal) noexcept { static void loadSpritePalette(GlContext *gctx, Palette const&pal) noexcept {
loadPalette(gctx->spriteShader, pal, true); loadPalette(gctx->spriteShader, pal, true);
} }
@ -332,7 +333,7 @@ static void loadSpriteTexture(
ox::Error initGfx( ox::Error initGfx(
Context *ctx, Context *ctx,
const InitParams &initParams) noexcept { InitParams const&initParams) noexcept {
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
const auto bgVshad = ox::sfmt(renderer::bgvshadTmpl, glutils::GlslVersion); const auto bgVshad = ox::sfmt(renderer::bgvshadTmpl, glutils::GlslVersion);
@ -364,8 +365,8 @@ struct TileSheetData {
int height = 0; int height = 0;
}; };
ox::Result<TileSheetData> loadTileSheet( static ox::Result<TileSheetData> loadTileSheet(
Context *ctx, const CompactTileSheet &tilesheet) noexcept { Context *ctx, CompactTileSheet const&tilesheet) noexcept {
auto &gctx = static_cast<GlContext&>(*ctx); auto &gctx = static_cast<GlContext&>(*ctx);
const unsigned bytesPerTile = tilesheet.bpp == 8 ? PixelsPerTile : PixelsPerTile / 2; const unsigned bytesPerTile = tilesheet.bpp == 8 ? PixelsPerTile : PixelsPerTile / 2;
const auto tiles = tilesheet.pixels.size() / bytesPerTile; const auto tiles = tilesheet.pixels.size() / bytesPerTile;
@ -391,8 +392,8 @@ ox::Result<TileSheetData> loadTileSheet(
ox::Error loadBgTileSheet( ox::Error loadBgTileSheet(
Context *ctx, Context *ctx,
unsigned cbb, unsigned cbb,
const ox::FileAddress &tilesheetAddr, ox::FileAddress const&tilesheetAddr,
const ox::FileAddress &paletteAddr) noexcept { ox::FileAddress const&paletteAddr) noexcept {
auto &gctx = static_cast<GlContext&>(*ctx); auto &gctx = static_cast<GlContext&>(*ctx);
auto &kctx = gctx.turbineCtx.keelCtx; auto &kctx = gctx.turbineCtx.keelCtx;
oxRequire(tilesheet, readObj<CompactTileSheet>(&kctx, tilesheetAddr)); oxRequire(tilesheet, readObj<CompactTileSheet>(&kctx, tilesheetAddr));
@ -405,8 +406,8 @@ ox::Error loadBgTileSheet(
ox::Error loadSpriteTileSheet( ox::Error loadSpriteTileSheet(
Context *ctx, Context *ctx,
const ox::FileAddress &tilesheetAddr, ox::FileAddress const&tilesheetAddr,
const ox::FileAddress &paletteAddr) noexcept { ox::FileAddress const&paletteAddr) noexcept {
auto &gctx = static_cast<GlContext&>(*ctx); auto &gctx = static_cast<GlContext&>(*ctx);
auto &kctx = gctx.turbineCtx.keelCtx; auto &kctx = gctx.turbineCtx.keelCtx;
oxRequire(tilesheet, readObj<CompactTileSheet>(&kctx, tilesheetAddr)); oxRequire(tilesheet, readObj<CompactTileSheet>(&kctx, tilesheetAddr));
@ -428,7 +429,12 @@ ox::Error initConsole(Context *ctx) noexcept {
void puts(Context *ctx, int column, int row, ox::CRStringView str) noexcept { void puts(Context *ctx, int column, int row, ox::CRStringView str) noexcept {
const auto col = static_cast<unsigned>(column); const auto col = static_cast<unsigned>(column);
for (auto i = 0u; i < str.bytes(); ++i) { for (auto i = 0u; i < str.bytes(); ++i) {
setTile(ctx, 0, static_cast<int>(col + i), row, static_cast<uint8_t>(charMap[static_cast<uint8_t>(str[i])])); setTile(
ctx,
0,
static_cast<int>(col + i),
row,
static_cast<uint8_t>(charMap[static_cast<uint8_t>(str[i])]));
} }
} }

View File

@ -63,6 +63,6 @@ class Drawer: public turbine::gl::Drawer {
} }
namespace nostalgia::core { namespace nostalgia::core {
ox::Error initGfx(Context *ctx, const InitParams&) noexcept; ox::Error initGfx(Context *ctx, InitParams const&) noexcept;
void shutdownGfx(Context &ctx) noexcept; void shutdownGfx(Context &ctx) noexcept;
} }

View File

@ -26,6 +26,7 @@ target_link_libraries(
Studio PUBLIC Studio PUBLIC
nfd nfd
OxEvent OxEvent
GlUtils
Turbine Turbine
) )

View File

@ -64,7 +64,7 @@ class Context {
Context(const Context &&other) noexcept = delete; Context(const Context &&other) noexcept = delete;
public: public:
inline ~Context() noexcept { virtual inline ~Context() noexcept {
shutdown(*this); shutdown(*this);
} }