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