ogl_beamforming

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

Commit: fcd5c18b7cd0ab6b11a4d25f6e57900b6ce91056
Parent: 9211e9927eca59ed51530b9603f68a40970540b8
Author: Randy Palamar
Date:   Fri, 24 Jan 2025 10:45:16 -0700

core: store hadamard as i8 texture data

This quarters the amount of memory needed for the hadamard matrix
(which ideally would be single bit of data).

This also allows us to easily do visual comparisons of the
hadamard we are using with one generated externally.

Diffstat:
Mbeamformer.c | 13+++++++------
Mbeamformer.h | 3+--
Mshaders/hadamard.glsl | 6++----
3 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/beamformer.c b/beamformer.c @@ -163,15 +163,16 @@ alloc_shader_storage(BeamformerCtx *ctx, Arena a) } /* NOTE: store hadamard in GPU once; it won't change for a particular imaging session */ - cs->hadamard_dim = (uv2){.x = dec_data_dim.z, .y = dec_data_dim.z}; size hadamard_elements = dec_data_dim.z * dec_data_dim.z; i32 *hadamard = alloc(&a, i32, hadamard_elements); i32 *tmp = alloc(&a, i32, hadamard_elements); fill_hadamard_transpose(hadamard, tmp, dec_data_dim.z); - glDeleteBuffers(1, &cs->hadamard_ssbo); - glCreateBuffers(1, &cs->hadamard_ssbo); - glNamedBufferStorage(cs->hadamard_ssbo, hadamard_elements * sizeof(i32), hadamard, 0); - LABEL_GL_OBJECT(GL_BUFFER, cs->hadamard_ssbo, s8("Hadamard_SSBO")); + glDeleteTextures(1, &cs->hadamard_texture); + glCreateTextures(GL_TEXTURE_2D, 1, &cs->hadamard_texture); + glTextureStorage2D(cs->hadamard_texture, 1, GL_R8I, dec_data_dim.z, dec_data_dim.z); + glTextureSubImage2D(cs->hadamard_texture, 0, 0, 0, dec_data_dim.z, dec_data_dim.z, + GL_RED_INTEGER, GL_INT, hadamard); + LABEL_GL_OBJECT(GL_TEXTURE, cs->hadamard_texture, s8("Hadamard_Matrix")); } static BeamformWork * @@ -387,7 +388,7 @@ do_compute_shader(BeamformerCtx *ctx, Arena arena, BeamformFrame *frame, u32 raw raw_data_index * rf_raw_size, rf_raw_size); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, csctx->rf_data_ssbos[output_ssbo_idx]); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, csctx->hadamard_ssbo); + glBindImageTexture(0, csctx->hadamard_texture, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R8I); glDispatchCompute(ORONE(csctx->dec_data_dim.x / 32), ORONE(csctx->dec_data_dim.y / 32), ORONE(csctx->dec_data_dim.z)); diff --git a/beamformer.h b/beamformer.h @@ -197,8 +197,7 @@ typedef struct { * buffers so that they can be swapped when chaining multiple compute stages */ u32 rf_data_ssbos[2]; u32 last_output_ssbo_index; - u32 hadamard_ssbo; - uv2 hadamard_dim; + u32 hadamard_texture; u32 shared_ubo; diff --git a/shaders/hadamard.glsl b/shaders/hadamard.glsl @@ -9,9 +9,7 @@ layout(std430, binding = 2) writeonly restrict buffer buffer_2 { vec2 out_data[]; }; -layout(std430, binding = 3) readonly restrict buffer buffer_3 { - int hadamard[]; -}; +layout(r8i, binding = 0) readonly restrict uniform iimage2D hadamard; void main() { @@ -57,7 +55,7 @@ void main() for (int i = 0; i < dec_data_dim.z; i++) { int data = (rf_data[ridx] << lfs) >> 16; - sum += hadamard[hoff + i] * data; + sum += imageLoad(hadamard, ivec2(acq, i)).x * data; ridx += ridx_delta; } } else {