ogl_beamforming

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

Commit: a71039397348cc86227c3146a606bd3e5cd999ac
Parent: b2ddc221d97727c68d9812e958c6ffd93e2afb0b
Author: Randy Palamar
Date:   Mon, 24 Aug 2026 18:37:34 -0700

core/das: remove array parameters; only allocate arrays as needed

Diffstat:
Mbeamformer.meta | 79+++++++++++++++++++++++++++++++------------------------------------------------
Mbeamformer_core.c | 77+++++++++++++++++++++++------------------------------------------------------
Mbeamformer_internal.h | 1-
Mbeamformer_shared_memory.c | 21++++++++-------------
Mgenerated/beamformer.c | 99+++++++++++++++++++++++++++----------------------------------------------------
Mlib/ogl_beamformer_lib.c | 17++++++-----------
Mshaders/das.glsl | 20+++++++++-----------
Mui.c | 12++++++------
8 files changed, 117 insertions(+), 209 deletions(-)

diff --git a/beamformer.meta b/beamformer.meta @@ -266,26 +266,8 @@ @Library @Struct LiveImagingParameters @MATLAB @Struct LiveImagingParameters -@Table([name_upper name_lower type elements]) ComputeArrayParametersTable -{ - [FocalVectors focal_vectors V2 MaxChannelCount] - [SparseElements sparse_elements S16 MaxChannelCount] - [TransmitReceiveOrientations transmit_receive_orientations U8 MaxChannelCount] -} - -@Expand(ComputeArrayParametersTable) @Enumeration(`$(name_upper)`) ComputeArrayParametersField -@Expand(ComputeArrayParametersTable) @Struct([`$(name_lower)` `$(type)` `$(elements)`]) ComputeArrayParameters - @Emit { - `read_only global u32 beamformer_compute_array_parameter_sizes[] = {` - @Expand(ComputeArrayParametersTable) ` sizeof($(%type))$(|)* Beamformer$(elements),` - `};` - `` - `read_only global u32 beamformer_compute_array_parameter_offsets[] = {` - @Expand(ComputeArrayParametersTable) ` offsetof(BeamformerComputeArrayParameters, $(name_lower)),` - `};` - `` `read_only global u8 beamformer_data_kind_element_size[] = {` @Expand(DataKindTable) ` $(size),` `};` @@ -424,8 +406,6 @@ @Enumeration ShaderBufferSlot @Enumeration ShaderResourceKind - @Struct ComputeArrayParameters - @Flags { CoherencyWeighting @@ -433,34 +413,37 @@ @Bake { - [ArrayParameters U64] - [IncoherentFrame U64] - [Hadamard U64] - [AcquisitionKind U32] - [Sparse B32] - [AcquisitionCount S32] - [ChannelCount S32] - [ChunkChannelCount S32] - [SampleCount S32] - - [SamplingFrequency F32] - [DemodulationFrequency F32] - [SpeedOfSound F32] - [TimeOffset F32] - [InterpolationMode U32] - [FNumber F32] - - [SingleOrientation B32] - [TransmitReceiveOrientation U32] - [SingleFocus B32] - [FocusDepth F32] - [TransmitAngle F32] - - [OutputSizeX U32] - [OutputSizeY U32] - [OutputSizeZ U32] - - [ReadiGroupCount U32] + [FocalVectors U64] + [Hadamard U64] + [IncoherentFrame U64] + [SparseElements U64] + [TransmitReceiveOrientations U64] + + [AcquisitionKind U32] + [Sparse B32] + [AcquisitionCount S32] + [ChannelCount S32] + [ChunkChannelCount S32] + [SampleCount S32] + + [SamplingFrequency F32] + [DemodulationFrequency F32] + [SpeedOfSound F32] + [TimeOffset F32] + [InterpolationMode U32] + [FNumber F32] + + [SingleOrientation B32] + [TransmitReceiveOrientation U32] + [SingleFocus B32] + [FocusDepth F32] + [TransmitAngle F32] + + [OutputSizeX U32] + [OutputSizeY U32] + [OutputSizeZ U32] + + [ReadiGroupCount U32] } @PushConstants diff --git a/beamformer_core.c b/beamformer_core.c @@ -234,7 +234,6 @@ beamformer_compute_plan_release(BeamformerComputeContext *cc, u32 block) assert(block < countof(cc->compute_plans)); BeamformerComputePlan *cp = cc->compute_plans[block]; if (cp) { - gpu_buffer_release(&cp->array_parameters); gpu_buffer_release(&cp->gpu_temp_arena); cc->compute_plans[block] = 0; SLLPushFreelist(cp, cc->compute_plan_freelist); @@ -346,19 +345,6 @@ beamformer_compute_plan_for_block(BeamformerComputeContext *cc, u32 block, Arena cc->compute_plans[block] = result; result->ui_voxel_transform = m4_identity(); - - Stream label = arena_stream(arena); - stream_append_str8(&label, str8("ComputeParameterArray[")); - stream_append_u64(&label, block); - stream_append_str8(&label, str8("]")); - - GPUBufferAllocateInfo allocate_info = { - .size = sizeof(BeamformerComputeArrayParameters), - .flags = VulkanUsageFlag_HostReadWrite, - .label = stream_to_str8(&label), - }; - gpu_buffer_allocate(&result->array_parameters, allocate_info); - assert((result->array_parameters.gpu_pointer & 63) == 0); } return result; } @@ -896,7 +882,6 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb, A db->TransmitAngle = pb->parameters.focal_vector.E[0]; db->FocusDepth = pb->parameters.focal_vector.E[1]; db->ReadiGroupCount = pb->parameters.readi_group_count; - db->ArrayParameters = cp->array_parameters.gpu_pointer; db->OutputSizeX = cp->output_points.x; db->OutputSizeY = cp->output_points.y; db->OutputSizeZ = cp->output_points.z; @@ -922,6 +907,27 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb, A sd->layout = layout_for_output(cp->output_points); sd->dispatch = dispatch_for_output(sd->layout, cp->output_points); + if (id != BeamformerAcquisitionKind_UFORCES && id != BeamformerAcquisitionKind_FORCES && !db->SingleFocus) { + gpu_resource_push(resource_builder, v2, db->AcquisitionCount, + .store = &db->FocalVectors, + .data = pb->focal_vectors, + .name = str8("focal_vectors")); + } + + if (id != BeamformerAcquisitionKind_UFORCES && id != BeamformerAcquisitionKind_FORCES && !db->SingleOrientation) { + gpu_resource_push(resource_builder, u8, db->AcquisitionCount, + .store = &db->TransmitReceiveOrientations, + .data = pb->transmit_receive_orientations, + .name = str8("transmit_receive_orientations")); + } + + if (db->Sparse) { + gpu_resource_push(resource_builder, i16, db->AcquisitionCount, + .store = &db->SparseElements, + .data = pb->sparse_elements, + .name = str8("sparse_elements")); + } + if (pb->parameters.coherency_weighting) { gpu_resource_push(resource_builder, u32, 0, .store = &db->IncoherentFrame, @@ -1198,23 +1204,16 @@ beamformer_commit_parameter_block(BeamformerCtx *ctx, BeamformerComputePlan *cp, { pb->region_update_flags &= ~(1ul << region); switch (region) { - case BeamformerParameterRegionFlag_NotifyUI:{ + case BeamformerParameterDirtyFlag_NotifyUI:{ atomic_store_u32(&ctx->ui_dirty_parameter_blocks, 1u << block); }break; - case BeamformerParameterRegionFlag_ComputePipeline: - case BeamformerParameterRegionFlag_Parameters: - { + case BeamformerParameterDirtyFlag_Parameters:{ cp->output_points = das_valid_points(pb->parameters.output_points.xyz); cp->average_frames = pb->parameters.output_points.E[3]; plan_compute_pipeline(cp, pb, scratch); - /* NOTE(rnp): these are both handled by plan_compute_pipeline() */ - u32 mask = 1 << BeamformerParameterBlockRegion_ComputePipeline | - 1 << BeamformerParameterBlockRegion_Parameters; - pb->region_update_flags &= ~mask; - for (u32 shader_slot = 0; shader_slot < cp->pipeline.shader_count; shader_slot++) { u128 hash = u128_hash_from_data(cp->shader_descriptors + shader_slot, sizeof(BeamformerShaderDescriptor)); if (!u128_equal(hash, cp->shader_hashes[shader_slot])) @@ -1252,36 +1251,6 @@ beamformer_commit_parameter_block(BeamformerCtx *ctx, BeamformerComputePlan *cp, } } }break; - - case BeamformerParameterBlockRegion_ChannelMapping:{ - cuda_set_channel_mapping(pb->channel_mapping); - }break; - - case BeamformerParameterRegionFlag_FocalVectors: - case BeamformerParameterRegionFlag_SparseElements: - case BeamformerParameterRegionFlag_TransmitReceiveOrientations: - { - u32 kind = BeamformerComputeArrayParametersField_Count; - switch (region) { - case BeamformerParameterRegionFlag_TransmitReceiveOrientations:{ - kind = BeamformerComputeArrayParametersField_TransmitReceiveOrientations; - }break; - case BeamformerParameterBlockRegion_FocalVectors:{ - kind = BeamformerComputeArrayParametersField_FocalVectors; - }break; - case BeamformerParameterBlockRegion_SparseElements:{ - kind = BeamformerComputeArrayParametersField_SparseElements; - }break; - InvalidDefaultCase; - } - - if (kind != BeamformerComputeArrayParametersField_Count) { - GPUBuffer *b = &cp->array_parameters; - u64 offset = beamformer_compute_array_parameter_offsets[kind]; - u64 size = beamformer_compute_array_parameter_sizes[kind]; - gpu_buffer_range_upload(b, (u8 *)pb + BeamformerParameterBlockRegionOffsets[region], offset, size, 0); - } - }break; } } } diff --git a/beamformer_internal.h b/beamformer_internal.h @@ -316,7 +316,6 @@ struct BeamformerComputePlan { u32 readi_group; - GPUBuffer array_parameters; GPUBuffer gpu_temp_arena; BeamformerFilterParameters filter_parameters[BeamformerFilterSlots]; diff --git a/beamformer_shared_memory.c b/beamformer_shared_memory.c @@ -1,5 +1,5 @@ /* See LICENSE for license details. */ -#define BEAMFORMER_SHARED_MEMORY_VERSION (33UL) +#define BEAMFORMER_SHARED_MEMORY_VERSION (34UL) typedef enum { BeamformerWorkKind_Compute, @@ -70,10 +70,6 @@ typedef struct { X(SparseElements, sparse_elements) \ X(TransmitReceiveOrientations, transmit_receive_orientations) \ -#define BEAMFORMER_PARAMETER_BLOCK_REGION_FLAG_LIST \ - BEAMFORMER_PARAMETER_BLOCK_REGION_LIST \ - X(NotifyUI) \ - typedef enum { #define X(k, ...) BeamformerParameterBlockRegion_##k, BEAMFORMER_PARAMETER_BLOCK_REGION_LIST @@ -82,11 +78,10 @@ typedef enum { } BeamformerParameterBlockRegions; typedef enum { - #define X(k, ...) BeamformerParameterRegionFlag_##k, - BEAMFORMER_PARAMETER_BLOCK_REGION_FLAG_LIST - #undef X - BeamformerParameterRegionFlag_Count, -} BeamformerParameterRegionFlags; + BeamformerParameterDirtyFlag_Parameters, + BeamformerParameterDirtyFlag_NotifyUI, + BeamformerParameterDirtyFlag_Count, +} BeamformerParameterDirtyFlags; typedef union { u8 filter_slot; @@ -111,7 +106,7 @@ typedef struct { /* NOTE(rnp): signals to the beamformer that a subregion of a block has been updated */ u32 region_update_flags; - static_assert(BeamformerParameterRegionFlag_Count <= 32, ""); + static_assert(BeamformerParameterDirtyFlag_Count <= 32, ""); BeamformerComputePipeline pipeline; @@ -297,10 +292,10 @@ beamformer_shared_memory_data_pointer(BeamformerSharedMemory *sm, i64 shared_mem } function void -mark_parameter_block_region_dirty(BeamformerSharedMemory *sm, u32 block, BeamformerParameterBlockRegions region) +beamformed_shared_memory_dirty_flag(BeamformerSharedMemory *sm, u32 block, BeamformerParameterDirtyFlags flag) { BeamformerParameterBlock *pb = beamformer_parameter_block(sm, block); - atomic_or_u32(&pb->region_update_flags, 1u << region); + atomic_or_u32(&pb->region_update_flags, 1u << flag); } function void diff --git a/generated/beamformer.c b/generated/beamformer.c @@ -114,13 +114,6 @@ typedef enum { } BeamformerLiveFeedbackFlags; typedef enum { - BeamformerComputeArrayParametersField_FocalVectors = 0, - BeamformerComputeArrayParametersField_SparseElements = 1, - BeamformerComputeArrayParametersField_TransmitReceiveOrientations = 2, - BeamformerComputeArrayParametersField_Count, -} BeamformerComputeArrayParametersField; - -typedef enum { BeamformerLiveImagingDirtyFlags_ImagePlaneOffsets = 1 << 0, BeamformerLiveImagingDirtyFlags_TransmitPower = 1 << 1, BeamformerLiveImagingDirtyFlags_TGCControlPoints = 1 << 2, @@ -204,9 +197,11 @@ typedef struct { } BeamformerFilterBakeParameters; typedef struct { - u64 ArrayParameters; - u64 IncoherentFrame; + u64 FocalVectors; u64 Hadamard; + u64 IncoherentFrame; + u64 SparseElements; + u64 TransmitReceiveOrientations; u32 AcquisitionKind; b32 Sparse; i32 AcquisitionCount; @@ -460,12 +455,6 @@ typedef struct { u8 save_name_tag[128]; } BeamformerLiveImagingParameters; -typedef struct { - v2 focal_vectors[BeamformerMaxChannelCount]; - i16 sparse_elements[BeamformerMaxChannelCount]; - u8 transmit_receive_orientations[BeamformerMaxChannelCount]; -} BeamformerComputeArrayParameters; - typedef union { BeamformerDecodeBakeParameters Decode; BeamformerFilterBakeParameters Filter; @@ -474,18 +463,6 @@ typedef union { BeamformerReshapeBakeParameters Reshape; } BeamformerShaderBakeParameters; -read_only global u32 beamformer_compute_array_parameter_sizes[] = { - sizeof(v2) * BeamformerMaxChannelCount, - sizeof(i16) * BeamformerMaxChannelCount, - sizeof(u8) * BeamformerMaxChannelCount, -}; - -read_only global u32 beamformer_compute_array_parameter_offsets[] = { - offsetof(BeamformerComputeArrayParameters, focal_vectors), - offsetof(BeamformerComputeArrayParameters, sparse_elements), - offsetof(BeamformerComputeArrayParameters, transmit_receive_orientations), -}; - read_only global u8 beamformer_data_kind_element_size[] = { 2, 2, @@ -646,27 +623,29 @@ read_only global MetaStructMember *meta_struct_members_by_id[] = { {17, 0, 1, 0}, {17, 8, 1, 0}, {17, 16, 1, 0}, - {18, 24, 1, 0}, - {14, 28, 1, 0}, - {10, 32, 1, 0}, - {10, 36, 1, 0}, - {10, 40, 1, 0}, - {10, 44, 1, 0}, - {8, 48, 1, 0}, - {8, 52, 1, 0}, - {8, 56, 1, 0}, - {8, 60, 1, 0}, - {18, 64, 1, 0}, + {17, 24, 1, 0}, + {17, 32, 1, 0}, + {18, 40, 1, 0}, + {14, 44, 1, 0}, + {10, 48, 1, 0}, + {10, 52, 1, 0}, + {10, 56, 1, 0}, + {10, 60, 1, 0}, + {8, 64, 1, 0}, {8, 68, 1, 0}, - {14, 72, 1, 0}, - {18, 76, 1, 0}, - {14, 80, 1, 0}, + {8, 72, 1, 0}, + {8, 76, 1, 0}, + {18, 80, 1, 0}, {8, 84, 1, 0}, - {8, 88, 1, 0}, + {14, 88, 1, 0}, {18, 92, 1, 0}, - {18, 96, 1, 0}, - {18, 100, 1, 0}, - {18, 104, 1, 0}, + {14, 96, 1, 0}, + {8, 100, 1, 0}, + {8, 104, 1, 0}, + {18, 108, 1, 0}, + {18, 112, 1, 0}, + {18, 116, 1, 0}, + {18, 120, 1, 0}, }, (MetaStructMember []){ {17, 0, 1, 0}, @@ -716,9 +695,11 @@ read_only global str8 *meta_struct_member_names_by_id[] = { str8_comp("OutputTransmitStride"), }, (str8 []){ - str8_comp("ArrayParameters"), - str8_comp("IncoherentFrame"), + str8_comp("FocalVectors"), str8_comp("Hadamard"), + str8_comp("IncoherentFrame"), + str8_comp("SparseElements"), + str8_comp("TransmitReceiveOrientations"), str8_comp("AcquisitionKind"), str8_comp("Sparse"), str8_comp("AcquisitionCount"), @@ -762,7 +743,7 @@ read_only global str8 *meta_struct_member_names_by_id[] = { read_only global MetaStructInfo meta_struct_info_by_id[] = { {str8_comp("DecodeBakeParameters"), 11, 48, 0}, {str8_comp("FilterBakeParameters"), 13, 56, 0}, - {str8_comp("DASBakeParameters"), 24, 108, 0}, + {str8_comp("DASBakeParameters"), 26, 124, 0}, {str8_comp("CoherencyWeightingBakeParameters"), 3, 16, 0}, {str8_comp("ReshapeBakeParameters"), 9, 36, 0}, }; @@ -891,18 +872,6 @@ read_only global str8 beamformer_shader_global_header_strings[] = { "#define RCAOrientation_Columns 2\n" "\n"), str8_comp("" - "struct ComputeArrayParameters {\n" - " f32vec2 focal_vectors[MaxChannelCount];\n" - " int16_t sparse_elements[MaxChannelCount];\n" - " uint8_t transmit_receive_orientations[MaxChannelCount];\n" - "};\n" - "layout(std430, buffer_reference) buffer ComputeArrayParametersReference {\n" - " f32vec2 focal_vectors[MaxChannelCount];\n" - " int16_t sparse_elements[MaxChannelCount];\n" - " uint8_t transmit_receive_orientations[MaxChannelCount];\n" - "};\n" - "\n"), - str8_comp("" "#define CoherencyWeighting ((CompileFlags & (1 << 0)) != 0)\n" "\n"), str8_comp("" @@ -984,18 +953,18 @@ read_only global b8 beamformer_shader_primitive_is_vertex[] = { read_only global i32 *beamformer_shader_header_vectors[] = { (i32 []){0, 1, 2}, (i32 []){3, 4, 5, 6}, - (i32 []){7, 8, 9, 10, 3, 4, 11, 12, 13}, - (i32 []){14}, - (i32 []){15, 16}, + (i32 []){7, 8, 9, 10, 3, 4, 11, 12}, + (i32 []){13}, + (i32 []){14, 15}, 0, + (i32 []){16}, (i32 []){17}, - (i32 []){18}, }; read_only global i32 beamformer_shader_header_vector_lengths[] = { 3, 4, - 9, + 8, 1, 2, 0, diff --git a/lib/ogl_beamformer_lib.c b/lib/ogl_beamformer_lib.c @@ -347,15 +347,14 @@ beamformer_maximum_frames_for_simple_parameters(BeamformerSimpleParameters *bp) } function b32 -parameter_block_region_upload(void *data, u32 size, u32 block, BeamformerParameterBlockRegions region_id, - u32 block_offset, i32 timeout_ms) +parameter_block_region_upload(void *data, u32 size, u32 block, u32 block_offset, i32 timeout_ms) { i32 lock = BeamformerSharedMemoryLockKind_Count + (i32)block; b32 result = valid_parameter_block(block) && lib_try_lock(lock, timeout_ms); if (result) { memory_copy((u8 *)beamformer_parameter_block(g_beamformer_library_context.bp, block) + block_offset, data, size); - mark_parameter_block_region_dirty(g_beamformer_library_context.bp, block, region_id); + beamformed_shared_memory_dirty_flag(g_beamformer_library_context.bp, block, BeamformerParameterDirtyFlag_Parameters); lib_release_lock(lock); } return result; @@ -368,8 +367,7 @@ beamformer_set_pipeline_stage_parameters_at(u32 stage_index, i32 parameter, u32 offset += offsetof(BeamformerComputePipeline, parameters); offset += (stage_index % BeamformerMaxComputeShaderStages) * sizeof(BeamformerShaderParameters); b32 result = parameter_block_region_upload(&parameter, sizeof(BeamformerShaderParameters), block, - BeamformerParameterBlockRegion_ComputePipeline, offset, - g_beamformer_library_context.timeout_ms); + offset, g_beamformer_library_context.timeout_ms); return result; } @@ -389,8 +387,7 @@ beamformer_push_pipeline_at(i32 *shaders, u32 shader_count, BeamformerDataKind d if (valid_parameter_block(block) && lib_try_lock(lock, g_beamformer_library_context.timeout_ms)) { BeamformerParameterBlock *b = beamformer_parameter_block(g_beamformer_library_context.bp, block); memory_copy(&b->pipeline.shaders, shaders, shader_count * sizeof(*shaders)); - mark_parameter_block_region_dirty(g_beamformer_library_context.bp, block, - BeamformerParameterBlockRegion_ComputePipeline); + beamformed_shared_memory_dirty_flag(g_beamformer_library_context.bp, block, BeamformerParameterDirtyFlag_Parameters); b->pipeline.shader_count = shader_count; b->pipeline.data_kind = data_kind; lib_release_lock(lock); @@ -446,7 +443,6 @@ b32 beamformer_push_##name ##_at(dtype *data, u32 count, u32 block) { \ b32 result = 0; \ if (lib_error_check(count <= countof(((BeamformerParameterBlock *)0)->name), BufferOverflow)) { \ result = parameter_block_region_upload(data, count * elements * sizeof(dtype), block, \ - BeamformerParameterBlockRegion_##region_name, \ offsetof(BeamformerParameterBlock, name), \ g_beamformer_library_context.timeout_ms); \ } \ @@ -599,12 +595,11 @@ beamformer_push_parameters_at(BeamformerParameters *bp, u32 block) b32 result = check_shared_memory() && validate_parameters(bp); if (result) { result = parameter_block_region_upload(bp, sizeof(*bp), block, - BeamformerParameterBlockRegion_Parameters, offsetof(BeamformerParameterBlock, parameters), g_beamformer_library_context.timeout_ms); if (result) { - BeamformerParameterBlock *pb = beamformer_parameter_block(g_beamformer_library_context.bp, block); - atomic_or_u32(&pb->region_update_flags, 1u << BeamformerParameterRegionFlag_NotifyUI); + beamformed_shared_memory_dirty_flag(g_beamformer_library_context.bp, block, + BeamformerParameterDirtyFlag_NotifyUI); } } return result; diff --git a/shaders/das.glsl b/shaders/das.glsl @@ -43,7 +43,11 @@ layout(std430, buffer_reference) buffer IncoherentOutput { f32 x[]; }; -layout(std430, buffer_reference) buffer F16 { f16 x[]; }; +layout(std430, buffer_reference) buffer F16 { f16 x[]; }; +layout(std430, buffer_reference) buffer F32 { f32 x[]; }; +layout(std430, buffer_reference) buffer S16 { s16 x[]; }; +layout(std430, buffer_reference) buffer U8 { u8 x[]; }; +layout(std430, buffer_reference) buffer V2 { vec2 x[]; }; #define RX_ORIENTATION(tx_rx) bitfieldExtract((tx_rx), 0, 4) #define TX_ORIENTATION(tx_rx) bitfieldExtract((tx_rx), 4, 4) @@ -172,15 +176,13 @@ float cylindrical_wave_transmit_distance(const vec3 point, const float focal_dep u8 tx_rx_orientation_for_acquisition(const s32 acquisition) { u8 result = u8(TransmitReceiveOrientation); - ComputeArrayParametersReference dp = ComputeArrayParametersReference(ArrayParameters); - if (!SingleOrientation) result = dp.transmit_receive_orientations[acquisition]; + if (!SingleOrientation) result = U8(TransmitReceiveOrientations).x[acquisition]; return result; } f32vec2 focal_vector_for_acquisition(const s32 acquisition) { - ComputeArrayParametersReference dp = ComputeArrayParametersReference(ArrayParameters); - f32vec2 result = SingleFocus ? f32vec2(TransmitAngle, FocusDepth) : dp.focal_vectors[acquisition]; + f32vec2 result = SingleFocus ? f32vec2(TransmitAngle, FocusDepth) : V2(FocalVectors).x[acquisition]; return result; } @@ -232,8 +234,6 @@ RESULT_TYPE RCA(const vec3 world_point) RESULT_TYPE HERCULES(const vec3 world_point) { - ComputeArrayParametersReference dp = ComputeArrayParametersReference(ArrayParameters); - const u8 tx_rx_orientation = tx_rx_orientation_for_acquisition(0); const bool rx_cols = RX_ORIENTATION(tx_rx_orientation) == RCAOrientation_Columns; const vec2 focal_vector = focal_vector_for_acquisition(0); @@ -260,7 +260,7 @@ RESULT_TYPE HERCULES(const vec3 world_point) else element_receive_delta_squared.y *= element_receive_delta_squared.y; for (f32 transmit = f32(Sparse); transmit < f32(AcquisitionCount); transmit += 1.f) { - f32 tx_channel = Sparse ? f32(dp.sparse_elements[s32(transmit) - s32(Sparse)]) : transmit; + f32 tx_channel = Sparse ? f32(S16(SparseElements).x[s32(transmit) - s32(Sparse)]) : transmit; if (rx_cols) element_receive_delta_squared.y = xy_world_point.y - tx_channel * xdc_element_pitch.y; else element_receive_delta_squared.x = xy_world_point.x - tx_channel * xdc_element_pitch.x; @@ -289,8 +289,6 @@ RESULT_TYPE FORCES(const vec3 xdc_world_point) { RESULT_TYPE result = RESULT_TYPE(0); - ComputeArrayParametersReference dp = ComputeArrayParametersReference(ArrayParameters); - float z_delta_squared = xdc_world_point.z * xdc_world_point.z; float transmit_y_delta = xdc_world_point.y - xdc_element_pitch.y * ChannelCount / 2; float transmit_yz_squared = transmit_y_delta * transmit_y_delta + z_delta_squared; @@ -307,7 +305,7 @@ RESULT_TYPE FORCES(const vec3 xdc_world_point) f32 receive_index = sample_index(sqrt(receive_x_delta * receive_x_delta + z_delta_squared)); f32 apodization = apodize(a_arg); for (f32 transmit = f32(Sparse); transmit < f32(AcquisitionCount); transmit += 1.f) { - f32 tx_channel = Sparse ? f32(dp.sparse_elements[s32(transmit) - s32(Sparse)]) : transmit; + f32 tx_channel = Sparse ? f32(S16(SparseElements).x[s32(transmit) - s32(Sparse)]) : transmit; f32 transmit_x_delta = xdc_world_point.x - xdc_element_pitch.x * tx_channel; f32 transmit_index = sqrt(transmit_yz_squared + transmit_x_delta * transmit_x_delta) * SamplingFrequency / SpeedOfSound; diff --git a/ui.c b/ui.c @@ -2310,8 +2310,8 @@ ui_rebuild_das_transform(u32 parameter_block, i32 dimension, v3 min, v3 max) } if (result) { - mark_parameter_block_region_dirty(beamformer_context->shared_memory, parameter_block, - BeamformerParameterBlockRegion_Parameters); + beamformed_shared_memory_dirty_flag(beamformer_context->shared_memory, parameter_block, + BeamformerParameterDirtyFlag_Parameters); } return result; @@ -5290,8 +5290,8 @@ beamformer_ui_frame(void) memory_copy(cp->ui_voxel_transform.E, identity.E, sizeof(identity)); if (recompute) { - mark_parameter_block_region_dirty(beamformer_context->shared_memory, selected_block, - BeamformerParameterBlockRegion_Parameters); + beamformed_shared_memory_dirty_flag(beamformer_context->shared_memory, selected_block, + BeamformerParameterDirtyFlag_Parameters); beamformer_queue_compute(beamformer_context, beamformer_frame_from_index(beamformer_registers()->frame), selected_block); @@ -5317,8 +5317,8 @@ beamformer_ui_frame(void) if (pb) { ui->flush_parameters = 0; memory_copy(&pb->parameters_ui, &ui->parameters, sizeof(ui->parameters)); - mark_parameter_block_region_dirty(beamformer_context->shared_memory, selected_block, - BeamformerParameterBlockRegion_Parameters); + beamformed_shared_memory_dirty_flag(beamformer_context->shared_memory, selected_block, + BeamformerParameterDirtyFlag_Parameters); beamformer_parameter_block_unlock(beamformer_context->shared_memory, selected_block); beamformer_queue_compute(beamformer_context, beamformer_frame_from_index(beamformer_registers()->frame),