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