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_task.h 24 //! \brief Contains CmTask declatation. 25 //! 26 27 #ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMTASK_H_ 28 #define MEDIADRIVER_AGNOSTIC_COMMON_CM_CMTASK_H_ 29 30 #include "cm_def.h" 31 32 enum CM_CONDITIONAL_END_OPERATOR_CODE 33 { 34 MAD_GREATER_THAN_IDD = 0, 35 MAD_GREATER_THAN_OR_EQUAL_IDD, 36 MAD_LESS_THAN_IDD, 37 MAD_LESS_THAN_OR_EQUAL_IDD, 38 MAD_EQUAL_IDD, 39 MAD_NOT_EQUAL_IDD 40 }; 41 42 //! 43 //! \brief CM_CONDITIONAL_END_PARAM 44 //! \details 45 //! The parameters of conditional batch buffer end command, for platforms 46 //! till CNL, only opValue and opMask fields are used. 47 //! 48 struct CM_CONDITIONAL_END_PARAM 49 { 50 uint32_t opValue; //!< operand of comparing operation 51 CM_CONDITIONAL_END_OPERATOR_CODE opCode; //!< operation type 52 bool opMask; //!< mask of operand 53 bool opLevel; //!< batch buffer level to end 54 }; 55 56 namespace CMRT_UMD 57 { 58 class CmKernel; 59 60 //! \brief CmTask Class to manage task parameters. 61 //! \details CmTask contains one or multiple CmKernels, optional 62 //! synchronization point between two consecutive kernels, 63 //! and some execution parameters. CmTask is the unit to 64 //! enqueue. 65 //! If there is no synchronization point. kernels will run 66 //! concurrently. If there is a synchronization point, kernels 67 //! after the synchronization point will not start until kernels 68 //! before the synchronization point finishes. 69 class CmTask 70 { 71 public: 72 //! 73 //! \brief Add a CmKernel pointer to CmTask. 74 //! \details Same kernel can appear in the task multiple times as long 75 //! as all the value of its arguments are the same for multiple 76 //! copies of the kernel. 77 //! \param [in] kernel 78 //! A pointer to CmKernel object. 79 //! \retval CM_SUCCESS if kernel is added. 80 //! \retval CM_EXCEED_MAX_KERNEL_PER_ENQUEUE trying to add more kernels 81 //! than CAP_KERNEL_COUNT_PER_TASK. 82 //! \retval CM_INVALID_ARG_VALUE if kernel is NULL. 83 //! 84 CM_RT_API virtual int32_t AddKernel(CmKernel *kernel) = 0; 85 86 //! 87 //! \brief Resets a CmTask object 88 //! \details All contents contained in CmTask get reset. Application need 89 //! add kernel, optional synchronization points, etc. again to 90 //! the CmTask. This function is to reuse CmTask for diffrent 91 //! contents so CmTask creation/destroy overhead can be avoided. 92 //! \returns CM_SUCCESS. 93 //! 94 CM_RT_API virtual int32_t Reset() = 0; 95 96 //! 97 //! \brief Inserts a synchronization point among kernels. 98 //! \details Kernels after the synchronization point will not start 99 //! execution untill kernels before the synchronization 100 //! point finishes execution. A CmTask can have multiple 101 //! synchronization points. 102 //! \returns CM_SUCCESS. 103 //! 104 CM_RT_API virtual int32_t AddSync() = 0; 105 106 //! 107 //! \brief Set a per-task based power option to current task. 108 //! \details The power option includes the hardware configuration of 109 //! slice, subslice and EU number. The setting takes effect 110 //! only for current task; the value needs to be set again if 111 //! user wants it to take effect for the next task. 112 //! \param [in] powerOption 113 //! A pointer to CM_POWER_OPTION struct 114 //! \retval CM_SUCCESS. 115 //! \retval CM_EXCEED_MAX_POWER_OPTION_FOR_ PLATFORM if the any of the 116 //! settings exceeds the limit of current platform 117 //! configuration. 118 //! 119 CM_RT_API virtual int32_t 120 SetPowerOption(PCM_POWER_OPTION powerOption) = 0; 121 122 //! 123 //! \brief This API is used for the conditional end feature. 124 //! \details It adds a conditional batch buffer end command between two 125 //! kernels in a task. The conditionalSurface + offset is the 126 //! address storing its data against the dword value provided in 127 //! conditionalParam. If the data at the compare memory address is 128 //! greater than the dword set in conditionalParam, the execution of 129 //! the command buffer will continue. If not, the remaining 130 //! kernels in the task will be skipped. The user can call this 131 //! API multiple times to insert multiple conditional ends 132 //! between different kernels. When opMask in conditionalParam is 1, 133 //! the actual comparison value is the result of bitwise-and of 134 //! the value in memory and mask. 135 //! \param [in] conditionalSurfaceIndex 136 //! Pointer to the surface used to store comparison 137 //! dword by kernel. 138 //! \param [in] offset 139 //! The offset pointered by pSurface where stores comparison 140 //! dword value, and mask if opMask in conditionalParam is set to 1. 141 //! \param [in] conditionalParam 142 //! Pointer to the parameters of conditional batch buffer end 143 //! command, for platforms till CNL, only opValue and opMask fields are 144 //! used. 145 //! \retval CM_SUCCESS if successfully add a conditional batch buffer 146 //! end. 147 //! \retval CM_FAILURE otherwise. 148 //! 149 CM_RT_API virtual int32_t 150 AddConditionalEnd(SurfaceIndex* conditionalSurfaceIndex, 151 uint32_t offset, 152 CM_CONDITIONAL_END_PARAM *conditionalParam) = 0; 153 154 //! 155 //! \brief Expose bitfield for task related property. 156 //! \details Currently this function can be used to expose the 157 //! bitfield for turbo boost. 158 //! \param [out] taskConfig 159 //! specify which bitfield will be exposed. 160 //! \returns CM_SUCCESS. 161 //! 162 CM_RT_API virtual int32_t SetProperty(const CM_TASK_CONFIG &taskConfig) = 0; 163 164 //! 165 //! \brief Add a CmKernel pointer to CmTask with customized execution 166 //! configure. 167 //! \details Same kernel can appear in the task multiple times as long 168 //! as all the value of its arguments are the same for multiple 169 //! copies of the kernel. 170 //! \param [in] kernel 171 //! A pointer to CmKernel object. 172 //! \param [in] config 173 //! A Pointer to customized kernel execution configure. 174 //! \retval CM_SUCCESS if kernel is added. 175 //! \retval CM_EXCEED_MAX_KERNEL_PER_ENQUEUE trying to add more kernels 176 //! than CAP_KERNEL_COUNT_PER_TASK. 177 //! \retval CM_INVALID_ARG_VALUE if kernel is NULL. 178 //! 179 CM_RT_API virtual int32_t AddKernelWithConfig( CmKernel *pKernel, const CM_EXECUTION_CONFIG *config ) = 0; 180 181 //! 182 //! \brief Get task related property. 183 //! \details Currently this function can be used to get the 184 //! bitfield for turbo boost. 185 //! \param [out] taskConfig 186 //! Task related property. 187 //! \returns CM_SUCCESS. 188 //! 189 CM_RT_API virtual int32_t GetProperty(CM_TASK_CONFIG &taskConfig) = 0; 190 191 //! \brief Set a per-kernel based power option to current kernel with dataCacheFlush flag or etc. 192 //! \details this function can be inserted after kernel added so that pipe_control will be inserted after the 193 //! walker with dataCacheFlush flag. 194 //! \param [in] taskConfig 195 //! A pointer to CM_KERNEL_SYNC_CONFIG object. 196 //! \retval CM_SUCCESS if CM_KERNEL_SYNC_CONFIG info can be successfully stored in CM_TASK. 197 //! \retval CM_FAILURE if the pointer is invalid. 198 //! 199 CM_RT_API virtual int32_t AddSyncEx(const CM_KERNEL_SYNC_CONFIG *config) = 0; 200 }; 201 }; //namespace 202 203 #endif // #ifndef MEDIADRIVER_AGNOSTIC_COMMON_CM_CMTASK_H_ 204