Compare commits
4 Commits
validation
...
ebridgewat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3f04387651 | ||
|
|
7b13964363 | ||
|
|
44b6c63fed | ||
|
|
6908f1b8af |
@@ -1139,6 +1139,7 @@ struct ExternalSamplerDatum {
|
|||||||
static_assert(sizeof(ExternalSamplerDatum) == 12);
|
static_assert(sizeof(ExternalSamplerDatum) == 12);
|
||||||
|
|
||||||
struct DescriptorSetLayout {
|
struct DescriptorSetLayout {
|
||||||
|
std::string label;
|
||||||
utils::FixedCapacityVector<DescriptorSetLayoutBinding> bindings;
|
utils::FixedCapacityVector<DescriptorSetLayoutBinding> bindings;
|
||||||
|
|
||||||
// TODO: uncomment when needed
|
// TODO: uncomment when needed
|
||||||
|
|||||||
@@ -228,6 +228,14 @@ WebGPUDriver::WebGPUDriver(WebGPUPlatform& platform, const Platform::DriverConfi
|
|||||||
driverConfig.disableHeapHandleTags) {
|
driverConfig.disableHeapHandleTags) {
|
||||||
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
||||||
printInstanceDetails(mPlatform.getInstance());
|
printInstanceDetails(mPlatform.getInstance());
|
||||||
|
#endif
|
||||||
|
mAdapter = mPlatform.requestAdapter(nullptr);
|
||||||
|
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
||||||
|
printAdapterDetails(mAdapter);
|
||||||
|
#endif
|
||||||
|
mDevice = mPlatform.requestDevice(mAdapter);
|
||||||
|
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
||||||
|
printDeviceDetails(mDevice);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,6 +344,9 @@ void WebGPUDriver::destroyTimerQuery(Handle<HwTimerQuery> tqh) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::destroyDescriptorSetLayout(Handle<HwDescriptorSetLayout> tqh) {
|
void WebGPUDriver::destroyDescriptorSetLayout(Handle<HwDescriptorSetLayout> tqh) {
|
||||||
|
if (tqh) {
|
||||||
|
destructHandle<WebGPUDescriptorSetLayout>(tqh);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebGPUDriver::destroyDescriptorSet(Handle<HwDescriptorSet> tqh) {
|
void WebGPUDriver::destroyDescriptorSet(Handle<HwDescriptorSet> tqh) {
|
||||||
@@ -410,8 +421,7 @@ Handle<HwRenderTarget> WebGPUDriver::createDefaultRenderTargetS() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwDescriptorSetLayout> WebGPUDriver::createDescriptorSetLayoutS() noexcept {
|
Handle<HwDescriptorSetLayout> WebGPUDriver::createDescriptorSetLayoutS() noexcept {
|
||||||
return Handle<HwDescriptorSetLayout>(
|
return allocHandle<WebGPUDescriptorSetLayout>();
|
||||||
(Handle<HwDescriptorSetLayout>::HandleId) mNextFakeHandle++);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Handle<HwTexture> WebGPUDriver::createTextureExternalImageS() noexcept {
|
Handle<HwTexture> WebGPUDriver::createTextureExternalImageS() noexcept {
|
||||||
@@ -430,14 +440,7 @@ void WebGPUDriver::createSwapChainR(Handle<HwSwapChain> sch, void* nativeWindow,
|
|||||||
mNativeWindow = nativeWindow;
|
mNativeWindow = nativeWindow;
|
||||||
assert_invariant(!mSwapChain);
|
assert_invariant(!mSwapChain);
|
||||||
wgpu::Surface surface = mPlatform.createSurface(nativeWindow, flags);
|
wgpu::Surface surface = mPlatform.createSurface(nativeWindow, flags);
|
||||||
mAdapter = mPlatform.requestAdapter(surface);
|
|
||||||
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
|
||||||
printAdapterDetails(mAdapter);
|
|
||||||
#endif
|
|
||||||
mDevice = mPlatform.requestDevice(mAdapter);
|
|
||||||
#if FWGPU_ENABLED(FWGPU_PRINT_SYSTEM)
|
|
||||||
printDeviceDetails(mDevice);
|
|
||||||
#endif
|
|
||||||
mQueue = mDevice.GetQueue();
|
mQueue = mDevice.GetQueue();
|
||||||
wgpu::Extent2D surfaceSize = mPlatform.getSurfaceExtent(mNativeWindow);
|
wgpu::Extent2D surfaceSize = mPlatform.getSurfaceExtent(mNativeWindow);
|
||||||
mSwapChain = constructHandle<WebGPUSwapChain>(sch, std::move(surface), surfaceSize, mAdapter,
|
mSwapChain = constructHandle<WebGPUSwapChain>(sch, std::move(surface), surfaceSize, mAdapter,
|
||||||
@@ -519,7 +522,9 @@ void WebGPUDriver::createFenceR(Handle<HwFence> fh, int) {}
|
|||||||
void WebGPUDriver::createTimerQueryR(Handle<HwTimerQuery> tqh, int) {}
|
void WebGPUDriver::createTimerQueryR(Handle<HwTimerQuery> tqh, int) {}
|
||||||
|
|
||||||
void WebGPUDriver::createDescriptorSetLayoutR(Handle<HwDescriptorSetLayout> dslh,
|
void WebGPUDriver::createDescriptorSetLayoutR(Handle<HwDescriptorSetLayout> dslh,
|
||||||
backend::DescriptorSetLayout&& info) {}
|
backend::DescriptorSetLayout&& info) {
|
||||||
|
constructHandle<WebGPUDescriptorSetLayout>(dslh, std::move(info), &mDevice);
|
||||||
|
}
|
||||||
|
|
||||||
void WebGPUDriver::createDescriptorSetR(Handle<HwDescriptorSet> dsh,
|
void WebGPUDriver::createDescriptorSetR(Handle<HwDescriptorSet> dsh,
|
||||||
Handle<HwDescriptorSetLayout> dslh) {}
|
Handle<HwDescriptorSetLayout> dslh) {}
|
||||||
|
|||||||
@@ -60,4 +60,94 @@ void WGPUVertexBuffer::setBuffer(WGPUBufferObject* bufferObject, uint32_t index)
|
|||||||
WGPUBufferObject::WGPUBufferObject(BufferObjectBinding bindingType, uint32_t byteCount)
|
WGPUBufferObject::WGPUBufferObject(BufferObjectBinding bindingType, uint32_t byteCount)
|
||||||
: HwBufferObject(byteCount),
|
: HwBufferObject(byteCount),
|
||||||
bufferObjectBinding(bindingType) {}
|
bufferObjectBinding(bindingType) {}
|
||||||
|
|
||||||
|
wgpu::ShaderStage WebGPUDescriptorSetLayout::filamentStageToWGPUStage(ShaderStageFlags fFlags) {
|
||||||
|
wgpu::ShaderStage ret = wgpu::ShaderStage::None;
|
||||||
|
if (any(ShaderStageFlags::VERTEX & fFlags)) {
|
||||||
|
ret |= wgpu::ShaderStage::Vertex;
|
||||||
|
}
|
||||||
|
if (any(ShaderStageFlags::FRAGMENT & fFlags)) {
|
||||||
|
ret |= wgpu::ShaderStage::Fragment;
|
||||||
|
}
|
||||||
|
if (any(ShaderStageFlags::COMPUTE & fFlags)) {
|
||||||
|
ret |= wgpu::ShaderStage::Compute;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
WebGPUDescriptorSetLayout::WebGPUDescriptorSetLayout(DescriptorSetLayout const& layout,
|
||||||
|
wgpu::Device const* device) {
|
||||||
|
assert_invariant(device->Get());
|
||||||
|
|
||||||
|
// TODO: layoutDescriptor has a "Label". Ideally we can get info on what this layout is for
|
||||||
|
// debugging. For now, hack an incrementing value.
|
||||||
|
static int layoutNum = 0;
|
||||||
|
|
||||||
|
|
||||||
|
uint samplerCount =
|
||||||
|
std::count_if(layout.bindings.begin(), layout.bindings.end(), [](auto& fEntry) {
|
||||||
|
return fEntry.type == DescriptorType::SAMPLER ||
|
||||||
|
fEntry.type == DescriptorType::SAMPLER_EXTERNAL;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<wgpu::BindGroupLayoutEntry> wEntries;
|
||||||
|
wEntries.reserve(layout.bindings.size() + samplerCount);
|
||||||
|
|
||||||
|
for (auto fEntry: layout.bindings) {
|
||||||
|
auto& wEntry = wEntries.emplace_back();
|
||||||
|
wEntry.visibility = filamentStageToWGPUStage(fEntry.stageFlags);
|
||||||
|
wEntry.binding = fEntry.binding * 2;
|
||||||
|
|
||||||
|
switch (fEntry.type) {
|
||||||
|
// TODO Metal treats these the same. Is this fine?
|
||||||
|
case DescriptorType::SAMPLER_EXTERNAL:
|
||||||
|
case DescriptorType::SAMPLER: {
|
||||||
|
// Sampler binding is 2n+1 due to split.
|
||||||
|
auto& samplerEntry = wEntries.emplace_back();
|
||||||
|
samplerEntry.binding = fEntry.binding * 2 + 1;
|
||||||
|
samplerEntry.visibility = wEntry.visibility;
|
||||||
|
// We are simply hoping that undefined and defaults suffices here.
|
||||||
|
samplerEntry.sampler.type = wgpu::SamplerBindingType::Undefined;
|
||||||
|
wEntry.texture.sampleType = wgpu::TextureSampleType::Undefined;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case DescriptorType::UNIFORM_BUFFER: {
|
||||||
|
wEntry.buffer.hasDynamicOffset =
|
||||||
|
any(fEntry.flags & DescriptorFlags::DYNAMIC_OFFSET);
|
||||||
|
wEntry.buffer.type = wgpu::BufferBindingType::Uniform;
|
||||||
|
// TODO: Ideally we fill minBindingSize
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DescriptorType::INPUT_ATTACHMENT: {
|
||||||
|
// TODO: support INPUT_ATTACHMENT. Metal does not currently.
|
||||||
|
PANIC_POSTCONDITION("Input Attachment is not supported");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DescriptorType::SHADER_STORAGE_BUFFER: {
|
||||||
|
// TODO: Vulkan does not support this, can we?
|
||||||
|
PANIC_POSTCONDITION("Shader storage is not supported");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Currently flags are only used to specify dynamic offset.
|
||||||
|
|
||||||
|
// UNUSED
|
||||||
|
// fEntry.count
|
||||||
|
}
|
||||||
|
|
||||||
|
wgpu::BindGroupLayoutDescriptor layoutDescriptor{
|
||||||
|
// TODO: layoutDescriptor has a "Label". Ideally we can get info on what this layout is for
|
||||||
|
// debugging. For now, hack an incrementing value.
|
||||||
|
.label{ "layout_"+ layout.label + std::to_string(++layoutNum) },
|
||||||
|
.entryCount = wEntries.size(),
|
||||||
|
.entries = wEntries.data()
|
||||||
|
};
|
||||||
|
// TODO Do we need to defer this until we have more info on textures and samplers??
|
||||||
|
mLayout = device->CreateBindGroupLayout(&layoutDescriptor);
|
||||||
|
}
|
||||||
|
WebGPUDescriptorSetLayout::~WebGPUDescriptorSetLayout() {}
|
||||||
}// namespace filament::backend
|
}// namespace filament::backend
|
||||||
|
|||||||
@@ -67,6 +67,18 @@ struct WGPUBufferObject : HwBufferObject {
|
|||||||
wgpu::Buffer buffer;
|
wgpu::Buffer buffer;
|
||||||
const BufferObjectBinding bufferObjectBinding;
|
const BufferObjectBinding bufferObjectBinding;
|
||||||
};
|
};
|
||||||
|
class WebGPUDescriptorSetLayout : public HwDescriptorSetLayout {
|
||||||
|
public:
|
||||||
|
WebGPUDescriptorSetLayout(DescriptorSetLayout const& layout, wgpu::Device const* device);
|
||||||
|
~WebGPUDescriptorSetLayout();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// TODO: If this is useful elsewhere, remove it from this class
|
||||||
|
// Convert Filament Shader Stage Flags bitmask to webgpu equivilant
|
||||||
|
static wgpu::ShaderStage filamentStageToWGPUStage(ShaderStageFlags fFlags);
|
||||||
|
|
||||||
|
wgpu::BindGroupLayout mLayout;
|
||||||
|
};
|
||||||
|
|
||||||
// TODO: Currently WGPUTexture is not used by WebGPU for useful task.
|
// TODO: Currently WGPUTexture is not used by WebGPU for useful task.
|
||||||
// Update the struct when used by WebGPU driver.
|
// Update the struct when used by WebGPU driver.
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ Shader::Shader(DriverApi& api, Cleanup& cleanup, ShaderConfig config) : mCleanup
|
|||||||
mProgram = cleanup.add(api.createProgram(std::move(prog)));
|
mProgram = cleanup.add(api.createProgram(std::move(prog)));
|
||||||
|
|
||||||
mDescriptorSetLayout = cleanup.add(
|
mDescriptorSetLayout = cleanup.add(
|
||||||
api.createDescriptorSetLayout(DescriptorSetLayout{ kLayouts }));
|
api.createDescriptorSetLayout(DescriptorSetLayout{ "kLayouts", kLayouts }));
|
||||||
}
|
}
|
||||||
|
|
||||||
filament::backend::DescriptorSetHandle Shader::createDescriptorSet(DriverApi& api) const {
|
filament::backend::DescriptorSetHandle Shader::createDescriptorSet(DriverApi& api) const {
|
||||||
|
|||||||
@@ -33,11 +33,11 @@ namespace filament::descriptor_sets {
|
|||||||
|
|
||||||
using namespace backend;
|
using namespace backend;
|
||||||
|
|
||||||
static DescriptorSetLayout const postProcessDescriptorSetLayout{{
|
static DescriptorSetLayout const postProcessDescriptorSetLayout{"postProcess", {
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
static DescriptorSetLayout const depthVariantDescriptorSetLayout{{
|
static DescriptorSetLayout const depthVariantDescriptorSetLayout{"depthVariant",{
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@@ -46,14 +46,14 @@ static DescriptorSetLayout const depthVariantDescriptorSetLayout{{
|
|||||||
// dedicated SSR vertex shader), which uses perViewDescriptorSetLayout.
|
// dedicated SSR vertex shader), which uses perViewDescriptorSetLayout.
|
||||||
// This means that PerViewBindingPoints::SHADOWS must be in the layout even though it's not used
|
// This means that PerViewBindingPoints::SHADOWS must be in the layout even though it's not used
|
||||||
// by the SSR variant.
|
// by the SSR variant.
|
||||||
static DescriptorSetLayout const ssrVariantDescriptorSetLayout{{
|
static DescriptorSetLayout const ssrVariantDescriptorSetLayout{"ssrVariant", {
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOWS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOWS },
|
||||||
{ DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::STRUCTURE },
|
{ DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::STRUCTURE },
|
||||||
{ DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SSR },
|
{ DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SSR },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
static DescriptorSetLayout perViewDescriptorSetLayout = {{
|
static DescriptorSetLayout perViewDescriptorSetLayout = {"perView", {
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FRAME_UNIFORMS },
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOWS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::SHADOWS },
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::LIGHTS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::LIGHTS },
|
||||||
@@ -68,7 +68,7 @@ static DescriptorSetLayout perViewDescriptorSetLayout = {{
|
|||||||
{ DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FOG },
|
{ DescriptorType::SAMPLER, ShaderStageFlags::FRAGMENT, +PerViewBindingPoints::FOG },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
static DescriptorSetLayout perRenderableDescriptorSetLayout = {{
|
static DescriptorSetLayout perRenderableDescriptorSetLayout = {"preRenderable",{
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::OBJECT_UNIFORMS, DescriptorFlags::DYNAMIC_OFFSET },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::OBJECT_UNIFORMS, DescriptorFlags::DYNAMIC_OFFSET },
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::BONES_UNIFORMS, DescriptorFlags::DYNAMIC_OFFSET },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::BONES_UNIFORMS, DescriptorFlags::DYNAMIC_OFFSET },
|
||||||
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::MORPHING_UNIFORMS },
|
{ DescriptorType::UNIFORM_BUFFER, ShaderStageFlags::VERTEX | ShaderStageFlags::FRAGMENT, +PerRenderableBindingPoints::MORPHING_UNIFORMS },
|
||||||
|
|||||||
Reference in New Issue
Block a user