Nebula
Loading...
Searching...
No Matches
barrier.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
10//------------------------------------------------------------------------------
11#include "ids/id.h"
12#include "util/array.h"
14#include "coregraphics/buffer.h"
16#include "coregraphics/config.h"
17#include <tuple>
18namespace CoreGraphics
19{
20
22
23struct CmdBufferId;
25{
28
36
44
49
54
59
64
69
74
79
84
89
90 const bool Overlaps(const TextureSubresourceInfo& rhs) const
91 {
92 return ((this->bits & rhs.bits) != 0) && (this->mip <= rhs.mip && this->mip + this->mipCount >= rhs.mip) && (this->layer <= rhs.layer && this->layer + this->layerCount >= rhs.layer);
93 }
94};
95
97{
98 uint64_t offset, size;
99
104
105 BufferSubresourceInfo(uint64_t offset, uint64_t size) :
106 offset(offset),
107 size(size)
108 {}
109
110 const bool Overlaps(const BufferSubresourceInfo& rhs) const
111 {
112 return (this->offset <= rhs.offset && this->offset + this->size >= rhs.offset);
113 }
114};
115
123
132
138
144
158
160{
163 {
164 n_assert(this->textures.IsEmpty());
165 n_assert(this->buffers.IsEmpty());
166 }
167
169 void Init(const char* name, CmdBufferId cmdBuf)
170 {
171 this->name = name;
172 this->cmdBuf = cmdBuf;
175 }
176
179 {
180 // If the barrier boundaries don't match, flush the barriers
181 if (this->fromStage != fromStage || this->toStage != toStage)
182 {
183 this->Flush();
184 this->fromStage = fromStage;
185 this->toStage = toStage;
186 }
187 TextureBarrierInfo info = { .tex = tex, .subres = TextureSubresourceInfo::Texture(bits) };
188 textures.Append(info);
189 }
190
193 {
194 // If the barrier boundaries don't match, flush the barriers
195 if (this->fromStage != fromStage || this->toStage != toStage)
196 {
197 this->Flush();
198 this->fromStage = fromStage;
199 this->toStage = toStage;
200 }
201 BufferBarrierInfo info = { .buf = buf, .subres = CoreGraphics::BufferSubresourceInfo() };
202 buffers.Append(info);
203 }
204
206 void Flush()
207 {
208 if (!this->textures.IsEmpty())
210 if (!this->buffers.IsEmpty())
212 this->buffers.Clear();
213 this->textures.Clear();
214 }
215
216 const char* name;
221
222private:
223
224};
225
227{
233
235 {
236 this->textureCurrentStages.Append(initialStage);
237 return this->textureCurrentStages.Size() - 1;
238 }
240 {
241 this->bufferCurrentStages.Append(initialStage);
242 return this->bufferCurrentStages.Size() - 1;
243 }
244
246 {
247 this->name = name;
248 this->cmdBuf = cmdBuf;
249 }
250
252 {
253 if (this->textureCurrentStages[index] != this->fromStage || stage != this->toStage)
254 {
255 this->Flush();
256 this->fromStage = this->textureCurrentStages[index];
257 this->toStage = stage;
258 }
259
260 if (this->textureCurrentStages[index] != stage)
261 {
262 TextureBarrierInfo info = { .tex = tex, .subres = TextureSubresourceInfo::Texture(bits) };
263 this->textureBarriers.Append(info);
264 }
265 this->textureCurrentStages[index] = stage;
266 }
268 {
269 if (this->bufferCurrentStages[index] != this->fromStage || stage != this->toStage)
270 {
271 this->Flush();
272 this->fromStage = this->bufferCurrentStages[index];
273 this->toStage = stage;
274 }
275
276 if (this->bufferCurrentStages[index] != stage)
277 {
278 BufferBarrierInfo info = { .buf = buf, .subres = CoreGraphics::BufferSubresourceInfo() };
279 this->bufferBarriers.Append(info);
280 }
281 this->fromStage = this->bufferCurrentStages[index];
282 this->toStage = stage;
283 this->bufferCurrentStages[index] = stage;
284 }
285
286 void Flush()
287 {
288 if (!this->textureBarriers.IsEmpty())
290 if (!this->bufferBarriers.IsEmpty())
292 this->bufferBarriers.Clear();
293 this->textureBarriers.Clear();
294 }
295
297 {
298 this->Flush();
299 this->cmdBuf = InvalidCmdBufferId;
302 }
303
304 const char* name;
311};
312
324
328void DestroyBarrier(const BarrierId id);
329
331void BarrierReset(const BarrierId id);
332
334void BarrierPush(
342void BarrierPush(
349void BarrierPush(
359
360
361//------------------------------------------------------------------------------
366{
367 Util::Array<Util::String> comps = str.Tokenize("|");
369 for (IndexT i = 0; i < comps.Size(); i++)
370 {
371 if (comps[i] == "Auto") { bits = CoreGraphics::ImageBits::Auto; break; }
372 else if (comps[i] == "Color") bits |= CoreGraphics::ImageBits::ColorBits;
373 else if (comps[i] == "Depth") bits |= CoreGraphics::ImageBits::DepthBits;
374 else if (comps[i] == "Stencil") bits |= CoreGraphics::ImageBits::StencilBits;
375 else if (comps[i] == "Metadata") bits |= CoreGraphics::ImageBits::MetaBits;
376 else if (comps[i] == "Plane0") bits |= CoreGraphics::ImageBits::Plane0Bits;
377 else if (comps[i] == "Plane1") bits |= CoreGraphics::ImageBits::Plane1Bits;
378 else if (comps[i] == "Plane2") bits |= CoreGraphics::ImageBits::Plane2Bits;
379
380 else
381 {
382 n_error("Invalid access string '%s'\n", comps[i].AsCharPtr());
384 }
385 }
386 return bits;
387}
388
389//------------------------------------------------------------------------------
394{
395 if (str == "Undefined") return CoreGraphics::ImageLayout::Undefined;
396 else if (str == "General") return CoreGraphics::ImageLayout::General;
397 else if (str == "ColorRenderTexture") return CoreGraphics::ImageLayout::ColorRenderTexture;
398 else if (str == "DepthRenderTexture") return CoreGraphics::ImageLayout::DepthStencilRenderTexture;
399 else if (str == "DepthStencilRead") return CoreGraphics::ImageLayout::DepthStencilRead;
400 else if (str == "ShaderRead") return CoreGraphics::ImageLayout::ShaderRead;
401 else if (str == "TransferSource") return CoreGraphics::ImageLayout::TransferSource;
402 else if (str == "TransferDestination") return CoreGraphics::ImageLayout::TransferDestination;
403 else if (str == "Preinitialized") return CoreGraphics::ImageLayout::Preinitialized;
404 else if (str == "Present") return CoreGraphics::ImageLayout::Present;
406}
407} // namespace CoreGraphics
Nebula's dynamic array class.
Definition array.h:60
const SizeT Size() const
get number of elements in array
Definition array.h:880
Implements a fixed size one-dimensional array.
Definition fixedarray.h:20
A StringAtom.
Definition stringatom.h:22
void __cdecl n_error(const char *msg,...)
This function is called when a serious situation is encountered which requires abortion of the applic...
Definition debug.cc:138
#define n_assert(exp)
Definition debug.h:50
#define ID_24_8_TYPE(x)
Definition id.h:132
Acceleration structures are used to enable ray tracing on the GPU by dividing the scene into a BVH.
Definition accelerationstructure.h:24
void BarrierPop(const CoreGraphics::CmdBufferId buf)
pop barrier, reverses the from-to stages and any access flags in the buffers and texture barriers
Definition vkbarrier.cc:255
ImageLayout
Definition config.h:97
@ General
Definition config.h:99
@ ShaderRead
Definition config.h:103
@ ColorRenderTexture
Definition config.h:100
@ TransferSource
Definition config.h:104
@ TransferDestination
Definition config.h:105
@ DepthStencilRead
Definition config.h:102
@ DepthStencilRenderTexture
Definition config.h:101
@ Present
Definition config.h:107
@ Undefined
Definition config.h:98
@ Preinitialized
Definition config.h:106
void BarrierReset(const BarrierId id)
reset resources previously set in barrier
Definition vkbarrier.cc:152
void BarrierRepeat(const CoreGraphics::CmdBufferId buf)
repeat barrier in queue
Definition vkbarrier.cc:268
QueueType
Definition config.h:40
void DestroyBarrier(const BarrierId id)
destroy barrier object
Definition vkbarrier.cc:143
ImageBits
Definition config.h:82
@ Auto
Definition config.h:84
@ Plane2Bits
Definition config.h:91
@ DepthBits
Definition config.h:86
@ Plane1Bits
Definition config.h:90
@ MetaBits
Definition config.h:88
@ Plane0Bits
Definition config.h:89
@ ColorBits
Definition config.h:85
@ StencilBits
Definition config.h:87
BarrierId CreateBarrier(const BarrierCreateInfo &info)
create barrier object
Definition vkbarrier.cc:39
BarrierDomain
Definition config.h:186
@ Global
Definition config.h:187
void BarrierPush(const CoreGraphics::CmdBufferId buf, CoreGraphics::PipelineStage fromStage, CoreGraphics::PipelineStage toStage, CoreGraphics::BarrierDomain domain, const Util::FixedArray< TextureBarrierInfo, true > &textures, const Util::FixedArray< BufferBarrierInfo, true > &buffers)
Push barrier to stack.
Definition vkbarrier.cc:179
PipelineStage
Definition config.h:192
@ InvalidStage
Definition config.h:193
void CmdBarrier(const CmdBufferId id, CoreGraphics::PipelineStage fromStage, CoreGraphics::PipelineStage toStage, CoreGraphics::BarrierDomain domain, const Util::FixedArray< TextureBarrierInfo, true > &textures, const IndexT fromQueue, const IndexT toQueue, const char *name)
Insert pipeline barrier.
Definition commandbuffer.cc:14
CoreGraphics::ImageBits ImageBitsFromString(const Util::String &str)
Definition barrier.h:365
CoreGraphics::ImageLayout ImageLayoutFromString(const Util::String &str)
Definition barrier.h:393
Compile time configuration options for the CoreGraphics subsystem.
#define NEBULA_ALL_MIPS
Definition config.h:17
#define NEBULA_WHOLE_BUFFER_SIZE
Definition config.h:16
#define NEBULA_ALL_LAYERS
Definition config.h:18
BlasId blas
Definition barrier.h:147
~AccelerationStructureBarrierInfo()
Definition barrier.h:156
TlasId tlas
Definition barrier.h:148
enum CoreGraphics::AccelerationStructureBarrierInfo::@304347251221102261212224157120362117041263200136 type
Util::Array< CoreGraphics::PipelineStage > bufferCurrentStages
Definition barrier.h:310
void Synchronize()
Definition barrier.h:296
const char * name
Definition barrier.h:304
Util::Array< BufferBarrierInfo > bufferBarriers
Definition barrier.h:308
void SyncBuffer(uint32_t index, CoreGraphics::BufferId buf, CoreGraphics::PipelineStage stage)
Definition barrier.h:267
void Flush()
Definition barrier.h:286
void SyncTexture(uint32_t index, CoreGraphics::ImageBits bits, CoreGraphics::TextureId tex, CoreGraphics::PipelineStage stage)
Definition barrier.h:251
Util::Array< CoreGraphics::PipelineStage > textureCurrentStages
Definition barrier.h:309
BarrierContext()
Definition barrier.h:228
CoreGraphics::PipelineStage toStage
Definition barrier.h:306
CoreGraphics::PipelineStage fromStage
Definition barrier.h:306
Util::Array< TextureBarrierInfo > textureBarriers
Definition barrier.h:307
uint32_t RegisterBuffer(CoreGraphics::PipelineStage initialStage)
Definition barrier.h:239
void Start(const char *name, const CoreGraphics::CmdBufferId cmdBuf)
Definition barrier.h:245
CmdBufferId cmdBuf
Definition barrier.h:305
uint32_t RegisterTexture(CoreGraphics::PipelineStage initialStage)
Definition barrier.h:234
Definition barrier.h:314
BarrierDomain domain
Definition barrier.h:316
Util::Array< BufferBarrierInfo > buffers
Definition barrier.h:322
CoreGraphics::QueueType fromQueue
Definition barrier.h:319
CoreGraphics::QueueType toQueue
Definition barrier.h:320
Util::StringAtom name
Definition barrier.h:315
CoreGraphics::PipelineStage toStage
Definition barrier.h:318
CoreGraphics::PipelineStage fromStage
Definition barrier.h:317
Util::Array< TextureBarrierInfo > textures
Definition barrier.h:321
Definition barrier.h:21
Definition barrier.h:160
Util::Array< TextureBarrierInfo > textures
Definition barrier.h:219
CmdBufferId cmdBuf
Definition barrier.h:217
CoreGraphics::PipelineStage fromStage
Definition barrier.h:218
Util::Array< BufferBarrierInfo > buffers
Definition barrier.h:220
~BarrierScope()
Make sure we have cleared the barrier scope before destroying the object.
Definition barrier.h:162
CoreGraphics::PipelineStage toStage
Definition barrier.h:218
void AddTexture(ImageBits bits, TextureId tex, CoreGraphics::PipelineStage fromStage, CoreGraphics::PipelineStage toStage)
Add texture barrier.
Definition barrier.h:178
void Init(const char *name, CmdBufferId cmdBuf)
Initiate.
Definition barrier.h:169
void Flush()
Flush all pending changes.
Definition barrier.h:206
const char * name
Definition barrier.h:216
void AddBuffer(BufferId buf, CoreGraphics::PipelineStage fromStage, CoreGraphics::PipelineStage toStage)
Add buffer barrier.
Definition barrier.h:192
Definition accelerationstructure.h:48
Definition barrier.h:125
BufferId buf
Definition barrier.h:126
SizeT size
Definition barrier.h:130
CoreGraphics::PipelineStage fromStage
Definition barrier.h:127
CoreGraphics::PipelineStage toStage
Definition barrier.h:128
IndexT offset
Definition barrier.h:129
Definition barrier.h:140
BufferSubresourceInfo subres
Definition barrier.h:142
BufferId buf
Definition barrier.h:141
Definition buffer.h:23
BufferSubresourceInfo(uint64_t offset, uint64_t size)
Definition barrier.h:105
uint64_t offset
Definition barrier.h:98
BufferSubresourceInfo()
Definition barrier.h:100
const bool Overlaps(const BufferSubresourceInfo &rhs) const
Definition barrier.h:110
uint64_t size
Definition barrier.h:98
Definition commandbuffer.h:168
Definition barrier.h:117
CoreGraphics::PipelineStage toStage
Definition barrier.h:121
TextureId tex
Definition barrier.h:118
TextureSubresourceInfo subres
Definition barrier.h:119
CoreGraphics::PipelineStage fromStage
Definition barrier.h:120
Definition barrier.h:134
TextureId tex
Definition barrier.h:135
TextureSubresourceInfo subres
Definition barrier.h:136
texture type
Definition texture.h:25
static TextureSubresourceInfo Texture(CoreGraphics::ImageBits bits)
Definition barrier.h:45
static TextureSubresourceInfo ColorNoMipNoLayer()
Definition barrier.h:60
TextureSubresourceInfo()
Definition barrier.h:29
static TextureSubresourceInfo DepthStencilNoLayer(uint mipCount)
Definition barrier.h:85
uint layerCount
Definition barrier.h:27
TextureSubresourceInfo(CoreGraphics::ImageBits bits, uint mip, uint mipCount, uint layer, uint layerCount)
Definition barrier.h:37
static TextureSubresourceInfo Color()
Definition barrier.h:50
ImageBits bits
Definition barrier.h:26
uint mipCount
Definition barrier.h:27
const bool Overlaps(const TextureSubresourceInfo &rhs) const
Definition barrier.h:90
uint mip
Definition barrier.h:27
static TextureSubresourceInfo DepthStencilNoMip(uint layerCount)
Definition barrier.h:80
static TextureSubresourceInfo ColorNoMip(uint layerCount)
Definition barrier.h:65
static TextureSubresourceInfo DepthStencil()
Definition barrier.h:55
static TextureSubresourceInfo ColorNoLayer(uint mipCount)
Definition barrier.h:70
uint layer
Definition barrier.h:27
static TextureSubresourceInfo DepthStencilNoMipNoLayer()
Definition barrier.h:75
Definition accelerationstructure.h:98
Nebula's universal string class.
Definition String.cs:8
SizeT Tokenize(const String &whiteSpace, Array< String > &outTokens) const
tokenize string into a provided String array (faster if tokens array can be reused)
Definition string.cc:193
static const int InvalidIndex
Definition types.h:47
int SizeT
Definition types.h:42
unsigned int uint
Definition types.h:33
int IndexT
Definition types.h:41