Merge pull request #5 from cozis/headless

Added OOGABOOGA_HEADLESS build for Windows
This commit is contained in:
Charlie 2024-07-22 10:11:13 +02:00 committed by GitHub
commit 01694b939c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 86 additions and 60 deletions

View file

@ -103,11 +103,6 @@ By default, the repository has an educational license that makes the engine free
[Educational license terms](https://github.com/alpinestudios/oogabooga/blob/master/LICENSE.md) [Educational license terms](https://github.com/alpinestudios/oogabooga/blob/master/LICENSE.md)
When you're ready to take the next step and work on a commercial game, you can upgrade to the full commercial license. You can obtain the full commercial license by being an active member of the community and making your first game.
Here are the benefits of obtaining the full license: [Learn more here](https://www.skool.com/game-dev)
- Permanent Ownership: You completely own the source code for life.
- No Recurring Fees or Royalties: Just an affordable one-time payment.
- It qualifies you to enter the private Skool community, where there's daily calls with Randy & Charlie, to help speedrun your game's development
You can [contact us](https://randy.gg/contact) to find out more.

View file

@ -16,7 +16,6 @@ int entry(int argc, char **argv) {
reset_temporary_storage(); reset_temporary_storage();
float64 now = os_get_current_time_in_seconds();
Matrix4 rect_xform = m4_scalar(1.0); Matrix4 rect_xform = m4_scalar(1.0);
rect_xform = m4_rotate_z(rect_xform, (f32)now); rect_xform = m4_rotate_z(rect_xform, (f32)now);
rect_xform = m4_translate(rect_xform, v3(-.25f, -.25f, 0)); rect_xform = m4_translate(rect_xform, v3(-.25f, -.25f, 0));

View file

@ -123,35 +123,6 @@ void CALLBACK d3d11_debug_callback(D3D11_MESSAGE_CATEGORY category, D3D11_MESSAG
} }
} }
#define win32_check_hr(hr) win32_check_hr_impl(hr, __LINE__, __FILE__);
void win32_check_hr_impl(HRESULT hr, u32 line, const char* file_name) {
if (hr != S_OK) {
LPVOID errorMsg;
DWORD dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS;
DWORD messageLength = FormatMessageW(
dwFlags,
NULL,
hr,
MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
(LPWSTR) &errorMsg,
0,
NULL );
if (messageLength > 0) {
MessageBoxW(NULL, (LPWSTR)errorMsg, L"Error", MB_OK | MB_ICONERROR);
} else {
MessageBoxW(NULL, L"Failed to retrieve error message.", L"Error", MB_OK | MB_ICONERROR);
}
panic("win32 hr failed in file %cs on line %d, hr was %d", file_name, line, hr);
}
}
void d3d11_update_swapchain() { void d3d11_update_swapchain() {
HRESULT hr; HRESULT hr;

View file

@ -19,7 +19,6 @@
case INPUT_EVENT_KEY: ...; break; case INPUT_EVENT_KEY: ...; break;
case INPUT_EVENT_SCROLL: ...; break; case INPUT_EVENT_SCROLL: ...; break;
case INPUT_EVENT_TEXT: ...; break; case INPUT_EVENT_TEXT: ...; break;
case INPUT_EVENT_CLOSE: ...; break;
} }
} }
*/ */

View file

