ogl_beamforming

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

Commit: 1e6f3560354cd9702fe4f6984cff6e0d887bf122
Parent: b6bd87b30496428a650e027307ee11d0d7e6e332
Author: Randy Palamar
Date:   Sat, 26 Jul 2025 15:05:44 -0600

core: remove double sized raw data ssbo

the decode first pass can just output to the input rf_data_ssbo

Diffstat:
Mbeamformer.c | 25+++++++++----------------
1 file changed, 9 insertions(+), 16 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -168,7 +168,7 @@ alloc_shader_storage(BeamformerCtx *ctx, u32 rf_raw_size, Arena a) u32 storage_flags = GL_DYNAMIC_STORAGE_BIT; glDeleteBuffers(1, &cs->raw_data_ssbo); glCreateBuffers(1, &cs->raw_data_ssbo); - glNamedBufferStorage(cs->raw_data_ssbo, 2 * rf_raw_size, 0, storage_flags); + glNamedBufferStorage(cs->raw_data_ssbo, rf_raw_size, 0, storage_flags); LABEL_GL_OBJECT(GL_BUFFER, cs->raw_data_ssbo, s8("Raw_RF_SSBO")); uz rf_decoded_size = 2 * sizeof(f32) * cs->dec_data_dim.x * cs->dec_data_dim.y * cs->dec_data_dim.z; @@ -530,25 +530,21 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformerComputeFrame *frame case BeamformerShaderKind_DecodeFloatComplex: case BeamformerShaderKind_DecodeInt16ToFloat: { - glBindBufferBase(GL_UNIFORM_BUFFER, 0, cp->ubos[BeamformerComputeUBOKind_Decode]); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, csctx->rf_data_ssbos[output_ssbo_idx]); + glBindBufferBase(GL_UNIFORM_BUFFER, 0, cp->ubos[BeamformerComputeUBOKind_Decode]); glBindImageTexture(0, csctx->hadamard_texture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8I); - iz raw_size = csctx->rf_raw_size; if (shader == cp->shaders[0]) { + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, csctx->raw_data_ssbo); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, csctx->rf_data_ssbos[input_ssbo_idx]); glBindImageTexture(1, csctx->channel_mapping_texture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R16I); glProgramUniform1ui(program, DECODE_FIRST_PASS_UNIFORM_LOC, 1); - glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 1, csctx->raw_data_ssbo, 0, raw_size); - glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 2, csctx->raw_data_ssbo, raw_size, raw_size); + glDispatchCompute(cp->decode_dispatch.x, cp->decode_dispatch.y, cp->decode_dispatch.z); glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); } - if (shader == cp->shaders[0]) { - glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 1, csctx->raw_data_ssbo, raw_size, raw_size); - } else { - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, csctx->rf_data_ssbos[input_ssbo_idx]); - } + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, csctx->rf_data_ssbos[input_ssbo_idx]); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, csctx->rf_data_ssbos[output_ssbo_idx]); glProgramUniform1ui(program, DECODE_FIRST_PASS_UNIFORM_LOC, 0); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, csctx->rf_data_ssbos[output_ssbo_idx]); @@ -570,13 +566,10 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformerComputeFrame *frame case BeamformerShaderKind_DemodulateFloat: { BeamformerDemodulateUBO *ubo = &cp->demod_ubo_data; + u32 input = ubo->map_channels ? csctx->raw_data_ssbo : csctx->rf_data_ssbos[input_ssbo_idx]; glBindBufferBase(GL_UNIFORM_BUFFER, 0, cp->ubos[BeamformerComputeUBOKind_Demodulate]); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, input); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, csctx->rf_data_ssbos[output_ssbo_idx]); - if (shader == cp->shaders[0]) { - glBindBufferRange(GL_SHADER_STORAGE_BUFFER, 1, csctx->raw_data_ssbo, 0, csctx->rf_raw_size); - } else { - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, csctx->rf_data_ssbos[input_ssbo_idx]); - } glBindImageTexture(0, csctx->filters[sp->filter_slot].texture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R32F); if (ubo->map_channels)