OGRE-Next  2.3
Object-Oriented Graphics Rendering Engine
Ogre::VulkanVaoManager Class Referencefinal

#include <OgreVulkanVaoManager.h>

+ Inheritance diagram for Ogre::VulkanVaoManager:

Classes

struct  Block
 
struct  StrideChanger
 

Public Types

typedef vector< Block >::type BlockVec
 
typedef vector< MemoryStatsEntry >::type MemoryStatsEntryVec
 
typedef vector< StrideChanger >::type StrideChangerVec
 
enum  VboFlag {
  CPU_INACCESSIBLE , CPU_WRITE_PERSISTENT , CPU_WRITE_PERSISTENT_COHERENT , CPU_READ_WRITE ,
  TEXTURES_OPTIMAL , MAX_VBO_FLAG
}
 

Public Member Functions

 VulkanVaoManager (VulkanDevice *device, VulkanRenderSystem *renderSystem, const NameValuePairList *params)
 
 ~VulkanVaoManager () override
 
virtual void _beginFrame ()
 
uint8 _getDynamicBufferCurrentFrameNoWait () const
 
void _notifyDeviceStalled ()
 
void _notifyNewCommandBuffer ()
 
void _notifyStagingBufferEnteredZeroRef (StagingBuffer *stagingBuffer)
 
void _notifyStagingBufferLeftZeroRef (StagingBuffer *stagingBuffer)
 
void _schedulePoolAdvanceFrame (VulkanDescriptorPool *pool)
 
void _update () override
 
void addDelayedFunc (VulkanDelayedFuncBase *cmd)
 
VulkanRawBuffer allocateRawBuffer (VboFlag vboFlag, size_t sizeBytes, size_t alignment=4u)
 
VkDeviceMemory allocateTexture (const VkMemoryRequirements &memReq, size_t &outVboIdx, size_t &outBufferOffset)
 
void bindDrawIdVertexBuffer (VkCommandBuffer cmdBuffer, uint32 binding=15)
 
void cleanupEmptyPools () override
 Frees GPU memory if there are empty, unused pools. More...
 
AsyncTicketPtr createAsyncTicket (BufferPacked *creator, StagingBuffer *stagingBuffer, size_t elementStart, size_t elementCount) override
 
ConstBufferPackedcreateConstBuffer (size_t sizeBytes, BufferType bufferType, void *initialData, bool keepAsShadow)
 Creates an constant buffer based on the given parameters. More...
 
IndexBufferPackedcreateIndexBuffer (IndexBufferPacked::IndexType indexType, size_t numIndices, BufferType bufferType, void *initialData, bool keepAsShadow)
 Creates an index buffer based on the given parameters. More...
 
IndirectBufferPackedcreateIndirectBuffer (size_t sizeBytes, BufferType bufferType, void *initialData, bool keepAsShadow)
 Creates an indirect buffer. More...
 
ReadOnlyBufferPackedcreateReadOnlyBuffer (PixelFormatGpu pixelFormat, size_t sizeBytes, BufferType bufferType, void *initialData, bool keepAsShadow)
 Creates a read-only buffer based on the given parameters. More...
 
StagingBuffercreateStagingBuffer (size_t sizeBytes, bool forUpload) override
 Creates a new staging buffer and adds it to the pool. More...
 
VulkanStagingTexturecreateStagingTexture (PixelFormatGpu formatFamily, size_t sizeBytes)
 
TexBufferPackedcreateTexBuffer (PixelFormatGpu pixelFormat, size_t sizeBytes, BufferType bufferType, void *initialData, bool keepAsShadow)
 Creates an constant buffer based on the given parameters. More...
 
UavBufferPackedcreateUavBuffer (size_t numElements, uint32 bytesPerElement, uint32 bindFlags, void *initialData, bool keepAsShadow)
 Creates an UAV buffer based on the given parameters. More...
 
VertexArrayObjectcreateVertexArrayObject (const VertexBufferPackedVec &vertexBuffers, IndexBufferPacked *indexBuffer, OperationType opType)
 Creates a VertexArrayObject that binds all the vertex buffers with their respective declarations, and the index buffers. More...
 
VertexBufferPackedcreateVertexBuffer (const VertexElement2Vec &vertexElements, size_t numVertices, BufferType bufferType, void *initialData, bool keepAsShadow)
 Creates a vertex buffer based on the given parameters. More...
 
void deallocateRawBuffer (VulkanRawBuffer &rawBuffer)
 
