Browse Source

Move DataFormat enum to vertex.h

Alex Szpakowski 5 years ago
parent
commit
d5d50d2e0d

+ 5 - 12
src/modules/graphics/Buffer.cpp

@@ -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
src/modules/graphics/Buffer.h

@@ -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 - 0
src/modules/graphics/vertex.cpp

@@ -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 - 0
src/modules/graphics/vertex.h

@@ -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);