Skip to content

Commit e02e26c

Browse files
committed
build: meta: simplify shader local flag packing
No need for these to be stored in an array when they just get ored togethor at the end anyways
1 parent 39b2d73 commit e02e26c

File tree

1 file changed

+49
-55
lines changed

1 file changed

+49
-55
lines changed

build.c

Lines changed: 49 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,9 +1256,8 @@ typedef struct {
12561256

12571257
typedef struct {
12581258
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;
12621261
} MetaShaderPermutation;
12631262
DA_STRUCT(MetaShaderPermutation, MetaShaderPermutation);
12641263

@@ -1307,6 +1306,41 @@ typedef struct {
13071306
MetaShaderDescriptor *shader_descriptors;
13081307
} MetaContext;
13091308

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+
13101344
function iz
13111345
meta_lookup_string_slow(s8_list *sv, s8 s)
13121346
{
@@ -1412,12 +1446,10 @@ typedef struct {
14121446

14131447
function void
14141448
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)
14171450
{
14181451
////////////////////////////////////
14191452
// NOTE: fill ids from up the stack
1420-
u32 local_flag_index = 0;
14211453
u32 global_flag_index = 0;
14221454
for (iz i = 0; i < stack->count; i++) {
14231455
MetaShaderPermutationStackFrame *f = stack->data + i;
@@ -1434,7 +1466,7 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh
14341466
}
14351467
f->permutation_id = packed;
14361468
}
1437-
sp->local_flags[local_flag_index++] = (u8)f->permutation_id;
1469+
sp->local_flags |= (u8)f->permutation_id;
14381470
}break;
14391471
case MetaEntryKind_Permute:{
14401472
if (f->permutation_id == U32_MAX) {
@@ -1453,18 +1485,16 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh
14531485
MetaEntryArgument *a = last->arguments;
14541486
switch (last->kind) {
14551487
case MetaEntryKind_PermuteFlags:{
1456-
u32 packed = local_flags;
1457-
u32 test = frame_cursor;
1488+
u32 packed = 0, test = frame_cursor;
14581489
for EachBit(test, flag) {
14591490
u32 flag_index = meta_commit_shader_flag(ctx, base_shader->flag_list_id, a->strings[flag], last);
14601491
packed |= (1u << flag_index);
14611492
}
1462-
sp->local_flags[local_flag_index++] = (u8)packed;
1493+
sp->local_flags |= (u8)packed;
14631494
}break;
14641495
case MetaEntryKind_Permute:{
14651496
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);
14681498
meta_intern_id(ctx, &base_shader->global_flag_ids, (u32)p.kind);
14691499
}break;
14701500
InvalidDefaultCase;
@@ -1478,27 +1508,24 @@ meta_pop_and_pack_shader_permutations(MetaContext *ctx, MetaShader *base_shader,
14781508
assert(stack->count > 0);
14791509

14801510
u32 global_flag_count = 0;
1481-
u32 local_flag_count = 0;
1482-
14831511
for (iz i = 0; i < stack->count; i++) {
14841512
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;
14871515
InvalidDefaultCase;
14881516
}
14891517
}
14901518

14911519
MetaShaderPermutationStackFrame *f = stack->data + (--stack->count);
14921520
MetaEntry *last = stack->base_entry + f->entry_id;
14931521
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++) {
14951523
MetaShaderPermutation *sp = da_push(ctx->arena, &base_shader->permutations);
14961524
sp->global_flags_count = (u8)global_flag_count;
1497-
sp->local_flags_count = (u8)local_flag_count;
14981525
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;
15001527

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);
15021529
}
15031530
}
15041531

@@ -1659,33 +1686,6 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry
16591686
return result;
16601687
}
16611688

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-
16891689
function void
16901690
metagen_push_table(MetaprogramContext *m, Arena scratch, s8 row_start, s8 row_end,
16911691
s8 **column_strings, uz rows, uz columns)
@@ -1779,14 +1779,9 @@ metagen_push_shader_derivative_vectors(MetaContext *ctx, MetaprogramContext *m,
17791779
for (i32 id = p->global_flags_count; id < sub_field_count; id++)
17801780
meta_push(m, s8(", -1"));
17811781

1782-
// NOTE(rnp): local flag names
17831782
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-
17881783
meta_push(m, s8(", 0x"));
1789-
meta_push_u64_hex(m, local_flags);
1784+
meta_push_u64_hex(m, p->local_flags);
17901785
}
17911786
meta_end_line(m, s8("},"));
17921787
}
@@ -2435,8 +2430,7 @@ metagen_load_context(Arena *arena)
24352430
MetaShader *s = ctx->shaders.data + shader;
24362431
MetaShaderDescriptor *sd = ctx->shader_descriptors + shader;
24372432

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;
24402434
sd->sub_field_count = (i32)s->global_flag_ids.count;
24412435
sd->first_match_vector_index = match_vectors_count;
24422436
match_vectors_count += (i32)s->permutations.count;

0 commit comments

Comments
 (0)