mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-20 19:01:34 +00:00
In a typical graphics application it is a common usage to update some uniforms once per draw, and such uniforms include the word positions, orientations, and so on. In the current state of WebGPU, this means that for each draw call we have to create a new bind group to set the right uniform values. Bind group creation is expected to be more expensive than recording draws because a memory allocation is required. The functionality of dynamic buffer offset is to reduce the number of bind groups that need to be created. The patch implements dynamic buffer offset on D3D backend using root descriptor. Bug=dawn:55 Change-Id: Ia713a4edb3c0ab8f3bba048d7813f343e9dee166 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/9040 Commit-Queue: Shaobo Yan <shaobo.yan@intel.com> Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
75 lines
2.6 KiB
C++
75 lines
2.6 KiB
C++
// Copyright 2017 The Dawn Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef DAWNNATIVE_BINDGROUPLAYOUT_H_
|
|
#define DAWNNATIVE_BINDGROUPLAYOUT_H_
|
|
|
|
#include "common/Constants.h"
|
|
#include "dawn_native/Error.h"
|
|
#include "dawn_native/Forward.h"
|
|
#include "dawn_native/ObjectBase.h"
|
|
|
|
#include "dawn_native/dawn_platform.h"
|
|
|
|
#include <array>
|
|
#include <bitset>
|
|
|
|
namespace dawn_native {
|
|
|
|
MaybeError ValidateBindGroupLayoutDescriptor(DeviceBase*,
|
|
const BindGroupLayoutDescriptor* descriptor);
|
|
|
|
class BindGroupLayoutBase : public ObjectBase {
|
|
public:
|
|
BindGroupLayoutBase(DeviceBase* device,
|
|
const BindGroupLayoutDescriptor* descriptor,
|
|
bool blueprint = false);
|
|
~BindGroupLayoutBase() override;
|
|
|
|
static BindGroupLayoutBase* MakeError(DeviceBase* device);
|
|
|
|
struct LayoutBindingInfo {
|
|
std::array<dawn::ShaderStageBit, kMaxBindingsPerGroup> visibilities;
|
|
std::array<dawn::BindingType, kMaxBindingsPerGroup> types;
|
|
std::bitset<kMaxBindingsPerGroup> dynamic;
|
|
std::bitset<kMaxBindingsPerGroup> multisampled;
|
|
std::bitset<kMaxBindingsPerGroup> mask;
|
|
};
|
|
const LayoutBindingInfo& GetBindingInfo() const;
|
|
|
|
// Functors necessary for the unordered_set<BGLBase*>-based cache.
|
|
struct HashFunc {
|
|
size_t operator()(const BindGroupLayoutBase* bgl) const;
|
|
};
|
|
struct EqualityFunc {
|
|
bool operator()(const BindGroupLayoutBase* a, const BindGroupLayoutBase* b) const;
|
|
};
|
|
|
|
uint32_t GetDynamicBufferCount() const;
|
|
uint32_t GetDynamicUniformBufferCount() const;
|
|
uint32_t GetDynamicStorageBufferCount() const;
|
|
|
|
private:
|
|
BindGroupLayoutBase(DeviceBase* device, ObjectBase::ErrorTag tag);
|
|
|
|
LayoutBindingInfo mBindingInfo;
|
|
bool mIsBlueprint = false;
|
|
uint32_t mDynamicUniformBufferCount = 0;
|
|
uint32_t mDynamicStorageBufferCount = 0;
|
|
};
|
|
|
|
} // namespace dawn_native
|
|
|
|
#endif // DAWNNATIVE_BINDGROUPLAYOUT_H_
|