@@ -1256,9 +1256,8 @@ typedef struct {
1256
1256
1257
1257
typedef struct {
1258
1258
u32 * global_flags ;
1259
- u8 * local_flags ;
1260
- u8 global_flags_count ;
1261
- u8 local_flags_count ;
1259
+ u16 local_flags ;
1260
+ u16 global_flags_count ;
1262
1261
} MetaShaderPermutation ;
1263
1262
DA_STRUCT (MetaShaderPermutation , MetaShaderPermutation );
1264
1263
@@ -1307,6 +1306,41 @@ typedef struct {
1307
1306
MetaShaderDescriptor * shader_descriptors ;
1308
1307
} MetaContext ;
1309
1308
1309
+
1310
+ function u32
1311
+ metagen_pack_permutation (MetaContext * ctx , MetaEnumeration e )
1312
+ {
1313
+ u32 result = ((u32 )(e .kind & 0xFFFFu ) << 16u ) | (u32 )(e .variation & 0xFFFFu );
1314
+ return result ;
1315
+ }
1316
+
1317
+ function MetaEnumeration
1318
+ metagen_unpack_permutation (MetaContext * ctx , u32 packed )
1319
+ {
1320
+ MetaEnumeration result ;
1321
+ result .kind = (iz )(packed >> 16u );
1322
+ result .variation = (iz )(packed & 0xFFFFu );
1323
+ assert (result .kind < ctx -> enumeration_kinds .count );
1324
+ assert (result .variation < ctx -> enumeration_members .data [result .kind ].count );
1325
+ return result ;
1326
+ }
1327
+
1328
+ function s8
1329
+ metagen_permutation_kind (MetaContext * ctx , u32 packed )
1330
+ {
1331
+ MetaEnumeration p = metagen_unpack_permutation (ctx , packed );
1332
+ s8 result = ctx -> enumeration_kinds .data [p .kind ];
1333
+ return result ;
1334
+ }
1335
+
1336
+ function s8
1337
+ metagen_permutation_variation (MetaContext * ctx , u32 packed )
1338
+ {
1339
+ MetaEnumeration p = metagen_unpack_permutation (ctx , packed );
1340
+ s8 result = ctx -> enumeration_members .data [p .kind ].data [p .variation ];
1341
+ return result ;
1342
+ }
1343
+
1310
1344
function iz
1311
1345
meta_lookup_string_slow (s8_list * sv , s8 s )
1312
1346
{
@@ -1412,12 +1446,10 @@ typedef struct {
1412
1446
1413
1447
function void
1414
1448
meta_pack_shader_permutation (MetaContext * ctx , MetaShaderPermutation * sp , MetaShader * base_shader ,
1415
- u32 local_flags , MetaShaderPermutationStack * stack , MetaEntry * last ,
1416
- u32 frame_cursor )
1449
+ MetaShaderPermutationStack * stack , MetaEntry * last , u32 frame_cursor )
1417
1450
{
1418
1451
////////////////////////////////////
1419
1452
// NOTE: fill ids from up the stack
1420
- u32 local_flag_index = 0 ;
1421
1453
u32 global_flag_index = 0 ;
1422
1454
for (iz i = 0 ; i < stack -> count ; i ++ ) {
1423
1455
MetaShaderPermutationStackFrame * f = stack -> data + i ;
@@ -1434,7 +1466,7 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh
1434
1466
}
1435
1467
f -> permutation_id = packed ;
1436
1468
}
1437
- sp -> local_flags [ local_flag_index ++ ] = (u8 )f -> permutation_id ;
1469
+ sp -> local_flags | = (u8 )f -> permutation_id ;
1438
1470
}break ;
1439
1471
case MetaEntryKind_Permute :{
1440
1472
if (f -> permutation_id == U32_MAX ) {
@@ -1453,18 +1485,16 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh
1453
1485
MetaEntryArgument * a = last -> arguments ;
1454
1486
switch (last -> kind ) {
1455
1487
case MetaEntryKind_PermuteFlags :{
1456
- u32 packed = local_flags ;
1457
- u32 test = frame_cursor ;
1488
+ u32 packed = 0 , test = frame_cursor ;
1458
1489
for EachBit (test , flag ) {
1459
1490
u32 flag_index = meta_commit_shader_flag (ctx , base_shader -> flag_list_id , a -> strings [flag ], last );
1460
1491
packed |= (1u << flag_index );
1461
1492
}
1462
- sp -> local_flags [ local_flag_index ++ ] = (u8 )packed ;
1493
+ sp -> local_flags | = (u8 )packed ;
1463
1494
}break ;
1464
1495
case MetaEntryKind_Permute :{
1465
1496
MetaEnumeration p = meta_commit_enumeration (ctx , a [0 ].string , a [1 ].strings [frame_cursor ]);
1466
- u32 packed = ((u32 )(p .kind & 0xFFFFu ) << 16 ) | (u32 )(p .variation & 0xFFFFu );
1467
- sp -> global_flags [global_flag_index ++ ] = packed ;
1497
+ sp -> global_flags [global_flag_index ++ ] = metagen_pack_permutation (ctx , p );
1468
1498
meta_intern_id (ctx , & base_shader -> global_flag_ids , (u32 )p .kind );
1469
1499
}break ;
1470
1500
InvalidDefaultCase ;
@@ -1478,27 +1508,24 @@ meta_pop_and_pack_shader_permutations(MetaContext *ctx, MetaShader *base_shader,
1478
1508
assert (stack -> count > 0 );
1479
1509
1480
1510
u32 global_flag_count = 0 ;
1481
- u32 local_flag_count = 0 ;
1482
-
1483
1511
for (iz i = 0 ; i < stack -> count ; i ++ ) {
1484
1512
switch (stack -> base_entry [stack -> data [i ].entry_id ].kind ) {
1485
- case MetaEntryKind_PermuteFlags :{ local_flag_count ++ ; }break ;
1486
- case MetaEntryKind_Permute :{ global_flag_count ++ ; }break ;
1513
+ case MetaEntryKind_PermuteFlags :{}break ;
1514
+ case MetaEntryKind_Permute :{ global_flag_count ++ ; }break ;
1487
1515
InvalidDefaultCase ;
1488
1516
}
1489
1517
}
1490
1518
1491
1519
MetaShaderPermutationStackFrame * f = stack -> data + (-- stack -> count );
1492
1520
MetaEntry * last = stack -> base_entry + f -> entry_id ;
1493
1521
assert (f -> cursor .current == 0 );
1494
- for (u32 cursor = 0 ; cursor < f -> cursor .target ; cursor ++ ) {
1522
+ for (; f -> cursor . current < f -> cursor .target ; f -> cursor . current ++ ) {
1495
1523
MetaShaderPermutation * sp = da_push (ctx -> arena , & base_shader -> permutations );
1496
1524
sp -> global_flags_count = (u8 )global_flag_count ;
1497
- sp -> local_flags_count = (u8 )local_flag_count ;
1498
1525
sp -> global_flags = push_array (ctx -> arena , typeof (* sp -> global_flags ), global_flag_count );
1499
- sp -> local_flags = push_array ( ctx -> arena , typeof ( * sp -> local_flags ), local_flag_count ) ;
1526
+ sp -> local_flags = ( u16 ) local_flags ;
1500
1527
1501
- meta_pack_shader_permutation (ctx , sp , base_shader , local_flags , stack , last , cursor );
1528
+ meta_pack_shader_permutation (ctx , sp , base_shader , stack , last , f -> cursor . current );
1502
1529
}
1503
1530
}
1504
1531
@@ -1659,33 +1686,6 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry
1659
1686
return result ;
1660
1687
}
1661
1688
1662
- function MetaEnumeration
1663
- metagen_unpack_permutation (MetaContext * ctx , u32 packed )
1664
- {
1665
- MetaEnumeration result ;
1666
- result .kind = (iz )(packed >> 16u );
1667
- result .variation = (iz )(packed & 0xFFFFu );
1668
- assert (result .kind < ctx -> enumeration_kinds .count );
1669
- assert (result .variation < ctx -> enumeration_members .data [result .kind ].count );
1670
- return result ;
1671
- }
1672
-
1673
- function s8
1674
- metagen_permutation_kind (MetaContext * ctx , u32 packed )
1675
- {
1676
- MetaEnumeration p = metagen_unpack_permutation (ctx , packed );
1677
- s8 result = ctx -> enumeration_kinds .data [p .kind ];
1678
- return result ;
1679
- }
1680
-
1681
- function s8
1682
- metagen_permutation_variation (MetaContext * ctx , u32 packed )
1683
- {
1684
- MetaEnumeration p = metagen_unpack_permutation (ctx , packed );
1685
- s8 result = ctx -> enumeration_members .data [p .kind ].data [p .variation ];
1686
- return result ;
1687
- }
1688
-
1689
1689
function void
1690
1690
metagen_push_table (MetaprogramContext * m , Arena scratch , s8 row_start , s8 row_end ,
1691
1691
s8 * * column_strings , uz rows , uz columns )
@@ -1779,14 +1779,9 @@ metagen_push_shader_derivative_vectors(MetaContext *ctx, MetaprogramContext *m,
1779
1779
for (i32 id = p -> global_flags_count ; id < sub_field_count ; id ++ )
1780
1780
meta_push (m , s8 (", -1" ));
1781
1781
1782
- // NOTE(rnp): local flag names
1783
1782
if (has_local_flags ) {
1784
- u64 local_flags = 0 ;
1785
- for (u8 id = 0 ; id < p -> local_flags_count ; id ++ )
1786
- local_flags |= p -> local_flags [id ];
1787
-
1788
1783
meta_push (m , s8 (", 0x" ));
1789
- meta_push_u64_hex (m , local_flags );
1784
+ meta_push_u64_hex (m , p -> local_flags );
1790
1785
}
1791
1786
meta_end_line (m , s8 ("}," ));
1792
1787
}
@@ -2435,8 +2430,7 @@ metagen_load_context(Arena *arena)
2435
2430
MetaShader * s = ctx -> shaders .data + shader ;
2436
2431
MetaShaderDescriptor * sd = ctx -> shader_descriptors + shader ;
2437
2432
2438
- for (iz perm = 0 ; perm < s -> permutations .count ; perm ++ )
2439
- sd -> has_local_flags |= s -> permutations .data [perm ].local_flags_count != 0 ;
2433
+ sd -> has_local_flags = ctx -> flags_for_shader .data [s -> flag_list_id ].count > 0 ;
2440
2434
sd -> sub_field_count = (i32 )s -> global_flag_ids .count ;
2441
2435
sd -> first_match_vector_index = match_vectors_count ;
2442
2436
match_vectors_count += (i32 )s -> permutations .count ;
0 commit comments