Commit: 3a2f6baff76be3f82c6fc9b465b9e10c1fe998d3
Parent: 4b47281e89e525d5c9ae08c801af932228c3eb07
Author: Randy Palamar
Date: Sun, 7 Sep 2025 16:13:49 -0600
meta: allow non-permutation shader flags to be specified
Diffstat:
5 files changed, 41 insertions(+), 37 deletions(-)
diff --git a/beamformer.c b/beamformer.c
@@ -429,12 +429,12 @@ das_ubo_from_beamformer_parameters(BeamformerDASUBO *du, BeamformerParameters *b
du->acquisition_count = bp->acquisition_count;
du->shader_flags = 0;
- if (bp->interpolate) du->shader_flags |= DASShaderFlags_Interpolate;
- if (bp->coherency_weighting) du->shader_flags |= DASShaderFlags_CoherencyWeighting;
+ if (bp->interpolate) du->shader_flags |= BeamformerShaderDASFlags_Interpolate;
+ if (bp->coherency_weighting) du->shader_flags |= BeamformerShaderDASFlags_CoherencyWeighting;
if (bp->transmit_mode == BeamformerTransmitMode_Columns)
- du->shader_flags |= DASShaderFlags_TxColumns;
+ du->shader_flags |= BeamformerShaderDASFlags_TxColumns;
if (bp->receive_mode == BeamformerReceiveMode_Columns)
- du->shader_flags |= DASShaderFlags_RxColumns;
+ du->shader_flags |= BeamformerShaderDASFlags_RxColumns;
}
function void
@@ -515,7 +515,7 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb)
das_data_kind = BeamformerDataKind_Float32Complex;
i32 local_flags = 0;
- if ((bp->shader_flags & DASShaderFlags_CoherencyWeighting) == 0)
+ if ((bp->shader_flags & BeamformerShaderDASFlags_CoherencyWeighting) == 0)
local_flags |= BeamformerShaderDASFlags_Fast;
if (bp->shader_kind == DASShaderKind_UFORCES || bp->shader_kind == DASShaderKind_UHERCULES)
local_flags |= BeamformerShaderDASFlags_Sparse;
@@ -935,9 +935,6 @@ stream_push_shader_header(Stream *s, ShaderReloadContext *ctx)
"layout(location = " str(DAS_FAST_CHANNEL_UNIFORM_LOC) ") uniform int u_channel;\n\n"
));
- #define X(k, id, ...) "#define ShaderFlags_" #k " " #id "\n"
- stream_append_s8s(s, s8(DAS_SHADER_FLAGS_LIST), s8("\n"));
- #undef X
#define X(k, id, ...) "#define ShaderKind_" #k " " #id "\n"
stream_append_s8s(s, s8(DAS_SHADER_KIND_LIST), s8("\n"));
#undef X
diff --git a/beamformer.h b/beamformer.h
@@ -107,16 +107,6 @@ typedef struct {
u32 texture;
} BeamformerFilter;
-#define DAS_SHADER_FLAGS_LIST \
- X(RxColumns, (1 << 2)) \
- X(TxColumns, (1 << 3)) \
- X(Interpolate, (1 << 4)) \
- X(CoherencyWeighting, (1 << 5))
-
-#define X(k, v, ...) DASShaderFlags_## k = v,
-typedef enum {DAS_SHADER_FLAGS_LIST} DASShaderFlags;
-#undef X
-
/* X(name, type, gltype) */
#define BEAMFORMER_FILTER_UBO_PARAM_LIST \
X(input_channel_stride, u32, uint) \
diff --git a/beamformer.meta b/beamformer.meta
@@ -12,7 +12,7 @@
{
@Permute(DataKind [Int16Complex Float32 Float32Complex])
{
- @PermuteBits([MapChannels ComplexFilter])
+ @PermuteFlags([MapChannels ComplexFilter])
}
@SubShader Demodulate
@@ -21,7 +21,7 @@
{
@Permute(SamplingMode [2X 4X])
{
- @PermuteBits([MapChannels ComplexFilter])
+ @PermuteFlags([MapChannels ComplexFilter])
}
}
}
@@ -31,8 +31,10 @@
{
@Permute(DataKind [Float32 Float32Complex])
{
- @PermuteBits([Fast Sparse])
+ @PermuteFlags([Fast Sparse])
}
+
+ @Flags([Interpolate CoherencyWeighting RxColumns TxColumns])
}
@Shader(min_max.glsl) MinMax
diff --git a/build.c b/build.c
@@ -818,12 +818,13 @@ meta_end_and_write_matlab(MetaprogramContext *m, char *path)
}
#define META_ENTRY_KIND_LIST \
- X(BeginScope) \
- X(EndScope) \
- X(Permute) \
- X(PermuteBits) \
- X(Shader) \
- X(ShaderGroup) \
+ X(BeginScope) \
+ X(EndScope) \
+ X(Flags) \
+ X(Permute) \
+ X(PermuteFlags) \
+ X(Shader) \
+ X(ShaderGroup) \
X(SubShader)
#define X(k, ...) MetaEntryKind_## k,
@@ -1413,7 +1414,7 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh
MetaEntryArgument *a = e->arguments;
u32 cursor = f->cursor.current;
switch (e->kind) {
- case MetaEntryKind_PermuteBits:{
+ case MetaEntryKind_PermuteFlags:{
if (f->permutation_id == U32_MAX)
f->permutation_id = meta_commit_shader_flag(ctx, base_shader->flag_list_id, a->strings[cursor], e);
sp->local_flags[local_flag_index++] = (u8)(1u << f->permutation_id);
@@ -1434,7 +1435,7 @@ meta_pack_shader_permutation(MetaContext *ctx, MetaShaderPermutation *sp, MetaSh
// NOTE: fill ids from stack frame
MetaEntryArgument *a = last->arguments;
switch (last->kind) {
- case MetaEntryKind_PermuteBits:{
+ case MetaEntryKind_PermuteFlags:{
u32 packed = local_flags;
u32 test = frame_cursor;
for EachBit(test, flag) {
@@ -1464,7 +1465,7 @@ meta_pop_and_pack_shader_permutations(MetaContext *ctx, MetaShader *base_shader,
for (iz i = 0; i < stack->count; i++) {
switch (stack->base_entry[stack->data[i].entry_id].kind) {
- case MetaEntryKind_PermuteBits:{ local_flag_count++; }break;
+ case MetaEntryKind_PermuteFlags:{ local_flag_count++; }break;
case MetaEntryKind_Permute:{ global_flag_count++; }break;
InvalidDefaultCase;
}
@@ -1490,7 +1491,7 @@ meta_emit_shader_permutations(MetaContext *ctx, Arena scratch, MetaShader *s, u3
{
assert(entry_count > 0);
assert(entries[0].kind == MetaEntryKind_Permute ||
- entries[0].kind == MetaEntryKind_PermuteBits ||
+ entries[0].kind == MetaEntryKind_PermuteFlags ||
entries[0].kind == MetaEntryKind_SubShader);
MetaShaderPermutationStack stack = {.base_entry = entries};
@@ -1500,7 +1501,7 @@ meta_emit_shader_permutations(MetaContext *ctx, Arena scratch, MetaShader *s, u3
for (iz i = 0; i < entry_count && !done; i++) {
MetaEntry *e = entries + i;
switch (e->kind) {
- case MetaEntryKind_PermuteBits:
+ case MetaEntryKind_PermuteFlags:
case MetaEntryKind_Permute:
{
if (stack.count && stack.data[stack.count - 1].entry_id == (u16)i) {
@@ -1578,7 +1579,7 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry
if (in_sub_shader) goto error;
in_sub_shader = 1;
} /* FALLTHROUGH */
- case MetaEntryKind_PermuteBits:
+ case MetaEntryKind_PermuteFlags:
case MetaEntryKind_Permute:
case MetaEntryKind_Shader:
{
@@ -1613,6 +1614,12 @@ meta_pack_shader(MetaContext *ctx, MetaShaderGroup *sg, Arena scratch, MetaEntry
}
}
}break;
+ case MetaEntryKind_Flags:{
+ meta_entry_argument_expected(e, s8("[flag ...]"));
+ MetaEntryArgument flags = meta_entry_argument_expect(e, 0, MetaEntryArgumentKind_Array);
+ for (u32 index = 0; index < flags.count; index++)
+ meta_commit_shader_flag(ctx, s->flag_list_id, flags.strings[index], e);
+ }break;
default:
error:
diff --git a/generated/beamformer.meta.c b/generated/beamformer.meta.c
@@ -23,8 +23,12 @@ typedef enum {
} BeamformerShaderFilterFlags;
typedef enum {
- BeamformerShaderDASFlags_Fast = (1 << 0),
- BeamformerShaderDASFlags_Sparse = (1 << 1),
+ BeamformerShaderDASFlags_Fast = (1 << 0),
+ BeamformerShaderDASFlags_Sparse = (1 << 1),
+ BeamformerShaderDASFlags_Interpolate = (1 << 2),
+ BeamformerShaderDASFlags_CoherencyWeighting = (1 << 3),
+ BeamformerShaderDASFlags_RxColumns = (1 << 4),
+ BeamformerShaderDASFlags_TxColumns = (1 << 5),
} BeamformerShaderDASFlags;
typedef enum {
@@ -201,8 +205,12 @@ read_only global s8 beamformer_shader_local_header_strings[] = {
"#define ShaderFlags_Demodulate (1 << 2)\n"
"\n"),
s8_comp(""
- "#define ShaderFlags_Fast (1 << 0)\n"
- "#define ShaderFlags_Sparse (1 << 1)\n"
+ "#define ShaderFlags_Fast (1 << 0)\n"
+ "#define ShaderFlags_Sparse (1 << 1)\n"
+ "#define ShaderFlags_Interpolate (1 << 2)\n"
+ "#define ShaderFlags_CoherencyWeighting (1 << 3)\n"
+ "#define ShaderFlags_RxColumns (1 << 4)\n"
+ "#define ShaderFlags_TxColumns (1 << 5)\n"
"\n"),
{0},
{0},