void deallocateTexture (size_t vboIdx, size_t bufferOffset, size_t sizeBytes)
 
void deleteStagingBuffers ()
 
void destroyConstBuffer (ConstBufferPacked *constBuffer)
 Destroys the given constant buffer created with createConstBuffer. More...
 
void destroyIndexBuffer (IndexBufferPacked *indexBuffer)
 Destroys the given index buffer created with createIndexBuffer. More...
 
void destroyIndirectBuffer (IndirectBufferPacked *indirectBuffer)
 Destroys the given indirect buffer created with createIndirectBuffer. More...
 
void destroyReadOnlyBuffer (ReadOnlyBufferPacked *readOnlyBuffer)
 Destroys the given texture buffer created with createReadOnlyBuffer. More...
 
void destroyStagingTexture (VulkanStagingTexture *stagingTexture)
 
void destroyTexBuffer (TexBufferPacked *texBuffer)
 Destroys the given texture buffer created with createTexBuffer. More...
 
void destroyUavBuffer (UavBufferPacked *uavBuffer)
 Destroys the given UAV buffer created with createUavBuffer. More...
 
void destroyVertexArrayObject (VertexArrayObject *vao)
 Destroys the input pointer. More...
 
void destroyVertexBuffer (VertexBufferPacked *vertexBuffer)
 Destroys the given vertex buffer created with createVertexBuffer. More...
 
VkSemaphore getAvailableSempaphore ()
 
void getAvailableSempaphores (VkSemaphoreArray &semaphoreArray, size_t numSemaphores)
 Insert into the end of semaphoreArray 'numSemaphores' number of semaphores that are safe for use. More...
 
uint32 getConstBufferAlignment () const
 
size_t getConstBufferMaxSize () const
 
uint32 getDefaultStagingBufferLifetime () const
 
uint32 getDefaultStagingBufferUnfencedTime () const
 
VulkanDescriptorPoolgetDescriptorPool (const VulkanRootLayout *rootLayout, size_t setIdx, VkDescriptorSetLayout setLayout)
 
VulkanDevicegetDevice () const
 
VertexBufferPackedgetDrawId () const
 
uint8 getDynamicBufferMultiplier () const
 
uint32 getFrameCount ()
 
void getMemoryStats (MemoryStatsEntryVec &outStats, size_t &outCapacityBytes, size_t &outFreeBytes, Log *log, bool &outIncludesTextures) const override
 Retrieves memory stats about our GPU pools being managed. More...
 
size_t getReadOnlyBufferMaxSize () const
 
StagingBuffergetStagingBuffer (size_t minSizeBytes, bool forUpload)
 Retrieves a staging buffer for use. More...
 
uint32 getTexBufferAlignment () const
 
size_t getTexBufferMaxSize () const
 
TimergetTimer ()
 
uint32 getUavBufferAlignment () const
 
size_t getUavBufferMaxSize () const
 
void initDrawIdVertexBuffer ()
 
bool isFrameFinished (uint32 frameCount) override
 See VaoManager::isFrameFinished. More...
 
void notifySemaphoreUnused (VkSemaphore semaphore)
 
void notifyWaitSemaphoresSubmitted (const VkSemaphoreArray &semaphores)
 
void notifyWaitSemaphoreSubmitted (VkSemaphore semaphore)
 Call this function after you've submitted to the GPU a VkSemaphore that will be waited on. More...
 
void operator delete (void *ptr)
 
void operator delete (void *ptr, const char *, int, const char *)
 
void operator delete (void *ptr, void *)
 
void operator delete[] (void *ptr)
 
void operator delete[] (void *ptr, const char *, int, const char *)
 
void * operator new (size_t sz)
 
void * operator new (size_t sz, const char *file, int line, const char *func)
 operator new, with debug line info More...
 
void * operator new (size_t sz, void *ptr)
 placement operator new More...
 
void * operator new[] (size_t sz)
 
void * operator new[] (size_t sz, const char *file, int line, const char *func)
 array operator new, with debug line info More...
 
bool readOnlyIsTexBuffer () const
 When true, ReadOnlyBufferPacked behaves like TexBufferPacked, i.e. More...
 
void setDefaultStagingBufferlifetime (uint32 lifetime, uint32 unfencedTime)
 Sets the default time for staging buffers. More...
 
bool supportsBaseInstance () const
 
bool supportsCoherentMapping () const
 
