xref: /aosp_15_r20/external/intel-media-driver/cmrtlib/agnostic/hardware/cm_queue.cpp (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 #include "cm_queue.h"
23*ba62d9d3SAndroid Build Coastguard Worker #include "cm_debug.h"
24*ba62d9d3SAndroid Build Coastguard Worker #include "cm_device.h"
25*ba62d9d3SAndroid Build Coastguard Worker #include "cm_include.h"
26*ba62d9d3SAndroid Build Coastguard Worker #include "cm_mem.h"
27*ba62d9d3SAndroid Build Coastguard Worker #include "cm_timer.h"
28*ba62d9d3SAndroid Build Coastguard Worker 
29*ba62d9d3SAndroid Build Coastguard Worker struct CM_CREATEQUEUE_PARAM
30*ba62d9d3SAndroid Build Coastguard Worker {
31*ba62d9d3SAndroid Build Coastguard Worker     CM_QUEUE_CREATE_OPTION createOption; // [in/out]
32*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;                 // [out]
33*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;                 // [out]
34*ba62d9d3SAndroid Build Coastguard Worker };
35*ba62d9d3SAndroid Build Coastguard Worker 
36*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUE_PARAM
37*ba62d9d3SAndroid Build Coastguard Worker {
38*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;        // [in]
39*ba62d9d3SAndroid Build Coastguard Worker     void *cmTaskHandle;         // [in]
40*ba62d9d3SAndroid Build Coastguard Worker     void *cmThreadSpaceHandle;  // [in]
41*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;        // [out]
42*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;        // [out] index of Event in m_EventArray
43*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;        // [out]
44*ba62d9d3SAndroid Build Coastguard Worker };
45*ba62d9d3SAndroid Build Coastguard Worker 
46*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUEGROUP_PARAM
47*ba62d9d3SAndroid Build Coastguard Worker {
48*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;      // [in]
49*ba62d9d3SAndroid Build Coastguard Worker     void *cmTaskHandle;       // [in]
50*ba62d9d3SAndroid Build Coastguard Worker     void *cmTGrpSpaceHandle;  // [in]
51*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;      // [out]
52*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;      // [out] index of Event in m_EventArray
53*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;      // [out]
54*ba62d9d3SAndroid Build Coastguard Worker };
55*ba62d9d3SAndroid Build Coastguard Worker 
56*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUEHINTS_PARAM
57*ba62d9d3SAndroid Build Coastguard Worker {
58*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;  // [in]
59*ba62d9d3SAndroid Build Coastguard Worker     void *cmTaskHandle;   // [in]
60*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;  // [in]
61*ba62d9d3SAndroid Build Coastguard Worker     uint32_t hints;      // [in]
62*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;  // [out] index of Event in m_EventArray
63*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;  // [out]
64*ba62d9d3SAndroid Build Coastguard Worker };
65*ba62d9d3SAndroid Build Coastguard Worker 
66*ba62d9d3SAndroid Build Coastguard Worker struct CM_DESTROYEVENT_PARAM
67*ba62d9d3SAndroid Build Coastguard Worker {
68*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;  // [in]
69*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;  // [in]
70*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;  // [out]
71*ba62d9d3SAndroid Build Coastguard Worker };
72*ba62d9d3SAndroid Build Coastguard Worker 
73*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUE_GPUCOPY_V2V_PARAM
74*ba62d9d3SAndroid Build Coastguard Worker {
75*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;   // [in]
76*ba62d9d3SAndroid Build Coastguard Worker     void *cmSrcSurface2d;  // [in]
77*ba62d9d3SAndroid Build Coastguard Worker     void *cmDstSurface2d;  // [in]
78*ba62d9d3SAndroid Build Coastguard Worker     uint32_t option;       // [in]
79*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;   // [out]
80*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;   // [out] index of Event in m_EventArray
81*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;   // [out]
82*ba62d9d3SAndroid Build Coastguard Worker };
83*ba62d9d3SAndroid Build Coastguard Worker 
84*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUE_GPUCOPY_L2L_PARAM
85*ba62d9d3SAndroid Build Coastguard Worker {
86*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;  // [in]
87*ba62d9d3SAndroid Build Coastguard Worker     void *srcSysMem;      // [in]
88*ba62d9d3SAndroid Build Coastguard Worker     void *dstSysMem;      // [in]
89*ba62d9d3SAndroid Build Coastguard Worker     uint32_t copySize;    // [in]
90*ba62d9d3SAndroid Build Coastguard Worker     uint32_t option;      // [in]
91*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;  // [out]
92*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;  // [out] index of Event in m_EventArray
93*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;  // [out]
94*ba62d9d3SAndroid Build Coastguard Worker };
95*ba62d9d3SAndroid Build Coastguard Worker 
96*ba62d9d3SAndroid Build Coastguard Worker 
97*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUE_COPY_BUFFER_PARAM
98*ba62d9d3SAndroid Build Coastguard Worker {
99*ba62d9d3SAndroid Build Coastguard Worker     void* cmQueueHandle;  // [in]
100*ba62d9d3SAndroid Build Coastguard Worker     void* buffer;         // [in]
101*ba62d9d3SAndroid Build Coastguard Worker     void* sysMem;         // [in]
102*ba62d9d3SAndroid Build Coastguard Worker     uint32_t offset;      // [in]
103*ba62d9d3SAndroid Build Coastguard Worker     uint64_t copySize;    // [in]
104*ba62d9d3SAndroid Build Coastguard Worker     uint32_t copyDir;     // [in]
105*ba62d9d3SAndroid Build Coastguard Worker     void* wait_event;     // [in]
106*ba62d9d3SAndroid Build Coastguard Worker     void* cmEventHandle;  // [out]
107*ba62d9d3SAndroid Build Coastguard Worker     uint32_t option;      // [in]
108*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;  // [out] index of Event in m_EventArray
109*ba62d9d3SAndroid Build Coastguard Worker     int32_t  returnValue; // [out]
110*ba62d9d3SAndroid Build Coastguard Worker };
111*ba62d9d3SAndroid Build Coastguard Worker 
112*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUE_2DInit_PARAM
113*ba62d9d3SAndroid Build Coastguard Worker {
114*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;  // [in]
115*ba62d9d3SAndroid Build Coastguard Worker     void *cmSurface2d;    // [in]
116*ba62d9d3SAndroid Build Coastguard Worker     uint32_t initValue;   // [in]
117*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;  // [out]
118*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;  // [out] index of Event in m_EventArray
119*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;  // [out]
120*ba62d9d3SAndroid Build Coastguard Worker };
121*ba62d9d3SAndroid Build Coastguard Worker 
122*ba62d9d3SAndroid Build Coastguard Worker struct CM_ENQUEUE_VEBOX_PARAM
123*ba62d9d3SAndroid Build Coastguard Worker {
124*ba62d9d3SAndroid Build Coastguard Worker     void *cmQueueHandle;  // [IN]
125*ba62d9d3SAndroid Build Coastguard Worker     void *cmVeboxHandle;  // [IN] CmVeboxG75's handle
126*ba62d9d3SAndroid Build Coastguard Worker     void *cmEventHandle;  // [out] event's handle
127*ba62d9d3SAndroid Build Coastguard Worker     uint32_t eventIndex;  // [out] event's index in  m_EventArray CMRT@UMD
128*ba62d9d3SAndroid Build Coastguard Worker     int32_t returnValue;  // [out] return value
129*ba62d9d3SAndroid Build Coastguard Worker };
130*ba62d9d3SAndroid Build Coastguard Worker 
Create(CmDevice_RT * device,CmQueue_RT * & queue,CM_QUEUE_CREATE_OPTION queueCreateOption)131*ba62d9d3SAndroid Build Coastguard Worker int32_t CmQueue_RT::Create(CmDevice_RT *device, CmQueue_RT *&queue, CM_QUEUE_CREATE_OPTION queueCreateOption)
132*ba62d9d3SAndroid Build Coastguard Worker {
133*ba62d9d3SAndroid Build Coastguard Worker     int32_t result = CM_SUCCESS;
134*ba62d9d3SAndroid Build Coastguard Worker     queue = new(std::nothrow) CmQueue_RT(device, queueCreateOption);
135*ba62d9d3SAndroid Build Coastguard Worker     if (queue)
136*ba62d9d3SAndroid Build Coastguard Worker     {
137*ba62d9d3SAndroid Build Coastguard Worker         result = queue->Initialize(queueCreateOption);
138*ba62d9d3SAndroid Build Coastguard Worker         if (result != CM_SUCCESS)
139*ba62d9d3SAndroid Build Coastguard Worker         {
140*ba62d9d3SAndroid Build Coastguard Worker             CmQueue_RT::Destroy(queue);
141*ba62d9d3SAndroid Build Coastguard Worker         }
142*ba62d9d3SAndroid Build Coastguard Worker     }
143*ba62d9d3SAndroid Build Coastguard Worker     else
144*ba62d9d3SAndroid Build Coastguard Worker     {
145*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
146*ba62d9d3SAndroid Build Coastguard Worker         result = CM_OUT_OF_HOST_MEMORY;
147*ba62d9d3SAndroid Build Coastguard Worker     }
148*ba62d9d3SAndroid Build Coastguard Worker     return result;
149*ba62d9d3SAndroid Build Coastguard Worker }
150*ba62d9d3SAndroid Build Coastguard Worker 
Destroy(CmQueue_RT * & queue)151*ba62d9d3SAndroid Build Coastguard Worker int32_t CmQueue_RT::Destroy(CmQueue_RT *&queue)
152*ba62d9d3SAndroid Build Coastguard Worker {
153*ba62d9d3SAndroid Build Coastguard Worker     CmSafeRelease(queue);
154*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
155*ba62d9d3SAndroid Build Coastguard Worker }
156*ba62d9d3SAndroid Build Coastguard Worker 
CmQueue_RT(CmDevice_RT * device,CM_QUEUE_CREATE_OPTION queueCreateOption)157*ba62d9d3SAndroid Build Coastguard Worker CmQueue_RT::CmQueue_RT(CmDevice_RT *device, CM_QUEUE_CREATE_OPTION queueCreateOption):
158*ba62d9d3SAndroid Build Coastguard Worker     m_cmDev(device),
159*ba62d9d3SAndroid Build Coastguard Worker     m_cmQueueHandle(nullptr),
160*ba62d9d3SAndroid Build Coastguard Worker     m_queueOption(queueCreateOption) {}
161*ba62d9d3SAndroid Build Coastguard Worker 
~CmQueue_RT()162*ba62d9d3SAndroid Build Coastguard Worker CmQueue_RT::~CmQueue_RT() {}
163*ba62d9d3SAndroid Build Coastguard Worker 
Initialize()164*ba62d9d3SAndroid Build Coastguard Worker int32_t CmQueue_RT::Initialize()
165*ba62d9d3SAndroid Build Coastguard Worker {
166*ba62d9d3SAndroid Build Coastguard Worker     CM_CREATEQUEUE_PARAM inParam;
167*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
168*ba62d9d3SAndroid Build Coastguard Worker 
169*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMDEVICE_CREATEQUEUE,
170*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
171*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(hr);
172*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(inParam.returnValue);
173*ba62d9d3SAndroid Build Coastguard Worker     m_cmQueueHandle = inParam.cmQueueHandle;
174*ba62d9d3SAndroid Build Coastguard Worker     m_queueOption   = inParam.createOption;
175*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
176*ba62d9d3SAndroid Build Coastguard Worker }
177*ba62d9d3SAndroid Build Coastguard Worker 
Initialize(CM_QUEUE_CREATE_OPTION queueCreateOption)178*ba62d9d3SAndroid Build Coastguard Worker int32_t CmQueue_RT::Initialize(CM_QUEUE_CREATE_OPTION queueCreateOption)
179*ba62d9d3SAndroid Build Coastguard Worker {
180*ba62d9d3SAndroid Build Coastguard Worker     CM_CREATEQUEUE_PARAM inParam;
181*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
182*ba62d9d3SAndroid Build Coastguard Worker     inParam.createOption = queueCreateOption;
183*ba62d9d3SAndroid Build Coastguard Worker 
184*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMDEVICE_CREATEQUEUEEX,
185*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
186*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(hr);
187*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(inParam.returnValue);
188*ba62d9d3SAndroid Build Coastguard Worker     m_cmQueueHandle = inParam.cmQueueHandle;
189*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
190*ba62d9d3SAndroid Build Coastguard Worker }
191*ba62d9d3SAndroid Build Coastguard Worker 
192*ba62d9d3SAndroid Build Coastguard Worker //!
193*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task. Each task have one or more kernels running concurrently.
194*ba62d9d3SAndroid Build Coastguard Worker //! Each kernel can run in multiple threads concurrently.
195*ba62d9d3SAndroid Build Coastguard Worker //! Tasks get executed according to the order they get enqueued. The next task
196*ba62d9d3SAndroid Build Coastguard Worker //! doesn't start execute until the current task finishs.
197*ba62d9d3SAndroid Build Coastguard Worker //! When the last argument, pThreadSpace, is not nullptr, there are dependency among all threads within a task
198*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue will make sure each x/y pair in the CmThreadSpace object is associated with
199*ba62d9d3SAndroid Build Coastguard Worker //! a unique thread in the task to enqueue.Otherwise enqueue will fail.
200*ba62d9d3SAndroid Build Coastguard Worker //! This is a non-blocking call. i.e. it returs immediately without waiting for
201*ba62d9d3SAndroid Build Coastguard Worker //! GPU to finish the execution of the task.
202*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
203*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
204*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
205*ba62d9d3SAndroid Build Coastguard Worker //!     1) Array of CmKernel_RT pointers. These kernels are to run concurrently. The
206*ba62d9d3SAndroid Build Coastguard Worker //!        first nullptr pointer in the array indicates the end of kernels
207*ba62d9d3SAndroid Build Coastguard Worker //!     2) Reference to the pointer to CMEvent
208*ba62d9d3SAndroid Build Coastguard Worker //!     3) A boolean value to indicate if or not to flush the queue after enqueue the task
209*ba62d9d3SAndroid Build Coastguard Worker //!        by default the boolean value is TRUE.
210*ba62d9d3SAndroid Build Coastguard Worker //! OUTPUT:
211*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
212*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
213*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
214*ba62d9d3SAndroid Build Coastguard Worker //!     More error code is coming.
215*ba62d9d3SAndroid Build Coastguard Worker //!
Enqueue(CmTask * task,CmEvent * & event,const CmThreadSpace * threadSpace)216*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::Enqueue(CmTask *task,
217*ba62d9d3SAndroid Build Coastguard Worker                                   CmEvent *&event,
218*ba62d9d3SAndroid Build Coastguard Worker                                   const CmThreadSpace *threadSpace)
219*ba62d9d3SAndroid Build Coastguard Worker {
220*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
221*ba62d9d3SAndroid Build Coastguard Worker     if (task == nullptr)
222*ba62d9d3SAndroid Build Coastguard Worker     {
223*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
224*ba62d9d3SAndroid Build Coastguard Worker         CmDebugMessage(("Kernel array is NULL."));
225*ba62d9d3SAndroid Build Coastguard Worker         return CM_INVALID_ARG_VALUE;
226*ba62d9d3SAndroid Build Coastguard Worker     }
227*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
228*ba62d9d3SAndroid Build Coastguard Worker 
229*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_PARAM inParam;
230*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
231*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTaskHandle = task;
232*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
233*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmThreadSpaceHandle = (void *)threadSpace;
234*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;  // to support invisiable event, this field is used for input/output.
235*ba62d9d3SAndroid Build Coastguard Worker 
236*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUE,
237*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
238*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
239*ba62d9d3SAndroid Build Coastguard Worker     {
240*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
241*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
242*ba62d9d3SAndroid Build Coastguard Worker         return hr;
243*ba62d9d3SAndroid Build Coastguard Worker     }
244*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
245*ba62d9d3SAndroid Build Coastguard Worker     {
246*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
247*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
248*ba62d9d3SAndroid Build Coastguard Worker     }
249*ba62d9d3SAndroid Build Coastguard Worker 
250*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
251*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
252*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
253*ba62d9d3SAndroid Build Coastguard Worker }
254*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueWithHints(CmTask * task,CmEvent * & event,uint32_t hints)255*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueWithHints(CmTask *task,
256*ba62d9d3SAndroid Build Coastguard Worker                                            CmEvent *&event,
257*ba62d9d3SAndroid Build Coastguard Worker                                            uint32_t hints)
258*ba62d9d3SAndroid Build Coastguard Worker {
259*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
260*ba62d9d3SAndroid Build Coastguard Worker     if (task == nullptr)
261*ba62d9d3SAndroid Build Coastguard Worker     {
262*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
263*ba62d9d3SAndroid Build Coastguard Worker         CmDebugMessage(("Kernel array is NULL."));
264*ba62d9d3SAndroid Build Coastguard Worker         return CM_INVALID_ARG_VALUE;
265*ba62d9d3SAndroid Build Coastguard Worker     }
266*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
267*ba62d9d3SAndroid Build Coastguard Worker 
268*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUEHINTS_PARAM inParam;
269*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
270*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTaskHandle = task;
271*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
272*ba62d9d3SAndroid Build Coastguard Worker     inParam.hints = hints;
273*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;  // to support invisable event, this field is used for input/output
274*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr =
275*ba62d9d3SAndroid Build Coastguard Worker         m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUEWITHHINTS,
276*ba62d9d3SAndroid Build Coastguard Worker                                        &inParam, sizeof(inParam));
277*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
278*ba62d9d3SAndroid Build Coastguard Worker     {
279*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
280*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
281*ba62d9d3SAndroid Build Coastguard Worker         return hr;
282*ba62d9d3SAndroid Build Coastguard Worker     }
283*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
284*ba62d9d3SAndroid Build Coastguard Worker     {
285*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
286*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
287*ba62d9d3SAndroid Build Coastguard Worker     }
288*ba62d9d3SAndroid Build Coastguard Worker 
289*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
290*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
291*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
292*ba62d9d3SAndroid Build Coastguard Worker }
293*ba62d9d3SAndroid Build Coastguard Worker 
294*ba62d9d3SAndroid Build Coastguard Worker //!
295*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task, which contains one pre-defined kernel to
296*ba62d9d3SAndroid Build Coastguard Worker //! copy from host memory to surface
297*ba62d9d3SAndroid Build Coastguard Worker //! This is a non-blocking call. i.e. it returs immediately without waiting for
298*ba62d9d3SAndroid Build Coastguard Worker //! GPU to finish the execution of the task.
299*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
300*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
301*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
302*ba62d9d3SAndroid Build Coastguard Worker //!     1) Pointer to the CmSurface2D_RT as copy destination
303*ba62d9d3SAndroid Build Coastguard Worker //!     2) Pointer to the host memory as copy source
304*ba62d9d3SAndroid Build Coastguard Worker //!     3) Reference to the pointer to CMEvent
305*ba62d9d3SAndroid Build Coastguard Worker //!     4) A boolean value to indicate if or not to flush the queue after enqueue the task
306*ba62d9d3SAndroid Build Coastguard Worker //!        by default the boolean value is TRUE.
307*ba62d9d3SAndroid Build Coastguard Worker //! OUTPUT:
308*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
309*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
310*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
311*ba62d9d3SAndroid Build Coastguard Worker //!     More error code is coming.
312*ba62d9d3SAndroid Build Coastguard Worker //!
EnqueueCopyCPUToGPU(CmSurface2D * surface,const unsigned char * sysMem,CmEvent * & event)313*ba62d9d3SAndroid Build Coastguard Worker int32_t CmQueue_RT::EnqueueCopyCPUToGPU(CmSurface2D *surface,
314*ba62d9d3SAndroid Build Coastguard Worker                                     const unsigned char *sysMem,
315*ba62d9d3SAndroid Build Coastguard Worker                                     CmEvent *&event)
316*ba62d9d3SAndroid Build Coastguard Worker {
317*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
318*ba62d9d3SAndroid Build Coastguard Worker     return EnqueueCopy(surface,
319*ba62d9d3SAndroid Build Coastguard Worker                        sysMem,
320*ba62d9d3SAndroid Build Coastguard Worker                        0,
321*ba62d9d3SAndroid Build Coastguard Worker                        0,
322*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_CPU2GPU,
323*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_OPTION_NONBLOCKING,
324*ba62d9d3SAndroid Build Coastguard Worker                        event);
325*ba62d9d3SAndroid Build Coastguard Worker }
326*ba62d9d3SAndroid Build Coastguard Worker 
327*ba62d9d3SAndroid Build Coastguard Worker //!
328*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task, which contains one pre-defined kernel to
329*ba62d9d3SAndroid Build Coastguard Worker //! copy from surface to host memory
330*ba62d9d3SAndroid Build Coastguard Worker //! This is a non-blocking call. i.e. it returs immediately without waiting for
331*ba62d9d3SAndroid Build Coastguard Worker //! GPU to finish the execution of the task.
332*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
333*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
334*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
335*ba62d9d3SAndroid Build Coastguard Worker //!     1) Pointer to the CmSurface2D_RT as copy source
336*ba62d9d3SAndroid Build Coastguard Worker //!     2) Pointer to the host memory as copy destination
337*ba62d9d3SAndroid Build Coastguard Worker //!     3) Reference to the pointer to CMEvent
338*ba62d9d3SAndroid Build Coastguard Worker //!     4) A boolean value to indicate if or not to flush the queue after enqueue the task
339*ba62d9d3SAndroid Build Coastguard Worker //!        by default the boolean value is TRUE.
340*ba62d9d3SAndroid Build Coastguard Worker //! OUTPUT:
341*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
342*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
343*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
344*ba62d9d3SAndroid Build Coastguard Worker //!     More error code is coming.
345*ba62d9d3SAndroid Build Coastguard Worker //!
EnqueueCopyGPUToCPU(CmSurface2D * surface,unsigned char * sysMem,CmEvent * & event)346*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueCopyGPUToCPU(CmSurface2D *surface,
347*ba62d9d3SAndroid Build Coastguard Worker                                               unsigned char *sysMem,
348*ba62d9d3SAndroid Build Coastguard Worker                                               CmEvent *&event)
349*ba62d9d3SAndroid Build Coastguard Worker {
350*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
351*ba62d9d3SAndroid Build Coastguard Worker     return EnqueueCopy(surface,
352*ba62d9d3SAndroid Build Coastguard Worker                        sysMem,
353*ba62d9d3SAndroid Build Coastguard Worker                        0,
354*ba62d9d3SAndroid Build Coastguard Worker                        0,
355*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_GPU2CPU,
356*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_OPTION_NONBLOCKING,
357*ba62d9d3SAndroid Build Coastguard Worker                        event);
358*ba62d9d3SAndroid Build Coastguard Worker }
359*ba62d9d3SAndroid Build Coastguard Worker 
360*ba62d9d3SAndroid Build Coastguard Worker //!
361*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task, which contains one pre-defined kernel to
362*ba62d9d3SAndroid Build Coastguard Worker //! copy from linear system memory to tiled video memory
363*ba62d9d3SAndroid Build Coastguard Worker //! This API supports both blocking/non-blocking copy, if user pass CM_GPUCOPY_OPTION_BLOCKING as option,
364*ba62d9d3SAndroid Build Coastguard Worker //! this API only return till copy operation is done. otherwise, this API will return immediately no waiting for copy in GPU.
365*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
366*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
367*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
368*ba62d9d3SAndroid Build Coastguard Worker //!     1) Pointer to the CmSurface2D as copy destination
369*ba62d9d3SAndroid Build Coastguard Worker //!     2) Pointer to the host memory as copy resource
370*ba62d9d3SAndroid Build Coastguard Worker //!     3) width stride in bytes for system memory
371*ba62d9d3SAndroid Build Coastguard Worker //!     4) height stride in rows for system memory
372*ba62d9d3SAndroid Build Coastguard Worker //!     5) option: CM_FASTCOPY_OPTION_NONBLOCKING,CM_FASTCOPY_OPTION_BLOCKING or CM_FASTCOPY_OPTION_DISABLE_TURBO_BOOST
373*ba62d9d3SAndroid Build Coastguard Worker //!     6) Reference to the pointer to CMEvent
374*ba62d9d3SAndroid Build Coastguard Worker //!
375*ba62d9d3SAndroid Build Coastguard Worker //! RETURNS:
376*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
377*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
378*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
379*ba62d9d3SAndroid Build Coastguard Worker //!
380*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t
EnqueueCopyCPUToGPUFullStride(CmSurface2D * surface,const unsigned char * sysMem,const uint32_t widthStride,const uint32_t heightStride,const uint32_t option,CmEvent * & event)381*ba62d9d3SAndroid Build Coastguard Worker CmQueue_RT::EnqueueCopyCPUToGPUFullStride(CmSurface2D *surface,
382*ba62d9d3SAndroid Build Coastguard Worker                                           const unsigned char *sysMem,
383*ba62d9d3SAndroid Build Coastguard Worker                                           const uint32_t widthStride,
384*ba62d9d3SAndroid Build Coastguard Worker                                           const uint32_t heightStride,
385*ba62d9d3SAndroid Build Coastguard Worker                                           const uint32_t option,
386*ba62d9d3SAndroid Build Coastguard Worker                                           CmEvent *&event)
387*ba62d9d3SAndroid Build Coastguard Worker {
388*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
389*ba62d9d3SAndroid Build Coastguard Worker     return EnqueueCopy(surface,
390*ba62d9d3SAndroid Build Coastguard Worker                        sysMem,
391*ba62d9d3SAndroid Build Coastguard Worker                        widthStride,
392*ba62d9d3SAndroid Build Coastguard Worker                        heightStride,
393*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_CPU2GPU,
394*ba62d9d3SAndroid Build Coastguard Worker                        option,
395*ba62d9d3SAndroid Build Coastguard Worker                        event);
396*ba62d9d3SAndroid Build Coastguard Worker }
397*ba62d9d3SAndroid Build Coastguard Worker 
398*ba62d9d3SAndroid Build Coastguard Worker //!
399*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task, which contains one pre-defined kernel to
400*ba62d9d3SAndroid Build Coastguard Worker //! copy from tiled video memory to linear system memory
401*ba62d9d3SAndroid Build Coastguard Worker //! This API supports both blocking/non-blocking copy, if user pass CM_FASTCOPY_OPTION_BLOCKING as option,
402*ba62d9d3SAndroid Build Coastguard Worker //! this API only return till copy operation is done. otherwise, this API will return immediately no waiting for copy in GPU.
403*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
404*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
405*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
406*ba62d9d3SAndroid Build Coastguard Worker //!     1) Pointer to the CmSurface2D as copy resource
407*ba62d9d3SAndroid Build Coastguard Worker //!     2) Pointer to the host memory as copy destination
408*ba62d9d3SAndroid Build Coastguard Worker //!     3) width stride in bytes for system memory
409*ba62d9d3SAndroid Build Coastguard Worker //!     4) height stride in rows for system memory
410*ba62d9d3SAndroid Build Coastguard Worker //!     5) option: CM_FASTCOPY_OPTION_NONBLOCKING or CM_FASTCOPY_OPTION_BLOCKING
411*ba62d9d3SAndroid Build Coastguard Worker //!     6) Reference to the pointer to CMEvent
412*ba62d9d3SAndroid Build Coastguard Worker //!
413*ba62d9d3SAndroid Build Coastguard Worker //! RETURNS:
414*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
415*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
416*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
417*ba62d9d3SAndroid Build Coastguard Worker //!
EnqueueCopyGPUToCPUFullStride(CmSurface2D * surface,unsigned char * sysMem,const uint32_t widthStride,const uint32_t heightStride,const uint32_t option,CmEvent * & event)418*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueCopyGPUToCPUFullStride(CmSurface2D *surface,
419*ba62d9d3SAndroid Build Coastguard Worker                                                         unsigned char *sysMem,
420*ba62d9d3SAndroid Build Coastguard Worker                                                         const uint32_t widthStride,
421*ba62d9d3SAndroid Build Coastguard Worker                                                         const uint32_t heightStride,
422*ba62d9d3SAndroid Build Coastguard Worker                                                         const uint32_t option,
423*ba62d9d3SAndroid Build Coastguard Worker                                                         CmEvent *&event)
424*ba62d9d3SAndroid Build Coastguard Worker {
425*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
426*ba62d9d3SAndroid Build Coastguard Worker     return EnqueueCopy(surface,
427*ba62d9d3SAndroid Build Coastguard Worker                        sysMem,
428*ba62d9d3SAndroid Build Coastguard Worker                        widthStride,
429*ba62d9d3SAndroid Build Coastguard Worker                        heightStride,
430*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_GPU2CPU,
431*ba62d9d3SAndroid Build Coastguard Worker                        option,
432*ba62d9d3SAndroid Build Coastguard Worker                        event);
433*ba62d9d3SAndroid Build Coastguard Worker }
434*ba62d9d3SAndroid Build Coastguard Worker 
435*ba62d9d3SAndroid Build Coastguard Worker //!
436*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task, which contains one pre-defined kernel to
437*ba62d9d3SAndroid Build Coastguard Worker //! copy from linear system memory to tiled video memory
438*ba62d9d3SAndroid Build Coastguard Worker //! This API supports both blocking/non-blocking copy, if user pass CM_GPUCOPY_OPTION_BLOCKING as option,
439*ba62d9d3SAndroid Build Coastguard Worker //! this API only return till copy operation is done. otherwise, this API will return immediately no waiting for copy in GPU.
440*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
441*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
442*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
443*ba62d9d3SAndroid Build Coastguard Worker //!     1) Pointer to the CmSurface2D as copy destination
444*ba62d9d3SAndroid Build Coastguard Worker //!     2) Pointer to the host memory as copy resource
445*ba62d9d3SAndroid Build Coastguard Worker //!     3) width stride in bytes for system memory
446*ba62d9d3SAndroid Build Coastguard Worker //!     4) height stride in rows for system memory
447*ba62d9d3SAndroid Build Coastguard Worker //!     5) option: CM_FASTCOPY_OPTION_NONBLOCKING,CM_FASTCOPY_OPTION_BLOCKING or CM_FASTCOPY_OPTION_DISABLE_TURBO_BOOST
448*ba62d9d3SAndroid Build Coastguard Worker //!     6) Reference to the pointer to CMEvent
449*ba62d9d3SAndroid Build Coastguard Worker //!
450*ba62d9d3SAndroid Build Coastguard Worker //! RETURNS:
451*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
452*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
453*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
454*ba62d9d3SAndroid Build Coastguard Worker //!
455*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t
EnqueueCopyCPUToGPUFullStrideDup(CmSurface2D * surface,const unsigned char * sysMem,const uint32_t widthStride,const uint32_t heightStride,const uint32_t option,CmEvent * & event)456*ba62d9d3SAndroid Build Coastguard Worker CmQueue_RT::EnqueueCopyCPUToGPUFullStrideDup(CmSurface2D *surface,
457*ba62d9d3SAndroid Build Coastguard Worker                                           const unsigned char *sysMem,
458*ba62d9d3SAndroid Build Coastguard Worker                                           const uint32_t widthStride,
459*ba62d9d3SAndroid Build Coastguard Worker                                           const uint32_t heightStride,
460*ba62d9d3SAndroid Build Coastguard Worker                                           const uint32_t option,
461*ba62d9d3SAndroid Build Coastguard Worker                                           CmEvent *&event)
462*ba62d9d3SAndroid Build Coastguard Worker {
463*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
464*ba62d9d3SAndroid Build Coastguard Worker     return EnqueueCopy(surface,
465*ba62d9d3SAndroid Build Coastguard Worker                        sysMem,
466*ba62d9d3SAndroid Build Coastguard Worker                        widthStride,
467*ba62d9d3SAndroid Build Coastguard Worker                        heightStride,
468*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_CPU2GPU,
469*ba62d9d3SAndroid Build Coastguard Worker                        option,
470*ba62d9d3SAndroid Build Coastguard Worker                        event);
471*ba62d9d3SAndroid Build Coastguard Worker }
472*ba62d9d3SAndroid Build Coastguard Worker 
473*ba62d9d3SAndroid Build Coastguard Worker //!
474*ba62d9d3SAndroid Build Coastguard Worker //! Enqueue an task, which contains one pre-defined kernel to
475*ba62d9d3SAndroid Build Coastguard Worker //! copy from tiled video memory to linear system memory
476*ba62d9d3SAndroid Build Coastguard Worker //! This API supports both blocking/non-blocking copy, if user pass CM_FASTCOPY_OPTION_BLOCKING as option,
477*ba62d9d3SAndroid Build Coastguard Worker //! this API only return till copy operation is done. otherwise, this API will return immediately no waiting for copy in GPU.
478*ba62d9d3SAndroid Build Coastguard Worker //! A CmEvent is generated each time a task is enqueued. The CmEvent can
479*ba62d9d3SAndroid Build Coastguard Worker //! be used to check if the task finishs.
480*ba62d9d3SAndroid Build Coastguard Worker //! INPUT:
481*ba62d9d3SAndroid Build Coastguard Worker //!     1) Pointer to the CmSurface2D as copy resource
482*ba62d9d3SAndroid Build Coastguard Worker //!     2) Pointer to the host memory as copy destination
483*ba62d9d3SAndroid Build Coastguard Worker //!     3) width stride in bytes for system memory
484*ba62d9d3SAndroid Build Coastguard Worker //!     4) height stride in rows for system memory
485*ba62d9d3SAndroid Build Coastguard Worker //!     5) option: CM_FASTCOPY_OPTION_NONBLOCKING or CM_FASTCOPY_OPTION_BLOCKING
486*ba62d9d3SAndroid Build Coastguard Worker //!     6) Reference to the pointer to CMEvent
487*ba62d9d3SAndroid Build Coastguard Worker //!
488*ba62d9d3SAndroid Build Coastguard Worker //! RETURNS:
489*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated;
490*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memery;
491*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise.
492*ba62d9d3SAndroid Build Coastguard Worker //!
EnqueueCopyGPUToCPUFullStrideDup(CmSurface2D * surface,unsigned char * sysMem,const uint32_t widthStride,const uint32_t heightStride,const uint32_t option,CmEvent * & event)493*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueCopyGPUToCPUFullStrideDup(CmSurface2D *surface,
494*ba62d9d3SAndroid Build Coastguard Worker                                                         unsigned char *sysMem,
495*ba62d9d3SAndroid Build Coastguard Worker                                                         const uint32_t widthStride,
496*ba62d9d3SAndroid Build Coastguard Worker                                                         const uint32_t heightStride,
497*ba62d9d3SAndroid Build Coastguard Worker                                                         const uint32_t option,
498*ba62d9d3SAndroid Build Coastguard Worker                                                         CmEvent *&event)
499*ba62d9d3SAndroid Build Coastguard Worker {
500*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
501*ba62d9d3SAndroid Build Coastguard Worker     return EnqueueCopy(surface,
502*ba62d9d3SAndroid Build Coastguard Worker                        sysMem,
503*ba62d9d3SAndroid Build Coastguard Worker                        widthStride,
504*ba62d9d3SAndroid Build Coastguard Worker                        heightStride,
505*ba62d9d3SAndroid Build Coastguard Worker                        CM_FASTCOPY_GPU2CPU,
506*ba62d9d3SAndroid Build Coastguard Worker                        option,
507*ba62d9d3SAndroid Build Coastguard Worker                        event);
508*ba62d9d3SAndroid Build Coastguard Worker }
509*ba62d9d3SAndroid Build Coastguard Worker 
DestroyEvent(CmEvent * & event)510*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::DestroyEvent(CmEvent *&event)
511*ba62d9d3SAndroid Build Coastguard Worker {
512*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
513*ba62d9d3SAndroid Build Coastguard Worker     if (event == nullptr)
514*ba62d9d3SAndroid Build Coastguard Worker     {
515*ba62d9d3SAndroid Build Coastguard Worker         return CM_FAILURE;
516*ba62d9d3SAndroid Build Coastguard Worker     }
517*ba62d9d3SAndroid Build Coastguard Worker 
518*ba62d9d3SAndroid Build Coastguard Worker     CM_DESTROYEVENT_PARAM inParam;
519*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
520*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
521*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
522*ba62d9d3SAndroid Build Coastguard Worker 
523*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_DESTROYEVENT,
524*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
525*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(hr);
526*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(inParam.returnValue);
527*ba62d9d3SAndroid Build Coastguard Worker     event = nullptr;
528*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
529*ba62d9d3SAndroid Build Coastguard Worker }
530*ba62d9d3SAndroid Build Coastguard Worker 
531*ba62d9d3SAndroid Build Coastguard Worker //!
532*ba62d9d3SAndroid Build Coastguard Worker //! Function to enqueue task with thread group space pointer
533*ba62d9d3SAndroid Build Coastguard Worker //! Arguments:
534*ba62d9d3SAndroid Build Coastguard Worker //!     1. Pointer to CmTask, which can only contain one kernel.
535*ba62d9d3SAndroid Build Coastguard Worker //!     2. Reference to the pointer to CmEvent that is to be returned
536*ba62d9d3SAndroid Build Coastguard Worker //!     3. Pointer to a CmThreadGroupSpace.
537*ba62d9d3SAndroid Build Coastguard Worker //! Return Value:
538*ba62d9d3SAndroid Build Coastguard Worker //!     CM_SUCCESS if the task is successfully enqueued and the CmEvent is generated
539*ba62d9d3SAndroid Build Coastguard Worker //!     CM_OUT_OF_HOST_MEMORY if out of host memory
540*ba62d9d3SAndroid Build Coastguard Worker //!     CM_FAILURE otherwise
541*ba62d9d3SAndroid Build Coastguard Worker //! Notes:
542*ba62d9d3SAndroid Build Coastguard Worker //!     If the kernel has per thread arg, GPGPU object is to be used.
543*ba62d9d3SAndroid Build Coastguard Worker //!     If the kernel has no per thread  arg. GPGPU walker is used.
544*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t
EnqueueWithGroup(CmTask * task,CmEvent * & event,const CmThreadGroupSpace * threadGroupSpace)545*ba62d9d3SAndroid Build Coastguard Worker CmQueue_RT::EnqueueWithGroup(CmTask *task,
546*ba62d9d3SAndroid Build Coastguard Worker                              CmEvent *&event,
547*ba62d9d3SAndroid Build Coastguard Worker                              const CmThreadGroupSpace *threadGroupSpace)
548*ba62d9d3SAndroid Build Coastguard Worker {
549*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
550*ba62d9d3SAndroid Build Coastguard Worker     if (task == nullptr)
551*ba62d9d3SAndroid Build Coastguard Worker     {
552*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
553*ba62d9d3SAndroid Build Coastguard Worker         CmDebugMessage(("Kernel array is NULL."));
554*ba62d9d3SAndroid Build Coastguard Worker         return CM_INVALID_ARG_VALUE;
555*ba62d9d3SAndroid Build Coastguard Worker     }
556*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
557*ba62d9d3SAndroid Build Coastguard Worker 
558*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUEGROUP_PARAM inParam;
559*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
560*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTaskHandle = task;
561*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
562*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTGrpSpaceHandle = (void *)threadGroupSpace;
563*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;  // to support invisiable event, this field is used for input/output.
564*ba62d9d3SAndroid Build Coastguard Worker 
565*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr =
566*ba62d9d3SAndroid Build Coastguard Worker         m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUEWITHGROUP,
567*ba62d9d3SAndroid Build Coastguard Worker                                        &inParam, sizeof(inParam));
568*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
569*ba62d9d3SAndroid Build Coastguard Worker     {
570*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
571*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
572*ba62d9d3SAndroid Build Coastguard Worker         return hr;
573*ba62d9d3SAndroid Build Coastguard Worker     }
574*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
575*ba62d9d3SAndroid Build Coastguard Worker     {
576*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
577*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
578*ba62d9d3SAndroid Build Coastguard Worker     }
579*ba62d9d3SAndroid Build Coastguard Worker 
580*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
581*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
582*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
583*ba62d9d3SAndroid Build Coastguard Worker }
584*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueCopy(CmSurface2D * surface,const unsigned char * sysMem,const uint32_t widthStride,const uint32_t heightStride,CM_FASTCOPY_DIRECTION direction,const uint32_t option,CmEvent * & event)585*ba62d9d3SAndroid Build Coastguard Worker int32_t CmQueue_RT::EnqueueCopy(CmSurface2D *surface,
586*ba62d9d3SAndroid Build Coastguard Worker                             const unsigned char *sysMem,
587*ba62d9d3SAndroid Build Coastguard Worker                             const uint32_t widthStride,
588*ba62d9d3SAndroid Build Coastguard Worker                             const uint32_t heightStride,
589*ba62d9d3SAndroid Build Coastguard Worker                             CM_FASTCOPY_DIRECTION direction,
590*ba62d9d3SAndroid Build Coastguard Worker                             const uint32_t option,
591*ba62d9d3SAndroid Build Coastguard Worker                             CmEvent *&event)
592*ba62d9d3SAndroid Build Coastguard Worker {
593*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_GPUCOPY_PARAM inParam;
594*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
595*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
596*ba62d9d3SAndroid Build Coastguard Worker 
597*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmSurface2d = surface;
598*ba62d9d3SAndroid Build Coastguard Worker     inParam.sysMem = (void *)sysMem;
599*ba62d9d3SAndroid Build Coastguard Worker     inParam.copyDir = direction;
600*ba62d9d3SAndroid Build Coastguard Worker     inParam.widthStride = widthStride;
601*ba62d9d3SAndroid Build Coastguard Worker     inParam.heightStride = heightStride;
602*ba62d9d3SAndroid Build Coastguard Worker     inParam.option = option;
603*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
604*ba62d9d3SAndroid Build Coastguard Worker 
605*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
606*ba62d9d3SAndroid Build Coastguard Worker 
607*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUECOPY,
608*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam),
609*ba62d9d3SAndroid Build Coastguard Worker                                                 nullptr, 0);
610*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
611*ba62d9d3SAndroid Build Coastguard Worker     {
612*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
613*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
614*ba62d9d3SAndroid Build Coastguard Worker         return hr;
615*ba62d9d3SAndroid Build Coastguard Worker     }
616*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
617*ba62d9d3SAndroid Build Coastguard Worker     {
618*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
619*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
620*ba62d9d3SAndroid Build Coastguard Worker     }
621*ba62d9d3SAndroid Build Coastguard Worker 
622*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
623*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
624*ba62d9d3SAndroid Build Coastguard Worker     return hr;
625*ba62d9d3SAndroid Build Coastguard Worker }
626*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueInitSurface2D(CmSurface2D * surface,const uint32_t initValue,CmEvent * & event)627*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueInitSurface2D(CmSurface2D *surface,
628*ba62d9d3SAndroid Build Coastguard Worker                                                const uint32_t initValue,
629*ba62d9d3SAndroid Build Coastguard Worker                                                CmEvent *&event)
630*ba62d9d3SAndroid Build Coastguard Worker {
631*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
632*ba62d9d3SAndroid Build Coastguard Worker 
633*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_2DInit_PARAM inParam;
634*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
635*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
636*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
637*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmSurface2d = surface;
638*ba62d9d3SAndroid Build Coastguard Worker     inParam.initValue  = initValue;
639*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
640*ba62d9d3SAndroid Build Coastguard Worker 
641*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUESURF2DINIT,
642*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
643*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
644*ba62d9d3SAndroid Build Coastguard Worker     {
645*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
646*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
647*ba62d9d3SAndroid Build Coastguard Worker         return hr;
648*ba62d9d3SAndroid Build Coastguard Worker     }
649*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
650*ba62d9d3SAndroid Build Coastguard Worker     {
651*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
652*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
653*ba62d9d3SAndroid Build Coastguard Worker     }
654*ba62d9d3SAndroid Build Coastguard Worker 
655*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
656*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
657*ba62d9d3SAndroid Build Coastguard Worker     return hr;
658*ba62d9d3SAndroid Build Coastguard Worker }
659*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueCopyGPUToGPU(CmSurface2D * outputSurface,CmSurface2D * inputSurface,uint32_t option,CmEvent * & event)660*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueCopyGPUToGPU(CmSurface2D *outputSurface,
661*ba62d9d3SAndroid Build Coastguard Worker                                               CmSurface2D *inputSurface,
662*ba62d9d3SAndroid Build Coastguard Worker                                               uint32_t option,
663*ba62d9d3SAndroid Build Coastguard Worker                                               CmEvent *&event)
664*ba62d9d3SAndroid Build Coastguard Worker {
665*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
666*ba62d9d3SAndroid Build Coastguard Worker 
667*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_GPUCOPY_V2V_PARAM inParam;
668*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
669*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
670*ba62d9d3SAndroid Build Coastguard Worker     inParam.option        = option;
671*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
672*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmDstSurface2d = outputSurface;
673*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmSrcSurface2d = inputSurface;
674*ba62d9d3SAndroid Build Coastguard Worker 
675*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
676*ba62d9d3SAndroid Build Coastguard Worker 
677*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUECOPY_V2V,
678*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
679*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
680*ba62d9d3SAndroid Build Coastguard Worker     {
681*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
682*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
683*ba62d9d3SAndroid Build Coastguard Worker         return hr;
684*ba62d9d3SAndroid Build Coastguard Worker     }
685*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
686*ba62d9d3SAndroid Build Coastguard Worker     {
687*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
688*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
689*ba62d9d3SAndroid Build Coastguard Worker     }
690*ba62d9d3SAndroid Build Coastguard Worker 
691*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
692*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
693*ba62d9d3SAndroid Build Coastguard Worker     return hr;
694*ba62d9d3SAndroid Build Coastguard Worker }
695*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueCopyCPUToCPU(unsigned char * dstSysMem,unsigned char * srcSysMem,uint32_t size,uint32_t option,CmEvent * & event)696*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueCopyCPUToCPU(unsigned char *dstSysMem,
697*ba62d9d3SAndroid Build Coastguard Worker                                               unsigned char *srcSysMem,
698*ba62d9d3SAndroid Build Coastguard Worker                                               uint32_t size,
699*ba62d9d3SAndroid Build Coastguard Worker                                               uint32_t option,
700*ba62d9d3SAndroid Build Coastguard Worker                                               CmEvent *&event)
701*ba62d9d3SAndroid Build Coastguard Worker {
702*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
703*ba62d9d3SAndroid Build Coastguard Worker 
704*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_GPUCOPY_L2L_PARAM inParam;
705*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
706*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
707*ba62d9d3SAndroid Build Coastguard Worker     inParam.srcSysMem     = srcSysMem;
708*ba62d9d3SAndroid Build Coastguard Worker     inParam.dstSysMem     = dstSysMem;
709*ba62d9d3SAndroid Build Coastguard Worker     inParam.copySize       = size;
710*ba62d9d3SAndroid Build Coastguard Worker     inParam.option        = option;
711*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
712*ba62d9d3SAndroid Build Coastguard Worker 
713*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
714*ba62d9d3SAndroid Build Coastguard Worker 
715*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUECOPY_L2L,
716*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
717*ba62d9d3SAndroid Build Coastguard Worker 
718*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
719*ba62d9d3SAndroid Build Coastguard Worker     {
720*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
721*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
722*ba62d9d3SAndroid Build Coastguard Worker         return hr;
723*ba62d9d3SAndroid Build Coastguard Worker     }
724*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
725*ba62d9d3SAndroid Build Coastguard Worker     {
726*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
727*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
728*ba62d9d3SAndroid Build Coastguard Worker     }
729*ba62d9d3SAndroid Build Coastguard Worker 
730*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
731*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
732*ba62d9d3SAndroid Build Coastguard Worker     return hr;
733*ba62d9d3SAndroid Build Coastguard Worker }
734*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueVebox(CmVebox * vebox,CmEvent * & event)735*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueVebox(CmVebox *vebox, CmEvent *&event)
736*ba62d9d3SAndroid Build Coastguard Worker {
737*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
738*ba62d9d3SAndroid Build Coastguard Worker 
739*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_VEBOX_PARAM inParam;
740*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
741*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
742*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmVeboxHandle = vebox;
743*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
744*ba62d9d3SAndroid Build Coastguard Worker 
745*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
746*ba62d9d3SAndroid Build Coastguard Worker 
747*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUEVEBOX,
748*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
749*ba62d9d3SAndroid Build Coastguard Worker 
750*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
751*ba62d9d3SAndroid Build Coastguard Worker     {
752*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
753*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
754*ba62d9d3SAndroid Build Coastguard Worker         return hr;
755*ba62d9d3SAndroid Build Coastguard Worker     }
756*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
757*ba62d9d3SAndroid Build Coastguard Worker     {
758*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
759*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
760*ba62d9d3SAndroid Build Coastguard Worker     }
761*ba62d9d3SAndroid Build Coastguard Worker 
762*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
763*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
764*ba62d9d3SAndroid Build Coastguard Worker     return hr;
765*ba62d9d3SAndroid Build Coastguard Worker }
766*ba62d9d3SAndroid Build Coastguard Worker 
GetQueueOption()767*ba62d9d3SAndroid Build Coastguard Worker CM_QUEUE_CREATE_OPTION CmQueue_RT::GetQueueOption()
768*ba62d9d3SAndroid Build Coastguard Worker {
769*ba62d9d3SAndroid Build Coastguard Worker     return m_queueOption;
770*ba62d9d3SAndroid Build Coastguard Worker }
771*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueFast(CmTask * task,CmEvent * & event,const CmThreadSpace * threadSpace)772*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueFast(CmTask *task,
773*ba62d9d3SAndroid Build Coastguard Worker                               CmEvent *&event,
774*ba62d9d3SAndroid Build Coastguard Worker                               const CmThreadSpace *threadSpace)
775*ba62d9d3SAndroid Build Coastguard Worker {
776*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
777*ba62d9d3SAndroid Build Coastguard Worker     if (task == nullptr)
778*ba62d9d3SAndroid Build Coastguard Worker     {
779*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
780*ba62d9d3SAndroid Build Coastguard Worker         CmDebugMessage(("Kernel array is NULL."));
781*ba62d9d3SAndroid Build Coastguard Worker         return CM_INVALID_ARG_VALUE;
782*ba62d9d3SAndroid Build Coastguard Worker     }
783*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
784*ba62d9d3SAndroid Build Coastguard Worker 
785*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_PARAM inParam;
786*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
787*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTaskHandle = task;
788*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
789*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmThreadSpaceHandle = (void *)threadSpace;
790*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;  // to support invisiable event, this field is used for input/output.
791*ba62d9d3SAndroid Build Coastguard Worker 
792*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUEFAST,
793*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
794*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
795*ba62d9d3SAndroid Build Coastguard Worker     {
796*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
797*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
798*ba62d9d3SAndroid Build Coastguard Worker         return hr;
799*ba62d9d3SAndroid Build Coastguard Worker     }
800*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
801*ba62d9d3SAndroid Build Coastguard Worker     {
802*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
803*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
804*ba62d9d3SAndroid Build Coastguard Worker     }
805*ba62d9d3SAndroid Build Coastguard Worker 
806*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
807*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
808*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
809*ba62d9d3SAndroid Build Coastguard Worker }
810*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueWithGroupFast(CmTask * task,CmEvent * & event,const CmThreadGroupSpace * threadGroupSpace)811*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueWithGroupFast(CmTask *task,
812*ba62d9d3SAndroid Build Coastguard Worker                               CmEvent *&event,
813*ba62d9d3SAndroid Build Coastguard Worker                               const CmThreadGroupSpace *threadGroupSpace)
814*ba62d9d3SAndroid Build Coastguard Worker {
815*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
816*ba62d9d3SAndroid Build Coastguard Worker     if (task == nullptr)
817*ba62d9d3SAndroid Build Coastguard Worker     {
818*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
819*ba62d9d3SAndroid Build Coastguard Worker         CmDebugMessage(("Kernel array is NULL."));
820*ba62d9d3SAndroid Build Coastguard Worker         return CM_INVALID_ARG_VALUE;
821*ba62d9d3SAndroid Build Coastguard Worker     }
822*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
823*ba62d9d3SAndroid Build Coastguard Worker 
824*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUEGROUP_PARAM inParam;
825*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
826*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTaskHandle = task;
827*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
828*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmTGrpSpaceHandle = (void *)threadGroupSpace;
829*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;  // to support invisiable event, this field is used for input/output.
830*ba62d9d3SAndroid Build Coastguard Worker 
831*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr =
832*ba62d9d3SAndroid Build Coastguard Worker         m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUEWITHGROUPFAST,
833*ba62d9d3SAndroid Build Coastguard Worker                                        &inParam, sizeof(inParam));
834*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
835*ba62d9d3SAndroid Build Coastguard Worker     {
836*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
837*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
838*ba62d9d3SAndroid Build Coastguard Worker         return hr;
839*ba62d9d3SAndroid Build Coastguard Worker     }
840*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
841*ba62d9d3SAndroid Build Coastguard Worker     {
842*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
843*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
844*ba62d9d3SAndroid Build Coastguard Worker     }
845*ba62d9d3SAndroid Build Coastguard Worker 
846*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent *>(inParam.cmEventHandle);
847*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
848*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
849*ba62d9d3SAndroid Build Coastguard Worker 
850*ba62d9d3SAndroid Build Coastguard Worker }
851*ba62d9d3SAndroid Build Coastguard Worker 
852*ba62d9d3SAndroid Build Coastguard Worker 
DestroyEventFast(CmEvent * & event)853*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::DestroyEventFast(CmEvent *&event)
854*ba62d9d3SAndroid Build Coastguard Worker {
855*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
856*ba62d9d3SAndroid Build Coastguard Worker     if (event == nullptr)
857*ba62d9d3SAndroid Build Coastguard Worker     {
858*ba62d9d3SAndroid Build Coastguard Worker         return CM_INVALID_ARG_VALUE;
859*ba62d9d3SAndroid Build Coastguard Worker     }
860*ba62d9d3SAndroid Build Coastguard Worker 
861*ba62d9d3SAndroid Build Coastguard Worker     CM_DESTROYEVENT_PARAM inParam;
862*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
863*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
864*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
865*ba62d9d3SAndroid Build Coastguard Worker 
866*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_DESTROYEVENTFAST,
867*ba62d9d3SAndroid Build Coastguard Worker                                                 &inParam, sizeof(inParam));
868*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(hr);
869*ba62d9d3SAndroid Build Coastguard Worker     CHK_FAILURE_RETURN(inParam.returnValue);
870*ba62d9d3SAndroid Build Coastguard Worker     event = nullptr;
871*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
872*ba62d9d3SAndroid Build Coastguard Worker }
873*ba62d9d3SAndroid Build Coastguard Worker 
SetResidentGroupAndParallelThreadNum(uint32_t residentGroupNum,uint32_t parallelThreadNum)874*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::SetResidentGroupAndParallelThreadNum(uint32_t residentGroupNum, uint32_t parallelThreadNum)
875*ba62d9d3SAndroid Build Coastguard Worker {
876*ba62d9d3SAndroid Build Coastguard Worker     return CM_NOT_IMPLEMENTED;
877*ba62d9d3SAndroid Build Coastguard Worker }
878*ba62d9d3SAndroid Build Coastguard Worker 
879*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueReadBuffer(CmBuffer * buffer,size_t offset,const unsigned char * sysMem,uint64_t sysMemSize,CmEvent * wait_event,CmEvent * & event,unsigned option)880*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueReadBuffer(CmBuffer* buffer,
881*ba62d9d3SAndroid Build Coastguard Worker                                                 size_t offset,
882*ba62d9d3SAndroid Build Coastguard Worker                                                 const unsigned char* sysMem,
883*ba62d9d3SAndroid Build Coastguard Worker                                                 uint64_t sysMemSize,
884*ba62d9d3SAndroid Build Coastguard Worker                                                 CmEvent* wait_event,
885*ba62d9d3SAndroid Build Coastguard Worker                                                 CmEvent*& event,
886*ba62d9d3SAndroid Build Coastguard Worker                                                 unsigned option)
887*ba62d9d3SAndroid Build Coastguard Worker {
888*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
889*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_COPY_BUFFER_PARAM inParam;
890*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
891*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
892*ba62d9d3SAndroid Build Coastguard Worker     inParam.buffer = buffer;
893*ba62d9d3SAndroid Build Coastguard Worker     inParam.sysMem = (void*)sysMem;
894*ba62d9d3SAndroid Build Coastguard Worker     inParam.copySize = sysMemSize;
895*ba62d9d3SAndroid Build Coastguard Worker     inParam.offset = offset;
896*ba62d9d3SAndroid Build Coastguard Worker     inParam.copyDir = 0;
897*ba62d9d3SAndroid Build Coastguard Worker     inParam.wait_event = wait_event;
898*ba62d9d3SAndroid Build Coastguard Worker     inParam.option = option;
899*ba62d9d3SAndroid Build Coastguard Worker     inParam.copyDir = CM_FASTCOPY_GPU2CPU;
900*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
901*ba62d9d3SAndroid Build Coastguard Worker 
902*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
903*ba62d9d3SAndroid Build Coastguard Worker 
904*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUECOPY_BUFFER,
905*ba62d9d3SAndroid Build Coastguard Worker         &inParam,
906*ba62d9d3SAndroid Build Coastguard Worker         sizeof(inParam));
907*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
908*ba62d9d3SAndroid Build Coastguard Worker     {
909*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
910*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
911*ba62d9d3SAndroid Build Coastguard Worker         return hr;
912*ba62d9d3SAndroid Build Coastguard Worker     }
913*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
914*ba62d9d3SAndroid Build Coastguard Worker     {
915*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
916*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
917*ba62d9d3SAndroid Build Coastguard Worker     }
918*ba62d9d3SAndroid Build Coastguard Worker 
919*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent*>(inParam.cmEventHandle);
920*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
921*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
922*ba62d9d3SAndroid Build Coastguard Worker }
923*ba62d9d3SAndroid Build Coastguard Worker 
EnqueueWriteBuffer(CmBuffer * buffer,size_t offset,const unsigned char * sysMem,uint64_t sysMemSize,CmEvent * wait_event,CmEvent * & event,unsigned option)924*ba62d9d3SAndroid Build Coastguard Worker CM_RT_API int32_t CmQueue_RT::EnqueueWriteBuffer(CmBuffer* buffer,
925*ba62d9d3SAndroid Build Coastguard Worker                                                  size_t offset,
926*ba62d9d3SAndroid Build Coastguard Worker                                                  const unsigned char* sysMem,
927*ba62d9d3SAndroid Build Coastguard Worker                                                  uint64_t sysMemSize,
928*ba62d9d3SAndroid Build Coastguard Worker                                                  CmEvent* wait_event,
929*ba62d9d3SAndroid Build Coastguard Worker                                                  CmEvent*& event,
930*ba62d9d3SAndroid Build Coastguard Worker                                                  unsigned option)
931*ba62d9d3SAndroid Build Coastguard Worker {
932*ba62d9d3SAndroid Build Coastguard Worker     INSERT_PROFILER_RECORD();
933*ba62d9d3SAndroid Build Coastguard Worker     CM_ENQUEUE_COPY_BUFFER_PARAM inParam;
934*ba62d9d3SAndroid Build Coastguard Worker     CmSafeMemSet(&inParam, 0, sizeof(inParam));
935*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmQueueHandle = m_cmQueueHandle;
936*ba62d9d3SAndroid Build Coastguard Worker     inParam.buffer = buffer;
937*ba62d9d3SAndroid Build Coastguard Worker     inParam.sysMem = (void*)sysMem;
938*ba62d9d3SAndroid Build Coastguard Worker     inParam.copySize = sysMemSize;
939*ba62d9d3SAndroid Build Coastguard Worker     inParam.offset = offset;
940*ba62d9d3SAndroid Build Coastguard Worker     inParam.copyDir = 1;
941*ba62d9d3SAndroid Build Coastguard Worker     inParam.wait_event = wait_event;
942*ba62d9d3SAndroid Build Coastguard Worker     inParam.option = option;
943*ba62d9d3SAndroid Build Coastguard Worker     inParam.copyDir = CM_FASTCOPY_CPU2GPU;
944*ba62d9d3SAndroid Build Coastguard Worker     inParam.cmEventHandle = event;
945*ba62d9d3SAndroid Build Coastguard Worker 
946*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Acquire();
947*ba62d9d3SAndroid Build Coastguard Worker 
948*ba62d9d3SAndroid Build Coastguard Worker     int32_t hr = m_cmDev->OSALExtensionExecute(CM_FN_CMQUEUE_ENQUEUECOPY_BUFFER,
949*ba62d9d3SAndroid Build Coastguard Worker         &inParam,
950*ba62d9d3SAndroid Build Coastguard Worker         sizeof(inParam));
951*ba62d9d3SAndroid Build Coastguard Worker     if (FAILED(hr))
952*ba62d9d3SAndroid Build Coastguard Worker     {
953*ba62d9d3SAndroid Build Coastguard Worker         CmAssert(0);
954*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
955*ba62d9d3SAndroid Build Coastguard Worker         return hr;
956*ba62d9d3SAndroid Build Coastguard Worker     }
957*ba62d9d3SAndroid Build Coastguard Worker     if (inParam.returnValue != CM_SUCCESS)
958*ba62d9d3SAndroid Build Coastguard Worker     {
959*ba62d9d3SAndroid Build Coastguard Worker         m_criticalSection.Release();
960*ba62d9d3SAndroid Build Coastguard Worker         return inParam.returnValue;
961*ba62d9d3SAndroid Build Coastguard Worker     }
962*ba62d9d3SAndroid Build Coastguard Worker 
963*ba62d9d3SAndroid Build Coastguard Worker     event = static_cast<CmEvent*>(inParam.cmEventHandle);
964*ba62d9d3SAndroid Build Coastguard Worker     m_criticalSection.Release();
965*ba62d9d3SAndroid Build Coastguard Worker     return CM_SUCCESS;
966*ba62d9d3SAndroid Build Coastguard Worker }
967