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

#include <OgreVulkanVaoManager.h>

+ Inheritance diagram for Ogre::VulkanVaoManager:

Classes

struct  Block
 
struct  DirtyBlock
 
struct  StrideChanger
 

Public Types

typedef vector< Block >::type BlockVec
 
typedef FastArray< DirtyBlockDirtyBlockArray
 
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 Types inherited from Ogre::VaoManager
typedef vector< MemoryStatsEntry >::type MemoryStatsEntryVec
 

Public Member Functions

 VulkanVaoManager (VulkanDevice *device, VulkanRenderSystem *renderSystem, const NameValuePairList *params)
 
 ~VulkanVaoManager () override
 
void _notifyDeviceStalled ()
 
void _notifyNewCommandBuffer ()
 
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
 
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)
 
void createVkResources ()
 
void deallocateRawBuffer (VulkanRawBuffer &rawBuffer, bool bImmediately)
 
void deallocateTexture (size_t vboIdx, size_t bufferOffset, size_t sizeBytes)
 
void destroyStagingTexture (VulkanStagingTexture *stagingTexture)
 
void destroyVkResources (bool finalDestruction=false)
 
VkSemaphore getAvailableSemaphore ()
 
void getAvailableSemaphores (VkSemaphoreArray &semaphoreArray, size_t numSemaphores)
 Insert into the end of semaphoreArray 'numSemaphores' number of semaphores that are safe for use. More...
 
VulkanDescriptorPoolgetDescriptorPool (const VulkanRootLayout *rootLayout, size_t setIdx, VkDescriptorSetLayout setLayout)
 
VulkanDevicegetDevice () const
 
VertexBufferPackedgetDrawId () const
 
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...
 
VulkanRenderSystemgetVkRenderSystem ()
 
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...
 
bool supportsCoherentMapping () const
 
bool supportsNonCoherentMapping () 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...
 
- Public Member Functions inherited from Ogre::VaoManager
 VaoManager (const NameValuePairList *params)
 
virtual ~VaoManager ()
 
virtual void _beginFrame ()
 
uint8 _getDynamicBufferCurrentFrameNoWait () const
 
void _notifyStagingBufferEnteredZeroRef (StagingBuffer *stagingBuffer)
 
void _notifyStagingBufferLeftZeroRef (StagingBuffer *stagingBuffer)
 
virtual void _waitUntilCommitedCommandBufferCompleted ()
 Waits for the last committed command buffer completion instead of the last frame completion with command buffer switching, so we can continue to work with current command buffer. More...
 
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...
 
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 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 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...
 
uint32 getConstBufferAlignment () const
 
size_t getConstBufferMaxSize () const
 
uint32 getDefaultStagingBufferLifetime () const
 
uint32 getDefaultStagingBufferUnfencedTime () const
 
uint8 getDynamicBufferMultiplier () const
 
uint32 getFrameCount ()
 
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
 
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 supportsIndirectBuffers () const
 When false, IndirectBufferPacked will emulate the mapping behavior, and we need to use the emulated calls in RenderSystem. More...
 
bool supportsPersistentMapping () const
 

Static Public Member Functions

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...
 
- Static Public Member Functions inherited from Ogre::VaoManager
static uint32 calculateVertexSize (const VertexElement2Vec &vertexElements)
 Returns the size of a single vertex buffer source with the given declaration, in bytes. More...
 

Member Typedef Documentation

◆ BlockVec

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

◆ DirtyBlockArray

◆ 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

◆ _notifyDeviceStalled()

void Ogre::VulkanVaoManager::_notifyDeviceStalled ( )

◆ _notifyNewCommandBuffer()

void Ogre::VulkanVaoManager::_notifyNewCommandBuffer ( )

◆ _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 
)

◆ 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.

◆ 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 
)

◆ createVkResources()

void Ogre::VulkanVaoManager::createVkResources ( )

◆ deallocateRawBuffer()

void Ogre::VulkanVaoManager::deallocateRawBuffer ( VulkanRawBuffer rawBuffer,
bool  bImmediately 
)

◆ deallocateTexture()

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

◆ destroyStagingTexture()

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

◆ destroyVkResources()

void Ogre::VulkanVaoManager::destroyVkResources ( bool  finalDestruction = false)

◆ getAttributeIndexFor()

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

◆ getAvailableSemaphore()

VkSemaphore Ogre::VulkanVaoManager::getAvailableSemaphore ( )

◆ getAvailableSemaphores()

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

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

Transfers ownership.

◆ 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

◆ 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.

◆ getVkRenderSystem()

VulkanRenderSystem* Ogre::VulkanVaoManager::getVkRenderSystem ( )
inline

◆ 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 getAvailableSemaphores to use

◆ supportsCoherentMapping()

bool Ogre::VulkanVaoManager::supportsCoherentMapping ( ) const

◆ supportsNonCoherentMapping()

bool Ogre::VulkanVaoManager::supportsNonCoherentMapping ( ) const

◆ 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.


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