xref: /aosp_15_r20/external/intel-media-driver/cmrtlib/agnostic/hardware/cm_queue.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1*ba62d9d3SAndroid Build Coastguard Worker /*
2*ba62d9d3SAndroid Build Coastguard Worker * Copyright (c) 2017, Intel Corporation
3*ba62d9d3SAndroid Build Coastguard Worker *
4*ba62d9d3SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*ba62d9d3SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*ba62d9d3SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*ba62d9d3SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*ba62d9d3SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*ba62d9d3SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*ba62d9d3SAndroid Build Coastguard Worker *
11*ba62d9d3SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included
12*ba62d9d3SAndroid Build Coastguard Worker * in all copies or substantial portions of the Software.
13*ba62d9d3SAndroid Build Coastguard Worker *
14*ba62d9d3SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15*ba62d9d3SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*ba62d9d3SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17*ba62d9d3SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*ba62d9d3SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*ba62d9d3SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*ba62d9d3SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE.
21*ba62d9d3SAndroid Build Coastguard Worker */
22*ba62d9d3SAndroid Build Coastguard Worker #ifndef CMRTLIB_AGNOSTIC_HARDWARE_CM_QUEUE_H_
23*ba62d9d3SAndroid Build Coastguard Worker #define CMRTLIB_AGNOSTIC_HARDWARE_CM_QUEUE_H_
24*ba62d9d3SAndroid Build Coastguard Worker 
25*ba62d9d3SAndroid Build Coastguard Worker #include "cm_queue_base_hw.h"
26*ba62d9d3SAndroid Build Coastguard Worker #include "cm_def_os.h"
27*ba62d9d3SAndroid Build Coastguard Worker 
28*ba62d9d3SAndroid Build Coastguard Worker class CmEvent;
29*ba62d9d3SAndroid Build Coastguard Worker class CmSurface2D;
30*ba62d9d3SAndroid Build Coastguard Worker class CmDevice_RT;
31*ba62d9d3SAndroid Build Coastguard Worker class CmThreadSpace;
32*ba62d9d3SAndroid Build Coastguard Worker class CmTask;
33*ba62d9d3SAndroid Build Coastguard Worker class CmThreadGroupSpace;
34*ba62d9d3SAndroid Build Coastguard Worker 
35*ba62d9d3SAndroid Build Coastguard Worker typedef enum _CM_FASTCOPY_DIRECTION
36*ba62d9d3SAndroid Build Coastguard Worker {
37*ba62d9d3SAndroid Build Coastguard Worker     CM_FASTCOPY_GPU2CPU = 0,
38*ba62d9d3SAndroid Build Coastguard Worker     CM_FASTCOPY_CPU2GPU = 1
39*ba62d9d3SAndroid Build Coastguard Worker } CM_FASTCOPY_DIRECTION;
40*ba62d9d3SAndroid Build Coastguard Worker 
41*ba62d9d3SAndroid Build Coastguard Worker typedef enum _CM_FASTCOPY_OPTION
42*ba62d9d3SAndroid Build Coastguard Worker {
43*ba62d9d3SAndroid Build Coastguard Worker     CM_FASTCOPY_OPTION_NONBLOCKING = 0x00,
44*ba62d9d3SAndroid Build Coastguard Worker     CM_FASTCOPY_OPTION_BLOCKING    = 0x01
45*ba62d9d3SAndroid Build Coastguard Worker } CM_FASTCOPY_OPTION;
46*ba62d9d3SAndroid Build Coastguard Worker 
47*ba62d9d3SAndroid Build Coastguard Worker //CM_ENQUEUE_GPUCOPY_PARAM version 2: two new fields are added
48*ba62d9d3SAndroid Build Coastguard Worker typedef struct _CM_ENQUEUE_GPUCOPY_PARAM
49*ba62d9d3SAndroid Build Coastguard Worker {
50*ba62d9d3SAndroid Build Coastguard Worker     void  *cmQueueHandle;  // [in] CmQueue pointer in CMRT@UMD
51*ba62d9d3SAndroid Build Coastguard Worker 
52*ba62d9d3SAndroid Build Coastguard Worker     void  *cmSurface2d;    // [in] CmSurface2d pointer in CMRT@UMD
53*ba62d9d3SAndroid Build Coastguard Worker 
54*ba62d9d3SAndroid Build Coastguard Worker     void  *sysMem;         // [in] pointer of system memory
55*ba62d9d3SAndroid Build Coastguard Worker 
56*ba62d9d3SAndroid Build Coastguard Worker     CM_FASTCOPY_DIRECTION copyDir;  // [in] direction for GPUCopy: CM_FASTCOPY_GPU2CPU (0) or CM_FASTCOPY_CPU2GPU(1)
57*ba62d9d3SAndroid Build Coastguard Worker 
58*ba62d9d3SAndroid Build Coastguard Worker     uint32_t widthStride;  // [in] width stride in byte for system memory, ZERO means no setting
59*ba62d9d3SAndroid Build Coastguard Worker 
60*ba62d9d3SAndroid Build Coastguard Worker     uint32_t heightStride;  // [in] height stride in row for system memory, ZERO means no setting
61*ba62d9d3SAndroid Build Coastguard Worker 
62*ba62d9d3SAndroid Build Coastguard Worker     uint32_t option;  // [in] option passed by user, only support CM_FASTCOPY_OPTION_NONBLOCKING(0) and CM_FASTCOPY_OPTION_BLOCKING(1)
63*ba62d9d3SAndroid Build Coastguard Worker 
64*ba62d9d3SAndroid Build Coastguard Worker     void  *cmEventHandle;  // [in/out] return CmDevice pointer in CMRT@UMD, nullptr if the input is CM_NO_EVENT
65*ba62d9d3SAndroid Build Coastguard Worker 
66*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;     // [out] index of Event in m_EventArray
67*ba62d9d3SAndroid Build Coastguard Worker 
68*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;    // [out] return value from CMRT@UMD
69*ba62d9d3SAndroid Build Coastguard Worker } CM_ENQUEUE_GPUCOPY_PARAM, *PCM_ENQUEUE_GPUCOPY_PARAM;
70*ba62d9d3SAndroid Build Coastguard Worker 
71*ba62d9d3SAndroid Build Coastguard Worker class CmQueue_RT : public CmQueue
72*ba62d9d3SAndroid Build Coastguard Worker {
73*ba62d9d3SAndroid Build Coastguard Worker public:
74*ba62d9d3SAndroid Build Coastguard Worker     static int32_t Create(CmDevice_RT *device,
75*ba62d9d3SAndroid Build Coastguard Worker                           CmQueue_RT* &queue,
76*ba62d9d3SAndroid Build Coastguard Worker                           CM_QUEUE_CREATE_OPTION queueCreateOption);
77*ba62d9d3SAndroid Build Coastguard Worker     static int32_t Destroy(CmQueue_RT *&queue);
78*ba62d9d3SAndroid Build Coastguard Worker 
79*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t Enqueue(CmTask *task,
80*ba62d9d3SAndroid Build Coastguard Worker                           CmEvent *&event,
81*ba62d9d3SAndroid Build Coastguard Worker                           const CmThreadSpace *threadSpace = nullptr);
82*ba62d9d3SAndroid Build Coastguard Worker 
83*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyCPUToGPU(CmSurface2D *surface,
84*ba62d9d3SAndroid Build Coastguard Worker                                       const unsigned char *sysMem,
85*ba62d9d3SAndroid Build Coastguard Worker                                       CmEvent *&event);
86*ba62d9d3SAndroid Build Coastguard Worker 
87*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyGPUToCPU(CmSurface2D *surface,
88*ba62d9d3SAndroid Build Coastguard Worker                                       unsigned char *sysMem,
89*ba62d9d3SAndroid Build Coastguard Worker                                       CmEvent *&event);
90*ba62d9d3SAndroid Build Coastguard Worker 
91*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueInitSurface2D(CmSurface2D *surface,
92*ba62d9d3SAndroid Build Coastguard Worker                                        const uint32_t initValue,
93*ba62d9d3SAndroid Build Coastguard Worker                                        CmEvent *&event);
94*ba62d9d3SAndroid Build Coastguard Worker 
95*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyGPUToGPU(CmSurface2D *outputSurface,
96*ba62d9d3SAndroid Build Coastguard Worker                                       CmSurface2D *inputSurface,
97*ba62d9d3SAndroid Build Coastguard Worker                                       uint32_t option,
98*ba62d9d3SAndroid Build Coastguard Worker                                       CmEvent *&event);
99*ba62d9d3SAndroid Build Coastguard Worker 
100*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyCPUToCPU(unsigned char *dstSysMem,
101*ba62d9d3SAndroid Build Coastguard Worker                                       unsigned char *srcSysMem,
102*ba62d9d3SAndroid Build Coastguard Worker                                       uint32_t size,
103*ba62d9d3SAndroid Build Coastguard Worker                                       uint32_t option,
104*ba62d9d3SAndroid Build Coastguard Worker                                       CmEvent *&event);
105*ba62d9d3SAndroid Build Coastguard Worker 
106*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyCPUToGPUFullStride(CmSurface2D *surface,
107*ba62d9d3SAndroid Build Coastguard Worker                                                 const unsigned char *sysMem,
108*ba62d9d3SAndroid Build Coastguard Worker                                                 const uint32_t widthStride,
109*ba62d9d3SAndroid Build Coastguard Worker                                                 const uint32_t heightStride,
110*ba62d9d3SAndroid Build Coastguard Worker                                                 const uint32_t option,
111*ba62d9d3SAndroid Build Coastguard Worker                                                 CmEvent *&event);
112*ba62d9d3SAndroid Build Coastguard Worker 
113*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyGPUToCPUFullStride(CmSurface2D *surface,
114*ba62d9d3SAndroid Build Coastguard Worker                                                 unsigned char *sysMem,
115*ba62d9d3SAndroid Build Coastguard Worker                                                 const uint32_t widthStride,
116*ba62d9d3SAndroid Build Coastguard Worker                                                 const uint32_t heightStride,
117*ba62d9d3SAndroid Build Coastguard Worker                                                 const uint32_t option,
118*ba62d9d3SAndroid Build Coastguard Worker                                                 CmEvent *&event);
119*ba62d9d3SAndroid Build Coastguard Worker 
120*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t DestroyEvent(CmEvent *&event);
121*ba62d9d3SAndroid Build Coastguard Worker 
122*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t
123*ba62d9d3SAndroid Build Coastguard Worker     EnqueueWithGroup(CmTask *task,
124*ba62d9d3SAndroid Build Coastguard Worker                      CmEvent *&event,
125*ba62d9d3SAndroid Build Coastguard Worker                      const CmThreadGroupSpace *threadGroupSpace = nullptr);
126*ba62d9d3SAndroid Build Coastguard Worker 
127*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyCPUToGPUFullStrideDup(CmSurface2D *surface,
128*ba62d9d3SAndroid Build Coastguard Worker                                                        const unsigned char *sysMem,
129*ba62d9d3SAndroid Build Coastguard Worker                                                        const uint32_t widthStride,
130*ba62d9d3SAndroid Build Coastguard Worker                                                        const uint32_t heightStride,
131*ba62d9d3SAndroid Build Coastguard Worker                                                        const uint32_t option,
132*ba62d9d3SAndroid Build Coastguard Worker                                                        CmEvent *&event);
133*ba62d9d3SAndroid Build Coastguard Worker 
134*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueCopyGPUToCPUFullStrideDup(CmSurface2D *surface,
135*ba62d9d3SAndroid Build Coastguard Worker                                                        unsigned char *sysMem,
136*ba62d9d3SAndroid Build Coastguard Worker                                                        const uint32_t widthStride,
137*ba62d9d3SAndroid Build Coastguard Worker                                                        const uint32_t heightStride,
138*ba62d9d3SAndroid Build Coastguard Worker                                                        const uint32_t option,
139*ba62d9d3SAndroid Build Coastguard Worker                                                        CmEvent *&event);
140*ba62d9d3SAndroid Build Coastguard Worker 
141*ba62d9d3SAndroid Build Coastguard Worker     // enqueue CmBuffer read from GPU 1D surface to CPU system memory
142*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueReadBuffer(CmBuffer* buffer,
143*ba62d9d3SAndroid Build Coastguard Worker                                         size_t offset,
144*ba62d9d3SAndroid Build Coastguard Worker                                         const unsigned char* sysMem,
145*ba62d9d3SAndroid Build Coastguard Worker                                         uint64_t sysMemSize,
146*ba62d9d3SAndroid Build Coastguard Worker                                         CmEvent* wait_event,
147*ba62d9d3SAndroid Build Coastguard Worker                                         CmEvent*& event,
148*ba62d9d3SAndroid Build Coastguard Worker                                         unsigned option = 0);
149*ba62d9d3SAndroid Build Coastguard Worker 
150*ba62d9d3SAndroid Build Coastguard Worker     // enqueue CmBuffer write from CPU system memory to GPU 1D surface
151*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueWriteBuffer(CmBuffer* buffer,
152*ba62d9d3SAndroid Build Coastguard Worker                                          size_t offset,
153*ba62d9d3SAndroid Build Coastguard Worker                                          const unsigned char* sysMem,
154*ba62d9d3SAndroid Build Coastguard Worker                                          uint64_t sysMemSize,
155*ba62d9d3SAndroid Build Coastguard Worker                                          CmEvent* wait_event,
156*ba62d9d3SAndroid Build Coastguard Worker                                          CmEvent*& event,
157*ba62d9d3SAndroid Build Coastguard Worker                                          unsigned option = 0);
158*ba62d9d3SAndroid Build Coastguard Worker 
159*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueWithHints(CmTask *task,
160*ba62d9d3SAndroid Build Coastguard Worker                                    CmEvent *&event,
161*ba62d9d3SAndroid Build Coastguard Worker                                    uint32_t hints = 0);
162*ba62d9d3SAndroid Build Coastguard Worker 
163*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueVebox(CmVebox *vebox, CmEvent *&event);
164*ba62d9d3SAndroid Build Coastguard Worker 
165*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueFast(CmTask *task,
166*ba62d9d3SAndroid Build Coastguard Worker                               CmEvent *&event,
167*ba62d9d3SAndroid Build Coastguard Worker                               const CmThreadSpace *threadSpace = nullptr);
168*ba62d9d3SAndroid Build Coastguard Worker 
169*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t DestroyEventFast(CmEvent *&event);
170*ba62d9d3SAndroid Build Coastguard Worker 
171*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t EnqueueWithGroupFast(CmTask *task,
172*ba62d9d3SAndroid Build Coastguard Worker                               CmEvent *&event,
173*ba62d9d3SAndroid Build Coastguard Worker                               const CmThreadGroupSpace *threadGroupSpace = nullptr);
174*ba62d9d3SAndroid Build Coastguard Worker 
175*ba62d9d3SAndroid Build Coastguard Worker     CM_RT_API int32_t SetResidentGroupAndParallelThreadNum(uint32_t residentGroupNum, uint32_t parallelThreadNum);
176*ba62d9d3SAndroid Build Coastguard Worker 
177*ba62d9d3SAndroid Build Coastguard Worker     CM_QUEUE_CREATE_OPTION GetQueueOption();
178*ba62d9d3SAndroid Build Coastguard Worker 
179*ba62d9d3SAndroid Build Coastguard Worker 
180*ba62d9d3SAndroid Build Coastguard Worker protected:
181*ba62d9d3SAndroid Build Coastguard Worker     CmQueue_RT(CmDevice_RT *device, CM_QUEUE_CREATE_OPTION queueCreateOption);
182*ba62d9d3SAndroid Build Coastguard Worker 
183*ba62d9d3SAndroid Build Coastguard Worker     ~CmQueue_RT();
184*ba62d9d3SAndroid Build Coastguard Worker 
185*ba62d9d3SAndroid Build Coastguard Worker     int32_t Initialize();
186*ba62d9d3SAndroid Build Coastguard Worker     int32_t Initialize(CM_QUEUE_CREATE_OPTION queueCreateOption);
187*ba62d9d3SAndroid Build Coastguard Worker 
188*ba62d9d3SAndroid Build Coastguard Worker     int32_t EnqueueCopy(CmSurface2D *surface,
189*ba62d9d3SAndroid Build Coastguard Worker                     const unsigned char *sysMem,
190*ba62d9d3SAndroid Build Coastguard Worker                     const uint32_t widthStride,
191*ba62d9d3SAndroid Build Coastguard Worker                     const uint32_t heightStride,
192*ba62d9d3SAndroid Build Coastguard Worker                     CM_FASTCOPY_DIRECTION direction,
193*ba62d9d3SAndroid Build Coastguard Worker                     const uint32_t option,
194*ba62d9d3SAndroid Build Coastguard Worker                     CmEvent *&event);
195*ba62d9d3SAndroid Build Coastguard Worker 
196*ba62d9d3SAndroid Build Coastguard Worker     CmDevice_RT *m_cmDev;
197*ba62d9d3SAndroid Build Coastguard Worker 
198*ba62d9d3SAndroid Build Coastguard Worker     void  *m_cmQueueHandle;  //pointer used in driver
199*ba62d9d3SAndroid Build Coastguard Worker 
200*ba62d9d3SAndroid Build Coastguard Worker     CM_QUEUE_CREATE_OPTION m_queueOption;
201*ba62d9d3SAndroid Build Coastguard Worker 
202*ba62d9d3SAndroid Build Coastguard Worker     CSync m_criticalSection;
203*ba62d9d3SAndroid Build Coastguard Worker 
204*ba62d9d3SAndroid Build Coastguard Worker private:
205*ba62d9d3SAndroid Build Coastguard Worker     CmQueue_RT(const CmQueue_RT &other);
206*ba62d9d3SAndroid Build Coastguard Worker     CmQueue_RT &operator=(const CmQueue_RT &other);
207*ba62d9d3SAndroid Build Coastguard Worker 
208*ba62d9d3SAndroid Build Coastguard Worker };
209*ba62d9d3SAndroid Build Coastguard Worker 
210*ba62d9d3SAndroid Build Coastguard Worker #endif  // #ifndef CMRTLIB_AGNOSTIC_HARDWARE_CM_QUEUE_H_
211