KiCad PCB EDA Suite
Loading...
Searching...
No Matches
KIGFX::CACHED_CONTAINER_GPU Class Reference

Specialization of CACHED_CONTAINER that stores data in video memory via memory mapping. More...

#include <cached_container_gpu.h>

Inheritance diagram for KIGFX::CACHED_CONTAINER_GPU:
KIGFX::CACHED_CONTAINER KIGFX::VERTEX_CONTAINER

Public Member Functions

 CACHED_CONTAINER_GPU (unsigned int aSize=DEFAULT_SIZE)
 
 ~CACHED_CONTAINER_GPU ()
 
unsigned int GetBufferHandle () const override
 Return handle to the vertex buffer.
 
bool IsMapped () const override
 Prepare the container for vertices updates.
 
void Map () override
 Finish the vertices updates stage.
 
void Unmap () override
 Finish the vertices updates stage.
 
virtual unsigned int AllItemsSize () const override
 
bool IsCached () const override
 Return true if the container caches vertex data in RAM or video memory.
 
virtual void SetItem (VERTEX_ITEM *aItem) override
 Clean up after adding an item.
 
virtual void FinishItem () override
 Clean up after adding an item.
 
virtual VERTEXAllocate (unsigned int aSize) override
 Return allocated space for the requested number of vertices associated with the current item (set with SetItem()).
 
virtual void Delete (VERTEX_ITEM *aItem) override
 Remove all data stored in the container and restores its original state.
 
virtual void Clear () override
 Remove all data stored in the container and restores its original state.
 
VERTEXGetAllVertices () const
 Return pointer to the vertices stored in the container.
 
virtual VERTEXGetVertices (unsigned int aOffset) const
 Return vertices stored at the specific offset.
 
virtual unsigned int GetSize () const
 Return amount of vertices currently stored in the container.
 
bool IsDirty () const
 Return information about the container cache state.
 
void SetDirty ()
 Set the dirty flag, so vertices in the container are going to be reuploaded to the GPU on the next frame.
 
void ClearDirty ()
 Clear the dirty flag to prevent reuploading vertices to the GPU memory.
 

Static Public Member Functions

static VERTEX_CONTAINERMakeContainer (bool aCached)
 Return a pointer to a new container of an appropriate type.
 

Protected Types

typedef std::pair< unsigned int, unsigned int > CHUNK
 < Maps size of free memory chunks to their offsets
 
typedef std::multimap< unsigned int, unsigned int > FREE_CHUNK_MAP
 
typedef std::set< VERTEX_ITEM * > ITEMS
 List of all the stored items.
 

Protected Member Functions

bool defragmentResize (unsigned int aNewSize) override
 Remove empty spaces between chunks and optionally resizes the container.
 
bool defragmentResizeMemcpy (unsigned int aNewSize)
 Flag saying if vertex buffer is currently mapped.
 
bool reallocate (unsigned int aSize)
 Resize the chunk that stores the current item to the given size.
 
void defragment (VERTEX *aTarget)
 Transfer all stored data to a new buffer, removing empty spaces between the data chunks in the container.
 
void mergeFreeChunks ()
 Look for consecutive free memory chunks and merges them, decreasing fragmentation of memory.
 
int getChunkSize (const CHUNK &aChunk) const
 Return the size of a chunk.
 
unsigned int getChunkOffset (const CHUNK &aChunk) const
 Return the offset of a chunk.
 
void addFreeChunk (unsigned int aOffset, unsigned int aSize)
 Add a chunk marked as a free space.
 
unsigned int usedSpace () const
 Return size of the used memory space.
 

Protected Attributes

bool m_isMapped
 Vertex buffer handle.
 
unsigned int m_glBufferHandle
 Flag saying whether it is safe to use glCopyBufferSubData.
 
bool m_useCopyBuffer
 
FREE_CHUNK_MAP m_freeChunks
 Stored VERTEX_ITEMs.
 
ITEMS m_items
 Currently modified item.
 
VERTEX_ITEMm_item
 Properties of currently modified chunk & item.
 
unsigned int m_chunkSize
 
unsigned int m_chunkOffset
 Maximal vertex index number stored in the container.
 
unsigned int m_maxIndex
 
unsigned int m_freeSpace
 Current container size, expressed in vertices.
 
unsigned int m_currentSize
 Store the initial size, so it can be resized to this on Clear()
 
unsigned int m_initialSize
 Actual storage memory.
 
VERTEXm_vertices
 
bool m_failed
 
bool m_dirty
 Default initial size of a container (expressed in vertices)
 

Static Protected Attributes

static constexpr unsigned int DEFAULT_SIZE = 1048576
 

Private Member Functions

void showFreeChunks ()
 Debug & test functions.
 
