summaryrefslogtreecommitdiff
path: root/src/platform.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform.h')
-rw-r--r--src/platform.h106
1 files changed, 76 insertions, 30 deletions
diff --git a/src/platform.h b/src/platform.h
index 152a38d..0a98850 100644
--- a/src/platform.h
+++ b/src/platform.h
@@ -1,7 +1,76 @@
// Handles windowing, input, and native surface creation.
+// Consolidates platform-specific shims for WebGPU.
#pragma once
+#include <cstdint>
+#include <cstring>
+
+// WebGPU specific headers and shims
+#if defined(DEMO_CROSS_COMPILE_WIN32)
+#include <webgpu/webgpu.h>
+#include <webgpu/wgpu.h>
+
+#define WGPUOptionalBool_True true
+#define WGPUOptionalBool_False false
+#define WGPUSType_ShaderSourceWGSL WGPUSType_ShaderModuleWGSLDescriptor
+#define WGPU_DEPTH_SLICE_UNDEFINED 0xffffffff
+#define WGPUSurfaceGetCurrentTextureStatus_SuccessOptimal \
+ WGPUSurfaceGetCurrentTextureStatus_Success
+#define WGPUSurfaceGetCurrentTextureStatus_SuccessSuboptimal \
+ WGPUSurfaceGetCurrentTextureStatus_Success
+#define WGPUCallbackMode_WaitAnyOnly 0
+
+typedef WGPUShaderModuleWGSLDescriptor WGPUShaderSourceWGSL;
+
+static inline const char* str_view(const char* str) {
+ return str;
+}
+static inline const char* label_view(const char* str) {
+ return str;
+}
+
+static inline void platform_wgpu_wait_any(WGPUInstance instance) {
+ wgpuInstanceProcessEvents(instance);
+}
+static inline void
+platform_wgpu_set_error_callback(WGPUDevice device,
+ WGPUErrorCallback callback) {
+ wgpuDeviceSetUncapturedErrorCallback(device, callback, nullptr);
+}
+
+#else
+#include <webgpu.h>
+#include <wgpu.h>
+
+static inline WGPUStringView str_view(const char* str) {
+ if (!str)
+ return {nullptr, 0};
+ return {str, strlen(str)};
+}
+
+static inline WGPUStringView label_view(const char* str) {
+#if !defined(STRIP_ALL)
+ if (!str)
+ return {nullptr, 0};
+ return {str, strlen(str)};
+#else
+ (void)str;
+ return {nullptr, 0};
+#endif
+}
+
+static inline void platform_wgpu_wait_any(WGPUInstance instance) {
+ wgpuInstanceWaitAny(instance, 0, nullptr, 0);
+}
+static inline void
+platform_wgpu_set_error_callback(WGPUDevice device,
+ WGPUUncapturedErrorCallback callback) {
+ // Handled in descriptor for new API, but provided for compatibility if needed
+ // elsewhere
+}
+#endif
+
// Forward declare GLFWwindow to avoid including the full header here.
struct GLFWwindow;
@@ -9,46 +78,23 @@ struct PlatformState {
GLFWwindow* window = nullptr;
int width = 1280;
int height = 720;
+ float aspect_ratio = 1.0f;
+ double time = 0.0;
bool is_fullscreen = false;
// Store windowed geometry for fullscreen toggle
int windowed_x = 0, windowed_y = 0, windowed_w = 0, windowed_h = 0;
};
-void platform_init(PlatformState* state, bool fullscreen, int* width_ptr,
- int* height_ptr);
+// Refactored platform API
+PlatformState platform_init(bool fullscreen, int width, int height);
void platform_shutdown(PlatformState* state);
void platform_poll(PlatformState* state);
bool platform_should_close(PlatformState* state);
void platform_toggle_fullscreen(PlatformState* state);
-// Inline getters for direct access
-inline GLFWwindow* platform_get_window(PlatformState* state) {
- return state->window;
-}
-inline int platform_get_width(PlatformState* state) {
- return state->width;
-}
-inline int platform_get_height(PlatformState* state) {
- return state->height;
-}
-inline float platform_get_aspect_ratio(PlatformState* state) {
- if (state->height == 0)
- return 1.0f;
- return (float)state->width / (float)state->height;
-}
-
-// glfwGetTime is a simple global query, so it doesn't need the state struct.
-// Include the header directly to get the proper linkage.
-#include <GLFW/glfw3.h>
-inline double platform_get_time() {
- return glfwGetTime();
-}
-
// WebGPU specific surface creation
-#if defined(DEMO_CROSS_COMPILE_WIN32)
-#include <webgpu/webgpu.h>
-#else
-#include <wgpu.h>
-#endif
WGPUSurface platform_create_wgpu_surface(WGPUInstance instance,
PlatformState* state);
+
+// Global time query (if needed without state)
+double platform_get_time(); \ No newline at end of file