Compare commits
3 Commits
ry/wgpuFix
...
ebridgewat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3041a7ccc0 | ||
|
|
06f8d073da | ||
|
|
e5b8f91859 |
@@ -143,6 +143,15 @@ abstract class MaterialCompiler extends TaskWithBinary {
|
|||||||
matcArgs += ['-a', 'vulkan']
|
matcArgs += ['-a', 'vulkan']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def include_webgpu = providers
|
||||||
|
.gradleProperty("com.google.android.filament.include-webgpu")
|
||||||
|
.forUseAtConfigurationTime().present
|
||||||
|
|
||||||
|
if (!include_webgpu) {
|
||||||
|
matcArgs += ['-a', 'webgpu']
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def mat_no_opt = providers
|
def mat_no_opt = providers
|
||||||
.gradleProperty("com.google.android.filament.matnopt")
|
.gradleProperty("com.google.android.filament.matnopt")
|
||||||
.forUseAtConfigurationTime().present
|
.forUseAtConfigurationTime().present
|
||||||
|
|||||||
@@ -257,6 +257,8 @@ if (FILAMENT_SUPPORTS_WEBGPU)
|
|||||||
src/webgpu/WebGPUDriver.h
|
src/webgpu/WebGPUDriver.h
|
||||||
src/webgpu/WebGPUSwapChain.cpp
|
src/webgpu/WebGPUSwapChain.cpp
|
||||||
src/webgpu/WebGPUSwapChain.h
|
src/webgpu/WebGPUSwapChain.h
|
||||||
|
src/webgpu/WebGPUHandles.cpp
|
||||||
|
src/webgpu/WebGPUHandles.h
|
||||||
)
|
)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
list(APPEND SRCS src/webgpu/platform/WebGPUPlatformWindows.cpp)
|
list(APPEND SRCS src/webgpu/platform/WebGPUPlatformWindows.cpp)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "CommandStreamDispatcher.h"
|
#include "CommandStreamDispatcher.h"
|
||||||
#include "DriverBase.h"
|
#include "DriverBase.h"
|
||||||
#include "private/backend/Dispatcher.h"
|
#include "private/backend/Dispatcher.h"
|
||||||
|
|
||||||
#include <backend/DriverEnums.h>
|
#include <backend/DriverEnums.h>
|
||||||
#include <backend/Handle.h>
|
#include <backend/Handle.h>
|
||||||
|
|
||||||
@@ -256,10 +257,14 @@ void WebGPUDriver::terminate() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::tick(int) {
|
void WebGPUDriver::tick(int) {
|
||||||
|
mDevice.Tick();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::beginFrame(int64_t monotonic_clock_ns,
|
void WebGPUDriver::beginFrame(int64_t monotonic_clock_ns,
|
||||||
int64_t refreshIntervalNs, uint32_t frameId) {
|
int64_t refreshIntervalNs, uint32_t frameId) {
|
||||||
|
wgpu::CommandEncoderDescriptor commandEncoderDescriptor{};
|
||||||
|
commandEncoderDescriptor.nextInChain = nullptr;
|
||||||
|
mCommandEncoder = mDevice.CreateCommandEncoder(&commandEncoderDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::setFrameScheduledCallback(Handle<HwSwapChain> sch,
|
void WebGPUDriver::setFrameScheduledCallback(Handle<HwSwapChain> sch,
|
||||||
@@ -276,6 +281,12 @@ void WebGPUDriver::setPresentationTime(int64_t monotonic_clock_ns) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::endFrame(uint32_t frameId) {
|
void WebGPUDriver::endFrame(uint32_t frameId) {
|
||||||
|
// FWGPU_LOGW << __FUNCTION__<< "\n";
|
||||||
|
mQueue.Submit(1, &mCommandBuffer);
|
||||||
|
mCommandEncoder = nullptr;
|
||||||
|
mCommandBuffer = nullptr;
|
||||||
|
mTextureView = nullptr;
|
||||||
|
mSwapChain->Present();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::flush(int) {
|
void WebGPUDriver::flush(int) {
|
||||||
@@ -342,7 +353,7 @@ Handle<HwSwapChain> WebGPUDriver::createSwapChainHeadlessS() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwTexture> WebGPUDriver::createTextureS() noexcept {
|
Handle<HwTexture> WebGPUDriver::createTextureS() noexcept {
|
||||||
return Handle<HwTexture>((Handle<HwTexture>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPUTexture>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwTexture> WebGPUDriver::importTextureS() noexcept {
|
Handle<HwTexture> WebGPUDriver::importTextureS() noexcept {
|
||||||
@@ -366,19 +377,19 @@ Handle<HwIndexBuffer> WebGPUDriver::createIndexBufferS() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwTexture> WebGPUDriver::createTextureViewS() noexcept {
|
Handle<HwTexture> WebGPUDriver::createTextureViewS() noexcept {
|
||||||
return Handle<HwTexture>((Handle<HwTexture>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPUTexture>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwBufferObject> WebGPUDriver::createBufferObjectS() noexcept {
|
Handle<HwBufferObject> WebGPUDriver::createBufferObjectS() noexcept {
|
||||||
return Handle<HwBufferObject>((Handle<HwBufferObject>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPUBufferObject>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwRenderTarget> WebGPUDriver::createRenderTargetS() noexcept {
|
Handle<HwRenderTarget> WebGPUDriver::createRenderTargetS() noexcept {
|
||||||
return Handle<HwRenderTarget>((Handle<HwRenderTarget>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPURenderTarget>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwVertexBuffer> WebGPUDriver::createVertexBufferS() noexcept {
|
Handle<HwVertexBuffer> WebGPUDriver::createVertexBufferS() noexcept {
|
||||||
return Handle<HwVertexBuffer>((Handle<HwVertexBuffer>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPUVertexBuffer>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwDescriptorSet> WebGPUDriver::createDescriptorSetS() noexcept {
|
Handle<HwDescriptorSet> WebGPUDriver::createDescriptorSetS() noexcept {
|
||||||
@@ -390,15 +401,15 @@ Handle<HwRenderPrimitive> WebGPUDriver::createRenderPrimitiveS() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwVertexBufferInfo> WebGPUDriver::createVertexBufferInfoS() noexcept {
|
Handle<HwVertexBufferInfo> WebGPUDriver::createVertexBufferInfoS() noexcept {
|
||||||
return Handle<HwVertexBufferInfo>((Handle<HwVertexBufferInfo>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPUVertexBufferInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwTexture> WebGPUDriver::createTextureViewSwizzleS() noexcept {
|
Handle<HwTexture> WebGPUDriver::createTextureViewSwizzleS() noexcept {
|
||||||
return Handle<HwTexture>((Handle<HwTexture>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPUTexture>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwRenderTarget> WebGPUDriver::createDefaultRenderTargetS() noexcept {
|
Handle<HwRenderTarget> WebGPUDriver::createDefaultRenderTargetS() noexcept {
|
||||||
return Handle<HwRenderTarget>((Handle<HwRenderTarget>::HandleId) mNextFakeHandle++);
|
return allocHandle<WGPURenderTarget>();
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwDescriptorSetLayout> WebGPUDriver::createDescriptorSetLayoutS() noexcept {
|
Handle<HwDescriptorSetLayout> WebGPUDriver::createDescriptorSetLayoutS() noexcept {
|
||||||
@@ -422,7 +433,7 @@ void WebGPUDriver::createSwapChainR(Handle<HwSwapChain> sch, void* nativeWindow,
|
|||||||
// TODO: use webgpu handle allocator from.
|
// TODO: use webgpu handle allocator from.
|
||||||
// https://github.com/google/filament/pull/8566
|
// https://github.com/google/filament/pull/8566
|
||||||
// HwSwapChain* hwSwapChain = handleCast<HwSwapChain*>(sch);
|
// HwSwapChain* hwSwapChain = handleCast<HwSwapChain*>(sch);
|
||||||
mSwapChain = nullptr;
|
assert_invariant(!mSwapChain);
|
||||||
wgpu::Surface surface = mPlatform.createSurface(nativeWindow, flags);
|
wgpu::Surface surface = mPlatform.createSurface(nativeWindow, flags);
|
||||||
mAdapter = mPlatform.requestAdapter(surface);
|
mAdapter = mPlatform.requestAdapter(surface);
|
||||||
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
||||||
@@ -434,6 +445,28 @@ void WebGPUDriver::createSwapChainR(Handle<HwSwapChain> sch, void* nativeWindow,
|
|||||||
#endif
|
#endif
|
||||||
mQueue = mDevice.GetQueue();
|
mQueue = mDevice.GetQueue();
|
||||||
mSwapChain = std::make_unique<WebGPUSwapChain>(std::move(surface), mAdapter, mDevice, flags);
|
mSwapChain = std::make_unique<WebGPUSwapChain>(std::move(surface), mAdapter, mDevice, flags);
|
||||||
|
// TODO configure the surface (maybe before or after creating the swapchain?
|
||||||
|
// how do we get the surface extent?)
|
||||||
|
// TODO actually create the swapchain
|
||||||
|
// auto onQueueWorkDone = [](wgpu::QueueWorkDoneStatus status, void* /* pUserData */) {
|
||||||
|
// FWGPU_LOGW << "Queued work finished with status: " << status << std::endl;
|
||||||
|
// };
|
||||||
|
// mQueue.OnSubmittedWorkDone(wgpu::CallbackMode::WaitAnyOnly, [](wgpu::QueueWorkDoneStatus status, void* pUserdata) {
|
||||||
|
// FWGPU_LOGW << "Queued work finished with status:\n";
|
||||||
|
// }, nullptr /* pUserData */);
|
||||||
|
void* userDataPtr = nullptr;
|
||||||
|
mQueue.OnSubmittedWorkDone(
|
||||||
|
wgpu::CallbackMode::AllowProcessEvents,
|
||||||
|
[](wgpu::QueueWorkDoneStatus status, void* pUserData) {
|
||||||
|
FWGPU_LOGW << "Queued work finished with status: " << static_cast<int>(status) << "\n";
|
||||||
|
if (pUserData == nullptr) {
|
||||||
|
// Expected case
|
||||||
|
} else {
|
||||||
|
FWGPU_LOGW << "Unexpected non-null pUserData received.\n";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
userDataPtr /* pUserData */
|
||||||
|
);
|
||||||
FWGPU_LOGW << "WebGPU support is still essentially a no-op at this point in development (only "
|
FWGPU_LOGW << "WebGPU support is still essentially a no-op at this point in development (only "
|
||||||
"background components have been instantiated/selected, such as surface/screen, "
|
"background components have been instantiated/selected, such as surface/screen, "
|
||||||
"graphics device/GPU, etc.), thus nothing is being drawn to the screen."
|
"graphics device/GPU, etc.), thus nothing is being drawn to the screen."
|
||||||
@@ -471,7 +504,13 @@ void WebGPUDriver::createTextureR(Handle<HwTexture> th, SamplerType target, uint
|
|||||||
TextureUsage usage) {}
|
TextureUsage usage) {}
|
||||||
|
|
||||||
void WebGPUDriver::createTextureViewR(Handle<HwTexture> th, Handle<HwTexture> srch,
|
void WebGPUDriver::createTextureViewR(Handle<HwTexture> th, Handle<HwTexture> srch,
|
||||||
uint8_t baseLevel, uint8_t levelCount) {}
|
uint8_t baseLevel, uint8_t levelCount) {
|
||||||
|
// FWGPU_LOGW << __FUNCTION__<< "\n";
|
||||||
|
WGPUTexture const* src = handleCast<WGPUTexture>(srch);
|
||||||
|
(void) src;
|
||||||
|
// textures.insert(
|
||||||
|
// constructHandle<WGPUTexture>(th, src, baseLevel, levelCount));
|
||||||
|
}
|
||||||
|
|
||||||
void WebGPUDriver::createTextureViewSwizzleR(Handle<HwTexture> th, Handle<HwTexture> srch,
|
void WebGPUDriver::createTextureViewSwizzleR(Handle<HwTexture> th, Handle<HwTexture> srch,
|
||||||
backend::TextureSwizzle r, backend::TextureSwizzle g, backend::TextureSwizzle b,
|
backend::TextureSwizzle r, backend::TextureSwizzle g, backend::TextureSwizzle b,
|
||||||
@@ -498,7 +537,11 @@ void WebGPUDriver::createRenderPrimitiveR(Handle<HwRenderPrimitive> rph, Handle<
|
|||||||
|
|
||||||
void WebGPUDriver::createProgramR(Handle<HwProgram> ph, Program&& program) {}
|
void WebGPUDriver::createProgramR(Handle<HwProgram> ph, Program&& program) {}
|
||||||
|
|
||||||
void WebGPUDriver::createDefaultRenderTargetR(Handle<HwRenderTarget> rth, int) {}
|
void WebGPUDriver::createDefaultRenderTargetR(Handle<HwRenderTarget> rth, int) {
|
||||||
|
assert_invariant(!mDefaultRenderTarget);
|
||||||
|
mDefaultRenderTarget = constructHandle<WGPURenderTarget>(rth);
|
||||||
|
assert_invariant(mDefaultRenderTarget);
|
||||||
|
}
|
||||||
|
|
||||||
void WebGPUDriver::createRenderTargetR(Handle<HwRenderTarget> rth, TargetBufferFlags targets,
|
void WebGPUDriver::createRenderTargetR(Handle<HwRenderTarget> rth, TargetBufferFlags targets,
|
||||||
uint32_t width, uint32_t height, uint8_t samples, uint8_t layerCount, MRT color,
|
uint32_t width, uint32_t height, uint8_t samples, uint8_t layerCount, MRT color,
|
||||||
@@ -659,6 +702,11 @@ void WebGPUDriver::resetBufferObject(Handle<HwBufferObject> boh) {
|
|||||||
|
|
||||||
void WebGPUDriver::setVertexBufferObject(Handle<HwVertexBuffer> vbh, uint32_t index,
|
void WebGPUDriver::setVertexBufferObject(Handle<HwVertexBuffer> vbh, uint32_t index,
|
||||||
Handle<HwBufferObject> boh) {
|
Handle<HwBufferObject> boh) {
|
||||||
|
auto* vertexBuffer = handleCast<WGPUVertexBuffer>(vbh);
|
||||||
|
auto* bufferObject = handleCast<WGPUBufferObject>(boh);
|
||||||
|
assert_invariant(index < vertexBuffer->mBuffers.size());
|
||||||
|
vertexBuffer->setBuffer(bufferObject, index);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::update3DImage(Handle<HwTexture> th,
|
void WebGPUDriver::update3DImage(Handle<HwTexture> th,
|
||||||
@@ -691,9 +739,33 @@ void WebGPUDriver::compilePrograms(CompilerPriorityQueue priority,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::beginRenderPass(Handle<HwRenderTarget> rth, const RenderPassParams& params) {
|
void WebGPUDriver::beginRenderPass(Handle<HwRenderTarget> rth, const RenderPassParams& params) {
|
||||||
|
// FWGPU_LOGW << __FUNCTION__<< "\n";
|
||||||
|
mTextureView = mSwapChain->GetNextSurfaceTextureView(params.viewport.width, params.viewport.height);
|
||||||
|
wgpu::RenderPassColorAttachment renderPassColorAttachment = {};
|
||||||
|
renderPassColorAttachment.view = mTextureView;
|
||||||
|
renderPassColorAttachment.resolveTarget = nullptr;
|
||||||
|
renderPassColorAttachment.loadOp = wgpu::LoadOp::Clear;
|
||||||
|
renderPassColorAttachment.storeOp = wgpu::StoreOp::Store;
|
||||||
|
renderPassColorAttachment.clearValue = wgpu::Color{1, 0 , 0 , 1};
|
||||||
|
renderPassColorAttachment.depthSlice = WGPU_DEPTH_SLICE_UNDEFINED;
|
||||||
|
|
||||||
|
wgpu::RenderPassDescriptor renderPassDescriptor = {};
|
||||||
|
renderPassDescriptor.nextInChain = nullptr;
|
||||||
|
renderPassDescriptor.colorAttachmentCount = 1;
|
||||||
|
renderPassDescriptor.colorAttachments = &renderPassColorAttachment;
|
||||||
|
renderPassDescriptor.depthStencilAttachment = nullptr;
|
||||||
|
renderPassDescriptor.timestampWrites = nullptr;
|
||||||
|
|
||||||
|
mRenderPassEncoder = mCommandEncoder.BeginRenderPass(&renderPassDescriptor);
|
||||||
|
mRenderPassEncoder.SetViewport((float)params.viewport.left, (float)params.viewport.bottom,
|
||||||
|
(float) params.viewport.width, (float) params.viewport.height, params.depthRange.near, params.depthRange.far);
|
||||||
|
// (float) 1024/*params.viewport.width*/, (float) 640/*params.viewport.height*/, params.depthRange.near, params.depthRange.far);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::endRenderPass(int) {
|
void WebGPUDriver::endRenderPass(int) {
|
||||||
|
// FWGPU_LOGW << __FUNCTION__<< "\n";
|
||||||
|
mRenderPassEncoder.End();
|
||||||
|
mRenderPassEncoder = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::nextSubpass(int) {
|
void WebGPUDriver::nextSubpass(int) {
|
||||||
@@ -703,6 +775,12 @@ void WebGPUDriver::makeCurrent(Handle<HwSwapChain> drawSch, Handle<HwSwapChain>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::commit(Handle<HwSwapChain> sch) {
|
void WebGPUDriver::commit(Handle<HwSwapChain> sch) {
|
||||||
|
wgpu::CommandBufferDescriptor commandBufferDescriptor = {};
|
||||||
|
commandBufferDescriptor.nextInChain = nullptr;
|
||||||
|
mCommandBuffer = mCommandEncoder.Finish(&commandBufferDescriptor);
|
||||||
|
|
||||||
|
// mQueue.Submit(1, &mCommandBuffer);
|
||||||
|
// mCommandBuffer = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::setPushConstant(backend::ShaderStage stage, uint8_t index,
|
void WebGPUDriver::setPushConstant(backend::ShaderStage stage, uint8_t index,
|
||||||
@@ -759,6 +837,8 @@ void WebGPUDriver::bindRenderPrimitive(Handle<HwRenderPrimitive> rph) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::draw2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) {
|
void WebGPUDriver::draw2(uint32_t indexOffset, uint32_t indexCount, uint32_t instanceCount) {
|
||||||
|
// mRenderPassEncoder.DrawIndexed(indexCount, instanceCount, indexOffset, 0, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::draw(PipelineState pipelineState, Handle<HwRenderPrimitive> rph,
|
void WebGPUDriver::draw(PipelineState pipelineState, Handle<HwRenderPrimitive> rph,
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
|
|
||||||
#include <webgpu/webgpu_cpp.h>
|
#include <webgpu/webgpu_cpp.h>
|
||||||
|
|
||||||
|
#include "WebGPUHandles.h"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@@ -63,7 +65,11 @@ private:
|
|||||||
// TODO consider moving to handle allocator when ready
|
// TODO consider moving to handle allocator when ready
|
||||||
std::unique_ptr<WebGPUSwapChain> mSwapChain = nullptr;
|
std::unique_ptr<WebGPUSwapChain> mSwapChain = nullptr;
|
||||||
uint64_t mNextFakeHandle = 1;
|
uint64_t mNextFakeHandle = 1;
|
||||||
|
wgpu::CommandEncoder mCommandEncoder = nullptr;
|
||||||
|
wgpu::TextureView mTextureView = nullptr;
|
||||||
|
wgpu::RenderPassEncoder mRenderPassEncoder = nullptr;
|
||||||
|
wgpu::CommandBuffer mCommandBuffer = nullptr;
|
||||||
|
WGPURenderTarget* mDefaultRenderTarget = nullptr;
|
||||||
/*
|
/*
|
||||||
* Driver interface
|
* Driver interface
|
||||||
*/
|
*/
|
||||||
@@ -93,6 +99,15 @@ private:
|
|||||||
return mHandleAllocator.allocate<D>();
|
return mHandleAllocator.allocate<D>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename D, typename B, typename ... ARGS>
|
||||||
|
D* constructHandle(Handle<B>& handle, ARGS&& ... args) noexcept {
|
||||||
|
return mHandleAllocator.construct<D>(handle, std::forward<ARGS>(args)...);
|
||||||
|
}
|
||||||
|
template<typename D, typename B>
|
||||||
|
D* handleCast(Handle<B> handle) noexcept {
|
||||||
|
return mHandleAllocator.handle_cast<D*>(handle);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace filament::backend
|
}// namespace filament::backend
|
||||||
|
|||||||
19
filament/backend/src/webgpu/WebGPUHandles.cpp
Normal file
19
filament/backend/src/webgpu/WebGPUHandles.cpp
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// Created by Idris Idris Shah on 3/21/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "WebGPUHandles.h"
|
||||||
|
|
||||||
|
namespace filament::backend {
|
||||||
|
|
||||||
|
WGPUVertexBuffer::WGPUVertexBuffer(uint32_t vextexCount, uint32_t bufferCount,
|
||||||
|
Handle<WGPUVertexBufferInfo> vbih)
|
||||||
|
: HwVertexBuffer(vextexCount),
|
||||||
|
vbih(vbih),
|
||||||
|
mBuffers(MAX_VERTEX_BUFFER_COUNT) {}
|
||||||
|
void WGPUVertexBuffer::setBuffer(WGPUBufferObject* bufferObject, uint32_t index) {}
|
||||||
|
|
||||||
|
WGPUBufferObject::WGPUBufferObject(BufferObjectBinding bindingType, uint32_t byteCount)
|
||||||
|
: HwBufferObject(byteCount),
|
||||||
|
mBindingType(bindingType) {}
|
||||||
|
}// namespace filament::backend
|
||||||
109
filament/backend/src/webgpu/WebGPUHandles.h
Normal file
109
filament/backend/src/webgpu/WebGPUHandles.h
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
//
|
||||||
|
// Created by Idris Idris Shah on 3/21/25.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef TNT_FILAMENT_BACKEND_WEBGPUHANDLES_H
|
||||||
|
#define TNT_FILAMENT_BACKEND_WEBGPUHANDLES_H
|
||||||
|
|
||||||
|
#include "DriverBase.h"
|
||||||
|
|
||||||
|
#include <backend/DriverEnums.h>
|
||||||
|
#include <backend/Handle.h>
|
||||||
|
#include <utils/FixedCapacityVector.h>
|
||||||
|
|
||||||
|
#include <webgpu/webgpu_cpp.h>
|
||||||
|
|
||||||
|
namespace filament::backend {
|
||||||
|
|
||||||
|
struct WGPUBufferObject;
|
||||||
|
struct WGPUVertexBufferInfo : public HwVertexBufferInfo {
|
||||||
|
WGPUVertexBufferInfo(uint8_t bufferCount, uint8_t attributeCount,
|
||||||
|
AttributeArray const& attributes)
|
||||||
|
: HwVertexBufferInfo(bufferCount, attributeCount),
|
||||||
|
attributes(attributes) {}
|
||||||
|
AttributeArray attributes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WGPUVertexBuffer : public HwVertexBuffer {
|
||||||
|
WGPUVertexBuffer(uint32_t vextexCount, uint32_t bufferCount, Handle<WGPUVertexBufferInfo> vbih);
|
||||||
|
void setBuffer(WGPUBufferObject* bufferObject, uint32_t index);
|
||||||
|
|
||||||
|
Handle<WGPUVertexBufferInfo> vbih;
|
||||||
|
utils::FixedCapacityVector<wgpu::Buffer> mBuffers;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WGPUIndexBuffer : public HwIndexBuffer {
|
||||||
|
WGPUIndexBuffer(BufferUsage usage, uint8_t elementSize, uint32_t indexCount);
|
||||||
|
|
||||||
|
wgpu::Buffer buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WGPUBufferObject : HwBufferObject {
|
||||||
|
WGPUBufferObject(BufferObjectBinding bindingType, uint32_t byteCount);
|
||||||
|
|
||||||
|
wgpu::Buffer mBuffer;
|
||||||
|
const BufferObjectBinding mBindingType;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WGPUTexture : public HwTexture {
|
||||||
|
public:
|
||||||
|
WGPUTexture(SamplerType target, uint8_t levels, TextureFormat format, uint8_t samples,
|
||||||
|
uint32_t width, uint32_t height, uint32_t depth, TextureUsage usage) noexcept;
|
||||||
|
|
||||||
|
// constructors for creating texture views
|
||||||
|
WGPUTexture(WGPUTexture const* src, uint8_t baseLevel, uint8_t levelCount) noexcept;
|
||||||
|
|
||||||
|
wgpu::Texture texture = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
class WGPURenderTarget : public HwRenderTarget {
|
||||||
|
public:
|
||||||
|
class Attachment {
|
||||||
|
public:
|
||||||
|
friend class WGPURenderTarget;
|
||||||
|
|
||||||
|
Attachment() = default;
|
||||||
|
Attachment(WGPUTexture* gpuTexture, uint8_t level = 0, uint16_t layer = 0)
|
||||||
|
: level(level),
|
||||||
|
layer(layer),
|
||||||
|
texture(gpuTexture->texture),
|
||||||
|
mWGPUTexture(gpuTexture) {}
|
||||||
|
|
||||||
|
uint8_t level = 0;
|
||||||
|
uint16_t layer = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
wgpu::Texture texture = nullptr;
|
||||||
|
WGPUTexture* mWGPUTexture = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
WGPURenderTarget(uint32_t width, uint32_t height, uint8_t samples,
|
||||||
|
Attachment colorAttachments[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT]);
|
||||||
|
WGPURenderTarget()
|
||||||
|
: HwRenderTarget(0, 0),
|
||||||
|
defaultRenderTarget(true) {}
|
||||||
|
|
||||||
|
void setUpRenderPassAttachments(wgpu::RenderPassDescriptor* descriptor,
|
||||||
|
const RenderPassParams& params);
|
||||||
|
|
||||||
|
math::uint2 getAttachmentSize() noexcept;
|
||||||
|
|
||||||
|
bool isDefaultRenderTarget() const { return defaultRenderTarget; }
|
||||||
|
uint8_t getSamples() const { return samples; }
|
||||||
|
|
||||||
|
Attachment getDrawColorAttachment(size_t index);
|
||||||
|
Attachment getReadColorAttachment(size_t index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static wgpu::LoadOp getLoadAction(const RenderPassParams& params, TargetBufferFlags buffer);
|
||||||
|
static wgpu::LoadOp getStoreAction(const RenderPassParams& params, TargetBufferFlags buffer);
|
||||||
|
|
||||||
|
bool defaultRenderTarget = false;
|
||||||
|
uint8_t samples = 1;
|
||||||
|
|
||||||
|
Attachment color[MRT::MAX_SUPPORTED_RENDER_TARGET_COUNT] = {};
|
||||||
|
math::uint2 attachmentSize = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
}// namespace filament::backend
|
||||||
|
#endif// TNT_FILAMENT_BACKEND_WEBGPUHANDLES_H
|
||||||
@@ -246,4 +246,32 @@ void WebGPUSwapChain::GetCurrentTexture(uint32_t width, uint32_t height, wgpu::S
|
|||||||
mSurface.GetCurrentTexture(texture);
|
mSurface.GetCurrentTexture(texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wgpu::TextureView WebGPUSwapChain::GetNextSurfaceTextureView(uint32_t width, uint32_t height) {
|
||||||
|
wgpu::SurfaceTexture surfaceTexture;
|
||||||
|
GetCurrentTexture(width, height, &surfaceTexture);
|
||||||
|
if (surfaceTexture.status != wgpu::SurfaceGetCurrentTextureStatus::Success) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a view for this surface texture
|
||||||
|
wgpu::TextureViewDescriptor textureViewDescriptor;
|
||||||
|
textureViewDescriptor.nextInChain = nullptr;
|
||||||
|
textureViewDescriptor.label = "Surface texture view";
|
||||||
|
textureViewDescriptor.format = surfaceTexture.texture.GetFormat();
|
||||||
|
textureViewDescriptor.dimension = wgpu::TextureViewDimension::e2D;
|
||||||
|
textureViewDescriptor.baseMipLevel = 0;
|
||||||
|
textureViewDescriptor.mipLevelCount = 1;
|
||||||
|
textureViewDescriptor.baseArrayLayer = 0;
|
||||||
|
textureViewDescriptor.arrayLayerCount = 1;
|
||||||
|
textureViewDescriptor.aspect = wgpu::TextureAspect::All;
|
||||||
|
wgpu::TextureView textureView = surfaceTexture.texture.CreateView(&textureViewDescriptor);
|
||||||
|
|
||||||
|
return textureView;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebGPUSwapChain::Present() {
|
||||||
|
assert_invariant(mSurface);
|
||||||
|
mSurface.Present();
|
||||||
|
}
|
||||||
|
|
||||||
}// namespace filament::backend
|
}// namespace filament::backend
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ public:
|
|||||||
~WebGPUSwapChain();
|
~WebGPUSwapChain();
|
||||||
|
|
||||||
void GetCurrentTexture(uint32_t width, uint32_t height, wgpu::SurfaceTexture*);
|
void GetCurrentTexture(uint32_t width, uint32_t height, wgpu::SurfaceTexture*);
|
||||||
|
wgpu::TextureView GetNextSurfaceTextureView(uint32_t width, uint32_t height);
|
||||||
|
void Present();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wgpu::Surface mSurface = {};
|
wgpu::Surface mSurface = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user