ogl_beamforming

Ultrasound Beamforming Implemented with OpenGL
git clone anongit@rnpnr.xyz:ogl_beamforming.git
Log | Files | Refs | Feed | Submodules | README | LICENSE

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:
Mbeamformer.c | 13+++++--------
Mbeamformer.h | 10----------
Mbeamformer.meta | 8+++++---
Mbuild.c | 31+++++++++++++++++++------------
Mgenerated/beamformer.meta.c | 16++++++++++++----
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},