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