diff options
-rw-r--r-- | src/renderwindow.c | 70 |
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); +} |