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:
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(¶meter, 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),