ogl_beamforming

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

beamformer_work_queue.h (4700B)


      1 /* See LICENSE for license details. */
      2 #ifndef _BEAMFORMER_WORK_QUEUE_H_
      3 #define _BEAMFORMER_WORK_QUEUE_H_
      4 
      5 #define BEAMFORMER_SHARED_MEMORY_VERSION (11UL)
      6 
      7 typedef struct BeamformerFrame     BeamformerFrame;
      8 typedef struct ShaderReloadContext ShaderReloadContext;
      9 
     10 typedef enum {
     11 	BeamformerWorkKind_Compute,
     12 	BeamformerWorkKind_ComputeIndirect,
     13 	BeamformerWorkKind_CreateFilter,
     14 	BeamformerWorkKind_ReloadShader,
     15 	BeamformerWorkKind_ExportBuffer,
     16 	BeamformerWorkKind_UploadBuffer,
     17 } BeamformerWorkKind;
     18 
     19 typedef enum {
     20 	BeamformerUploadKind_ChannelMapping,
     21 	BeamformerUploadKind_FocalVectors,
     22 	BeamformerUploadKind_SparseElements,
     23 } BeamformerUploadKind;
     24 
     25 typedef struct {
     26 	BeamformerUploadKind kind;
     27 	u32 size;
     28 	i32 shared_memory_offset;
     29 } BeamformerUploadContext;
     30 
     31 typedef struct {
     32 	BeamformerFilterKind kind;
     33 	union {
     34 		struct {
     35 			f32 beta;
     36 			f32 cutoff_frequency;
     37 		};
     38 		f32 xdc_center_frequency;
     39 	};
     40 	i16 length;
     41 	i16 slot;
     42 } BeamformerCreateFilterContext;
     43 
     44 typedef enum {
     45 	BeamformerExportKind_BeamformedData,
     46 	BeamformerExportKind_Stats,
     47 } BeamformerExportKind;
     48 
     49 typedef struct {
     50 	BeamformerExportKind kind;
     51 	u32 size;
     52 } BeamformerExportContext;
     53 
     54 typedef union {
     55 	u8 filter_slot;
     56 } BeamformerShaderParameters;
     57 
     58 #define BEAMFORMER_SHARED_MEMORY_LOCKS \
     59 	X(None)            \
     60 	X(ComputePipeline) \
     61 	X(ChannelMapping)  \
     62 	X(FocalVectors)    \
     63 	X(Parameters)      \
     64 	X(ScratchSpace)    \
     65 	X(SparseElements)  \
     66 	X(UploadRF)        \
     67 	X(ExportSync)      \
     68 	X(DispatchCompute)
     69 
     70 #define X(name) BeamformerSharedMemoryLockKind_##name,
     71 typedef enum {BEAMFORMER_SHARED_MEMORY_LOCKS BeamformerSharedMemoryLockKind_Count} BeamformerSharedMemoryLockKind;
     72 #undef X
     73 
     74 /* NOTE: discriminated union based on type */
     75 typedef struct {
     76 	BeamformerWorkKind kind;
     77 	BeamformerSharedMemoryLockKind lock;
     78 	union {
     79 		BeamformerFrame               *frame;
     80 		BeamformerCreateFilterContext  create_filter_context;
     81 		BeamformerExportContext        export_context;
     82 		BeamformerUploadContext        upload_context;
     83 		BeamformerViewPlaneTag         compute_indirect_plane;
     84 		ShaderReloadContext           *shader_reload_context;
     85 		void                          *generic;
     86 	};
     87 } BeamformWork;
     88 
     89 typedef struct {
     90 	union {
     91 		u64 queue;
     92 		struct {u32 widx, ridx;};
     93 	};
     94 	BeamformWork work_items[1 << 6];
     95 } BeamformWorkQueue;
     96 
     97 #define BEAMFORM_WORK_QUEUE_PUSH_FN(name) BeamformWork *name(BeamformWorkQueue *q)
     98 typedef BEAMFORM_WORK_QUEUE_PUSH_FN(beamform_work_queue_push_fn);
     99 
    100 #define BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(name) void name(BeamformWorkQueue *q)
    101 typedef BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(beamform_work_queue_push_commit_fn);
    102 
    103 #define BEAMFORMER_SHARED_MEMORY_SIZE (GB(2))
    104 #define BEAMFORMER_SCRATCH_OFF        (sizeof(BeamformerSharedMemory) + 4096ULL \
    105                                        - (uintptr_t)(sizeof(BeamformerSharedMemory) & 4095ULL))
    106 #define BEAMFORMER_SCRATCH_SIZE       (BEAMFORMER_SHARED_MEMORY_SIZE - BEAMFORMER_SCRATCH_OFF)
    107 #define BEAMFORMER_MAX_RF_DATA_SIZE   (BEAMFORMER_SCRATCH_SIZE)
    108 
    109 #define X(name, id) BeamformerLiveImagingDirtyFlags_##name = (1 << id),
    110 typedef enum {BEAMFORMER_LIVE_IMAGING_DIRTY_FLAG_LIST} BeamformerLiveImagingDirtyFlags;
    111 #undef X
    112 
    113 typedef struct {
    114 	u32 version;
    115 
    116 	/* NOTE(rnp): causes future library calls to fail.
    117 	 * see note in beamformer_invalidate_shared_memory() */
    118 	b32 invalid;
    119 
    120 	/* NOTE(rnp): not used for locking on w32 but we can use these to peek at the status of
    121 	 * the lock without leaving userspace. also this struct needs a bunch of padding */
    122 	i32 locks[BeamformerSharedMemoryLockKind_Count];
    123 
    124 	/* NOTE(rnp): used to coalesce uploads when they are not yet uploaded to the GPU */
    125 	u32 dirty_regions;
    126 	static_assert(BeamformerSharedMemoryLockKind_Count <= 32, "only 32 lock regions supported");
    127 
    128 	/* NOTE(rnp): interleaved transmit angle, focal depth pairs */
    129 	align_as(64) v2 focal_vectors[256];
    130 
    131 	i16 channel_mapping[256];
    132 	i16 sparse_elements[256];
    133 
    134 	union {
    135 		BeamformerParameters parameters;
    136 		struct {
    137 			BeamformerParametersHead parameters_head;
    138 			BeamformerUIParameters   parameters_ui;
    139 			BeamformerParametersTail parameters_tail;
    140 		};
    141 	};
    142 
    143 	//////////////////////////
    144 	// Pipeline Configuration
    145 	BeamformerShaderKind       shaders[MAX_COMPUTE_SHADER_STAGES];
    146 	BeamformerShaderParameters shader_parameters[MAX_COMPUTE_SHADER_STAGES];
    147 	i32                        shader_count;
    148 	BeamformerDataKind         data_kind;
    149 
    150 	/* TODO(rnp): this is really sucky. we need a better way to communicate this */
    151 	u32 scratch_rf_size;
    152 
    153 	BeamformerLiveImagingParameters live_imaging_parameters;
    154 	BeamformerLiveImagingDirtyFlags live_imaging_dirty_flags;
    155 
    156 	BeamformWorkQueue external_work_queue;
    157 } BeamformerSharedMemory;
    158 
    159 #endif /* _BEAMFORMER_WORK_QUEUE_H_ */