1 /* 2 * Copyright (c) 2017, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file cm_event_rt.h 24 //! \brief Contains CmEventRT declarations. 25 //! 26 27 #ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMEVENTRT_H_ 28 #define MEDIADRIVER_AGNOSTIC_COMMON_CM_CMEVENTRT_H_ 29 30 #include "cm_event.h" 31 #include "cm_csync.h" 32 #include "cm_hal.h" 33 #include "cm_log.h" 34 35 namespace CMRT_UMD 36 { 37 class CmDeviceRT; 38 class CmEventRT; 39 class CmQueueRT; 40 class CmTaskRT; 41 class CmTaskInternal; 42 class CmThreadGroupSpace; 43 class CmThreadSpaceRT; 44 }; 45 46 #define CM_CALLBACK __cdecl 47 typedef void (CM_CALLBACK *EventCallBackFunction)(CMRT_UMD::CmEventRT*, void*); 48 49 namespace CMRT_UMD 50 { 51 class CmEventRT: public CmEvent 52 { 53 public: 54 static int32_t Create(uint32_t index, 55 CmQueueRT *queue, 56 CmTaskInternal *task, 57 int32_t taskDriverId, 58 CmDeviceRT *device, 59 bool isVisible, 60 CmEventRT *&event); 61 62 static int32_t Destroy(CmEventRT *&event); 63 64 CM_RT_API int32_t GetStatus(CM_STATUS &status); 65 66 CM_RT_API int32_t GetExecutionTime(uint64_t &time); 67 68 CM_RT_API int32_t 69 WaitForTaskFinished(uint32_t timeOutMs = CM_MAX_TIMEOUT_MS); 70 71 CM_RT_API int32_t GetSurfaceDetails(uint32_t kernIndex, 72 uint32_t surfBTI, 73 CM_SURFACE_DETAILS &outDetails); 74 75 CM_RT_API int32_t GetProfilingInfo(CM_EVENT_PROFILING_INFO infoType, 76 size_t paramSize, 77 void *inputValue, 78 void *value); 79 80 CM_RT_API int32_t GetExecutionTickTime(uint64_t &ticks); 81 82 int32_t GetIndex(uint32_t &index); 83 84 int32_t SetTaskDriverId(int32_t id); 85 86 int32_t GetTaskDriverId(int32_t &id); 87 88 int32_t SetTaskOsData(void *data); 89 90 int32_t SetSurfaceDetails(CM_HAL_SURFACE_ENTRY_INFO_ARRAYS surfaceInfo); 91 92 int32_t Acquire(void); 93 94 int32_t SafeRelease(void); 95 96 int32_t SetKernelNames(CmTaskRT *task, 97 CmThreadSpaceRT *threadSpace, 98 CmThreadGroupSpace *threadGroupSpace); 99 100 int32_t SetEnqueueTime(LARGE_INTEGER time); 101 102 int32_t SetCompleteTime(LARGE_INTEGER time); 103 104 int32_t GetSubmitTime(LARGE_INTEGER *time); 105 106 int32_t GetHWStartTime(LARGE_INTEGER *time); 107 108 int32_t GetHWEndTime(LARGE_INTEGER *time); 109 110 int32_t GetCompleteTime(LARGE_INTEGER *time); 111 112 uint32_t GetKernelCount(); 113 114 int32_t GetEnqueueTime(LARGE_INTEGER *time); 115 116 int32_t SetCallBack(EventCallBackFunction function, void *userData); 117 118 int32_t GetStatusNoFlush(CM_STATUS &status); 119 120 int32_t ModifyStatus(CM_STATUS status, uint64_t elapsedTime); 121 122 int32_t GetQueue(CmQueueRT *&queue); 123 124 int32_t Query(); 125 126 CM_STATUS GetStatusWithoutFlush(); 127 128 #if CM_LOG_ON 129 std::string Log(const char *callerFuncName); 130 131 CM_HAL_STATE* GetHalState(); 132 #endif // #if CM_LOG_ON 133 134 protected: 135 CmEventRT(uint32_t index, 136 CmQueueRT *queue, 137 CmTaskInternal *task, 138 int32_t taskDriverId, 139 CmDeviceRT *device, 140 bool isVisible); 141 142 ~CmEventRT(); 143 144 int32_t Initialize(); 145 146 void UnreferenceIfNeeded(void *pdata); 147 148 uint32_t m_index; 149 int32_t m_taskDriverId; 150 void *m_osData; 151 152 CM_STATUS m_status; 153 uint64_t m_time; 154 uint64_t m_ticks; 155 uint64_t m_hwStartTimeStampInTicks; 156 uint64_t m_hwEndTimeStampInTicks; 157 158 LARGE_INTEGER m_globalSubmitTimeCpu; // The CM task submission time in CPU 159 LARGE_INTEGER m_submitTimeGpu; // The CM task submission time in GPU 160 LARGE_INTEGER m_hwStartTimeStamp; // The task start execution time in GPU 161 LARGE_INTEGER m_hwEndTimeStamp; // The task end execution time in GPU 162 LARGE_INTEGER m_completeTime; // The task complete time in CPU 163 LARGE_INTEGER m_enqueueTime; // The time when the task is pushed into enqueued 164 // queue 165 166 char **m_kernelNames; 167 uint32_t *m_threadSpace; 168 uint32_t m_kernelCount; 169 170 CmDeviceRT* m_device; 171 CmQueueRT *m_queue; 172 173 int32_t m_refCount; 174 175 bool m_isVisible; // if the event is Visible to user or not 176 177 CM_HAL_SURFACE_ENTRY_INFO_ARRAYS m_surEntryInfoArrays; 178 CmTaskInternal *m_task; 179 180 CSync m_criticalSectionQuery; 181 182 //Vtune call back 183 EventCallBackFunction m_callbackFunction; //CallBack Function 184 void *m_callbackUserData; //Pdata for Callback 185 186 private: 187 bool m_osSignalTriggered; 188 189 CmEventRT(const CmEventRT& other); 190 CmEventRT& operator=(const CmEventRT& other); 191 }; 192 } 193 194 #endif // MEDIADRIVER_AGNOSTIC_COMMON_CM_CMEVENTRT_H_ 195