ogl_beamforming

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

beamformer.h (6644B)


      1 /* See LICENSE for license details. */
      2 #ifndef _BEAMFORMER_H_
      3 #define _BEAMFORMER_H_
      4 
      5 #include <glad.h>
      6 
      7 #define GRAPHICS_API_OPENGL_43
      8 #include <raylib_extended.h>
      9 #include <rlgl.h>
     10 
     11 #include "util.h"
     12 #include "util_gl.c"
     13 
     14 enum gl_vendor_ids {
     15 	GL_VENDOR_AMD,
     16 	GL_VENDOR_ARM,
     17 	GL_VENDOR_INTEL,
     18 	GL_VENDOR_NVIDIA,
     19 };
     20 
     21 typedef struct {
     22 	v2   mouse;
     23 	v2   last_mouse;
     24 	b32  executable_reloaded;
     25 } BeamformerInput;
     26 
     27 #define CUDA_INIT_FN(name) void name(u32 *input_dims, u32 *decoded_dims)
     28 typedef CUDA_INIT_FN(cuda_init_fn);
     29 CUDA_INIT_FN(cuda_init_stub) {}
     30 
     31 #define CUDA_REGISTER_BUFFERS_FN(name) void name(u32 *rf_data_ssbos, u32 rf_buffer_count, u32 raw_data_ssbo)
     32 typedef CUDA_REGISTER_BUFFERS_FN(cuda_register_buffers_fn);
     33 CUDA_REGISTER_BUFFERS_FN(cuda_register_buffers_stub) {}
     34 
     35 #define CUDA_DECODE_FN(name) void name(size_t input_offset, u32 output_buffer_idx, u32 rf_channel_offset)
     36 typedef CUDA_DECODE_FN(cuda_decode_fn);
     37 CUDA_DECODE_FN(cuda_decode_stub) {}
     38 
     39 #define CUDA_HILBERT_FN(name) void name(u32 input_buffer_idx, u32 output_buffer_idx)
     40 typedef CUDA_HILBERT_FN(cuda_hilbert_fn);
     41 CUDA_HILBERT_FN(cuda_hilbert_stub) {}
     42 
     43 #define CUDA_SET_CHANNEL_MAPPING_FN(name) void name(i16 *channel_mapping)
     44 typedef CUDA_SET_CHANNEL_MAPPING_FN(cuda_set_channel_mapping_fn);
     45 CUDA_SET_CHANNEL_MAPPING_FN(cuda_set_channel_mapping_stub) {}
     46 
     47 #define CUDA_LIB_FNS \
     48 	X(decode,              "cuda_decode")              \
     49 	X(hilbert,             "cuda_hilbert")             \
     50 	X(init,                "init_cuda_configuration")  \
     51 	X(register_buffers,    "register_cuda_buffers")    \
     52 	X(set_channel_mapping, "cuda_set_channel_mapping")
     53 
     54 typedef struct {
     55 	void *lib;
     56 	#define X(name, symname) cuda_ ## name ## _fn *name;
     57 	CUDA_LIB_FNS
     58 	#undef X
     59 } CudaLib;
     60 
     61 #define FRAME_VIEW_RENDER_DYNAMIC_RANGE_LOC 1
     62 #define FRAME_VIEW_RENDER_THRESHOLD_LOC     2
     63 #define FRAME_VIEW_RENDER_GAMMA_LOC         3
     64 #define FRAME_VIEW_RENDER_LOG_SCALE_LOC     4
     65 
     66 typedef struct {
     67 	u32 shader;
     68 	u32 framebuffer;
     69 	u32 vao;
     70 	u32 vbo;
     71 	b32 updated;
     72 } FrameViewRenderContext;
     73 
     74 #include "beamformer_parameters.h"
     75 #include "beamformer_work_queue.h"
     76 
     77 #define CS_MIN_MAX_MIPS_LEVEL_UNIFORM_LOC 1
     78 #define CS_SUM_PRESCALE_UNIFORM_LOC       1
     79 
     80 typedef struct {
     81 	u32 programs[ComputeShaderKind_Count];
     82 
     83 	/* NOTE: Decoded data is only relevant in the context of a single frame. We use two
     84 	 * buffers so that they can be swapped when chaining multiple compute stages */
     85 	u32 rf_data_ssbos[2];
     86 	u32 last_output_ssbo_index;
     87 
     88 	u32 raw_data_ssbo;
     89 	u32 shared_ubo;
     90 
     91 	u32 channel_mapping_texture;
     92 	u32 sparse_elements_texture;
     93 	u32 focal_vectors_texture;
     94 	u32 hadamard_texture;
     95 
     96 	f32 processing_progress;
     97 	b32 processing_compute;
     98 
     99 	uv4 dec_data_dim;
    100 	u32 rf_raw_size;
    101 } ComputeShaderCtx;
    102 
    103 typedef enum {
    104 	#define X(type, id, pretty, fixed_tx) DASShaderKind_##type = id,
    105 	DAS_TYPES
    106 	#undef X
    107 	DASShaderKind_Count
    108 } DASShaderKind;
    109 
    110 typedef enum {
    111 	#define X(e, n, s, h, pn) ShaderKind_##e = n,
    112 	COMPUTE_SHADERS
    113 	#undef X
    114 	ShaderKind_Render2D,
    115 	ShaderKind_Count
    116 } ShaderKind;
    117 
    118 typedef struct {
    119 	/* TODO(rnp): there is assumption here that each shader will occur only once
    120 	 * per compute. add an insertion index and change these to hold the max number
    121 	 * of executed compute stages */
    122 	u32 timer_ids[ComputeShaderKind_Count];
    123 	f32 times[ComputeShaderKind_Count];
    124 	b32 timer_active[ComputeShaderKind_Count];
    125 } ComputeShaderStats;
    126 
    127 typedef struct BeamformFrame {
    128 	uv3 dim;
    129 	u32 texture;
    130 
    131 	/* NOTE: for use when displaying either prebeamformed frames or on the current frame
    132 	 * when we intend to recompute on the next frame */
    133 	v4  min_coordinate;
    134 	v4  max_coordinate;
    135 
    136 	u32 mips;
    137 	DASShaderKind das_shader_kind;
    138 	u32 compound_count;
    139 	u32 id;
    140 
    141 	struct BeamformFrame *next;
    142 } BeamformFrame;
    143 
    144 struct BeamformComputeFrame {
    145 	BeamformFrame      frame;
    146 	ComputeShaderStats stats;
    147 	ImagePlaneTag image_plane_tag;
    148 	b32 in_flight;
    149 	b32 ready_to_present;
    150 };
    151 
    152 #define GL_PARAMETERS \
    153 	X(MAJOR_VERSION,                   version_major,                   "")      \
    154 	X(MINOR_VERSION,                   version_minor,                   "")      \
    155 	X(TEXTURE_BUFFER_OFFSET_ALIGNMENT, texture_buffer_offset_alignment, "")      \
    156 	X(MAX_TEXTURE_BUFFER_SIZE,         max_texture_buffer_size,         "")      \
    157 	X(MAX_TEXTURE_SIZE,                max_2d_texture_dim,              "")      \
    158 	X(MAX_3D_TEXTURE_SIZE,             max_3d_texture_dim,              "")      \
    159 	X(MAX_SHADER_STORAGE_BLOCK_SIZE,   max_ssbo_size,                   "")      \
    160 	X(MAX_UNIFORM_BLOCK_SIZE,          max_ubo_size,                    "")      \
    161 	X(MAX_SERVER_WAIT_TIMEOUT,         max_server_wait_time,            " [ns]")
    162 
    163 typedef struct {
    164 	enum gl_vendor_ids vendor_id;
    165 	#define X(glname, name, suffix) i32 name;
    166 	GL_PARAMETERS
    167 	#undef X
    168 } GLParams;
    169 
    170 typedef struct {
    171 	GLParams gl;
    172 
    173 	uv2 window_size;
    174 	b32 start_compute;
    175 	b32 should_exit;
    176 
    177 	Arena  ui_backing_store;
    178 	void  *ui;
    179 	/* TODO(rnp): this is nasty and should be removed */
    180 	b32    ui_read_params;
    181 
    182 	BeamformComputeFrame beamform_frames[MAX_BEAMFORMED_SAVED_FRAMES];
    183 	u32 next_render_frame_index;
    184 	u32 display_frame_index;
    185 
    186 	/* NOTE: this will only be used when we are averaging */
    187 	u32                  averaged_frame_index;
    188 	BeamformComputeFrame averaged_frames[2];
    189 
    190 	ComputeShaderCtx  csctx;
    191 
    192 	/* TODO(rnp): ideally this would go in the UI but its hard to manage with the UI
    193 	 * destroying itself on hot-reload */
    194 	FrameViewRenderContext frame_view_render_context;
    195 
    196 	Arena export_buffer;
    197 
    198 	CudaLib cuda_lib;
    199 	OS      os;
    200 	Stream  error_stream;
    201 
    202 	BeamformWorkQueue *beamform_work_queue;
    203 
    204 	BeamformerSharedMemory *shared_memory;
    205 } BeamformerCtx;
    206 
    207 struct ShaderReloadContext {
    208 	BeamformerCtx *beamformer_context;
    209 	s8   path;
    210 	s8   name;
    211 	s8   header;
    212 	u32 *shader;
    213 	ShaderReloadContext *link;
    214 	GLenum     gl_type;
    215 	ShaderKind kind;
    216 };
    217 
    218 #define BEAMFORMER_FRAME_STEP_FN(name) void name(BeamformerCtx *ctx, Arena *arena, \
    219                                                  BeamformerInput *input)
    220 typedef BEAMFORMER_FRAME_STEP_FN(beamformer_frame_step_fn);
    221 
    222 #define BEAMFORMER_COMPUTE_SETUP_FN(name) void name(iptr user_context, Arena arena, iptr gl_context)
    223 typedef BEAMFORMER_COMPUTE_SETUP_FN(beamformer_compute_setup_fn);
    224 
    225 #define BEAMFORMER_COMPLETE_COMPUTE_FN(name) void name(iptr user_context, Arena arena, iptr gl_context)
    226 typedef BEAMFORMER_COMPLETE_COMPUTE_FN(beamformer_complete_compute_fn);
    227 
    228 #define BEAMFORMER_RELOAD_SHADER_FN(name) b32 name(BeamformerCtx *ctx, ShaderReloadContext *src, \
    229                                                    Arena arena, s8 shader_name)
    230 typedef BEAMFORMER_RELOAD_SHADER_FN(beamformer_reload_shader_fn);
    231 
    232 #endif /*_BEAMFORMER_H_ */