mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-08-21 03:11:36 +00:00
RefCounted (and derived) destructors should be protected on the class to ensure the objects can ONLY be destructed by calling Release. This avoids errors cause by destroying objects out from under code which has an active reference count. Unfortunately, many of the 'base' classes must continue having public destructors because they are used as "blueprint" objects created on the stack. Added final on most-derived classes. Ideas for future improvement: - Change "base" objects to have protected destructors but create new blueprint objects that privately derive from base objects. This limits the blueprint object's usefulness to only be a blueprint. - Modify createX methods to return Ref<Object> instead of Object* Change-Id: I6f3b3b178118d135c4342cb912e982a3873d71af Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/18780 Commit-Queue: Rafael Cintron <rafael.cintron@microsoft.com> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
76 lines
2.9 KiB
C++
76 lines
2.9 KiB
C++
// Copyright 2019 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_ATTACHMENTSTATE_H_
|
|
#define DAWNNATIVE_ATTACHMENTSTATE_H_
|
|
|
|
#include "common/Constants.h"
|
|
#include "dawn_native/CachedObject.h"
|
|
|
|
#include "dawn_native/dawn_platform.h"
|
|
|
|
#include <array>
|
|
#include <bitset>
|
|
|
|
namespace dawn_native {
|
|
|
|
class DeviceBase;
|
|
|
|
// AttachmentStateBlueprint and AttachmentState are separated so the AttachmentState
|
|
// can be constructed by copying the blueprint state instead of traversing descriptors.
|
|
// Also, AttachmentStateBlueprint does not need a refcount like AttachmentState.
|
|
class AttachmentStateBlueprint {
|
|
public:
|
|
// Note: Descriptors must be validated before the AttachmentState is constructed.
|
|
explicit AttachmentStateBlueprint(const RenderBundleEncoderDescriptor* descriptor);
|
|
explicit AttachmentStateBlueprint(const RenderPipelineDescriptor* descriptor);
|
|
explicit AttachmentStateBlueprint(const RenderPassDescriptor* descriptor);
|
|
|
|
AttachmentStateBlueprint(const AttachmentStateBlueprint& rhs);
|
|
|
|
// Functors necessary for the unordered_set<AttachmentState*>-based cache.
|
|
struct HashFunc {
|
|
size_t operator()(const AttachmentStateBlueprint* attachmentState) const;
|
|
};
|
|
struct EqualityFunc {
|
|
bool operator()(const AttachmentStateBlueprint* a,
|
|
const AttachmentStateBlueprint* b) const;
|
|
};
|
|
|
|
protected:
|
|
std::bitset<kMaxColorAttachments> mColorAttachmentsSet;
|
|
std::array<wgpu::TextureFormat, kMaxColorAttachments> mColorFormats;
|
|
// Default (texture format Undefined) indicates there is no depth stencil attachment.
|
|
wgpu::TextureFormat mDepthStencilFormat = wgpu::TextureFormat::Undefined;
|
|
uint32_t mSampleCount = 0;
|
|
};
|
|
|
|
class AttachmentState final : public AttachmentStateBlueprint, public CachedObject {
|
|
public:
|
|
AttachmentState(DeviceBase* device, const AttachmentStateBlueprint& blueprint);
|
|
|
|
std::bitset<kMaxColorAttachments> GetColorAttachmentsMask() const;
|
|
wgpu::TextureFormat GetColorAttachmentFormat(uint32_t index) const;
|
|
bool HasDepthStencilAttachment() const;
|
|
wgpu::TextureFormat GetDepthStencilFormat() const;
|
|
uint32_t GetSampleCount() const;
|
|
|
|
private:
|
|
~AttachmentState() override;
|
|
};
|
|
|
|
} // namespace dawn_native
|
|
|
|
#endif // DAWNNATIVE_ATTACHMENTSTATE_H_
|