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