From cf05128a96dbf6ea5dc147a8ff368f56b8622e89 Mon Sep 17 00:00:00 2001 From: Sergii Liebodkin Date: Thu, 28 Nov 2024 07:01:43 +0000 Subject: [PATCH] wg_engine: revision of device creation policy make valid device and instance as mandatory paramter for webgpu renderer --- examples/Example.h | 21 +++++++++++- src/renderer/wg_engine/tvgWgRenderer.cpp | 41 ++---------------------- src/renderer/wg_engine/tvgWgRenderer.h | 5 --- 3 files changed, 22 insertions(+), 45 deletions(-) diff --git a/examples/Example.h b/examples/Example.h index 37b04a0e..10f3c777 100644 --- a/examples/Example.h +++ b/examples/Example.h @@ -367,6 +367,8 @@ struct WgWindow : Window { WGPUInstance instance; WGPUSurface surface; + WGPUAdapter adapter; + WGPUDevice device; WgWindow(Example* example, uint32_t width, uint32_t height, uint32_t threadsCnt) : Window(tvg::CanvasEngine::Wg, example, width, height, threadsCnt) { @@ -412,11 +414,26 @@ struct WgWindow : Window }; #endif + // create surface WGPUSurfaceDescriptor surfaceDesc{}; surfaceDesc.nextInChain = (const WGPUChainedStruct*)&surfaceNativeDesc; surfaceDesc.label = "The surface"; surface = wgpuInstanceCreateSurface(instance, &surfaceDesc); + // request adapter + const WGPURequestAdapterOptions requestAdapterOptions { .compatibleSurface = surface, .powerPreference = WGPUPowerPreference_HighPerformance }; + auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, char const * message, void * pUserData) { *((WGPUAdapter*)pUserData) = adapter; }; + wgpuInstanceRequestAdapter(instance, &requestAdapterOptions, onAdapterRequestEnded, &adapter); + + // get adapter and surface properties + WGPUFeatureName featureNames[32]{}; + size_t featuresCount = wgpuAdapterEnumerateFeatures(this->adapter, featureNames); + + // request device + const WGPUDeviceDescriptor deviceDesc { .label = "The owned device", .requiredFeatureCount = featuresCount, .requiredFeatures = featureNames }; + auto onDeviceRequestEnded = [](WGPURequestDeviceStatus status, WGPUDevice device, char const * message, void * pUserData) { *((WGPUDevice*)pUserData) = device; }; + wgpuAdapterRequestDevice(this->adapter, &deviceDesc, onDeviceRequestEnded, &device); + //Create a Canvas canvas = tvg::WgCanvas::gen(); if (!canvas) { @@ -433,6 +450,8 @@ struct WgWindow : Window delete(canvas); canvas = nullptr; + wgpuDeviceRelease(device); + wgpuAdapterRelease(adapter); wgpuSurfaceRelease(surface); wgpuInstanceRelease(instance); } @@ -440,7 +459,7 @@ struct WgWindow : Window void resize() override { //Set the canvas target and draw on it. - verify(static_cast(canvas)->target(nullptr, instance, surface, width, height, tvg::ColorSpace::ABGR8888S)); + verify(static_cast(canvas)->target(device, instance, surface, width, height, tvg::ColorSpace::ABGR8888S)); } void refresh() override diff --git a/src/renderer/wg_engine/tvgWgRenderer.cpp b/src/renderer/wg_engine/tvgWgRenderer.cpp index 13c4c7b0..804f2fbe 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.cpp +++ b/src/renderer/wg_engine/tvgWgRenderer.cpp @@ -65,7 +65,6 @@ void WgRenderer::release() // release gpu handles clearTargets(); - releaseDevice(); } @@ -297,12 +296,7 @@ bool WgRenderer::target(WGPUDevice device, WGPUInstance instance, void* target, release(); // can not initialize renderer, give up - if (!instance || !target || !width || !height) return false; - - // store or regest gpu device - this->device = device; - if (!this->device) - reguestDevice(instance, (WGPUSurface)target); + if (!instance || !device || !target || !width || !height) return false; // store target properties mTargetSurface.stride = width; @@ -310,7 +304,7 @@ bool WgRenderer::target(WGPUDevice device, WGPUInstance instance, void* target, mTargetSurface.h = height; // initialize rendering context - mContext.initialize(instance, this->device); + mContext.initialize(instance, device); // initialize render tree instances mRenderStoragePool.initialize(mContext, width, height); @@ -326,37 +320,6 @@ bool WgRenderer::target(WGPUDevice device, WGPUInstance instance, void* target, } -void WgRenderer::reguestDevice(WGPUInstance instance, WGPUSurface surface) -{ - // request adapter - const WGPURequestAdapterOptions requestAdapterOptions { .compatibleSurface = surface, .powerPreference = WGPUPowerPreference_HighPerformance }; - auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, char const * message, void * pUserData) { *((WGPUAdapter*)pUserData) = adapter; }; - wgpuInstanceRequestAdapter(instance, &requestAdapterOptions, onAdapterRequestEnded, &this->adapter); - - // get adapter and surface properties - WGPUFeatureName featureNames[32]{}; - size_t featuresCount = wgpuAdapterEnumerateFeatures(this->adapter, featureNames); - - // request device - const WGPUDeviceDescriptor deviceDesc { .label = "The owned device", .requiredFeatureCount = featuresCount, .requiredFeatures = featureNames }; - auto onDeviceRequestEnded = [](WGPURequestDeviceStatus status, WGPUDevice device, char const * message, void * pUserData) { *((WGPUDevice*)pUserData) = device; }; - wgpuAdapterRequestDevice(this->adapter, &deviceDesc, onDeviceRequestEnded, &this->device); - gpuOwner = true; -} - - -void WgRenderer::releaseDevice() -{ - if (!gpuOwner) return; - wgpuDeviceRelease(device); - wgpuDeviceDestroy(device); - wgpuAdapterRelease(adapter); - device = nullptr; - adapter = nullptr; - gpuOwner = false; -} - - void WgRenderer::clearTargets() { releaseSurfaceTexture(); targetTexture = nullptr; diff --git a/src/renderer/wg_engine/tvgWgRenderer.h b/src/renderer/wg_engine/tvgWgRenderer.h index 4e6e36d5..0f4ac0d6 100755 --- a/src/renderer/wg_engine/tvgWgRenderer.h +++ b/src/renderer/wg_engine/tvgWgRenderer.h @@ -66,8 +66,6 @@ private: void disposeObjects(); void releaseSurfaceTexture(); - void reguestDevice(WGPUInstance instance, WGPUSurface surface); - void releaseDevice(); void clearTargets(); bool surfaceConfigure(WGPUSurface surface, WgContext& context, uint32_t width, uint32_t height); @@ -101,9 +99,6 @@ private: WGPUTexture targetTexture{}; // external handle WGPUSurfaceTexture surfaceTexture{}; WGPUSurface surface{}; // external handle - WGPUAdapter adapter{}; - WGPUDevice device{}; - bool gpuOwner{}; }; #endif /* _TVG_WG_RENDERER_H_ */