| 2327 | } |
| 2328 | |
| 2329 | static void UnrollConstant(rdcstr prefix, uint32_t baseOffset, const ShaderConstant &constant, |
| 2330 | rdcarray<ShaderConstant> &columns, |
| 2331 | rdcarray<BufferElementProperties> &props) |
| 2332 | { |
| 2333 | bool isArray = constant.type.elements > 1; |
| 2334 | |
| 2335 | rdcstr baseName = constant.name; |
| 2336 | |
| 2337 | if(!prefix.isEmpty()) |
| 2338 | baseName = prefix + "." + baseName; |
| 2339 | |
| 2340 | if(constant.type.baseType == VarType::Enum || constant.type.members.isEmpty()) |
| 2341 | { |
| 2342 | BufferElementProperties prop; |
| 2343 | prop.format = GetInterpretedResourceFormat(constant); |
| 2344 | |
| 2345 | ShaderConstant c = constant; |
| 2346 | c.byteOffset += baseOffset; |
| 2347 | |
| 2348 | if(isArray) |
| 2349 | { |
| 2350 | for(uint32_t a = 0; a < constant.type.elements; a++) |
| 2351 | { |
| 2352 | c.name = QFormatStr("%1[%2]").arg(baseName).arg(a); |
| 2353 | columns.push_back(c); |
| 2354 | props.push_back(prop); |
| 2355 | c.byteOffset += constant.type.arrayByteStride; |
| 2356 | } |
| 2357 | } |
| 2358 | else |
| 2359 | { |
| 2360 | c.name = baseName; |
| 2361 | columns.push_back(c); |
| 2362 | props.push_back(prop); |
| 2363 | } |
| 2364 | |
| 2365 | return; |
| 2366 | } |
| 2367 | |
| 2368 | // struct, expand by members |
| 2369 | uint32_t arraySize = qMax(1U, constant.type.elements); |
| 2370 | if(arraySize == ~0U) |
| 2371 | arraySize = 1U; |
| 2372 | for(uint32_t a = 0; a < arraySize; a++) |
| 2373 | { |
| 2374 | for(const ShaderConstant &child : constant.type.members) |
| 2375 | { |
| 2376 | UnrollConstant(isArray ? QFormatStr("%1[%2]").arg(baseName).arg(a) : QString(baseName), |
| 2377 | baseOffset + constant.byteOffset + a * constant.type.arrayByteStride, child, |
| 2378 | columns, props); |
| 2379 | } |
| 2380 | } |
| 2381 | } |
| 2382 | |
| 2383 | static void UnrollConstant(const ShaderConstant &constant, rdcarray<ShaderConstant> &columns, |
| 2384 | rdcarray<BufferElementProperties> &props) |
no test coverage detected