summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/renderwindow.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/renderwindow.c b/src/renderwindow.c
index 769105b..df7de96 100644
--- a/src/renderwindow.c
+++ b/src/renderwindow.c
@@ -1,5 +1,6 @@
#include <SDL3/SDL.h>
#include <dawn/webgpu.h>
+#include <inttypes.h>
#include "renderwindow.h"
#if defined(SDL_PLATFORM_LINUX)
@@ -11,10 +12,49 @@
#include <windows.h>
#endif
+void LogWindowProperties(RenderWindow* win);
+
+void HandleAdapterRequest
+(
+ WGPURequestAdapterStatus status,
+ WGPUAdapter wgpuAdapter,
+ WGPUStringView message,
+ void* userdata1,
+ void*
+) {
+ if (status != WGPURequestAdapterStatus_Success) {
+ SDL_Log("Failed to initialize adapter, error %s!\n", message.data);
+ return;
+ }
+
+ RenderWindow* renderWindow = userdata1;
+ renderWindow->wgpuAdapter = wgpuAdapter;
+}
+
+void HandleDeviceRequest
+(
+ WGPURequestDeviceStatus status,
+ WGPUDevice wgpuDevice,
+ WGPUStringView message,
+ void* userdata1,
+ void*
+) {
+ if (status != WGPURequestDeviceStatus_Success) {
+ SDL_Log("Failed to initialize adapter, error %s!\n", message.data);
+ return;
+ }
+
+ RenderWindow* renderWindow = userdata1;
+ renderWindow->wgpuDevice = wgpuDevice;
+}
+
+
RenderWindow InitRenderWindow(int width, int height, const char* title) {
RenderWindow renderWindow = {0};
SDL_Init(SDL_INIT_VIDEO);
+ SDL_Log("Initialized Video!\n");
renderWindow.window = SDL_CreateWindow(title, width, height, 0);
+ LogWindowProperties(&renderWindow);
renderWindow.wgpuInstance = wgpuCreateInstance(&(const WGPUInstanceDescriptor){
.requiredFeatureCount = 1,
@@ -91,13 +131,43 @@ RenderWindow InitRenderWindow(int width, int height, const char* title) {
#endif
SDL_assert(renderWindow.wgpuSurface);
+ WGPUFuture adapterFuture =
+ wgpuInstanceRequestAdapter(renderWindow.wgpuInstance, &(const WGPURequestAdapterOptions){
+ .compatibleSurface = renderWindow.wgpuSurface,
+ .powerPreference = WGPUPowerPreference_LowPower,
+ }, (const WGPURequestAdapterCallbackInfo){
+ .callback = HandleAdapterRequest,
+ .mode = WGPUCallbackMode_WaitAnyOnly,
+ .userdata1 = &renderWindow
+ });
+
+ wgpuInstanceWaitAny
+ (renderWindow.wgpuInstance, 1,
+ &(WGPUFutureWaitInfo){adapterFuture,false},
+ INT64_MAX
+ );
+ SDL_assert(renderWindow.wgpuInstance);
+
return renderWindow;
}
void QuitRenderWindow(RenderWindow* renderWindow) {
+ wgpuAdapterRelease(renderWindow->wgpuAdapter);
wgpuSurfaceRelease(renderWindow->wgpuSurface);
wgpuInstanceRelease(renderWindow->wgpuInstance);
SDL_DestroyWindow(renderWindow->window);
SDL_memset(renderWindow, 0, sizeof(RenderWindow));
SDL_Quit();
}
+
+void LogWindowProperties(RenderWindow* renderWindow) {
+ SDL_Window* window = renderWindow->window;
+
+ SDL_Log("WINDOW:\n");
+ SDL_Log("\tBACKEND:%s", SDL_GetCurrentVideoDriver());
+
+ int width, height;
+ SDL_GetWindowSize(window, &width, &height);
+ SDL_Log("\tWIDTH:%d\n", width);
+ SDL_Log("\tHEIGHT:%d\n", height);
+}