void showUsedChunks ()
 
void test ()
 

Detailed Description

Specialization of CACHED_CONTAINER that stores data in video memory via memory mapping.

Definition at line 38 of file cached_container_gpu.h.

Member Typedef Documentation

◆ CHUNK

typedef std::pair<unsigned int, unsigned int> KIGFX::CACHED_CONTAINER::CHUNK
protectedinherited

< Maps size of free memory chunks to their offsets

Definition at line 101 of file cached_container.h.

◆ FREE_CHUNK_MAP

typedef std::multimap<unsigned int, unsigned int> KIGFX::CACHED_CONTAINER::FREE_CHUNK_MAP
protectedinherited

Definition at line 102 of file cached_container.h.

◆ ITEMS

typedef std::set<VERTEX_ITEM*> KIGFX::CACHED_CONTAINER::ITEMS
protectedinherited

List of all the stored items.

Definition at line 105 of file cached_container.h.

Constructor & Destructor Documentation

◆ CACHED_CONTAINER_GPU()

CACHED_CONTAINER_GPU::CACHED_CONTAINER_GPU ( unsigned int  aSize = DEFAULT_SIZE)

◆ ~CACHED_CONTAINER_GPU()

CACHED_CONTAINER_GPU::~CACHED_CONTAINER_GPU ( )

Definition at line 80 of file cached_container_gpu.cpp.

References m_glBufferHandle, m_isMapped, and Unmap().

Member Function Documentation

◆ addFreeChunk()

void CACHED_CONTAINER::addFreeChunk ( unsigned int  aOffset,
unsigned int  aSize 
)
protectedinherited

◆ AllItemsSize()

unsigned int CACHED_CONTAINER_GPU::AllItemsSize ( ) const
overridevirtual

Reimplemented from KIGFX::CACHED_CONTAINER.

Definition at line 300 of file cached_container_gpu.cpp.

References KIGFX::CACHED_CONTAINER::m_items.

Referenced by defragmentResize(), and defragmentResizeMemcpy().

◆ Allocate()

VERTEX * CACHED_CONTAINER::Allocate ( unsigned int  aSize)
overridevirtualinherited

Return allocated space for the requested number of vertices associated with the current item (set with SetItem()).

The allocated space is added at the end of the chunk used by the current item and may serve to store new vertices.

Parameters
aSizeis the number of vertices to be allocated.
Returns
Pointer to the allocated space.
Exceptions
bad_allocexception if allocation fails.

Erase the data related to an item.

Parameters
aItemis the item to be erased.

Implements KIGFX::VERTEX_CONTAINER.

Definition at line 111 of file cached_container.cpp.

References KIGFX::VERTEX_ITEM::GetSize(), KIGFX::CACHED_CONTAINER::IsMapped(), KIGFX::CACHED_CONTAINER::m_chunkOffset, KIGFX::CACHED_CONTAINER::m_chunkSize, KIGFX::VERTEX_CONTAINER::m_dirty, KIGFX::VERTEX_CONTAINER::m_failed, KIGFX::CACHED_CONTAINER::m_item, KIGFX::VERTEX_CONTAINER::m_vertices, KIGFX::CACHED_CONTAINER::reallocate(), KIGFX::VERTEX_ITEM::setSize(), KIGFX::CACHED_CONTAINER::showFreeChunks(), KIGFX::CACHED_CONTAINER::showUsedChunks(), and KIGFX::CACHED_CONTAINER::test().

◆ Clear()

void CACHED_CONTAINER::Clear ( )
overridevirtualinherited

◆ ClearDirty()

void KIGFX::VERTEX_CONTAINER::ClearDirty ( )
inlineinherited

Clear the dirty flag to prevent reuploading vertices to the GPU memory.

Definition at line 152 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_dirty.

Referenced by KIGFX::GPU_CACHED_MANAGER::EndDrawing().

◆ defragment()

void CACHED_CONTAINER::defragment ( VERTEX aTarget)
protectedinherited

◆ defragmentResize()

bool CACHED_CONTAINER_GPU::defragmentResize ( unsigned int  aNewSize)
overrideprotectedvirtual

Remove empty spaces between chunks and optionally resizes the container.

After the operation there is continuous space for storing vertices at the end of the container.

Parameters
aNewSizeis the new size of container, expressed in number of vertices.
Returns
false in case of failure (e.g. memory shortage).

Implements KIGFX::CACHED_CONTAINER.

Definition at line 129 of file cached_container_gpu.cpp.

