Files
libsst/Include/ZRenderer/ZDataBuffer.hpp
2026-04-03 00:22:39 -05:00

288 lines
8.3 KiB
C++

/*
ZDataBuffer.hpp
Author: James Russell <jcrussell@762studios.com>
Created: 3/20/2011
Purpose:
Interface for graphics device buffered memory, used for uniform buffers, vertex buffers, and
index buffers.
Note that ZDataBuffer is a ZRendererResource, and should be used as such.
License:
TODO
*/
#pragma once
#ifndef _ZDATABUFFER_HPP
#define _ZDATABUFFER_HPP
#include <ZRenderer/ZRendererResource.hpp>
#include <ZSTL/ZArray.hpp>
//Forward Declarations
class ZDataBuffer;
//The type of data buffer
enum ZDataBufferType
{
ZDBT_VERTEX, //Contains Vertex Data
ZDBT_INDEX, //Contains Index Data
ZDBT_UNIFORM, //Contains Uniform (Constant) Data
ZDBT_SIZE
};
//The usage type of the data buffer
enum ZDataBufferUsage
{
ZDBU_STATIC, //Static Buffer (never or rarely updated)
ZDBU_DYNAMIC, //Dynamic Buffer (updated frequently)
ZDBU_STREAMING, //Streaming Buffer (updated every frame)
ZDBU_SIZE
};
//The data type in a stream
enum ZDataBufferStreamType
{
ZDBST_FLOAT32, //32-bit floating point
ZDBST_FLOAT64, //64-bit floating point
ZDBST_INT8, //8-bit integer, signed
ZDBST_INT16, //16-bit integer, signed
ZDBST_INT32, //32-bit integer, signed
ZDBST_UINT8, //8-bit integer, unsigned
ZDBST_UINT16, //16-bit integer, unsigned
ZDBST_UINT32, //32-bit integer, unsigned
ZDBST_SIZE
};
//The data type in a block
enum ZDataBufferBlockType
{
ZDBBT_UNIFORM, //Uniform Data
ZDBBT_INDEX8, //8-bit index data
ZDBBT_INDEX16, //16-bit index data
ZDBBT_INDEX32, //32-bit index data
ZDBBT_SIZE
};
//Struct for stream definitions
struct ZDataBufferStream
{
ZDataBuffer* Buffer; //Parent buffer that contains this stream
size_t ElementSize; //Size of an element in terms of data type (e.g., 2 for vec2, 3 for vec3, etc.)
size_t Offset; //Offset (in bytes) that this stream starts from beginning of data buffer
size_t Stride; //Distance (in bytes) between elements of this stream
ZDataBufferStreamType Type; //Type of data in each element of this stream (this gives us size of each unit of data)
bool Normalize; //true: fixed point value converted to [0,1] or [-1,1] range; false: typecasted.
};
//Struct for block definitions
struct ZDataBufferBlock
{
ZDataBufferBlockType Type; //Type of data contained by this block
size_t Offset; //Offset (in bytes) into the buffer where this block begins
size_t Size; //Size (in bytes) of the block
ZDataBuffer* Buffer; //Parent buffer that contains this block data
};
//Wrapper class for data buffers
class ZDataBuffer : public ZRendererResource
{
private:
DISABLE_COPY_AND_ASSIGN(ZDataBuffer);
public:
//Default Constructor
ZDataBuffer() : ZRendererResource() { }
//Virtual Destructor
virtual ~ZDataBuffer() { }
/*
virtual public ZDataBuffer::DefineBlock
Defines a block of data present in the buffer. Examples of blocks include
index blocks and uniform buffer storage blocks.
@param _type - the type of block (index or uniform)
@param _size - the size of the block (in bytes)
@return (const ZDataBufferBlock*) - the data buffer block created
@context (all)
*/
virtual const ZDataBufferBlock* DefineBlock(ZDataBufferBlockType _type,
size_t _size
) = 0;
/*
virtual public ZDataBuffer::DefineStream
Defines a stream that is present in this buffer. Examples of streams include
the position stream (vertex coordinates), the color stream, the normal stream,
and uv coordinate streams. Other streams can be defined so as to be usable by
shader programs.
@param _type - The type of stream.
@param _elemCount - The number of elements in the stream, e.g., 3D position has an element
count of 3, 2D position has an element count of 2, etc...
@param _offset - The offset into the buffer (in bytes) where this stream begins
@param _stride - The stride between beginnings of consecutive elements (in bytes), or 0 for packed elements
@param _normalize - If true, fixed point data should be normalized (i.e. changed to [0,1] or [-1,1] if unsigned/signed), otherwise
it is converted similar to a C typecast, i.e. 'float value = (float)fixedValue'
@return (const ZDataBufferStream*) - the data buffer stream created
@context (all)
*/
virtual const ZDataBufferStream* DefineStream(ZDataBufferStreamType _type,
size_t _elemCount,
size_t _offset,
size_t _stride,
bool _normalize
) = 0;
/*
virtual public ZDataBuffer::Fill
Fills the buffer with data, as specified. This is equivalent to calling
'MapBuffer', filling the buffer, and calling 'UnmapBuffer'.
@param _data - the data to fill the buffer with
@param _offset - offset into the buffer to start copying to
@param _byteCount - number of bytes to copy from _data
@return (bool) - true if this update was successful, false if the buffer is 'locked' or 'contended'
@context (all)
*/
virtual bool Fill(const void* _data,
size_t _offset,
size_t _byteCount
) = 0;
/*
virtual public ZDataBuffer::GetBlock
Gets the pointer to a block previously defined using DefineBlock().
@param index - The block's index. The first block created with DefineBlock() is 0, the second is 1, and so on.
@return ( const ZDataBufferBlock*) - block definition
@context (all)
*/
virtual const ZDataBufferBlock* GetBlock(size_t index) = 0;
/*
virtual public ZDataBuffer::GetStream
Gets the pointer to a stream previously defined using DefineStream().
@param index - The stream's index. The first stream created with DefineStream() is 0, the second is 1, and so on.
@return (const ZDataBufferStream*) - stream definition
@context (all)
*/
virtual const ZDataBufferStream* GetStream(size_t index) = 0;
/*
virtual public ZDataBuffer::GetBlockCount
Gets the number of blocks that have been defined so far.
@return (size_t) - The number of blocks defined with DefineBlock()
@context (all)
*/
virtual size_t GetBlockCount() const = 0;
/*
virtual public ZDataBuffer::GetStreamCount
Gets the number of streams that have been defined so far.
@return (size_t) - The number of blocks defined with DefineStream()
@context (all)
*/
virtual size_t GetStreamCount() const = 0;
/*
virtual public ZDataBuffer::GetSize
Gets the size of this data buffer.
@return (size_t) - the size (in bytes) of this buffer
@context (all)
*/
virtual size_t GetSize() = 0;
/*
virtual public ZDataBuffer::GetType
Gets the type of this data buffer.
@return (ZDataBufferType) - the buffer type
@context (all)
*/
virtual ZDataBufferType GetType() = 0;
/*
virtual public ZDataBuffer::GetUsage
Gets the usage of this data buffer.
@return (ZDataBufferUsage) - the usage type
@context (all)
*/
virtual ZDataBufferUsage GetUsage() = 0;
/*
virtual public ZDataBuffer::Map
Maps the data buffer into user memory and marks this resource as locked until 'UnmapBuffer' is called.
If the discard parameter is set to true, this tells the implementation that the data
that is currently present in the buffer is not required, and this may result in a faster
return, especially in the case of static usage buffers. If the current data is needed
(discard is false), static usage buffers must wait for the render thread to get the data
from the graphics memory. Dynamic and streaming usage buffers typically suffer no
performance penalty regardless of the value of the discard parameter, though this may
vary based on implementation.
@param _discard - hint to the implementation that the data in the buffer can be discarded
@return (void*) - pointer to the buffer in mapped memory, NULL if this buffer is 'locked' or 'contended'
@context (all)
*/
virtual void* Map(bool _discard = false) = 0;
/*
virtual public ZDataBuffer::UndefBlocks
Undefines all currently set blocks. This will invalidate existing block
definition structures returned from DefineBlock.
@return (void)
@context (all)
*/
virtual void UndefBlocks() = 0;
/*
virtual public ZDataBuffer::UndefStreams
Undefines all currently set streams. This will invalidate existing stream
definition structures returned from DefineStream.
@return (void)
@context (all)
*/
virtual void UndefStreams() = 0;
/*
virtual public ZDataBuffer::Unmap
Unmaps a previously mapped data buffer and unlocks the data buffer.
@return (void)
@context (all)
*/
virtual void Unmap() = 0;
};
#endif