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_ */