mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2025-10-30 08:02:29 +00:00
* `RendererContext` abstract class * Delete rt64_layer * Implement renderer creation callback * Make `GraphicsConfig` an abstract class * Remove rt64 * Add renderer callback to `ultramodern::set_callbacks` * Fix rebase * Change setup_result's visibility to protected * Declare abstract `is_equal` method instead of operators * Various fixes * Fix issues * trigger_config_action * Move GraphicsConfig back to ultramodern * Change `update_config` to return if any changes were applied * Rename renderer_wrapper to renderer_context * Remove SDL2 and other libraries * Allow registering get_graphics_api_name * Move WindowHandle to renderer namespace * Comments explaining which callbacks are required * Fix CI * Update readme * `ULTRAMODERN_QUICK_EXIT` macro * Remove --config from readme * Add `add_compile_definitions(NOMINMAX)`
66 lines
2.3 KiB
C++
66 lines
2.3 KiB
C++
#include <cassert>
|
|
|
|
#include "ultramodern/ultramodern.hpp"
|
|
|
|
static PTR(OSThread) running_queue_impl = NULLPTR;
|
|
|
|
static PTR(OSThread)* queue_to_ptr(RDRAM_ARG PTR(PTR(OSThread)) queue) {
|
|
if (queue == ultramodern::running_queue) {
|
|
return &running_queue_impl;
|
|
}
|
|
return TO_PTR(PTR(OSThread), queue);
|
|
}
|
|
|
|
void ultramodern::thread_queue_insert(RDRAM_ARG PTR(PTR(OSThread)) queue_, PTR(OSThread) toadd_) {
|
|
PTR(OSThread)* cur = queue_to_ptr(PASS_RDRAM queue_);
|
|
OSThread* toadd = TO_PTR(OSThread, toadd_);
|
|
debug_printf("[Thread Queue] Inserting thread %d into queue 0x%08X\n", toadd->id, (uintptr_t)queue_);
|
|
while (*cur && TO_PTR(OSThread, *cur)->priority > toadd->priority) {
|
|
cur = &TO_PTR(OSThread, *cur)->next;
|
|
}
|
|
toadd->next = (*cur);
|
|
toadd->queue = queue_;
|
|
*cur = toadd_;
|
|
|
|
debug_printf(" Contains:");
|
|
cur = queue_to_ptr(PASS_RDRAM queue_);
|
|
while (*cur) {
|
|
debug_printf("%d (%d) ", TO_PTR(OSThread, *cur)->id, TO_PTR(OSThread, *cur)->priority);
|
|
cur = &TO_PTR(OSThread, *cur)->next;
|
|
}
|
|
debug_printf("\n");
|
|
}
|
|
|
|
PTR(OSThread) ultramodern::thread_queue_pop(RDRAM_ARG PTR(PTR(OSThread)) queue_) {
|
|
PTR(OSThread)* queue = queue_to_ptr(PASS_RDRAM queue_);
|
|
PTR(OSThread) ret = *queue;
|
|
*queue = TO_PTR(OSThread, ret)->next;
|
|
TO_PTR(OSThread, ret)->queue = NULLPTR;
|
|
debug_printf("[Thread Queue] Popped thread %d from queue 0x%08X\n", TO_PTR(OSThread, ret)->id, (uintptr_t)queue_);
|
|
return ret;
|
|
}
|
|
|
|
bool ultramodern::thread_queue_remove(RDRAM_ARG PTR(PTR(OSThread)) queue_, PTR(OSThread) t_) {
|
|
debug_printf("[Thread Queue] Removing thread %d from queue 0x%08X\n", TO_PTR(OSThread, t_)->id, (uintptr_t)queue_);
|
|
|
|
PTR(PTR(OSThread)) cur = queue_;
|
|
while (cur != NULLPTR) {
|
|
PTR(OSThread)* cur_ptr = queue_to_ptr(PASS_RDRAM queue_);
|
|
if (*cur_ptr == t_) {
|
|
return true;
|
|
}
|
|
cur = TO_PTR(OSThread, *cur_ptr)->next;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool ultramodern::thread_queue_empty(RDRAM_ARG PTR(PTR(OSThread)) queue_) {
|
|
PTR(OSThread)* queue = queue_to_ptr(PASS_RDRAM queue_);
|
|
return *queue == NULLPTR;
|
|
}
|
|
|
|
PTR(OSThread) ultramodern::thread_queue_peek(RDRAM_ARG PTR(PTR(OSThread)) queue_) {
|
|
PTR(OSThread)* queue = queue_to_ptr(PASS_RDRAM queue_);
|
|
return *queue;
|
|
}
|