Move DataFormat enum to vertex.h

This commit is contained in:
Alex Szpakowski
2020-01-13 23:20:49 -04:00
parent 1bc2b947fc
commit d5d50d2e0d
4 changed files with 158 additions and 100 deletions
+5 -12
View File
@@ -26,13 +26,6 @@ namespace love
namespace graphics
{
static const Buffer::DataTypeInfo dataTypeInfo[]
{
// baseType, isMatrix, components, rows, columns, componentSize, packedAlign, packedSize
{ Buffer::DATA_BASE_FLOAT, false, 1, 0, 0, sizeof(float), 4, 4 }, // DATA_FLOAT
};
love::Type Buffer::type("GraphicsBuffer", &Object::type);
Buffer::Buffer(size_t size, BufferTypeFlags typeflags, BufferUsage usage, uint32 mapflags)
@@ -65,12 +58,12 @@ Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataMe
for (const auto &member : format)
{
DataType type = member.type;
const DataTypeInfo &info = getDataTypeInfo(type);
DataFormat format = member.format;
const DataFormatInfo &info = getDataFormatInfo(format);
if (indexbuffer)
{
if (type != DATA_UINT16 && type != DATA_UINT32)
if (format != DATAFORMAT_UINT16 && format != DATAFORMAT_UINT32)
throw love::Exception("Index buffers only support uint16 and uint32 data types.");
}
@@ -79,10 +72,10 @@ Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataMe
if (info.isMatrix)
throw love::Exception("matrix types are not supported in vertex buffers.");
if (info.baseType == DATA_BASE_BOOL)
if (info.baseType == DATA_BASETYPE_BOOL)
throw love::Exception("bool types are not supported in vertex buffers.");
if ((info.baseType == DATA_BASE_INT || info.baseType == DATA_BASE_UINT) && !supportsGLSL3)
if ((info.baseType == DATA_BASETYPE_INT || info.baseType == DATA_BASETYPE_UINT) && !supportsGLSL3)
throw love::Exception("Integer vertex attribute data types require GLSL 3 support.");
}
+1 -88
View File
@@ -54,93 +54,10 @@ public:
MAP_READ = (1 << 1),
};
enum DataType
{
DATA_FLOAT,
DATA_FLOAT_VEC2,
DATA_FLOAT_VEC3,
DATA_FLOAT_VEC4,
DATA_FLOAT_MAT2X2,
DATA_FLOAT_MAT2X3,
DATA_FLOAT_MAT2X4,
DATA_FLOAT_MAT3X2,
DATA_FLOAT_MAT3X3,
DATA_FLOAT_MAT3X4,
DATA_FLOAT_MAT4X2,
DATA_FLOAT_MAT4X3,
DATA_FLOAT_MAT4X4,
DATA_INT32,
DATA_INT32_VEC2,
DATA_INT32_VEC3,
DATA_INT32_VEC4,
DATA_UINT32,
DATA_UINT32_VEC2,
DATA_UINT32_VEC3,
DATA_UINT32_VEC4,
DATA_SNORM8_VEC4,
DATA_UNORM8_VEC4,
DATA_INT8_VEC4,
DATA_UINT8_VEC4,
DATA_SNORM16,
DATA_SNORM16_VEC2,
DATA_SNORM16_VEC4,
DATA_UNORM16,
DATA_UNORM16_VEC2,
DATA_UNORM16_VEC4,
DATA_INT16,
DATA_INT16_VEC2,
DATA_INT16_VEC4,
DATA_UINT16,
DATA_UINT16_VEC2,
DATA_UINT16_VEC4,
DATA_BOOL,
DATA_BOOL_VEC2,
DATA_BOOL_VEC3,
DATA_BOOL_VEC4,
DATA_MAX_ENUM
};
enum DataTypeBase
{
DATA_BASE_FLOAT,
DATA_BASE_INT,
DATA_BASE_UINT,
DATA_BASE_SNORM,
DATA_BASE_UNORM,
DATA_BASE_BOOL,
};
struct DataTypeInfo
{
DataTypeBase baseType;
bool isMatrix;
int components;
int matrixRows;
int matrixColumns;
size_t componentSize;
size_t packedAlignment;
size_t packedSize;
};
struct DataMember
{
std::string name;
DataType type;
DataFormat format;
int arraySize;
};
@@ -219,10 +136,6 @@ public:
}; // Mapper
// static size_t getDataTypeSize(DataType type, bool uniform)
const DataTypeInfo &getDataTypeInfo(DataType type);
protected:
std::vector<DataMember> format;
+65
View File
@@ -101,6 +101,71 @@ int getFormatPositionComponents(CommonFormat format)
return 0;
}
// Order here relies on order of DataFormat enum.
static const DataFormatInfo dataFormatInfo[]
{
// baseType, isMatrix, components, rows, columns, componentSize, align, size
{ DATA_BASETYPE_FLOAT, false, 1, 0, 0, 4, 4, 4 }, // DATAFORMAT_FLOAT
{ DATA_BASETYPE_FLOAT, false, 2, 0, 0, 4, 4, 8 }, // DATAFORMAT_FLOAT_VEC2
{ DATA_BASETYPE_FLOAT, false, 3, 0, 0, 4, 4, 12 }, // DATAFORMAT_FLOAT_VEC3
{ DATA_BASETYPE_FLOAT, false, 4, 0, 0, 4, 4, 16 }, // DATAFORMAT_FLOAT_VEC4
{ DATA_BASETYPE_FLOAT, true, 0, 2, 2, 4, 4, 16 }, // DATAFORMAT_FLOAT_MAT2X2
{ DATA_BASETYPE_FLOAT, true, 0, 2, 3, 4, 4, 24 }, // DATAFORMAT_FLOAT_MAT2X3
{ DATA_BASETYPE_FLOAT, true, 0, 2, 4, 4, 4, 32 }, // DATAFORMAT_FLOAT_MAT2X4
{ DATA_BASETYPE_FLOAT, true, 0, 3, 2, 4, 4, 24 }, // DATAFORMAT_FLOAT_MAT3X2
{ DATA_BASETYPE_FLOAT, true, 0, 3, 3, 4, 4, 36 }, // DATAFORMAT_FLOAT_MAT3X3
{ DATA_BASETYPE_FLOAT, true, 0, 3, 4, 4, 4, 48 }, // DATAFORMAT_FLOAT_MAT3X4
{ DATA_BASETYPE_FLOAT, true, 0, 4, 2, 4, 4, 32 }, // DATAFORMAT_FLOAT_MAT4X2
{ DATA_BASETYPE_FLOAT, true, 0, 4, 3, 4, 4, 48 }, // DATAFORMAT_FLOAT_MAT4X3
{ DATA_BASETYPE_FLOAT, true, 0, 4, 4, 4, 4, 64 }, // DATAFORMAT_FLOAT_MAT4X4
{ DATA_BASETYPE_INT, false, 1, 0, 0, 4, 4, 4 }, // DATAFORMAT_INT32
{ DATA_BASETYPE_INT, false, 2, 0, 0, 4, 4, 8 }, // DATAFORMAT_INT32_VEC2
{ DATA_BASETYPE_INT, false, 3, 0, 0, 4, 4, 12 }, // DATAFORMAT_INT32_VEC3
{ DATA_BASETYPE_INT, false, 4, 0, 0, 4, 4, 16 }, // DATAFORMAT_INT32_VEC4
{ DATA_BASETYPE_UINT, false, 1, 0, 0, 4, 4, 4 }, // DATAFORMAT_UINT32
{ DATA_BASETYPE_UINT, false, 2, 0, 0, 4, 4, 8 }, // DATAFORMAT_UINT32_VEC2
{ DATA_BASETYPE_UINT, false, 3, 0, 0, 4, 4, 12 }, // DATAFORMAT_UINT32_VEC3
{ DATA_BASETYPE_UINT, false, 4, 0, 0, 4, 4, 16 }, // DATAFORMAT_UINT32_VEC4
{ DATA_BASETYPE_SNORM, false, 4, 0, 0, 1, 1, 4 }, // DATAFORMAT_SNORM8_VEC4
{ DATA_BASETYPE_UNORM, false, 4, 0, 0, 1, 1, 4 }, // DATAFORMAT_UNORM8_VEC4
{ DATA_BASETYPE_INT, false, 4, 0, 0, 1, 1, 4 }, // DATAFORMAT_INT8_VEC4
{ DATA_BASETYPE_UINT, false, 4, 0, 0, 1, 1, 4 }, // DATAFORMAT_UINT8_VEC4
{ DATA_BASETYPE_SNORM, false, 1, 0, 0, 2, 2, 2 }, // DATAFORMAT_SNORM16
{ DATA_BASETYPE_SNORM, false, 2, 0, 0, 2, 2, 4 }, // DATAFORMAT_SNORM16_VEC2
{ DATA_BASETYPE_SNORM, false, 4, 0, 0, 2, 2, 8 }, // DATAFORMAT_SNORM16_VEC4
{ DATA_BASETYPE_UNORM, false, 1, 0, 0, 2, 2, 2 }, // DATAFORMAT_SNORM16
{ DATA_BASETYPE_UNORM, false, 2, 0, 0, 2, 2, 4 }, // DATAFORMAT_SNORM16_VEC2
{ DATA_BASETYPE_UNORM, false, 4, 0, 0, 2, 2, 8 }, // DATAFORMAT_SNORM16_VEC4
{ DATA_BASETYPE_INT, false, 1, 0, 0, 2, 2, 2 }, // DATAFORMAT_SNORM16
{ DATA_BASETYPE_INT, false, 2, 0, 0, 2, 2, 4 }, // DATAFORMAT_SNORM16_VEC2
{ DATA_BASETYPE_INT, false, 4, 0, 0, 2, 2, 8 }, // DATAFORMAT_SNORM16_VEC4
{ DATA_BASETYPE_UINT, false, 1, 0, 0, 2, 2, 2 }, // DATAFORMAT_SNORM16
{ DATA_BASETYPE_UINT, false, 2, 0, 0, 2, 2, 4 }, // DATAFORMAT_SNORM16_VEC2
{ DATA_BASETYPE_UINT, false, 4, 0, 0, 2, 2, 8 }, // DATAFORMAT_SNORM16_VEC4
{ DATA_BASETYPE_BOOL, false, 1, 0, 0, 4, 4, 4 }, // DATAFORMAT_BOOL
{ DATA_BASETYPE_BOOL, false, 2, 0, 0, 4, 4, 8 }, // DATAFORMAT_BOOL_VEC2
{ DATA_BASETYPE_BOOL, false, 3, 0, 0, 4, 4, 12 }, // DATAFORMAT_BOOL_VEC3
{ DATA_BASETYPE_BOOL, false, 4, 0, 0, 4, 4, 16 }, // DATAFORMAT_BOOL_VEC4
};
static_assert((sizeof(dataFormatInfo) / sizeof(DataFormatInfo)) == DATAFORMAT_MAX_ENUM, "dataFormatInfo array size must match number of DataFormat enum values.");
const DataFormatInfo &getDataFormatInfo(DataFormat format)
{
return dataFormatInfo[format];
}
size_t getIndexDataSize(IndexDataType type)
{
switch (type)
+87
View File
@@ -131,6 +131,79 @@ enum DataType
DATA_MAX_ENUM
};
// The order of this enum affects the dataFormatInfo array.
enum DataFormat
{
DATAFORMAT_FLOAT,
DATAFORMAT_FLOAT_VEC2,
DATAFORMAT_FLOAT_VEC3,
DATAFORMAT_FLOAT_VEC4,
DATAFORMAT_FLOAT_MAT2X2,
DATAFORMAT_FLOAT_MAT2X3,
DATAFORMAT_FLOAT_MAT2X4,
DATAFORMAT_FLOAT_MAT3X2,
DATAFORMAT_FLOAT_MAT3X3,
DATAFORMAT_FLOAT_MAT3X4,
DATAFORMAT_FLOAT_MAT4X2,
DATAFORMAT_FLOAT_MAT4X3,
DATAFORMAT_FLOAT_MAT4X4,
DATAFORMAT_INT32,
DATAFORMAT_INT32_VEC2,
DATAFORMAT_INT32_VEC3,
DATAFORMAT_INT32_VEC4,
DATAFORMAT_UINT32,
DATAFORMAT_UINT32_VEC2,
DATAFORMAT_UINT32_VEC3,
DATAFORMAT_UINT32_VEC4,
DATAFORMAT_SNORM8_VEC4,
DATAFORMAT_UNORM8_VEC4,
DATAFORMAT_INT8_VEC4,
DATAFORMAT_UINT8_VEC4,
DATAFORMAT_SNORM16,
DATAFORMAT_SNORM16_VEC2,
DATAFORMAT_SNORM16_VEC4,
DATAFORMAT_UNORM16,
DATAFORMAT_UNORM16_VEC2,
DATAFORMAT_UNORM16_VEC4,
DATAFORMAT_INT16,
DATAFORMAT_INT16_VEC2,
DATAFORMAT_INT16_VEC4,
DATAFORMAT_UINT16,
DATAFORMAT_UINT16_VEC2,
DATAFORMAT_UINT16_VEC4,
DATAFORMAT_BOOL,
DATAFORMAT_BOOL_VEC2,
DATAFORMAT_BOOL_VEC3,
DATAFORMAT_BOOL_VEC4,
DATAFORMAT_MAX_ENUM
};
enum DataBaseType
{
DATA_BASETYPE_FLOAT,
DATA_BASETYPE_INT,
DATA_BASETYPE_UINT,
DATA_BASETYPE_SNORM,
DATA_BASETYPE_UNORM,
DATA_BASETYPE_BOOL,
DATA_BASETYPE_MAX_ENUM
};
enum Winding
{
WINDING_CW,
@@ -161,6 +234,18 @@ enum class CommonFormat
XYf_STPf_RGBAub,
};
struct DataFormatInfo
{
DataBaseType baseType;
bool isMatrix;
int components;
int matrixRows;
int matrixColumns;
size_t componentSize;
size_t alignment;
size_t size;
};
struct STf_RGBAub
{
float s, t;
@@ -315,6 +400,8 @@ inline CommonFormat getSinglePositionFormat(bool is2D)
return is2D ? CommonFormat::XYf : CommonFormat::XYZf;
}
const DataFormatInfo &getDataFormatInfo(DataFormat format);
size_t getIndexDataSize(IndexDataType type);
size_t getDataTypeSize(DataType datatype);
bool isDataTypeInteger(DataType datatype);