bool supportsIndirectBuffers () const
 When false, IndirectBufferPacked will emulate the mapping behavior, and we need to use the emulated calls in RenderSystem. More...
 
bool supportsNonCoherentMapping () const
 
bool supportsPersistentMapping () const
 
void waitForSpecificFrameToFinish (uint32 frameCount) override
 See VaoManager::waitForSpecificFrameToFinish. More...
 
uint8 waitForTailFrameToFinish () override
 Returns the current frame # (which wraps to 0 every mDynamicBufferMultiplier times). More...
 

Static Public Member Functions

static uint32 calculateVertexSize (const VertexElement2Vec &vertexElements)
 Returns the size of a single vertex buffer source with the given declaration, in bytes. More...
 
static uint32 getAttributeIndexFor (VertexElementSemantic semantic)
 
static void mergeContiguousBlocks (BlockVec::iterator blockToMerge, BlockVec &blocks)
 
static VkFence waitFor (VkFence fenceName, VulkanQueue *queue)
 Will stall undefinitely until GPU finishes (signals the sync object). More...
 

Friends

class VulkanStagingBuffer
 

Member Typedef Documentation

◆ BlockVec

typedef vector<Block>::type Ogre::VulkanVaoManager::BlockVec

◆ MemoryStatsEntryVec

◆ StrideChangerVec

Member Enumeration Documentation

◆ VboFlag

Enumerator
CPU_INACCESSIBLE 
CPU_WRITE_PERSISTENT 
CPU_WRITE_PERSISTENT_COHERENT 
CPU_READ_WRITE 
TEXTURES_OPTIMAL 

Where textures go if bufferImageGranularity != 1.

MAX_VBO_FLAG 

Constructor & Destructor Documentation

◆ VulkanVaoManager()

Ogre::VulkanVaoManager::VulkanVaoManager ( VulkanDevice device,
VulkanRenderSystem renderSystem,
const NameValuePairList params 
)

◆ ~VulkanVaoManager()

Ogre::VulkanVaoManager::~VulkanVaoManager ( )
override

Member Function Documentation

◆ _beginFrame()

virtual void Ogre::VaoManager::_beginFrame ( )
inlinevirtualinherited

Reimplemented in Ogre::D3D11VaoManager.

◆ _getDynamicBufferCurrentFrameNoWait()

uint8 Ogre::VaoManager::_getDynamicBufferCurrentFrameNoWait ( ) const
inlineinherited

◆ _notifyDeviceStalled()

void Ogre::VulkanVaoManager::_notifyDeviceStalled ( )

◆ _notifyNewCommandBuffer()

void Ogre::VulkanVaoManager::_notifyNewCommandBuffer ( )

◆ _notifyStagingBufferEnteredZeroRef()

void Ogre::VaoManager::_notifyStagingBufferEnteredZeroRef ( StagingBuffer stagingBuffer)
inherited

◆ _notifyStagingBufferLeftZeroRef()

void Ogre::VaoManager::_notifyStagingBufferLeftZeroRef ( StagingBuffer stagingBuffer)
inherited

◆ _schedulePoolAdvanceFrame()

void Ogre::VulkanVaoManager::_schedulePoolAdvanceFrame ( VulkanDescriptorPool pool)

◆ _update()

void Ogre::VulkanVaoManager::_update ( )
overridevirtual

Reimplemented from Ogre::VaoManager.

◆ addDelayedFunc()

void Ogre::VulkanVaoManager::addDelayedFunc ( VulkanDelayedFuncBase cmd)

◆ allocateRawBuffer()

VulkanRawBuffer Ogre::VulkanVaoManager::allocateRawBuffer ( VboFlag  vboFlag,
size_t  sizeBytes,
size_t  alignment = 4u 
)

◆ allocateTexture()

VkDeviceMemory Ogre::VulkanVaoManager::allocateTexture ( const VkMemoryRequirements &  memReq,
size_t &  outVboIdx,
size_t &  outBufferOffset 
)

◆ bindDrawIdVertexBuffer()

void Ogre::VulkanVaoManager::bindDrawIdVertexBuffer ( VkCommandBuffer  cmdBuffer,
uint32  binding = 15 
)

◆ calculateVertexSize()

static uint32 Ogre::VaoManager::calculateVertexSize ( const VertexElement2Vec vertexElements)
staticinherited

Returns the size of a single vertex buffer source with the given declaration, in bytes.

◆ cleanupEmptyPools()