References AllItemsSize(), checkGlError(), defragmentResizeMemcpy(), KIGFX::VERTEX_ITEM::GetOffset(), KIGFX::VERTEX_ITEM::GetSize(), IsMapped(), KI_TRACE, KIGFX::CACHED_CONTAINER::m_chunkOffset, KIGFX::VERTEX_CONTAINER::m_currentSize, KIGFX::CACHED_CONTAINER::m_freeChunks, KIGFX::VERTEX_CONTAINER::m_freeSpace, m_glBufferHandle, m_isMapped, KIGFX::CACHED_CONTAINER::m_item, KIGFX::CACHED_CONTAINER::m_items, m_useCopyBuffer, Map(), PROF_TIMER::msecs(), KIGFX::VERTEX_ITEM::setOffset(), PROF_TIMER::Stop(), traceGalCachedContainerGpu, traceGalProfile, KIGFX::VERTEX_CONTAINER::usedSpace(), and KIGFX::VERTEX_SIZE.

◆ defragmentResizeMemcpy()

◆ Delete()

◆ FinishItem()

◆ GetAllVertices()

VERTEX * KIGFX::VERTEX_CONTAINER::GetAllVertices ( ) const
inlineinherited

Return pointer to the vertices stored in the container.

Definition at line 107 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_vertices.

Referenced by KIGFX::GPU_NONCACHED_MANAGER::EndDrawing().

◆ GetBufferHandle()

unsigned int KIGFX::CACHED_CONTAINER_GPU::GetBufferHandle ( ) const
inlineoverridevirtual

Return handle to the vertex buffer.

It might be negative if the buffer is not initialized.

Implements KIGFX::CACHED_CONTAINER.

Definition at line 44 of file cached_container_gpu.h.

References m_glBufferHandle.

◆ getChunkOffset()

unsigned int KIGFX::CACHED_CONTAINER::getChunkOffset ( const CHUNK aChunk) const
inlineprotectedinherited

Return the offset of a chunk.

Parameters
aChunkis the chunk.

Definition at line 157 of file cached_container.h.

Referenced by KIGFX::CACHED_CONTAINER::reallocate().

◆ getChunkSize()

int KIGFX::CACHED_CONTAINER::getChunkSize ( const CHUNK aChunk) const
inlineprotectedinherited

Return the size of a chunk.

Parameters
aChunkis the chunk.

Definition at line 147 of file cached_container.h.

Referenced by KIGFX::CACHED_CONTAINER::reallocate(), and KIGFX::CACHED_CONTAINER::test().

◆ GetSize()

virtual unsigned int KIGFX::VERTEX_CONTAINER::GetSize ( ) const
inlinevirtualinherited

Return amount of vertices currently stored in the container.

Reimplemented in KIGFX::NONCACHED_CONTAINER.

Definition at line 125 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_currentSize.

Referenced by KIGFX::GPU_NONCACHED_MANAGER::EndDrawing().

◆ GetVertices()

virtual VERTEX * KIGFX::VERTEX_CONTAINER::GetVertices ( unsigned int  aOffset) const
inlinevirtualinherited

Return vertices stored at the specific offset.

Parameters
aOffsetis the offset.

Definition at line 117 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_vertices.

◆ IsCached()

bool KIGFX::CACHED_CONTAINER::IsCached ( ) const
inlineoverridevirtualinherited

Return true if the container caches vertex data in RAM or video memory.

Otherwise it is a single batch draw which is later discarded.

Implements KIGFX::VERTEX_CONTAINER.

Definition at line 52 of file cached_container.h.

◆ IsDirty()

bool KIGFX::VERTEX_CONTAINER::IsDirty ( ) const
inlineinherited

Return information about the container cache state.

Returns
True in case the vertices have to be reuploaded.

Definition at line 135 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_dirty.

◆ IsMapped()

bool KIGFX::CACHED_CONTAINER_GPU::IsMapped ( ) const
inlineoverridevirtual

Prepare the container for vertices updates.

Implements KIGFX::CACHED_CONTAINER.

Definition at line 49 of file cached_container_gpu.h.

References m_isMapped.

Referenced by defragmentResize(), defragmentResizeMemcpy(), Map(), and Unmap().

◆ MakeContainer()

VERTEX_CONTAINER * VERTEX_CONTAINER::MakeContainer ( bool  aCached)
staticinherited

Return a pointer to a new container of an appropriate type.

Definition at line 42 of file vertex_container.cpp.

Referenced by KIGFX::VERTEX_MANAGER::VERTEX_MANAGER().

◆ Map()

void CACHED_CONTAINER_GPU::Map ( )
overridevirtual

Finish the vertices updates stage.

Implements KIGFX::CACHED_CONTAINER.

Definition at line 90 of file cached_container_gpu.cpp.

References checkGlError(), IsMapped(), m_glBufferHandle, m_isMapped, and KIGFX::VERTEX_CONTAINER::m_vertices.

