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


      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 (7UL)
      6 
      7 typedef struct BeamformComputeFrame BeamformComputeFrame;
      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 	i32 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 	i32 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 		BeamformComputeFrame    *frame;
     62 		BeamformerUploadContext  upload_context;
     63 		BeamformerExportContext  export_context;
     64 		ShaderReloadContext     *shader_reload_context;
     65 		ImagePlaneTag            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 typedef struct {
     93 	u32 version;
     94 
     95 	/* NOTE(rnp): causes future library calls to fail.
     96 	 * see note in beamformer_invalidate_shared_memory() */
     97 	b32 invalid;
     98 
     99 	/* NOTE(rnp): not used for locking on w32 but we can use these to peek at the status of
    100 	 * the lock without leaving userspace. also this struct needs a bunch of padding */
    101 	i32 locks[BeamformerSharedMemoryLockKind_Count];
    102 
    103 	/* NOTE(rnp): used to coalesce uploads when they are not yet uploaded to the GPU */
    104 	u32 dirty_regions;
    105 	static_assert(BeamformerSharedMemoryLockKind_Count <= 32, "only 32 lock regions supported");
    106 
    107 	/* NOTE(rnp): interleaved transmit angle, focal depth pairs */
    108 	align_as(64) v2 focal_vectors[256];
    109 
    110 	i16 channel_mapping[256];
    111 	i16 sparse_elements[256];
    112 
    113 	union {
    114 		BeamformerParameters parameters;
    115 		struct {
    116 			BeamformerParametersHead parameters_head;
    117 			BeamformerUIParameters   parameters_ui;
    118 			BeamformerParametersTail parameters_tail;
    119 		};
    120 	};
    121 
    122 	BeamformerShaderKind compute_stages[MAX_COMPUTE_SHADER_STAGES];
    123 	u32                  compute_stages_count;
    124 
    125 	/* TODO(rnp): hack: we need a different way of dispatching work for export */
    126 	b32 start_compute_from_main;
    127 
    128 	/* TODO(rnp): this shouldn't be needed */
    129 	b32 export_next_frame;
    130 
    131 	BeamformWorkQueue external_work_queue;
    132 } BeamformerSharedMemory;
    133 
    134 #endif /* _BEAMFORMER_WORK_QUEUE_H_ */