ogl_beamforming

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

beamformer_work_queue.h (2968B)


      1 /* See LICENSE for license details. */
      2 #ifndef _BEAMFORMER_WORK_QUEUE_H_
      3 #define _BEAMFORMER_WORK_QUEUE_H_
      4 
      5 typedef struct BeamformComputeFrame BeamformComputeFrame;
      6 typedef struct ComputeShaderReloadContext ComputeShaderReloadContext;
      7 
      8 typedef enum {
      9 	BW_COMPUTE,
     10 	BW_RELOAD_SHADER,
     11 	BW_SAVE_FRAME,
     12 	BW_SEND_FRAME,
     13 	BW_UPLOAD_BUFFER,
     14 } BeamformWorkType;
     15 
     16 typedef enum {
     17 	BU_KIND_CHANNEL_MAPPING,
     18 	BU_KIND_FOCAL_VECTORS,
     19 	BU_KIND_PARAMETERS,
     20 	BU_KIND_RF_DATA,
     21 	BU_KIND_SPARSE_ELEMENTS,
     22 	BU_KIND_LAST,
     23 } BeamformerUploadKind;
     24 
     25 typedef struct {
     26 	i32 size;
     27 	i32 shared_memory_offset;
     28 	BeamformerUploadKind kind;
     29 } BeamformerUploadContext;
     30 
     31 typedef struct {
     32 	BeamformComputeFrame *frame;
     33 	iptr                  file_handle;
     34 } BeamformOutputFrameContext;
     35 
     36 /* NOTE: discriminated union based on type */
     37 typedef struct {
     38 	union {
     39 		BeamformComputeFrame       *frame;
     40 		BeamformerUploadContext     upload_context;
     41 		BeamformOutputFrameContext  output_frame_ctx;
     42 		ComputeShaderReloadContext *reload_shader_ctx;
     43 		void                       *generic;
     44 	};
     45 	/* NOTE(rnp): mostly for __external__ processes to sync on. when passed from external
     46 	 * process this should be an offset from base of shared_memory */
     47 	iptr completion_barrier;
     48 
     49 	BeamformWorkType type;
     50 } BeamformWork;
     51 
     52 typedef struct {
     53 	union {
     54 		u64 queue;
     55 		struct {u32 widx, ridx;};
     56 	};
     57 	BeamformWork work_items[1 << 6];
     58 } BeamformWorkQueue;
     59 
     60 #define BEAMFORM_WORK_QUEUE_PUSH_FN(name) BeamformWork *name(BeamformWorkQueue *q)
     61 typedef BEAMFORM_WORK_QUEUE_PUSH_FN(beamform_work_queue_push_fn);
     62 
     63 #define BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(name) void name(BeamformWorkQueue *q)
     64 typedef BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(beamform_work_queue_push_commit_fn);
     65 
     66 #define BEAMFORMER_SHARED_MEMORY_SIZE (GB(2))
     67 #define BEAMFORMER_RF_DATA_OFF        (sizeof(BeamformerSharedMemory) + 4096ULL \
     68                                        - (uintptr_t)(sizeof(BeamformerSharedMemory) & 4095ULL))
     69 #define BEAMFORMER_MAX_RF_DATA_SIZE   (BEAMFORMER_SHARED_MEMORY_SIZE - BEAMFORMER_RF_DATA_OFF)
     70 
     71 typedef struct {
     72 	/* NOTE(rnp): interleaved transmit angle, focal depth pairs */
     73 	_Alignas(64) v2 focal_vectors[256];
     74 
     75 	i16 channel_mapping[256];
     76 	i16 sparse_elements[256];
     77 
     78 	union {
     79 		BeamformerParameters parameters;
     80 		struct {
     81 			BeamformerParametersHead parameters_head;
     82 			BeamformerUIParameters   parameters_ui;
     83 			BeamformerParametersTail parameters_tail;
     84 		};
     85 	};
     86 
     87 	ComputeShaderID compute_stages[16];
     88 	u32             compute_stages_count;
     89 
     90 	i32 parameters_sync;
     91 	i32 parameters_head_sync;
     92 	i32 parameters_ui_sync;
     93 	i32 focal_vectors_sync;
     94 	i32 channel_mapping_sync;
     95 	i32 sparse_elements_sync;
     96 	i32 raw_data_sync;
     97 
     98 	i32           dispatch_compute_sync;
     99 	ImagePlaneTag current_image_plane;
    100 
    101 	/* TODO(rnp): these shouldn't be needed */
    102 	b32 export_next_frame;
    103 
    104 	/* TODO(rnp): probably remove this */
    105 	c8  export_pipe_name[256];
    106 
    107 	BeamformWorkQueue external_work_queue;
    108 } BeamformerSharedMemory;
    109 
    110 #endif /* _BEAMFORMER_WORK_QUEUE_H_ */