Referenced by defragmentResize(), and defragmentResizeMemcpy().

◆ mergeFreeChunks()

void CACHED_CONTAINER::mergeFreeChunks ( )
protectedinherited

Look for consecutive free memory chunks and merges them, decreasing fragmentation of memory.

Definition at line 337 of file cached_container.cpp.

References KIGFX::CACHED_CONTAINER::m_freeChunks, and KIGFX::CACHED_CONTAINER::test().

◆ reallocate()

bool CACHED_CONTAINER::reallocate ( unsigned int  aSize)
protectedinherited

◆ SetDirty()

void KIGFX::VERTEX_CONTAINER::SetDirty ( )
inlineinherited

Set the dirty flag, so vertices in the container are going to be reuploaded to the GPU on the next frame.

Definition at line 144 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_dirty.

◆ SetItem()

void CACHED_CONTAINER::SetItem ( VERTEX_ITEM aItem)
overridevirtualinherited

◆ showFreeChunks()

void CACHED_CONTAINER::showFreeChunks ( )
privateinherited

Debug & test functions.

Definition at line 401 of file cached_container.cpp.

Referenced by KIGFX::CACHED_CONTAINER::Allocate().

◆ showUsedChunks()

void CACHED_CONTAINER::showUsedChunks ( )
privateinherited

Definition at line 406 of file cached_container.cpp.

Referenced by KIGFX::CACHED_CONTAINER::Allocate().

◆ test()

◆ Unmap()

void CACHED_CONTAINER_GPU::Unmap ( )
overridevirtual

Finish the vertices updates stage.

Implements KIGFX::CACHED_CONTAINER.

Definition at line 106 of file cached_container_gpu.cpp.

References checkGlError(), IsMapped(), m_isMapped, and KIGFX::VERTEX_CONTAINER::m_vertices.

Referenced by defragmentResizeMemcpy(), and ~CACHED_CONTAINER_GPU().

◆ usedSpace()

unsigned int KIGFX::VERTEX_CONTAINER::usedSpace ( ) const
inlineprotectedinherited

Return size of the used memory space.

Returns
Size of the used memory space (expressed as a number of vertices). Free space left in the container, expressed in vertices

Definition at line 165 of file vertex_container.h.

References KIGFX::VERTEX_CONTAINER::m_currentSize, and KIGFX::VERTEX_CONTAINER::m_freeSpace.

Referenced by KIGFX::CACHED_CONTAINER::defragment(), defragmentResize(), KIGFX::CACHED_CONTAINER_RAM::defragmentResize(), and defragmentResizeMemcpy().

Member Data Documentation

◆ DEFAULT_SIZE

constexpr unsigned int KIGFX::VERTEX_CONTAINER::DEFAULT_SIZE = 1048576
staticconstexprprotectedinherited

Definition at line 187 of file vertex_container.h.

◆ m_chunkOffset

unsigned int KIGFX::CACHED_CONTAINER::m_chunkOffset
protectedinherited

◆ m_chunkSize

◆ m_currentSize

◆ m_dirty

bool KIGFX::VERTEX_CONTAINER::m_dirty
protectedinherited

◆ m_failed

bool KIGFX::VERTEX_CONTAINER::m_failed
protectedinherited

◆ m_freeChunks

◆ m_freeSpace

◆ m_glBufferHandle

unsigned int KIGFX::CACHED_CONTAINER_GPU::m_glBufferHandle
protected

Flag saying whether it is safe to use glCopyBufferSubData.

Definition at line 80 of file cached_container_gpu.h.

Referenced by CACHED_CONTAINER_GPU(), defragmentResize(), defragmentResizeMemcpy(), GetBufferHandle(), Map(), and ~CACHED_CONTAINER_GPU().

◆ m_initialSize

unsigned int KIGFX::VERTEX_CONTAINER::m_initialSize
protectedinherited

Actual storage memory.

Definition at line 177 of file vertex_container.h.

Referenced by KIGFX::CACHED_CONTAINER::Delete().

◆ m_isMapped

bool KIGFX::CACHED_CONTAINER_GPU::m_isMapped
protected

Vertex buffer handle.

Definition at line 77 of file cached_container_gpu.h.

Referenced by defragmentResize(), IsMapped(), Map(), Unmap(), and ~CACHED_CONTAINER_GPU().

◆ m_item

◆ m_items

◆ m_maxIndex

unsigned int KIGFX::CACHED_CONTAINER::m_maxIndex
protectedinherited

◆ m_useCopyBuffer

bool KIGFX::CACHED_CONTAINER_GPU::m_useCopyBuffer
protected

Definition at line 83 of file cached_container_gpu.h.

Referenced by CACHED_CONTAINER_GPU(), and defragmentResize().

◆ m_vertices


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