CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
RenderResource.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10#include "Forward.hpp"
11
14
17
18#include <iostream>
19
20namespace CeresEngine {
21
22 enum class RenderResourceType {
23 Buffer,
24 Image
25 };
26
27 class RenderResource : public RefCounted<RenderResource> {
28 friend class RenderTask;
29
30 protected:
33
34 private:
37
38 public:
40 virtual ~RenderResource() = default;
41
42 public: // Resource lifetime
47 virtual void realize(GPUDevice& device) = 0;
48
53 virtual void unrealize(GPUDevice& device) = 0;
54
55 public: // Resource properties
58 virtual bool isTransient() const = 0;
59
61 virtual bool isExternal() const = 0;
62
64 virtual bool isValid() const = 0;
65
66 public: // Resource operator overloads
68 explicit operator bool() const { return isValid(); }
69
70 public:
71 [[nodiscard]] const Vector<RenderTask*>& getReaders() const { return mReaders; }
72 [[nodiscard]] const Vector<RenderTask*>& getWriters() const { return mWriters; }
73 };
74
75 template<typename R, typename D, RenderResourceType RT> class TRenderResource : public RenderResource {
76 public:
77 static const constexpr RenderResourceType resourceType = RT;
78
79 public:
81
82 public:
84 [[nodiscard]] virtual R* get() const = 0;
85
89 [[nodiscard]] virtual const D& getDescriptor() const = 0;
90
92 [[nodiscard]] bool isValid() const override { return get() != nullptr; }
93
94 public:
96 [[nodiscard]] R& operator*() const { return *get(); }
97
99 [[nodiscard]] R* operator->() const { return get(); }
100
102 [[nodiscard]] operator R&() const { return *get(); }
103
105 [[nodiscard]] operator R*() const { return get(); }
106
108 [[nodiscard]] operator RC<R>() const { return get(); }
109 };
110
111 // ---------------------------------------------------------------------------------------------
112 // ---------------------------------------------------------------------------------------------
113
114 class ImageRenderResource : public TRenderResource<GPUImage, GPUImageDescriptor, RenderResourceType::Image> {
115 public:
116 using TRenderResource::TRenderResource;
117 };
118
120 private:
123
124 public:
126
127 public:
129 void realize(GPUDevice& device) final;
130
132 void unrealize(GPUDevice& device) final;
133
136
139
140 public:
142 [[nodiscard]] bool isTransient() const final { return true; }
143
145 [[nodiscard]] bool isExternal() const final { return false; }
146
147 public:
150 template<typename Processor> static constexpr void reflect(Processor&& RTTI) {
155 }
156 };
157
159 private:
161
162 public:
165
166 public:
168 void realize(GPUDevice& device) final;
169
171 void unrealize(GPUDevice& device) final;
172
175
177 void set(GPUImage& image) { mImage = &image; }
178
180 [[nodiscard]] const GPUImageDescriptor& getDescriptor() const final { return mImage->descriptor; }
181
182 public:
184 [[nodiscard]] bool isTransient() const final { return false; }
185
187 [[nodiscard]] bool isExternal() const final { return true; }
188 };
189
190 // ---------------------------------------------------------------------------------------------
191 // ---------------------------------------------------------------------------------------------
192
193 class BufferRenderResource : public TRenderResource<GPUBuffer, GPUBufferDescriptor, RenderResourceType::Buffer> {
194 public:
195 using TRenderResource::TRenderResource;
196 };
197
199 private:
202
203 public:
205
206 public:
208 void realize(GPUDevice& device) final;
209
211 void unrealize(GPUDevice& device) final;
212
215
218
219 public:
221 [[nodiscard]] bool isTransient() const final { return true; }
222
224 [[nodiscard]] bool isExternal() const final { return false; }
225 };
226
228 private:
230
231 public:
234
235 public:
237 void realize(GPUDevice& device) final;
238
240 void unrealize(GPUDevice& device) final;
241
244
246 [[nodiscard]] const GPUBufferDescriptor& getDescriptor() const final { return mBuffer->descriptor; }
247
248 public:
250 [[nodiscard]] bool isTransient() const final { return false; }
251
253 [[nodiscard]] bool isExternal() const final { return true; }
254 };
255
256 template<typename T = RenderResource> class RenderResourceRef {
257 private:
258 T* mResource = nullptr;
259
260 public:
261 RenderResourceRef() = default;
262
263 RenderResourceRef(T& resource) : RenderResourceRef(&resource) {}
265 mResource = &resource;
266 return *this;
267 }
268
269 RenderResourceRef(T* resource) : mResource(resource) {}
271 mResource = resource;
272 return *this;
273 }
274
275 RenderResourceRef(const RenderResourceRef& other) = default;
277
278 public:
279 [[nodiscard]] T& get() const { return *mResource; }
280 [[nodiscard]] bool valid() const { return mResource != nullptr; }
281
282 T& operator*() const { return get(); }
283 T* operator->() const { return &get(); }
284 operator T&() const { return get(); }
285 };
286
289
290} // namespace CeresEngine
#define CE_REFL_FUNC(N)
Definition Macros.hpp:552
#define CE_REFL_DATA(N)
Definition Macros.hpp:541
Represents a secure buffer i.e.
Definition Buffer.hpp:28
Definition RenderResource.hpp:193
A retain-release type of smart pointer.
Definition SmartPtr.hpp:132
Pointer get() const noexcept
Definition SmartPtr.hpp:244
Definition RenderResource.hpp:227
bool isTransient() const final
Definition RenderResource.hpp:250
const GPUBufferDescriptor & getDescriptor() const final
Gets the resource descriptor.
Definition RenderResource.hpp:246
ExternalBufferRenderResource(RenderGraph &renderGraph, GPUBuffer &buffer)
bool isExternal() const final
Definition RenderResource.hpp:253
void realize(GPUDevice &device) final
Realizes the resource.
GPUBufferPtr mBuffer
Definition RenderResource.hpp:229
ExternalBufferRenderResource(RenderGraph &renderGraph, const GPUBufferPtr &buffer)
void unrealize(GPUDevice &device) final
Unrealizes the resource.
GPUBuffer * get() const final
Definition RenderResource.hpp:243
Definition RenderResource.hpp:158
GPUImage * get() const final
Definition RenderResource.hpp:174
ExternalImageRenderResource(RenderGraph &renderGraph, const GPUImagePtr &image)
bool isExternal() const final
Definition RenderResource.hpp:187
void set(GPUImage &image)
Definition RenderResource.hpp:177
bool isTransient() const final
Definition RenderResource.hpp:184
void realize(GPUDevice &device) final
Realizes the resource.
ExternalImageRenderResource(RenderGraph &renderGraph, GPUImage &image)
const GPUImageDescriptor & getDescriptor() const final
Gets the resource descriptor.
Definition RenderResource.hpp:180
void unrealize(GPUDevice &device) final
Unrealizes the resource.
GPUImagePtr mImage
Definition RenderResource.hpp:160
Definition GPUBuffer.hpp:124
Definition GPUDevice.hpp:357
Definition GPUImage.hpp:331
Definition RenderResource.hpp:114
A simple reference counter base class.
Definition SmartPtr.hpp:438
Definition RenderGraph.hpp:23
Definition RenderResource.hpp:27
virtual ~RenderResource()=default
const Vector< RenderTask * > & getWriters() const
Definition RenderResource.hpp:72
Vector< RenderTask * > mReaders
Definition RenderResource.hpp:35
RenderGraph & mRenderGraph
The owning render graph instance.
Definition RenderResource.hpp:32
virtual void realize(GPUDevice &device)=0
Realizes the resource.
virtual bool isValid() const =0
RenderResource(RenderGraph &renderGraph)
Definition RenderResource.hpp:39
virtual bool isTransient() const =0
const Vector< RenderTask * > & getReaders() const
Definition RenderResource.hpp:71
virtual void unrealize(GPUDevice &device)=0
Unrealizes the resource.
virtual bool isExternal() const =0
Vector< RenderTask * > mWriters
Definition RenderResource.hpp:36
Definition RenderResource.hpp:256
RenderResourceRef & operator=(T &resource)
Definition RenderResource.hpp:264
RenderResourceRef(T *resource)
Definition RenderResource.hpp:269
T & get() const
Definition RenderResource.hpp:279
T * mResource
Definition RenderResource.hpp:258
bool valid() const
Definition RenderResource.hpp:280
RenderResourceRef & operator=(const RenderResourceRef &other)=default
T & operator*() const
Definition RenderResource.hpp:282
T * operator->() const
Definition RenderResource.hpp:283
RenderResourceRef(T &resource)
Definition RenderResource.hpp:263
RenderResourceRef & operator=(T *resource)
Definition RenderResource.hpp:270
RenderResourceRef(const RenderResourceRef &other)=default
Definition RenderTask.hpp:164
Definition RenderResource.hpp:75
virtual const D & getDescriptor() const =0
Gets the resource descriptor.
bool isValid() const override
Definition RenderResource.hpp:92
virtual R * get() const =0
R * operator->() const
Definition RenderResource.hpp:99
R & operator*() const
Definition RenderResource.hpp:96
static const constexpr RenderResourceType resourceType
Definition RenderResource.hpp:77
Definition RenderResource.hpp:198
bool isTransient() const final
Definition RenderResource.hpp:221
const GPUBufferDescriptor & getDescriptor() const final
Gets the resource descriptor.
Definition RenderResource.hpp:217
void realize(GPUDevice &device) final
Realizes the resource.
TransientBufferRenderResource(RenderGraph &renderGraph, const GPUBufferDescriptor &descriptor)
GPUBufferPtr mBuffer
Definition RenderResource.hpp:201
bool isExternal() const final
Definition RenderResource.hpp:224
void unrealize(GPUDevice &device) final
Unrealizes the resource.
GPUBufferDescriptor mDescriptor
Definition RenderResource.hpp:200
GPUBuffer * get() const final
Definition RenderResource.hpp:214
Definition RenderResource.hpp:119
const GPUImageDescriptor & getDescriptor() const final
Gets the resource descriptor.
Definition RenderResource.hpp:138
bool isTransient() const final
Definition RenderResource.hpp:142
bool isExternal() const final
Definition RenderResource.hpp:145
TransientImageRenderResource(RenderGraph &renderGraph, const GPUImageDescriptor &descriptor)
void unrealize(GPUDevice &device) final
Unrealizes the resource.
static constexpr void reflect(Processor &&RTTI)
Executes the given processor for every field of the struct.
Definition RenderResource.hpp:150
GPUImageDescriptor mDescriptor
Definition RenderResource.hpp:121
void realize(GPUDevice &device) final
Realizes the resource.
GPUImagePtr mImage
Definition RenderResource.hpp:122
GPUImage * get() const final
Definition RenderResource.hpp:135
Definition Application.hpp:19
std::vector< T, ScopedAllocatorAdaptor< StdAllocator< T, RawAllocator > > > Vector
Vector is a sequence container that encapsulates dynamic size arrays.
Definition Vector.hpp:17
RenderResourceType
Definition RenderResource.hpp:22
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25
Hardware buffer descriptor structure.
Definition GPUBuffer.hpp:92
Definition GPUImage.hpp:247