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