1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "rsovCore.h" 18 19 #include <malloc.h> 20 #include <sched.h> 21 #include <string.h> 22 #include <sys/resource.h> 23 #include <sys/syscall.h> 24 #include <sys/types.h> 25 26 #include "cpu_ref/rsd_cpu.h" 27 #include "rsContext.h" 28 #include "rsovAllocation.h" 29 #include "rsovContext.h" 30 #include "rsovElement.h" 31 #include "rsovSampler.h" 32 #include "rsovScript.h" 33 #include "rsovScriptGroup.h" 34 #include "rsovType.h" 35 36 namespace android { 37 namespace renderscript { 38 39 namespace { 40 41 void SetPriority(const Context *rsc, int32_t priority) { 42 RSoVHal *dc = (RSoVHal *)rsc->mHal.drv; 43 44 dc->mCpuRef->setPriority(priority); 45 } 46 47 void Shutdown(Context *rsc) { 48 RSoVHal *dc = (RSoVHal *)rsc->mHal.drv; 49 delete dc->mCpuRef; 50 free(dc); 51 rsc->mHal.drv = nullptr; 52 } 53 54 void *AllocRuntimeMem(size_t size, uint32_t flags) { 55 void* buffer = calloc(size, sizeof(char)); 56 return buffer; 57 } 58 59 void FreeRuntimeMem(void* ptr) { 60 free(ptr); 61 } 62 63 const RsdCpuReference::CpuSymbol *lookupRuntimeStubs( 64 Context *pContext, char const *name) { 65 return nullptr; 66 } 67 68 } // anonymous namespace 69 70 namespace rsov { 71 72 namespace { 73 74 RsdCpuReference::CpuScript *lookupCpuScript(Context *rsc, const Script *s) { 75 if (RSoVScript::isScriptCpuBacked(s)) { 76 return reinterpret_cast<RsdCpuReference::CpuScript *>(s->mHal.drv); 77 } 78 79 RSoVScript *rsovScript = reinterpret_cast<RSoVScript *>(s->mHal.drv); 80 return rsovScript->getCpuScript(); 81 } 82 83 } // anonymous namespace 84 85 } // namespace rsov 86 87 88 extern "C" bool rsdHalQueryHal(RsHalInitEnums entry, void **fnPtr) { 89 switch (entry) { 90 case RS_HAL_ALLOCATION_INIT: 91 fnPtr[0] = (void *)rsovAllocationInit; 92 break; 93 case RS_HAL_ALLOCATION_INIT_OEM: 94 fnPtr[0] = (void *)nullptr; 95 break; 96 case RS_HAL_ALLOCATION_INIT_ADAPTER: 97 fnPtr[0] = (void *)rsovAllocationAdapterInit; 98 break; 99 case RS_HAL_ALLOCATION_DESTROY: 100 fnPtr[0] = (void *)rsovAllocationDestroy; 101 break; 102 case RS_HAL_ALLOCATION_GET_GRALLOC_BITS: 103 fnPtr[0] = (void *)rsovAllocationGrallocBits; 104 break; 105 case RS_HAL_ALLOCATION_DATA_1D: 106 fnPtr[0] = (void *)rsovAllocationData1D; 107 break; 108 case RS_HAL_ALLOCATION_DATA_2D: 109 fnPtr[0] = (void *)rsovAllocationData2D; 110 break; 111 case RS_HAL_ALLOCATION_DATA_3D: 112 fnPtr[0] = (void *)rsovAllocationData3D; 113 break; 114 case RS_HAL_ALLOCATION_READ_1D: 115 fnPtr[0] = (void *)rsovAllocationRead1D; 116 break; 117 case RS_HAL_ALLOCATION_READ_2D: 118 fnPtr[0] = (void *)rsovAllocationRead2D; 119 break; 120 case RS_HAL_ALLOCATION_READ_3D: 121 fnPtr[0] = (void *)rsovAllocationRead3D; 122 break; 123 case RS_HAL_ALLOCATION_LOCK_1D: 124 fnPtr[0] = (void *)rsovAllocationLock1D; 125 break; 126 case RS_HAL_ALLOCATION_UNLOCK_1D: 127 fnPtr[0] = (void *)rsovAllocationUnlock1D; 128 break; 129 case RS_HAL_ALLOCATION_COPY_1D: 130 fnPtr[0] = (void *)rsovAllocationData1D_alloc; 131 break; 132 case RS_HAL_ALLOCATION_COPY_2D: 133 fnPtr[0] = (void *)rsovAllocationData2D_alloc; 134 break; 135 case RS_HAL_ALLOCATION_COPY_3D: 136 fnPtr[0] = (void *)rsovAllocationData3D_alloc; 137 break; 138 case RS_HAL_ALLOCATION_ADAPTER_OFFSET: 139 fnPtr[0] = (void *)rsovAllocationAdapterOffset; 140 break; 141 case RS_HAL_ALLOCATION_RESIZE: 142 fnPtr[0] = (void *)rsovAllocationResize; 143 break; 144 case RS_HAL_ALLOCATION_SYNC_ALL: 145 fnPtr[0] = (void *)rsovAllocationSyncAll; 146 break; 147 case RS_HAL_ALLOCATION_MARK_DIRTY: 148 fnPtr[0] = (void *)rsovAllocationMarkDirty; 149 break; 150 case RS_HAL_ALLOCATION_GENERATE_MIPMAPS: 151 fnPtr[0] = (void *)rsovAllocationGenerateMipmaps; 152 break; 153 case RS_HAL_ALLOCATION_UPDATE_CACHED_OBJECT: 154 fnPtr[0] = (void *)rsovAllocationUpdateCachedObject; 155 break; 156 case RS_HAL_ALLOCATION_GET_POINTER: 157 fnPtr[0] = (void *)nullptr; 158 break; 159 case RS_HAL_ALLOCATION_SET_SURFACE: 160 fnPtr[0] = (void *)rsovAllocationSetSurface; 161 break; 162 case RS_HAL_ALLOCATION_IO_SEND: 163 fnPtr[0] = (void *)rsovAllocationIoSend; 164 break; 165 case RS_HAL_ALLOCATION_IO_RECEIVE: 166 fnPtr[0] = (void *)rsovAllocationIoReceive; 167 break; 168 case RS_HAL_ALLOCATION_ELEMENT_DATA: 169 fnPtr[0] = (void *)rsovAllocationElementData; 170 break; 171 case RS_HAL_ALLOCATION_ELEMENT_READ: 172 fnPtr[0] = (void *)rsovAllocationElementRead; 173 break; 174 175 case RS_HAL_CORE_SHUTDOWN: 176 fnPtr[0] = (void *)Shutdown; 177 break; 178 case RS_HAL_CORE_SET_PRIORITY: 179 fnPtr[0] = (void *)SetPriority; 180 break; 181 case RS_HAL_CORE_ALLOC_RUNTIME_MEM: 182 fnPtr[0] = (void *)AllocRuntimeMem; 183 break; 184 case RS_HAL_CORE_FREE_RUNTIME_MEM: 185 fnPtr[0] = (void *)FreeRuntimeMem; 186 break; 187 case RS_HAL_CORE_FINISH: 188 fnPtr[0] = (void *)nullptr; 189 break; 190 191 case RS_HAL_SCRIPT_INIT: 192 fnPtr[0] = (void *)rsovScriptInit; 193 break; 194 case RS_HAL_SCRIPT_INIT_INTRINSIC: 195 fnPtr[0] = (void *)rsovInitIntrinsic; 196 break; 197 case RS_HAL_SCRIPT_INVOKE_FUNCTION: 198 fnPtr[0] = (void *)rsovScriptInvokeFunction; 199 break; 200 case RS_HAL_SCRIPT_INVOKE_ROOT: 201 fnPtr[0] = (void *)rsovScriptInvokeRoot; 202 break; 203 case RS_HAL_SCRIPT_INVOKE_FOR_EACH: 204 fnPtr[0] = (void *)rsovScriptInvokeForEach; 205 break; 206 case RS_HAL_SCRIPT_INVOKE_INIT: 207 fnPtr[0] = (void *)rsovScriptInvokeInit; 208 break; 209 case RS_HAL_SCRIPT_INVOKE_FREE_CHILDREN: 210 fnPtr[0] = (void *)rsovScriptInvokeFreeChildren; 211 break; 212 case RS_HAL_SCRIPT_DESTROY: 213 fnPtr[0] = (void *)rsovScriptDestroy; 214 break; 215 case RS_HAL_SCRIPT_SET_GLOBAL_VAR: 216 fnPtr[0] = (void *)rsovScriptSetGlobalVar; 217 break; 218 case RS_HAL_SCRIPT_GET_GLOBAL_VAR: 219 fnPtr[0] = (void *)rsovScriptGetGlobalVar; 220 break; 221 case RS_HAL_SCRIPT_SET_GLOBAL_VAR_WITH_ELEMENT_DIM: 222 fnPtr[0] = (void *)rsovScriptSetGlobalVarWithElemDims; 223 break; 224 case RS_HAL_SCRIPT_SET_GLOBAL_BIND: 225 fnPtr[0] = (void *)rsovScriptSetGlobalBind; 226 break; 227 case RS_HAL_SCRIPT_SET_GLOBAL_OBJECT: 228 fnPtr[0] = (void *)rsovScriptSetGlobalObj; 229 break; 230 case RS_HAL_SCRIPT_INVOKE_FOR_EACH_MULTI: 231 fnPtr[0] = (void *)rsovScriptInvokeForEachMulti; 232 break; 233 case RS_HAL_SCRIPT_UPDATE_CACHED_OBJECT: 234 fnPtr[0] = (void *)rsovScriptUpdateCachedObject; 235 break; 236 case RS_HAL_SCRIPT_INVOKE_REDUCE: 237 fnPtr[0] = (void *)rsovScriptInvokeReduce; 238 break; 239 240 case RS_HAL_SAMPLER_INIT: 241 fnPtr[0] = (void *)rsovSamplerInit; 242 break; 243 case RS_HAL_SAMPLER_DESTROY: 244 fnPtr[0] = (void *)rsovSamplerDestroy; 245 break; 246 case RS_HAL_SAMPLER_UPDATE_CACHED_OBJECT: 247 fnPtr[0] = (void *)rsovSamplerUpdateCachedObject; 248 break; 249 250 case RS_HAL_TYPE_INIT: 251 fnPtr[0] = (void *)rsovTypeInit; 252 break; 253 case RS_HAL_TYPE_DESTROY: 254 fnPtr[0] = (void *)rsovTypeDestroy; 255 break; 256 case RS_HAL_TYPE_UPDATE_CACHED_OBJECT: 257 fnPtr[0] = (void *)rsovTypeUpdateCachedObject; 258 break; 259 260 case RS_HAL_ELEMENT_INIT: 261 fnPtr[0] = (void *)rsovElementInit; 262 break; 263 case RS_HAL_ELEMENT_DESTROY: 264 fnPtr[0] = (void *)rsovElementDestroy; 265 break; 266 case RS_HAL_ELEMENT_UPDATE_CACHED_OBJECT: 267 fnPtr[0] = (void *)rsovElementUpdateCachedObject; 268 break; 269 270 case RS_HAL_SCRIPT_GROUP_INIT: 271 fnPtr[0] = (void *)rsovScriptGroupInit; 272 break; 273 case RS_HAL_SCRIPT_GROUP_DESTROY: 274 fnPtr[0] = (void *)rsovScriptGroupDestroy; 275 break; 276 case RS_HAL_SCRIPT_GROUP_UPDATE_CACHED_OBJECT: 277 fnPtr[0] = (void *)nullptr; 278 break; 279 case RS_HAL_SCRIPT_GROUP_SET_INPUT: 280 fnPtr[0] = (void *)rsovScriptGroupSetInput; 281 break; 282 case RS_HAL_SCRIPT_GROUP_SET_OUTPUT: 283 fnPtr[0] = (void *)rsovScriptGroupSetOutput; 284 break; 285 case RS_HAL_SCRIPT_GROUP_EXECUTE: 286 fnPtr[0] = (void *)rsovScriptGroupExecute; 287 break; 288 289 // Ignore entries for the legacy graphics api, 290 291 default: 292 ALOGE("ERROR: unknown RenderScript HAL API query, %i", entry); 293 return false; 294 } 295 296 return true; 297 } 298 299 extern "C" void rsdHalAbort(RsContext) {} 300 301 extern "C" bool rsdHalQueryVersion(uint32_t *major, uint32_t *minor) { 302 *major = RS_HAL_VERSION; 303 *minor = 0; 304 return true; 305 } 306 307 extern "C" bool rsdHalInit(RsContext c, uint32_t version_major, 308 uint32_t version_minor) { 309 Context *rsc = (Context *)c; 310 311 std::unique_ptr<RSoVHal> hal(new RSoVHal()); 312 if (!hal) { 313 ALOGE("Failed creating RSoV driver hal."); 314 return false; 315 } 316 317 std::unique_ptr<rsov::RSoVContext> rsov(rsov::RSoVContext::create()); 318 if (!rsov) { 319 ALOGE("RSoVContext::create for driver hal failed."); 320 return false; 321 } 322 323 std::unique_ptr<RsdCpuReference> cpuref(RsdCpuReference::create(rsc, version_major, version_minor, 324 &lookupRuntimeStubs, 325 &rsov::lookupCpuScript)); 326 if (!cpuref) { 327 ALOGE("RsdCpuReference::create for driver hal failed."); 328 return false; 329 } 330 331 hal->mRSoV = rsov.release(); 332 hal->mCpuRef = cpuref.release(); 333 rsc->mHal.drv = hal.release(); 334 335 return true; 336 } 337 338 } // namespace renderscript 339 } // namespace android 340