| 446 | typedef WorkQueue2<CompileShaderArguments, decltype( &CompileShader )> CompileQueue; |
| 447 | |
| 448 | void AddPermutationsToWorkQueue( CompileQueue& queue, const Permutations& permutations, bool ignorePermutations, const std::vector<Macro>& defines ) |
| 449 | { |
| 450 | std::vector<size_t> indexes; |
| 451 | indexes.resize( permutations.size() ); |
| 452 | uint32_t permutation = 0; |
| 453 | bool done = false; |
| 454 | while( !done ) |
| 455 | { |
| 456 | CompileShaderArguments args; |
| 457 | args.permutation = permutation; |
| 458 | if( !defines.empty() ) |
| 459 | { |
| 460 | args.defines.insert( args.defines.end(), defines.begin(), defines.end() ); |
| 461 | } |
| 462 | |
| 463 | if( !ignorePermutations ) |
| 464 | { |
| 465 | for( size_t i = 0; i < permutations.size(); ++i ) |
| 466 | { |
| 467 | Macro define; |
| 468 | define.name = permutations[i].name; |
| 469 | define.value = std::to_string( int64_t( permutations[i].options[indexes[i]].value ) ); |
| 470 | args.defines.push_back( define ); |
| 471 | } |
| 472 | } |
| 473 | |
| 474 | queue.Put( args ); |
| 475 | |
| 476 | for( size_t i = 0; i < permutations.size(); ++i ) |
| 477 | { |
| 478 | ++indexes[i]; |
| 479 | if( indexes[i] >= permutations[i].options.size() ) |
| 480 | { |
| 481 | if( i + 1 == permutations.size() ) |
| 482 | { |
| 483 | done = true; |
| 484 | } |
| 485 | indexes[i] = 0; |
| 486 | } |
| 487 | else |
| 488 | { |
| 489 | break; |
| 490 | } |
| 491 | } |
| 492 | if( ignorePermutations || permutations.empty() ) |
| 493 | { |
| 494 | break; |
| 495 | } |
| 496 | ++permutation; |
| 497 | } |
| 498 | } |
| 499 | |
| 500 | struct WithTelemetry |
| 501 | { |