void Ogre::VulkanVaoManager::cleanupEmptyPools ( )
overridevirtual

Frees GPU memory if there are empty, unused pools.

Implements Ogre::VaoManager.

◆ createAsyncTicket()

AsyncTicketPtr Ogre::VulkanVaoManager::createAsyncTicket ( BufferPacked creator,
StagingBuffer stagingBuffer,
size_t  elementStart,
size_t  elementCount 
)
overridevirtual

Implements Ogre::VaoManager.

◆ createConstBuffer()

ConstBufferPacked* Ogre::VaoManager::createConstBuffer ( size_t  sizeBytes,
BufferType  bufferType,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates an constant buffer based on the given parameters.

Behind the scenes, the buffer is actually part of much larger buffer, in order to reduce bindings at runtime. (depends on the RenderSystem, on D3D11 we're forced to give its own buffer)

Remarks
@See createVertexBuffer for the remaining parameters not documented here.
Parameters
sizeBytesThe size in bytes of the given constant buffer. API restrictions may apply. To stay safe keep it multiple of 16, don't request more than 64kb per buffer.
Returns
The desired const buffer pointer

◆ createIndexBuffer()

IndexBufferPacked* Ogre::VaoManager::createIndexBuffer ( IndexBufferPacked::IndexType  indexType,
size_t  numIndices,
BufferType  bufferType,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates an index buffer based on the given parameters.

Behind the scenes, the buffer is actually part of much larger buffer, in order to reduce bindings at runtime.

Remarks
@See createVertexBuffer for the remaining parameters not documented here.
Parameters
indexTypeWhether this Index Buffer should be 16-bit (recommended) or 32-bit
numIndicesThe number of indices
Returns
The desired index buffer pointer

◆ createIndirectBuffer()

IndirectBufferPacked* Ogre::VaoManager::createIndirectBuffer ( size_t  sizeBytes,
BufferType  bufferType,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates an indirect buffer.

Remarks
@See createVertexBuffer for the remaining parameters not documented here.

◆ createReadOnlyBuffer()

ReadOnlyBufferPacked* Ogre::VaoManager::createReadOnlyBuffer ( PixelFormatGpu  pixelFormat,
size_t  sizeBytes,
BufferType  bufferType,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates a read-only buffer based on the given parameters.

Behind the scenes, the buffer is actually part of much larger buffer, in order to reduce bindings at runtime. (depends on the RenderSystem, on D3D11 we're forced to give its own buffer)

Remarks
See VaoManager::createVertexBuffer for the remaining parameters not documented here.
Parameters
pixelFormatThe pixel format for the texture buffer.
sizeBytesThe size in bytes of the given constant buffer. API restrictions may apply.
Returns
The desired read-only buffer pointer

◆ createStagingBuffer()

StagingBuffer* Ogre::VulkanVaoManager::createStagingBuffer ( size_t  sizeBytes,
bool  forUpload 
)
overridevirtual

Creates a new staging buffer and adds it to the pool.

See also
getStagingBuffer.
Remarks
The returned buffer starts with a reference count of 1. You should decrease it when you're done using it.

Implements Ogre::VaoManager.

◆ createStagingTexture()

VulkanStagingTexture* Ogre::VulkanVaoManager::createStagingTexture ( PixelFormatGpu  formatFamily,
size_t  sizeBytes 
)

◆ createTexBuffer()

TexBufferPacked* Ogre::VaoManager::createTexBuffer ( PixelFormatGpu  pixelFormat,
size_t  sizeBytes,
BufferType  bufferType,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates an constant buffer based on the given parameters.

Behind the scenes, the buffer is actually part of much larger buffer, in order to reduce bindings at runtime. (depends on the RenderSystem, on D3D11 we're forced to give its own buffer)

Remarks
@See createVertexBuffer for the remaining parameters not documented here.
Parameters
pixelFormatThe pixel format for the texture buffer.
sizeBytesThe size in bytes of the given constant buffer. API restrictions may apply.
Returns
The desired texture buffer pointer

◆ createUavBuffer()

UavBufferPacked* Ogre::VaoManager::createUavBuffer ( size_t  numElements,
uint32  bytesPerElement,
uint32  bindFlags,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates an UAV buffer based on the given parameters.

Behind the scenes, the buffer is actually part of much larger buffer, in order to reduce bindings at runtime. (depends on the RenderSystem, on D3D11 we're forced to give its own buffer)

Remarks
@See createVertexBuffer for the remaining parameters not documented here. There is no BufferType option as the only available one is BT_DEFAULT
Parameters
sizeBytesThe size in bytes of the given constant buffer. API restrictions may apply.
bindFlagsA combination of BufferBindFlags. BB_FLAG_UAV is implicit.
Returns
The desired UAV buffer pointer

◆ createVertexArrayObject()

VertexArrayObject* Ogre::VaoManager::createVertexArrayObject ( const VertexBufferPackedVec vertexBuffers,
IndexBufferPacked indexBuffer,
OperationType  opType 
)
inherited

Creates a VertexArrayObject that binds all the vertex buffers with their respective declarations, and the index buffers.

The returned value is immutable and thus cannot be modified.

Parameters
vertexBuffersAn array of vertex buffers to be bound to the vertex array object.
indexBufferThe index buffer to be bound.
opTypeType of operation. Cannot be changed later.
Returns
VertexArrayObject that can be rendered.

◆ createVertexBuffer()

VertexBufferPacked* Ogre::VaoManager::createVertexBuffer ( const VertexElement2Vec vertexElements,
size_t  numVertices,
BufferType  bufferType,
void *  initialData,
bool  keepAsShadow 
)
inherited

Creates a vertex buffer based on the given parameters.

Behind the scenes, the vertex buffer is part of much larger vertex buffer, in order to reduce bindings at runtime.

Parameters
vertexElementsA list of element bindings for this vertex buffer. Once created, changing VertexElements is not possible, you'll have to create another Vertex Buffer.
numVerticesThe number of vertices for this vertex
bufferTypeThe type of buffer for this vertex buffer. @See BufferType::BT_DYNAMIC special case.
initialDataInitial data the buffer will hold upon creation. Can be null (i.e. you plan to upload later). Cannot be null when bufferType is BT_IMMUTABLE. Must have enough room to prevent an overflow.
See also
BufferPacked::BufferPacked
Parameters
keepAsShadowWhether to keep the pointer "initialData" as a shadow copy of the contents. @See BufferPacked::BufferPacked regarding on who is responsible for freeing this pointer and what happens if an exception was raised.
Returns
The desired vertex buffer pointer

◆ deallocateRawBuffer()

void Ogre::VulkanVaoManager::deallocateRawBuffer ( VulkanRawBuffer rawBuffer)

◆ deallocateTexture()

void Ogre::VulkanVaoManager::deallocateTexture ( size_t  vboIdx,
size_t  bufferOffset,
size_t  sizeBytes 
)

◆ deleteStagingBuffers()

void Ogre::VaoManager::deleteStagingBuffers ( )
inherited

◆ destroyConstBuffer()

void Ogre::VaoManager::destroyConstBuffer ( ConstBufferPacked constBuffer)
inherited

Destroys the given constant buffer created with createConstBuffer.

Parameters
constBufferConstant Buffer created with createConstBuffer

◆ destroyIndexBuffer()

void Ogre::VaoManager::destroyIndexBuffer ( IndexBufferPacked indexBuffer)
inherited

Destroys the given index buffer created with createIndexBuffer.

Parameters
indexBufferIndex Buffer created with createIndexBuffer

◆ destroyIndirectBuffer()

void Ogre::VaoManager::destroyIndirectBuffer ( IndirectBufferPacked indirectBuffer)
inherited

Destroys the given indirect buffer created with createIndirectBuffer.

Parameters
indirectBufferIndirect Buffer created with createIndirectBuffer

◆ destroyReadOnlyBuffer()

void Ogre::VaoManager::destroyReadOnlyBuffer ( ReadOnlyBufferPacked readOnlyBuffer)
inherited

Destroys the given texture buffer created with createReadOnlyBuffer.

Parameters
readOnlyBufferReadOnlyBufferPacked created with createReadOnlyBuffer

◆ destroyStagingTexture()

void Ogre::VulkanVaoManager::destroyStagingTexture ( VulkanStagingTexture stagingTexture)

◆ destroyTexBuffer()

void Ogre::VaoManager::destroyTexBuffer ( TexBufferPacked texBuffer)
inherited

Destroys the given texture buffer created with createTexBuffer.

Parameters
constBufferTexture Buffer created with createTexBuffer

◆ destroyUavBuffer()

void Ogre::VaoManager::destroyUavBuffer ( UavBufferPacked uavBuffer)
inherited

Destroys the given UAV buffer created with createUavBuffer.

Parameters
constBufferUav Buffer created with createUavBuffer

◆ destroyVertexArrayObject()

void Ogre::VaoManager::destroyVertexArrayObject ( VertexArrayObject vao)
inherited

Destroys the input pointer.

After this call, it's no longer valid

Remarks
API memory may or may not be released since VertexArrayObjects may internally share the same API constructs.
The vertex & index buffers associated with this vao are not destroyed by this function.

◆ destroyVertexBuffer()

void Ogre::VaoManager::destroyVertexBuffer ( VertexBufferPacked vertexBuffer)
inherited

Destroys the given vertex buffer created with createVertexBuffer.

NOTE: Vertex Buffers created by a MultiSourceVertexBufferPool must be freed by the pool that created it, don't use this function for those.

Remarks
Performs an O(N) lookup. Where N is the number of created vertex buffers

◆ getAttributeIndexFor()

static uint32 Ogre::VulkanVaoManager::getAttributeIndexFor ( VertexElementSemantic  semantic)
static

◆ getAvailableSempaphore()

VkSemaphore Ogre::VulkanVaoManager::getAvailableSempaphore ( )

◆ getAvailableSempaphores()

void Ogre::VulkanVaoManager::getAvailableSempaphores ( VkSemaphoreArray semaphoreArray,
size_t  numSemaphores 
)

Insert into the end of semaphoreArray 'numSemaphores' number of semaphores that are safe for use.

◆ getConstBufferAlignment()

uint32 Ogre::VaoManager::getConstBufferAlignment ( ) const
inlineinherited

◆ getConstBufferMaxSize()

size_t Ogre::VaoManager::getConstBufferMaxSize ( ) const
inlineinherited

◆ getDefaultStagingBufferLifetime()

uint32 Ogre::VaoManager::getDefaultStagingBufferLifetime ( ) const
inlineinherited

◆ getDefaultStagingBufferUnfencedTime()

uint32 Ogre::VaoManager::getDefaultStagingBufferUnfencedTime ( ) const
inlineinherited

◆ getDescriptorPool()

VulkanDescriptorPool* Ogre::VulkanVaoManager::getDescriptorPool ( const VulkanRootLayout rootLayout,
size_t  setIdx,
VkDescriptorSetLayout  setLayout 
)

◆ getDevice()

VulkanDevice* Ogre::VulkanVaoManager::getDevice ( ) const
inline

◆ getDrawId()

VertexBufferPacked* Ogre::VulkanVaoManager::getDrawId ( ) const
inline

◆ getDynamicBufferMultiplier()

uint8 Ogre::VaoManager::getDynamicBufferMultiplier ( ) const
inlineinherited

◆ getFrameCount()

uint32 Ogre::VaoManager::getFrameCount ( )
inlineinherited

◆ getMemoryStats()

void Ogre::VulkanVaoManager::getMemoryStats ( MemoryStatsEntryVec outStats,
size_t &  outCapacityBytes,
size_t &  outFreeBytes,
Log log,
bool &  outIncludesTextures 
) const
overridevirtual

Retrieves memory stats about our GPU pools being managed.

The output in the Log will be csv data that resembles the following: Pool Type Offset Bytes Pool Capacity CPU_INACCESSIBLE 0 148128 67108864 CPU_INACCESSIBLE 200000 1024 67108864 CPU_ACCESSIBLE_PERSISTENT 0 1152 16777216

These are the chunks of memory currently in use. If there are multiple entries belonging to the same pool, that means the memory has been fragmented.

The actual output may vary depending on the RenderSystem.

Remarks
Worst case scenario this function has O(N^2) complexity where N is the number of free blocks.
Parameters
outStatsDetailed information about each entry.
outCapacityBytesTotal capacity i.e. total used VRAM in GPU.
outFreeBytesTotal free memory available for consumption.
logOptional to dump all information to a CSV file. Nullptr to avoid dumping.
outIncludesTextures[out] When true, memory reports in outCapacityBytes & outFreeBytes include textures. See Tutorial_Memory on how to deal with this output.

Note outIncludesTextures may be false but some entries in outStats[n].bPoolHasTextures may be true. If this happens, then outCapacityBytes & outFreeBytes don't include texture consumption; but the pools with bPoolHasTextures in MemoryStatsEntryVec may.

Implements Ogre::VaoManager.

◆ getReadOnlyBufferMaxSize()

size_t Ogre::VaoManager::getReadOnlyBufferMaxSize ( ) const
inlineinherited

◆ getStagingBuffer()

StagingBuffer* Ogre::VaoManager::getStagingBuffer ( size_t  minSizeBytes,
bool  forUpload 
)
inherited

Retrieves a staging buffer for use.

We'll search for existing ones that can hold minSizeBytes. We first prioritize those that won't cause a stall at all. Then those that will cause a partial stall, and otherwise return one that will cause full stall. If we can't find any existing buffer that can hold the requested number bytes, we'll create a new one.

Remarks
Calling this function causes the reference count of the returned pointer to be increased. You should decrease the reference count after you're done with the returned pointer. @See StagingBuffer::removeReferenceCount regarding ref. counting.
Parameters
sizeBytesMinimum size, in bytes, of the staging buffer. The returned buffer may be bigger.
forUploadTrue if it should be used to upload data to GPU, false to download.
Returns
The staging buffer.

◆ getTexBufferAlignment()

uint32 Ogre::VaoManager::getTexBufferAlignment ( ) const
inlineinherited

◆ getTexBufferMaxSize()

size_t Ogre::VaoManager::getTexBufferMaxSize ( ) const
inlineinherited

◆ getTimer()

Timer* Ogre::VaoManager::getTimer ( )
inlineinherited

◆ getUavBufferAlignment()

uint32 Ogre::VaoManager::getUavBufferAlignment ( ) const
inlineinherited

◆ getUavBufferMaxSize()

size_t Ogre::VaoManager::getUavBufferMaxSize ( ) const
inlineinherited

◆ initDrawIdVertexBuffer()

void Ogre::VulkanVaoManager::initDrawIdVertexBuffer ( )

◆ isFrameFinished()

bool Ogre::VulkanVaoManager::isFrameFinished ( uint32  frameCount)
overridevirtual

◆ mergeContiguousBlocks()

static void Ogre::VulkanVaoManager::mergeContiguousBlocks ( BlockVec::iterator  blockToMerge,
BlockVec blocks 
)
static
See also
StagingBuffer::mergeContiguousBlocks

◆ notifySemaphoreUnused()

void Ogre::VulkanVaoManager::notifySemaphoreUnused ( VkSemaphore  semaphore)

◆ notifyWaitSemaphoresSubmitted()

void Ogre::VulkanVaoManager::notifyWaitSemaphoresSubmitted ( const VkSemaphoreArray semaphores)

◆ notifyWaitSemaphoreSubmitted()

void Ogre::VulkanVaoManager::notifyWaitSemaphoreSubmitted ( VkSemaphore  semaphore)

Call this function after you've submitted to the GPU a VkSemaphore that will be waited on.

i.e. 'semaphore' is part of VkSubmitInfo::pWaitSemaphores or part of VkPresentInfoKHR::pWaitSemaphores

After enough frames have passed, this semaphore goes back to a pool for getAvailableSempaphores to use

◆ operator delete() [1/3]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete ( void *  ptr)
inlineinherited

◆ operator delete() [2/3]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete ( void *  ptr,
const char *  ,
int  ,
const char *   
)
inlineinherited

◆ operator delete() [3/3]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete ( void *  ptr,
void *   
)
inlineinherited

◆ operator delete[]() [1/2]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete[] ( void *  ptr)
inlineinherited

◆ operator delete[]() [2/2]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete[] ( void *  ptr,
const char *  ,
int  ,
const char *   
)
inlineinherited

◆ operator new() [1/3]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new ( size_t  sz)
inlineinherited

◆ operator new() [2/3]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new ( size_t  sz,
const char *  file,
int  line,
const char *  func 
)
inlineinherited

operator new, with debug line info

◆ operator new() [3/3]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new ( size_t  sz,
void *  ptr 
)
inlineinherited

placement operator new

◆ operator new[]() [1/2]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new[] ( size_t  sz)
inlineinherited

◆ operator new[]() [2/2]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new[] ( size_t  sz,
const char *  file,
int  line,
const char *  func 
)
inlineinherited

array operator new, with debug line info

◆ readOnlyIsTexBuffer()

bool Ogre::VaoManager::readOnlyIsTexBuffer ( ) const
inlineinherited

When true, ReadOnlyBufferPacked behaves like TexBufferPacked, i.e.

assigned to texture buffer slots.

When false, ReadOnlyBufferPacked behaves like UavBufferPacked i.e. assigned to UAV buffer slots. Except D3D11, which still uses texture buffer slots when false but chooses StructuredBuffer over Buffer

◆ setDefaultStagingBufferlifetime()

void Ogre::VaoManager::setDefaultStagingBufferlifetime ( uint32  lifetime,
uint32  unfencedTime 
)
inherited

Sets the default time for staging buffers.

Staging buffers are recycled/reused. When their reference count reaches 0, this VaoManager will begin to track how long since the last time they've reached ref count 0. When the time threshold is met, the staging buffer gets removed.

Remarks
See getStagingBuffer
Small explanation on StagingBuffer lifetime management (so you can make sense on what we're doing here):

StagingBuffers may produce "pops" when created (due to API/driver stalls) so we reuse them. We keep track of how long StagingBuffers have been remained unused, and delete old ones. The intention is to be able to recycle old buffers, while getting rid of the excess if a sudden spike happened. That's what the lifetime threshold controls.

We also have the "unfenced threshold". This controls something very different. StagingBuffers usages need fences to check whether we're done using the buffer. But we don't issue a fence every time you do something with them, because that could result in a lot of fences (i.e. imagine you do a 1000 uploads of 16 bytes each, in succession, we shouldn't do 1000 fences); so we fence when certain upload/download thresholds are met (i.e. you've uploaded 1MB of data). So if you've uploaded 750kb so far, no fence will be issued. But if you upload 300kb more, we will fence. But what happens if you've only uploaded 750kb and then nothing more for the last 10 minutes? Since we haven't fenced, and now you need to upload a lot more, we don't know if those 750kb are done uploading because we never fenced it. It probably ended 10 minutes ago, but we won't know. We would have to fence now and perform a full stall waiting for that fence. To solve this edge case, we fence whenever X time has elapsed without fencing (and only if there's data that remains unfenced of course). That's what the unfenced threshold is for.

Parameters
lifetimeTime in milliseconds. The default is 5 minutes. A staging buffer that remained at zero ref. count for lifetime milliseconds will be destroyed.
unfencedTimeFor efficiency reasons (API overhead), some staging buffers implementations will not track all hazards on fences. A staging buffer that remained at zero ref. count for unfencedTime milliseconds will be told to clean their hazards, creating the missing appropiate fences. unfencedTime can't be higher than lifetime. unfencedTime should not be too far away from lifetime, and not too soon either, to maximize the chances of no stalls when we finally destroy it and avoid excessive API overhead in keeping fences alive. The default is 4 minutes 59 seconds.

◆ supportsBaseInstance()

bool Ogre::VaoManager::supportsBaseInstance ( ) const
inlineinherited

◆ supportsCoherentMapping()

bool Ogre::VulkanVaoManager::supportsCoherentMapping ( ) const

◆ supportsIndirectBuffers()

bool Ogre::VaoManager::supportsIndirectBuffers ( ) const
inlineinherited

When false, IndirectBufferPacked will emulate the mapping behavior, and we need to use the emulated calls in RenderSystem.

◆ supportsNonCoherentMapping()

bool Ogre::VulkanVaoManager::supportsNonCoherentMapping ( ) const

◆ supportsPersistentMapping()

bool Ogre::VaoManager::supportsPersistentMapping ( ) const
inlineinherited

◆ waitFor()

static VkFence Ogre::VulkanVaoManager::waitFor ( VkFence  fenceName,
VulkanQueue queue 
)
static

Will stall undefinitely until GPU finishes (signals the sync object).

Parameters
fenceNameSync object to wait for. Will be released on success. On failure, throws an exception and fenceName will not be released.
queueVulkanQueue this fence is linked to.
Returns
Null ptr on success. Should throw on failure.

◆ waitForSpecificFrameToFinish()

void Ogre::VulkanVaoManager::waitForSpecificFrameToFinish ( uint32  frameCount)
overridevirtual

◆ waitForTailFrameToFinish()

uint8 Ogre::VulkanVaoManager::waitForTailFrameToFinish ( )
overridevirtual

Returns the current frame # (which wraps to 0 every mDynamicBufferMultiplier times).

But first stalls until that mDynamicBufferMultiplier-1 frame behind is finished.

Implements Ogre::VaoManager.

Friends And Related Function Documentation

◆ VulkanStagingBuffer

friend class VulkanStagingBuffer
friend

The documentation for this class was generated from the following file: