beamformer_work_queue.h (2968B)
1 /* See LICENSE for license details. */ 2 #ifndef _BEAMFORMER_WORK_QUEUE_H_ 3 #define _BEAMFORMER_WORK_QUEUE_H_ 4 5 typedef struct BeamformComputeFrame BeamformComputeFrame; 6 typedef struct ComputeShaderReloadContext ComputeShaderReloadContext; 7 8 typedef enum { 9 BW_COMPUTE, 10 BW_RELOAD_SHADER, 11 BW_SAVE_FRAME, 12 BW_SEND_FRAME, 13 BW_UPLOAD_BUFFER, 14 } BeamformWorkType; 15 16 typedef enum { 17 BU_KIND_CHANNEL_MAPPING, 18 BU_KIND_FOCAL_VECTORS, 19 BU_KIND_PARAMETERS, 20 BU_KIND_RF_DATA, 21 BU_KIND_SPARSE_ELEMENTS, 22 BU_KIND_LAST, 23 } BeamformerUploadKind; 24 25 typedef struct { 26 i32 size; 27 i32 shared_memory_offset; 28 BeamformerUploadKind kind; 29 } BeamformerUploadContext; 30 31 typedef struct { 32 BeamformComputeFrame *frame; 33 iptr file_handle; 34 } BeamformOutputFrameContext; 35 36 /* NOTE: discriminated union based on type */ 37 typedef struct { 38 union { 39 BeamformComputeFrame *frame; 40 BeamformerUploadContext upload_context; 41 BeamformOutputFrameContext output_frame_ctx; 42 ComputeShaderReloadContext *reload_shader_ctx; 43 void *generic; 44 }; 45 /* NOTE(rnp): mostly for __external__ processes to sync on. when passed from external 46 * process this should be an offset from base of shared_memory */ 47 iptr completion_barrier; 48 49 BeamformWorkType type; 50 } BeamformWork; 51 52 typedef struct { 53 union { 54 u64 queue; 55 struct {u32 widx, ridx;}; 56 }; 57 BeamformWork work_items[1 << 6]; 58 } BeamformWorkQueue; 59 60 #define BEAMFORM_WORK_QUEUE_PUSH_FN(name) BeamformWork *name(BeamformWorkQueue *q) 61 typedef BEAMFORM_WORK_QUEUE_PUSH_FN(beamform_work_queue_push_fn); 62 63 #define BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(name) void name(BeamformWorkQueue *q) 64 typedef BEAMFORM_WORK_QUEUE_PUSH_COMMIT_FN(beamform_work_queue_push_commit_fn); 65 66 #define BEAMFORMER_SHARED_MEMORY_SIZE (GB(2)) 67 #define BEAMFORMER_RF_DATA_OFF (sizeof(BeamformerSharedMemory) + 4096ULL \ 68 - (uintptr_t)(sizeof(BeamformerSharedMemory) & 4095ULL)) 69 #define BEAMFORMER_MAX_RF_DATA_SIZE (BEAMFORMER_SHARED_MEMORY_SIZE - BEAMFORMER_RF_DATA_OFF) 70 71 typedef struct { 72 /* NOTE(rnp): interleaved transmit angle, focal depth pairs */ 73 _Alignas(64) v2 focal_vectors[256]; 74 75 i16 channel_mapping[256]; 76 i16 sparse_elements[256]; 77 78 union { 79 BeamformerParameters parameters; 80 struct { 81 BeamformerParametersHead parameters_head; 82 BeamformerUIParameters parameters_ui; 83 BeamformerParametersTail parameters_tail; 84 }; 85 }; 86 87 ComputeShaderID compute_stages[16]; 88 u32 compute_stages_count; 89 90 i32 parameters_sync; 91 i32 parameters_head_sync; 92 i32 parameters_ui_sync; 93 i32 focal_vectors_sync; 94 i32 channel_mapping_sync; 95 i32 sparse_elements_sync; 96 i32 raw_data_sync; 97 98 i32 dispatch_compute_sync; 99 ImagePlaneTag current_image_plane; 100 101 /* TODO(rnp): these shouldn't be needed */ 102 b32 export_next_frame; 103 104 /* TODO(rnp): probably remove this */ 105 c8 export_pipe_name[256]; 106 107 BeamformWorkQueue external_work_queue; 108 } BeamformerSharedMemory; 109 110 #endif /* _BEAMFORMER_WORK_QUEUE_H_ */