ogl_beamforming

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

Commit: 7c6b544005834ba5634a53a51a99f406e5dc93f4
Parent: cf740eba2567db46fc8585db1cc159d79ab810d7
Author: Randy Palamar
Date:   Thu, 10 Sep 2026 20:22:14 -0700

shaders: re-add readonly qualifier to a few buffer reference types

The shader compiler will not generate scalar load instructions if
the pointer is not marked as readonly. This is a little strange
and I would need to see the logic in the compiler to understand
why (readonly applies only to use in this shader instance so the
compiler should be able to see that it is impossible that the
shader writes to it, but maybe it needs either restrict or
readonly to make that assumption.)

This can give a minor performance boost to VLS/TPW which do
multiple scalar loads from the orientations and focal vectors
arrays. There is some nuance to this though, loading a mat4 this
way seems strictly worse even when it is uniform.

Diffstat:
Mshaders/das.glsl | 30++++++++++++++----------------
Mshaders/decode.glsl | 2+-
2 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/shaders/das.glsl b/shaders/das.glsl @@ -37,22 +37,20 @@ #define HeapBase u64(0) #endif -layout(std430, buffer_reference) buffer Input { InputDataType x[]; }; -layout(std430, buffer_reference) buffer Output { OutputDataType x[]; }; - -layout(std430, buffer_reference) buffer IncoherentOutput { - f32 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 U32V4 { u32vec4 x[]; }; -layout(std430, buffer_reference) buffer F32V2 { f32vec2 x[]; }; -layout(std430, buffer_reference) buffer F32V4 { f32vec4 x[]; }; -layout(std430, buffer_reference) buffer F16V2 { f16vec2 x[]; }; -layout(std430, buffer_reference) buffer F16V4 { f16vec4 x[]; }; +layout(std430, buffer_reference) readonly buffer Input { InputDataType x[]; }; +layout(std430, buffer_reference) buffer Output { OutputDataType x[]; }; + +layout(std430, buffer_reference) buffer IncoherentOutput { f32 x[]; }; + +layout(std430, buffer_reference) readonly buffer F16 { f16 x[]; }; +layout(std430, buffer_reference) readonly buffer F32 { f32 x[]; }; +layout(std430, buffer_reference) readonly buffer S16 { s16 x[]; }; +layout(std430, buffer_reference) readonly buffer U8 { u8 x[]; }; +layout(std430, buffer_reference) readonly buffer U32V4 { u32vec4 x[]; }; +layout(std430, buffer_reference) readonly buffer F32V2 { f32vec2 x[]; }; +layout(std430, buffer_reference) readonly buffer F32V4 { f32vec4 x[]; }; +layout(std430, buffer_reference) readonly buffer F16V2 { f16vec2 x[]; }; +layout(std430, buffer_reference) readonly buffer F16V4 { f16vec4 x[]; }; #define RX_ORIENTATION(tx_rx) bitfieldExtract((tx_rx), 0, 4) #define TX_ORIENTATION(tx_rx) bitfieldExtract((tx_rx), 4, 4) diff --git a/shaders/decode.glsl b/shaders/decode.glsl @@ -13,7 +13,7 @@ layout(std430, buffer_reference, buffer_reference_align = 64) restrict writeonly OutputDataType x[]; }; -layout(std430, buffer_reference) buffer F16 { f16 x[]; }; +layout(std430, buffer_reference, buffer_reference_align = 16) readonly buffer F16 { f16 x[]; }; OutputDataType sample_rf_data(u32 index) {