@ -281,10 +281,6 @@ typedef u8 bool;
///// /////
#include "concurrency.c" #include "concurrency.c"
#include "gfx_interface.c"
#include "font.c"
#include "profiling.c" #include "profiling.c"
#include "random.c" #include "random.c"
@ -292,31 +288,40 @@ typedef u8 bool;
#include "memory.c" #include "memory.c"
#include "input.c" #include "input.c"
#include "drawing.c" #ifndef OOGABOOGA_HEADLESS
#include "audio.c" #include "gfx_interface.c"
// #Portability #include "font.c"
#if GFX_RENDERER == GFX_RENDERER_D3D11
#include "gfx_impl_d3d11.c" #include "drawing.c"
#elif GFX_RENDERER == GFX_RENDERER_VULKAN
#error "We only have a D3D11 renderer at the moment" #include "audio.c"
#elif GFX_RENDERER == GFX_RENDERER_METAL
#error "We only have a D3D11 renderer at the moment"
#else
#error "Unknown renderer GFX_RENDERER defined"
#endif #endif
#if TARGET_OS == WINDOWS #if TARGET_OS == WINDOWS
#include "os_impl_windows.c" #include "os_impl_windows.c"
#elif TARGET_OS == LINUX #elif TARGET_OS == LINUX
#error "Linux is not supported yet" #include "os_impl_linux.c"
#elif TARGET_OS == MACOS #elif TARGET_OS == MACOS
#error "Macos is not supported yet" #error "Macos is not supported yet"
#else #else
#error "Current OS is not supported" #error "Current OS is not supported"
#endif #endif
#ifndef OOGABOOGA_HEADLESS
// #Portability
#if GFX_RENDERER == GFX_RENDERER_D3D11
#include "gfx_impl_d3d11.c"
#elif GFX_RENDERER == GFX_RENDERER_VULKAN
#error "We only have a D3D11 renderer at the moment"
#elif GFX_RENDERER == GFX_RENDERER_METAL
#error "We only have a D3D11 renderer at the moment"
#else
#error "Unknown renderer GFX_RENDERER defined"
#endif
#endif
#include "tests.c" #include "tests.c"
#define malloc please_use_alloc_for_memory_allocations_instead_of_malloc #define malloc please_use_alloc_for_memory_allocations_instead_of_malloc
@ -350,7 +355,11 @@ void oogabooga_init(u64 program_memory_size) {
heap_init(); heap_init();
temporary_storage_init(); temporary_storage_init();
log_info("Ooga booga version is %d.%02d.%03d", OGB_VERSION_MAJOR, OGB_VERSION_MINOR, OGB_VERSION_PATCH); log_info("Ooga booga version is %d.%02d.%03d", OGB_VERSION_MAJOR, OGB_VERSION_MINOR, OGB_VERSION_PATCH);
#ifndef OOGABOOGA_HEADLESS
gfx_init(); gfx_init();
#else
log_info("Headless mode on");
#endif
log_verbose("CPU has sse1: %cs", features.sse1 ? "true" : "false"); log_verbose("CPU has sse1: %cs", features.sse1 ? "true" : "false");
log_verbose("CPU has sse2: %cs", features.sse2 ? "true" : "false"); log_verbose("CPU has sse2: %cs", features.sse2 ? "true" : "false");
log_verbose("CPU has sse3: %cs", features.sse3 ? "true" : "false"); log_verbose("CPU has sse3: %cs", features.sse3 ? "true" : "false");

View file

@ -12,6 +12,37 @@
void* heap_alloc(u64); void* heap_alloc(u64);
void heap_dealloc(void*); void heap_dealloc(void*);
#define win32_check_hr(hr) win32_check_hr_impl(hr, __LINE__, __FILE__);
void win32_check_hr_impl(HRESULT hr, u32 line, const char* file_name) {
if (hr != S_OK) {
LPVOID errorMsg;
DWORD dwFlags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS;
DWORD messageLength = FormatMessageW(
dwFlags,
NULL,
hr,
MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
(LPWSTR) &errorMsg,
0,
NULL );
if (messageLength > 0) {
MessageBoxW(NULL, (LPWSTR)errorMsg, L"Error", MB_OK | MB_ICONERROR);
} else {
MessageBoxW(NULL, L"Failed to retrieve error message.", L"Error", MB_OK | MB_ICONERROR);
}
panic("win32 hr failed in file %cs on line %d, hr was %d", file_name, line, hr);
}
}
#ifndef OOGABOOGA_HEADLESS
// Persistent // Persistent
Input_State_Flags win32_key_states[INPUT_KEY_CODE_COUNT]; Input_State_Flags win32_key_states[INPUT_KEY_CODE_COUNT];
@ -202,6 +233,7 @@ void
win32_audio_poll_default_device_thread(Thread *t); win32_audio_poll_default_device_thread(Thread *t);
bool win32_has_audio_thread_started = false; bool win32_has_audio_thread_started = false;
#endif /* OOGABOOGA_HEADLESS */
void os_init(u64 program_memory_size) { void os_init(u64 program_memory_size) {
@ -256,9 +288,9 @@ void os_init(u64 program_memory_size) {
os.crt_vsnprintf = (Crt_Vsnprintf_Proc)os_dynamic_library_load_symbol(os.crt, STR("vsnprintf")); os.crt_vsnprintf = (Crt_Vsnprintf_Proc)os_dynamic_library_load_symbol(os.crt, STR("vsnprintf"));
assert(os.crt_vsnprintf, "Missing vsnprintf in crt"); assert(os.crt_vsnprintf, "Missing vsnprintf in crt");
#ifndef OOGABOOGA_HEADLESS
win32_init_window(); win32_init_window();
local_persist Thread audio_thread, audio_poll_default_device_thread; local_persist Thread audio_thread, audio_poll_default_device_thread;
os_thread_init(&audio_thread, win32_audio_thread); os_thread_init(&audio_thread, win32_audio_thread);
@ -268,6 +300,7 @@ void os_init(u64 program_memory_size) {
os_thread_start(&audio_poll_default_device_thread); os_thread_start(&audio_poll_default_device_thread);
while (!win32_has_audio_thread_started) { os_yield_thread(); } while (!win32_has_audio_thread_started) { os_yield_thread(); }
#endif /* NOT OOGABOOGA_HEADLESS */
} }
void s64_to_null_terminated_string_reverse(char str[], int length) void s64_to_null_terminated_string_reverse(char str[], int length)
@ -1103,6 +1136,9 @@ os_get_stack_trace(u64 *trace_count, Allocator allocator) {
#endif // NOT DEBUG #endif // NOT DEBUG
} }
#ifndef OOGABOOGA_HEADLESS
// Actually fuck you bill gates // Actually fuck you bill gates
const GUID CLSID_MMDeviceEnumerator = {0xbcde0395, 0xe52f, 0x467c, {0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e}}; const GUID CLSID_MMDeviceEnumerator = {0xbcde0395, 0xe52f, 0x467c, {0x8e,0x3d, 0xc4,0x57,0x92,0x91,0x69,0x2e}};
const GUID IID_IMMDeviceEnumerator = {0xa95664d2, 0x9614, 0x4f35, {0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6}}; const GUID IID_IMMDeviceEnumerator = {0xa95664d2, 0x9614, 0x4f35, {0xa7,0x46, 0xde,0x8d,0xb6,0x36,0x17,0xe6}};
@ -1395,9 +1431,11 @@ win32_audio_thread(Thread *t) {
} }
} }
#endif /* OOGABOOGA_HEADLESS */
void os_update() { void os_update() {
#ifndef OOGABOOGA_HEADLESS
UINT dpi = GetDpiForWindow(window._os_handle); UINT dpi = GetDpiForWindow(window._os_handle);
float dpi_scale_factor = dpi / 96.0f; float dpi_scale_factor = dpi / 96.0f;
@ -1512,8 +1550,10 @@ void os_update() {
if (window.should_close) { if (window.should_close) {
win32_window_proc(window._os_handle, WM_CLOSE, 0, 0); win32_window_proc(window._os_handle, WM_CLOSE, 0, 0);
} }
#endif /* OOGABOOGA_HEADLESS */
} }
#ifndef OOGABOOGA_HEADLESS
Input_Key_Code os_key_to_key_code(void* os_key) { Input_Key_Code os_key_to_key_code(void* os_key) {
UINT win32_key = (UINT)(u64)os_key; UINT win32_key = (UINT)(u64)os_key;
@ -1625,3 +1665,4 @@ void* key_code_to_os_key(Input_Key_Code key_code) {
panic("Invalid key code %d", key_code); panic("Invalid key code %d", key_code);
return 0; return 0;
} }
#endif /* OOGABOOGA_HEADLESS */

View file

@ -8,6 +8,9 @@
typedef HANDLE File; typedef HANDLE File;
#elif defined(__linux__) #elif defined(__linux__)
#ifndef OOGABOOGA_HEADLESS
#define "Linux is only supported for headless builds"
#endif
typedef SOMETHING Mutex_Handle; typedef SOMETHING Mutex_Handle;
typedef SOMETHING Thread_Handle; typedef SOMETHING Thread_Handle;
typedef SOMETHING Dynamic_Library_Handle; typedef SOMETHING Dynamic_Library_Handle;
@ -282,6 +285,8 @@ void dump_stack_trace() {
} }
} }
#ifndef OOGABOOGA_HEADLESS
/// ///
/// ///
// Window management // Window management
@ -308,4 +313,6 @@ typedef struct Os_Window {
} Os_Window; } Os_Window;
Os_Window window; Os_Window window;
#endif
void os_update(); void os_update();

