12 bool isValid()
const {
return baseSize > 0 && baseAlignment > 0; }
20 bool isValid()
const {
return size > 0 && alignment > 0; }
29static constexpr inline int64_t alignUp(int64_t value, int64_t alignment)
33 return (value + alignment - 1) & ~(alignment - 1);
36static inline ArrayParseResult parseArrayType(
const QString& typeStr)
38 ArrayParseResult result;
39 result.baseType = typeStr;
40 result.arrayCount = 0;
42 int bracketStart = typeStr.lastIndexOf(
'[');
43 int bracketEnd = typeStr.lastIndexOf(
']');
45 if(bracketStart != -1 && bracketEnd > bracketStart)
48 = typeStr.mid(bracketStart + 1, bracketEnd - bracketStart - 1).trimmed();
49 result.baseType = typeStr.left(bracketStart).trimmed();
54 result.arrayCount = -1;
60 int count = content.toInt(&ok);
61 result.arrayCount = ok ? count : 1;
68static inline Std430TypeInfo getStd430BaseTypeInfo(
const QString& typeStr)
70 if(typeStr ==
"float" || typeStr ==
"int" || typeStr ==
"uint" || typeStr ==
"bool")
72 if(typeStr ==
"double")
75 if(typeStr ==
"vec2" || typeStr ==
"ivec2" || typeStr ==
"uvec2" || typeStr ==
"bvec2")
77 if(typeStr ==
"vec3" || typeStr ==
"ivec3" || typeStr ==
"uvec3" || typeStr ==
"bvec3")
79 if(typeStr ==
"vec4" || typeStr ==
"ivec4" || typeStr ==
"uvec4" || typeStr ==
"bvec4")
82 if(typeStr ==
"dvec2")
84 if(typeStr ==
"dvec3")
86 if(typeStr ==
"dvec4")
90 if(typeStr ==
"mat2" || typeStr ==
"mat2x2")
93 if(typeStr ==
"mat3" || typeStr ==
"mat3x3")
96 if(typeStr ==
"mat4" || typeStr ==
"mat4x4")
100 if(typeStr ==
"mat2x3")
103 if(typeStr ==
"mat2x4")
106 if(typeStr ==
"mat3x2")
109 if(typeStr ==
"mat3x4")
112 if(typeStr ==
"mat4x2")
115 if(typeStr ==
"mat4x3")
119 if(typeStr ==
"dmat2" || typeStr ==
"dmat2x2")
122 if(typeStr ==
"dmat3" || typeStr ==
"dmat3x3")
125 if(typeStr ==
"dmat4" || typeStr ==
"dmat4x4")
128 if(typeStr ==
"dmat2x3")
130 if(typeStr ==
"dmat2x4")
132 if(typeStr ==
"dmat3x2")
134 if(typeStr ==
"dmat3x4")
136 if(typeStr ==
"dmat4x2")
138 if(typeStr ==
"dmat4x3")
145static inline LayoutResult calculateStructLayout(
146 std::span<const isf::storage_input::layout_field> layout,
147 std::span<const isf::descriptor::type_definition> typeDefinitions)
152 int currentOffset = 0;
153 int maxAlignment = 0;
155 for(
const auto& field : layout)
157 const ArrayParseResult parsed = parseArrayType(QString::fromStdString(field.type));
158 const QString baseType = parsed.baseType;
160 const bool isArray = (parsed.arrayCount != 0);
161 const bool isFlexibleArray = (parsed.arrayCount == -1);
162 const int arrayCount = (parsed.arrayCount > 0) ? parsed.arrayCount : 1;
166 qWarning() <<
"Flexible array found inside struct. Invalid GLSL, skipping:"
167 << QString::fromStdString(field.name);
174 const Std430TypeInfo info = getStd430BaseTypeInfo(baseType);
179 fieldSize = info.baseSize;
180 fieldAlign = info.baseAlignment;
186 for(
const auto& typeDef : typeDefinitions)
188 if(QString::fromStdString(typeDef.name) == baseType)
190 LayoutResult subStruct
191 = calculateStructLayout(typeDef.layout, typeDefinitions);
192 fieldSize = subStruct.size;
193 fieldAlign = subStruct.alignment;
200 qWarning() <<
"Unknown type, using fallback alignment:" << baseType;
207 int totalFieldSize = fieldSize;
208 if(isArray && arrayCount > 0)
211 int elementStride = alignUp(fieldSize, fieldAlign);
212 totalFieldSize = elementStride * arrayCount;
215 currentOffset = alignUp(currentOffset, fieldAlign);
216 currentOffset += totalFieldSize;
217 maxAlignment = std::max(maxAlignment, fieldAlign);
221 currentOffset = alignUp(currentOffset, maxAlignment);
223 return {currentOffset, maxAlignment};
226static inline int64_t calculateStorageBufferSize(
227 std::span<const isf::storage_input::layout_field> layout,
int arrayCount,
228 const isf::descriptor& d)
237 const auto& typeDefinitions = d.types;
239 int64_t currentOffset = 0;
240 int64_t maxBufferAlignment = 0;
242 for(
const auto& field : layout)
244 const ArrayParseResult parsed = parseArrayType(QString::fromStdString(field.type));
245 const QString baseType = parsed.baseType;
247 const bool isFlexibleArray = (parsed.arrayCount == -1);
248 const bool isFixedArray = (parsed.arrayCount > 0);
249 const int fixedArrayCount = isFixedArray ? parsed.arrayCount : 1;
252 int64_t fieldAlign = 0;
254 const Std430TypeInfo info = getStd430BaseTypeInfo(baseType);
259 fieldSize = info.baseSize;
260 fieldAlign = info.baseAlignment;
266 for(
const auto& typeDef : typeDefinitions)
268 if(QString::fromStdString(typeDef.name) == baseType)
270 const LayoutResult subRes
271 = calculateStructLayout(typeDef.layout, typeDefinitions);
272 fieldSize = subRes.size;
273 fieldAlign = subRes.alignment;
280 qWarning() <<
"Unknown type in buffer layout:" << baseType;
286 int elementStride = alignUp(fieldSize, fieldAlign);
287 currentOffset = alignUp(currentOffset, fieldAlign);
291 currentOffset += elementStride * arrayCount;
293 else if(isFixedArray)
296 currentOffset += elementStride * fixedArrayCount;
301 currentOffset += fieldSize;
304 maxBufferAlignment = std::max(maxBufferAlignment, fieldAlign);
307 currentOffset = alignUp(currentOffset, maxBufferAlignment);
309 return currentOffset;
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:12