|
|
|
@ -60,88 +60,169 @@ public: |
|
|
|
Fragment = 4, |
|
|
|
}; |
|
|
|
|
|
|
|
enum class VertexSize : u32 { |
|
|
|
Size_32_32_32_32 = 0x01, |
|
|
|
Size_32_32_32 = 0x02, |
|
|
|
Size_16_16_16_16 = 0x03, |
|
|
|
Size_32_32 = 0x04, |
|
|
|
Size_16_16_16 = 0x05, |
|
|
|
Size_8_8_8_8 = 0x0a, |
|
|
|
Size_16_16 = 0x0f, |
|
|
|
Size_32 = 0x12, |
|
|
|
Size_8_8_8 = 0x13, |
|
|
|
Size_8_8 = 0x18, |
|
|
|
Size_16 = 0x1b, |
|
|
|
Size_8 = 0x1d, |
|
|
|
Size_10_10_10_2 = 0x30, |
|
|
|
Size_11_11_10 = 0x31, |
|
|
|
}; |
|
|
|
struct VertexAttribute { |
|
|
|
enum class Size : u32 { |
|
|
|
Size_32_32_32_32 = 0x01, |
|
|
|
Size_32_32_32 = 0x02, |
|
|
|
Size_16_16_16_16 = 0x03, |
|
|
|
Size_32_32 = 0x04, |
|
|
|
Size_16_16_16 = 0x05, |
|
|
|
Size_8_8_8_8 = 0x0a, |
|
|
|
Size_16_16 = 0x0f, |
|
|
|
Size_32 = 0x12, |
|
|
|
Size_8_8_8 = 0x13, |
|
|
|
Size_8_8 = 0x18, |
|
|
|
Size_16 = 0x1b, |
|
|
|
Size_8 = 0x1d, |
|
|
|
Size_10_10_10_2 = 0x30, |
|
|
|
Size_11_11_10 = 0x31, |
|
|
|
}; |
|
|
|
|
|
|
|
enum class Type : u32 { |
|
|
|
SignedNorm = 1, |
|
|
|
UnsignedNorm = 2, |
|
|
|
SignedInt = 3, |
|
|
|
UnsignedInt = 4, |
|
|
|
UnsignedScaled = 5, |
|
|
|
SignedScaled = 6, |
|
|
|
Float = 7, |
|
|
|
}; |
|
|
|
|
|
|
|
static std::string VertexSizeToString(VertexSize vertex_size) { |
|
|
|
switch (vertex_size) { |
|
|
|
case VertexSize::Size_32_32_32_32: |
|
|
|
return "32_32_32_32"; |
|
|
|
case VertexSize::Size_32_32_32: |
|
|
|
return "32_32_32"; |
|
|
|
case VertexSize::Size_16_16_16_16: |
|
|
|
return "16_16_16_16"; |
|
|
|
case VertexSize::Size_32_32: |
|
|
|
return "32_32"; |
|
|
|
case VertexSize::Size_16_16_16: |
|
|
|
return "16_16_16"; |
|
|
|
case VertexSize::Size_8_8_8_8: |
|
|
|
return "8_8_8_8"; |
|
|
|
case VertexSize::Size_16_16: |
|
|
|
return "16_16"; |
|
|
|
case VertexSize::Size_32: |
|
|
|
return "32"; |
|
|
|
case VertexSize::Size_8_8_8: |
|
|
|
return "8_8_8"; |
|
|
|
case VertexSize::Size_8_8: |
|
|
|
return "8_8"; |
|
|
|
case VertexSize::Size_16: |
|
|
|
return "16"; |
|
|
|
case VertexSize::Size_8: |
|
|
|
return "8"; |
|
|
|
case VertexSize::Size_10_10_10_2: |
|
|
|
return "10_10_10_2"; |
|
|
|
case VertexSize::Size_11_11_10: |
|
|
|
return "11_11_10"; |
|
|
|
union { |
|
|
|
BitField<0, 5, u32> buffer; |
|
|
|
BitField<6, 1, u32> constant; |
|
|
|
BitField<7, 14, u32> offset; |
|
|
|
BitField<21, 6, Size> size; |
|
|
|
BitField<27, 3, Type> type; |
|
|
|
BitField<31, 1, u32> bgra; |
|
|
|
}; |
|
|
|
|
|
|
|
u32 ComponentCount() const { |
|
|
|
switch (size) { |
|
|
|
case Size::Size_32_32_32_32: |
|
|
|
return 4; |
|
|
|
case Size::Size_32_32_32: |
|
|
|
return 3; |
|
|
|
case Size::Size_16_16_16_16: |
|
|
|
return 4; |
|
|
|
case Size::Size_32_32: |
|
|
|
return 2; |
|
|
|
case Size::Size_16_16_16: |
|
|
|
return 3; |
|
|
|
case Size::Size_8_8_8_8: |
|
|
|
return 4; |
|
|
|
case Size::Size_16_16: |
|
|
|
return 2; |
|
|
|
case Size::Size_32: |
|
|
|
return 1; |
|
|
|
case Size::Size_8_8_8: |
|
|
|
return 3; |
|
|
|
case Size::Size_8_8: |
|
|
|
return 2; |
|
|
|
case Size::Size_16: |
|
|
|
return 1; |
|
|
|
case Size::Size_8: |
|
|
|
return 1; |
|
|
|
case Size::Size_10_10_10_2: |
|
|
|
return 4; |
|
|
|
case Size::Size_11_11_10: |
|
|
|
return 3; |
|
|
|
default: |
|
|
|
UNREACHABLE(); |
|
|
|
} |
|
|
|
} |
|
|
|
UNIMPLEMENTED(); |
|
|
|
return {}; |
|
|
|
} |
|
|
|
|
|
|
|
enum class VertexType : u32 { |
|
|
|
SignedNorm = 1, |
|
|
|
UnsignedNorm = 2, |
|
|
|
SignedInt = 3, |
|
|
|
UnsignedInt = 4, |
|
|
|
UnsignedScaled = 5, |
|
|
|
SignedScaled = 6, |
|
|
|
Float = 7, |
|
|
|
}; |
|
|
|
|
|
|
|
static std::string VertexTypeToString(VertexType vertex_type) { |
|
|
|
switch (vertex_type) { |
|
|
|
case VertexType::SignedNorm: |
|
|
|
return "SignedNorm"; |
|
|
|
case VertexType::UnsignedNorm: |
|
|
|
return "UnsignedNorm"; |
|
|
|
case VertexType::SignedInt: |
|
|
|
return "SignedInt"; |
|
|
|
case VertexType::UnsignedInt: |
|
|
|
return "UnsignedInt"; |
|
|
|
case VertexType::UnsignedScaled: |
|
|
|
return "UnsignedScaled"; |
|
|
|
case VertexType::SignedScaled: |
|
|
|
return "SignedScaled"; |
|
|
|
case VertexType::Float: |
|
|
|
return "Float"; |
|
|
|
u32 SizeInBytes() const { |
|
|
|
switch (size) { |
|
|
|
case Size::Size_32_32_32_32: |
|
|
|
return 16; |
|
|
|
case Size::Size_32_32_32: |
|
|
|
return 12; |
|
|
|
case Size::Size_16_16_16_16: |
|
|
|
return 8; |
|
|
|
case Size::Size_32_32: |
|
|
|
return 8; |
|
|
|
case Size::Size_16_16_16: |
|
|
|
return 6; |
|
|
|
case Size::Size_8_8_8_8: |
|
|
|
return 4; |
|
|
|
case Size::Size_16_16: |
|
|
|
return 4; |
|
|
|
case Size::Size_32: |
|
|
|
return 4; |
|
|
|
case Size::Size_8_8_8: |
|
|
|
return 3; |
|
|
|
case Size::Size_8_8: |
|
|
|
return 2; |
|
|
|
case Size::Size_16: |
|
|
|
return 2; |
|
|
|
case Size::Size_8: |
|
|
|
return 1; |
|
|
|
case Size::Size_10_10_10_2: |
|
|
|
return 4; |
|
|
|
case Size::Size_11_11_10: |
|
|
|
return 4; |
|
|
|
default: |
|
|
|
UNREACHABLE(); |
|
|
|
} |
|
|
|
} |
|
|
|
UNIMPLEMENTED(); |
|
|
|
return {}; |
|
|
|
} |
|
|
|
|
|
|
|
std::string SizeString() const { |
|
|
|
switch (size) { |
|
|
|
case Size::Size_32_32_32_32: |
|
|
|
return "32_32_32_32"; |
|
|
|
case Size::Size_32_32_32: |
|
|
|
return "32_32_32"; |
|
|
|
case Size::Size_16_16_16_16: |
|
|
|
return "16_16_16_16"; |
|
|
|
case Size::Size_32_32: |
|
|
|
return "32_32"; |
|
|
|
case Size::Size_16_16_16: |
|
|
|
return "16_16_16"; |
|
|
|
case Size::Size_8_8_8_8: |
|
|
|
return "8_8_8_8"; |
|
|
|
case Size::Size_16_16: |
|
|
|
return "16_16"; |
|
|
|
case Size::Size_32: |
|
|
|
return "32"; |
|
|
|
case Size::Size_8_8_8: |
|
|
|
return "8_8_8"; |
|
|
|
case Size::Size_8_8: |
|
|
|
return "8_8"; |
|
|
|
case Size::Size_16: |
|
|
|
return "16"; |
|
|
|
case Size::Size_8: |
|
|
|
return "8"; |
|
|
|
case Size::Size_10_10_10_2: |
|
|
|
return "10_10_10_2"; |
|
|
|
case Size::Size_11_11_10: |
|
|
|
return "11_11_10"; |
|
|
|
} |
|
|
|
UNREACHABLE(); |
|
|
|
return {}; |
|
|
|
} |
|
|
|
|
|
|
|
std::string TypeToString() const { |
|
|
|
switch (type) { |
|
|
|
case Type::SignedNorm: |
|
|
|
return "SignedNorm"; |
|
|
|
case Type::UnsignedNorm: |
|
|
|
return "UnsignedNorm"; |
|
|
|
case Type::SignedInt: |
|
|
|
return "SignedInt"; |
|
|
|
case Type::UnsignedInt: |
|
|
|
return "UnsignedInt"; |
|
|
|
case Type::UnsignedScaled: |
|
|
|
return "UnsignedScaled"; |
|
|
|
case Type::SignedScaled: |
|
|
|
return "SignedScaled"; |
|
|
|
case Type::Float: |
|
|
|
return "Float"; |
|
|
|
} |
|
|
|
UNREACHABLE(); |
|
|
|
return {}; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
enum class PrimitiveTopology : u32 { |
|
|
|
Points = 0x0, |
|
|
|
@ -222,49 +303,7 @@ public: |
|
|
|
|
|
|
|
INSERT_PADDING_WORDS(0x5B); |
|
|
|
|
|
|
|
union { |
|
|
|
BitField<0, 5, u32> buffer; |
|
|
|
BitField<6, 1, u32> constant; |
|
|
|
BitField<7, 14, u32> offset; |
|
|
|
BitField<21, 6, VertexSize> size; |
|
|
|
BitField<27, 3, VertexType> type; |
|
|
|
BitField<31, 1, u32> bgra; |
|
|
|
|
|
|
|
u32 SizeInBytes() const { |
|
|
|
switch (size) { |
|
|
|
case VertexSize::Size_32_32_32_32: |
|
|
|
return 16; |
|
|
|
case VertexSize::Size_32_32_32: |
|
|
|
return 12; |
|
|
|
case VertexSize::Size_16_16_16_16: |
|
|
|
return 8; |
|
|
|
case VertexSize::Size_32_32: |
|
|
|
return 8; |
|
|
|
case VertexSize::Size_16_16_16: |
|
|
|
return 6; |
|
|
|
case VertexSize::Size_8_8_8_8: |
|
|
|
return 4; |
|
|
|
case VertexSize::Size_16_16: |
|
|
|
return 4; |
|
|
|
case VertexSize::Size_32: |
|
|
|
return 4; |
|
|
|
case VertexSize::Size_8_8_8: |
|
|
|
return 3; |
|
|
|
case VertexSize::Size_8_8: |
|
|
|
return 2; |
|
|
|
case VertexSize::Size_16: |
|
|
|
return 2; |
|
|
|
case VertexSize::Size_8: |
|
|
|
return 1; |
|
|
|
case VertexSize::Size_10_10_10_2: |
|
|
|
return 4; |
|
|
|
case VertexSize::Size_11_11_10: |
|
|
|
return 4; |
|
|
|
default: |
|
|
|
UNREACHABLE(); |
|
|
|
} |
|
|
|
} |
|
|
|
} vertex_attrib_format[NumVertexAttributes]; |
|
|
|
VertexAttribute vertex_attrib_format[NumVertexAttributes]; |
|
|
|
|
|
|
|
INSERT_PADDING_WORDS(0xF); |
|
|
|
|
|
|
|
|