View file

@ -1151,6 +1151,7 @@ void test_mutex() {
mutex_destroy(&data.mutex); mutex_destroy(&data.mutex);
} }
#ifndef OOGABOOGA_HEADLESS
int compare_draw_quads(const void *a, const void *b) { int compare_draw_quads(const void *a, const void *b) {
return ((Draw_Quad*)a)->z-((Draw_Quad*)b)->z; return ((Draw_Quad*)a)->z-((Draw_Quad*)b)->z;
} }
@ -1220,6 +1221,8 @@ void test_sort() {
print("Merge sort took on average %llu cycles and %.2f ms\n", cycles / num_samples, (seconds * 1000.0) / (float64)num_samples); print("Merge sort took on average %llu cycles and %.2f ms\n", cycles / num_samples, (seconds * 1000.0) / (float64)num_samples);
} }
#endif /* OOGABOOGA_HEADLESS */
void oogabooga_run_tests() { void oogabooga_run_tests() {
@ -1259,9 +1262,11 @@ void oogabooga_run_tests() {
test_mutex(); test_mutex();
print("OK!\n"); print("OK!\n");
#ifndef OOGABOOGA_HEADLESS
print("Testing radix sort... "); print("Testing radix sort... ");
test_sort(); test_sort();
print("OK!\n"); print("OK!\n");
#endif
print("All tests ok!\n"); print("All tests ok!\n");
} }