Commit: e0bd75572cdba7626c8dcf6d2fb87f8aa77660f7
Parent: ad11111303575137d78ca4118bb1601bcc11b69d
Author: Randy Palamar
Date: Tue, 3 Mar 2026 10:13:45 -0700
decode/filter: use f16 as intermediate exchange type
This gives ~20% speed up for the decoding.
Diffstat:
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/beamformer_core.c b/beamformer_core.c
@@ -365,7 +365,7 @@ plan_compute_pipeline(BeamformerComputePlan *cp, BeamformerParameterBlock *pb)
db->data_kind = data_kind;
if (!first) {
if (data_kind == BeamformerDataKind_Int16) {
- db->data_kind = BeamformerDataKind_Int16Complex;
+ db->data_kind = BeamformerDataKind_Float16Complex;
} else {
db->data_kind = BeamformerDataKind_Float32Complex;
}
diff --git a/shaders/decode.glsl b/shaders/decode.glsl
@@ -14,6 +14,12 @@
#elif DataKind == DataKind_Float32Complex
#define INPUT_DATA_TYPE vec2
#define SAMPLE_DATA_TYPE vec2
+#elif DataKind == DataKind_Float16Complex
+ #define INPUT_DATA_TYPE f16vec2
+ #define SAMPLE_DATA_TYPE vec2
+#elif DataKind == DataKind_Float16
+ #define INPUT_DATA_TYPE float16_t
+ #define SAMPLE_DATA_TYPE float
#elif DataKind == DataKind_Int16Complex
#define INPUT_DATA_TYPE i16vec2
#define SAMPLE_DATA_TYPE vec2
diff --git a/shaders/filter.glsl b/shaders/filter.glsl
@@ -1,18 +1,19 @@
/* See LICENSE for license details. */
/* TODO(rnp): bug: this won't filter RF data correctly */
-#define SAMPLE_TYPE vec2
+#define SAMPLE_TYPE f32vec2
#if DataKind == DataKind_Float32
- #define DATA_TYPE vec2
+ #define DATA_TYPE f32vec2
#define RESULT_TYPE_CAST(v) (v)
#define SAMPLE_TYPE_CAST(v) (v)
#else
- #define DATA_TYPE uint
- #define SAMPLE_TYPE_CAST(v) unpackSnorm2x16(v)
+ #define DATA_TYPE i16vec2
+ #define SAMPLE_TYPE_CAST(v) (v)
#if OutputFloats
- #define OUT_DATA_TYPE vec2
+ #define OUT_DATA_TYPE f32vec2
#define RESULT_TYPE_CAST(v) (clamp((v), -1.0, 1.0) * 32767.0f)
#else
- #define RESULT_TYPE_CAST(v) packSnorm2x16(v)
+ #define OUT_DATA_TYPE f16vec2
+ #define RESULT_TYPE_CAST(v) f16vec2(v)
#endif
#endif