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 (4238B)


      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 (8UL)
      6 
      7 typedef struct BeamformerComputeFrame BeamformerComputeFrame;
      8 typedef struct ShaderReloadContext    ShaderReloadContext;
      9 
     10 typedef enum {
     11 	BeamformerWorkKind_Compute,
     12 	BeamformerWorkKind_ComputeIndirect,
     13 	BeamformerWorkKind_ReloadShader,
     14 	BeamformerWorkKind_SendFrame,
     15 	BeamformerWorkKind_ExportBuffer,
     16 	BeamformerWorkKind_UploadBuffer,
     17 } BeamformerWorkKind;
     18 
     19 typedef enum {
     20 	BU_KIND_CHANNEL_MAPPING,
     21 	BU_KIND_FOCAL_VECTORS,
     22 	BU_KIND_PARAMETERS,
     23 	BU_KIND_RF_DATA,
     24 	BU_KIND_SPARSE_ELEMENTS,
     25 	BU_KIND_LAST,
     26 } BeamformerUploadKind;
     27 
     28 typedef struct {
     29 	BeamformerUploadKind kind;
     30 	u32 size;
     31 	i32 shared_memory_offset;
     32 } BeamformerUploadContext;
     33 
     34 typedef enum {
     35 	BeamformerExportKind_BeamformedData,
     36 	BeamformerExportKind_Stats,
     37 } BeamformerExportKind;
     38 
     39 typedef struct {
     40 	BeamformerExportKind kind;
     41 	u32 size;
     42 } BeamformerExportContext;
     43 
     44 #define BEAMFORMER_SHARED_MEMORY_LOCKS \
     45 	X(None)            \
     46 	X(ChannelMapping)  \
     47 	X(FocalVectors)    \
     48 	X(Parameters)      \
     49 	X(ScratchSpace)    \
     50 	X(SparseElements)  \
     51 	X(ExportSync)      \
     52 	X(DispatchCompute)
     53 
     54 #define X(name) BeamformerSharedMemoryLockKind_##name,
     55 typedef enum {BEAMFORMER_SHARED_MEMORY_LOCKS BeamformerSharedMemoryLockKind_Count} BeamformerSharedMemoryLockKind;
     56 #undef X
     57 
     58 /* NOTE: discriminated union based on type */
     59 typedef struct {
     60 	union {
     61 		BeamformerComputeFrame  *frame;
     62 		BeamformerUploadContext  upload_context;
     63 		BeamformerExportContext  export_context;
     64 		ShaderReloadContext     *shader_reload_context;
     65 		BeamformerViewPlaneTag   compute_indirect_plane;
     66 		void                    *generic;
     67 	};
     68 	BeamformerSharedMemoryLockKind lock;
     69 	BeamformerWorkKind kind;
     70 } BeamformWork;
     71 
     72 typedef struct {
     73 	union {
     74 		u64 queue;
     75 		struct {u32 widx, ridx;};
     76 	};
     77 	BeamformWork work_items[1 << 6];
     78 } BeamformWorkQueue;
     79 
     80 #define BEAMFORM_WORK_QUEUE_PUSH_FN(name) BeamformWork *name(BeamformWorkQueue *q)
     81 typedef BEAMFORM_WORK_QUEUE_PUSH_FN(beamform_work_queue_push_fn);
     82 
     83 #define BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(name) void name(BeamformWorkQueue *q)
     84 typedef BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(beamform_work_queue_push_commit_fn);
     85 
     86 #define BEAMFORMER_SHARED_MEMORY_SIZE (GB(2))
     87 #define BEAMFORMER_SCRATCH_OFF        (sizeof(BeamformerSharedMemory) + 4096ULL \
     88                                        - (uintptr_t)(sizeof(BeamformerSharedMemory) & 4095ULL))
     89 #define BEAMFORMER_SCRATCH_SIZE       (BEAMFORMER_SHARED_MEMORY_SIZE - BEAMFORMER_SCRATCH_OFF)
     90 #define BEAMFORMER_MAX_RF_DATA_SIZE   (BEAMFORMER_SCRATCH_SIZE)
     91 
     92 #define X(name, id) BeamformerLiveImagingDirtyFlags_##name = (1 << id),
     93 typedef enum {BEAMFORMER_LIVE_IMAGING_DIRTY_FLAG_LIST} BeamformerLiveImagingDirtyFlags;
     94 #undef X
     95 
     96 typedef struct {
     97 	u32 version;
     98 
     99 	/* NOTE(rnp): causes future library calls to fail.
    100 	 * see note in beamformer_invalidate_shared_memory() */
    101 	b32 invalid;
    102 
    103 	/* NOTE(rnp): not used for locking on w32 but we can use these to peek at the status of
    104 	 * the lock without leaving userspace. also this struct needs a bunch of padding */
    105 	i32 locks[BeamformerSharedMemoryLockKind_Count];
    106 
    107 	/* NOTE(rnp): used to coalesce uploads when they are not yet uploaded to the GPU */
    108 	u32 dirty_regions;
    109 	static_assert(BeamformerSharedMemoryLockKind_Count <= 32, "only 32 lock regions supported");
    110 
    111 	/* NOTE(rnp): interleaved transmit angle, focal depth pairs */
    112 	align_as(64) v2 focal_vectors[256];
    113 
    114 	i16 channel_mapping[256];
    115 	i16 sparse_elements[256];
    116 
    117 	union {
    118 		BeamformerParameters parameters;
    119 		struct {
    120 			BeamformerParametersHead parameters_head;
    121 			BeamformerUIParameters   parameters_ui;
    122 			BeamformerParametersTail parameters_tail;
    123 		};
    124 	};
    125 
    126 	BeamformerShaderKind compute_stages[MAX_COMPUTE_SHADER_STAGES];
    127 	u32                  compute_stages_count;
    128 
    129 	/* TODO(rnp): hack: we need a different way of dispatching work for export */
    130 	b32 start_compute_from_main;
    131 
    132 	/* TODO(rnp): this shouldn't be needed */
    133 	b32 export_next_frame;
    134 
    135 	BeamformerLiveImagingParameters live_imaging_parameters;
    136 	BeamformerLiveImagingDirtyFlags live_imaging_dirty_flags;
    137 
    138 	BeamformWorkQueue external_work_queue;
    139 } BeamformerSharedMemory;
    140 
    141 #endif /* _BEAMFORMER_WORK_QUEUE_H_ */