/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "rsovCore.h" #include <malloc.h> #include <sched.h> #include <string.h> #include <sys/resource.h> #include <sys/syscall.h> #include <sys/types.h> #include "cpu_ref/rsd_cpu.h" #include "rsContext.h" #include "rsovAllocation.h" #include "rsovContext.h" #include "rsovElement.h" #include "rsovSampler.h" #include "rsovScript.h" #include "rsovScriptGroup.h" #include "rsovType.h" namespace android { namespace renderscript { namespace { void SetPriority(const Context *rsc, int32_t priority) { RSoVHal *dc = (RSoVHal *)rsc->mHal.drv; dc->mCpuRef->setPriority(priority); } void Shutdown(Context *rsc) { RSoVHal *dc = (RSoVHal *)rsc->mHal.drv; delete dc->mCpuRef; free(dc); rsc->mHal.drv = nullptr; } void *AllocRuntimeMem(size_t size, uint32_t flags) { void* buffer = calloc(size, sizeof(char)); return buffer; } void FreeRuntimeMem(void* ptr) { free(ptr); } const RsdCpuReference::CpuSymbol *lookupRuntimeStubs( Context *pContext, char const *name) { return nullptr; } } // anonymous namespace namespace rsov { namespace { RsdCpuReference::CpuScript *lookupCpuScript(Context *rsc, const Script *s) { if (RSoVScript::isScriptCpuBacked(s)) { return reinterpret_cast<RsdCpuReference::CpuScript *>(s->mHal.drv); } RSoVScript *rsovScript = reinterpret_cast<RSoVScript *>(s->mHal.drv); return rsovScript->getCpuScript(); } } // anonymous namespace } // namespace rsov extern "C" bool rsdHalQueryHal(RsHalInitEnums entry, void **fnPtr) { switch (entry) { case RS_HAL_ALLOCATION_INIT: fnPtr[0] = (void *)rsovAllocationInit; break; case RS_HAL_ALLOCATION_INIT_OEM: fnPtr[0] = (void *)nullptr; break; case RS_HAL_ALLOCATION_INIT_ADAPTER: fnPtr[0] = (void *)rsovAllocationAdapterInit; break; case RS_HAL_ALLOCATION_DESTROY: fnPtr[0] = (void *)rsovAllocationDestroy; break; case RS_HAL_ALLOCATION_GET_GRALLOC_BITS: fnPtr[0] = (void *)rsovAllocationGrallocBits; break; case RS_HAL_ALLOCATION_DATA_1D: fnPtr[0] = (void *)rsovAllocationData1D; break; case RS_HAL_ALLOCATION_DATA_2D: fnPtr[0] = (void *)rsovAllocationData2D; break; case RS_HAL_ALLOCATION_DATA_3D: fnPtr[0] = (void *)rsovAllocationData3D; break; case RS_HAL_ALLOCATION_READ_1D: fnPtr[0] = (void *)rsovAllocationRead1D; break; case RS_HAL_ALLOCATION_READ_2D: fnPtr[0] = (void *)rsovAllocationRead2D; break; case RS_HAL_ALLOCATION_READ_3D: fnPtr[0] = (void *)rsovAllocationRead3D; break; case RS_HAL_ALLOCATION_LOCK_1D: fnPtr[0] = (void *)rsovAllocationLock1D; break; case RS_HAL_ALLOCATION_UNLOCK_1D: fnPtr[0] = (void *)rsovAllocationUnlock1D; break; case RS_HAL_ALLOCATION_COPY_1D: fnPtr[0] = (void *)rsovAllocationData1D_alloc; break; case RS_HAL_ALLOCATION_COPY_2D: fnPtr[0] = (void *)rsovAllocationData2D_alloc; break; case RS_HAL_ALLOCATION_COPY_3D: fnPtr[0] = (void *)rsovAllocationData3D_alloc; break; case RS_HAL_ALLOCATION_ADAPTER_OFFSET: fnPtr[0] = (void *)rsovAllocationAdapterOffset; break; case RS_HAL_ALLOCATION_RESIZE: fnPtr[0] = (void *)rsovAllocationResize; break; case RS_HAL_ALLOCATION_SYNC_ALL: fnPtr[0] = (void *)rsovAllocationSyncAll; break; case RS_HAL_ALLOCATION_MARK_DIRTY: fnPtr[0] = (void *)rsovAllocationMarkDirty; break; case RS_HAL_ALLOCATION_GENERATE_MIPMAPS: fnPtr[0] = (void *)rsovAllocationGenerateMipmaps; break; case RS_HAL_ALLOCATION_UPDATE_CACHED_OBJECT: fnPtr[0] = (void *)rsovAllocationUpdateCachedObject; break; case RS_HAL_ALLOCATION_GET_POINTER: fnPtr[0] = (void *)nullptr; break; case RS_HAL_ALLOCATION_SET_SURFACE: fnPtr[0] = (void *)rsovAllocationSetSurface; break; case RS_HAL_ALLOCATION_IO_SEND: fnPtr[0] = (void *)rsovAllocationIoSend; break; case RS_HAL_ALLOCATION_IO_RECEIVE: fnPtr[0] = (void *)rsovAllocationIoReceive; break; case RS_HAL_ALLOCATION_ELEMENT_DATA: fnPtr[0] = (void *)rsovAllocationElementData; break; case RS_HAL_ALLOCATION_ELEMENT_READ: fnPtr[0] = (void *)rsovAllocationElementRead; break; case RS_HAL_CORE_SHUTDOWN: fnPtr[0] = (void *)Shutdown; break; case RS_HAL_CORE_SET_PRIORITY: fnPtr[0] = (void *)SetPriority; break; case RS_HAL_CORE_ALLOC_RUNTIME_MEM: fnPtr[0] = (void *)AllocRuntimeMem; break; case RS_HAL_CORE_FREE_RUNTIME_MEM: fnPtr[0] = (void *)FreeRuntimeMem; break; case RS_HAL_CORE_FINISH: fnPtr[0] = (void *)nullptr; break; case RS_HAL_SCRIPT_INIT: fnPtr[0] = (void *)rsovScriptInit; break; case RS_HAL_SCRIPT_INIT_INTRINSIC: fnPtr[0] = (void *)rsovInitIntrinsic; break; case RS_HAL_SCRIPT_INVOKE_FUNCTION: fnPtr[0] = (void *)rsovScriptInvokeFunction; break; case RS_HAL_SCRIPT_INVOKE_ROOT: fnPtr[0] = (void *)rsovScriptInvokeRoot; break; case RS_HAL_SCRIPT_INVOKE_FOR_EACH: fnPtr[0] = (void *)rsovScriptInvokeForEach; break; case RS_HAL_SCRIPT_INVOKE_INIT: fnPtr[0] = (void *)rsovScriptInvokeInit; break; case RS_HAL_SCRIPT_INVOKE_FREE_CHILDREN: fnPtr[0] = (void *)rsovScriptInvokeFreeChildren; break; case RS_HAL_SCRIPT_DESTROY: fnPtr[0] = (void *)rsovScriptDestroy; break; case RS_HAL_SCRIPT_SET_GLOBAL_VAR: fnPtr[0] = (void *)rsovScriptSetGlobalVar; break; case RS_HAL_SCRIPT_GET_GLOBAL_VAR: fnPtr[0] = (void *)rsovScriptGetGlobalVar; break; case RS_HAL_SCRIPT_SET_GLOBAL_VAR_WITH_ELEMENT_DIM: fnPtr[0] = (void *)rsovScriptSetGlobalVarWithElemDims; break; case RS_HAL_SCRIPT_SET_GLOBAL_BIND: fnPtr[0] = (void *)rsovScriptSetGlobalBind; break; case RS_HAL_SCRIPT_SET_GLOBAL_OBJECT: fnPtr[0] = (void *)rsovScriptSetGlobalObj; break; case RS_HAL_SCRIPT_INVOKE_FOR_EACH_MULTI: fnPtr[0] = (void *)rsovScriptInvokeForEachMulti; break; case RS_HAL_SCRIPT_UPDATE_CACHED_OBJECT: fnPtr[0] = (void *)rsovScriptUpdateCachedObject; break; case RS_HAL_SCRIPT_INVOKE_REDUCE: fnPtr[0] = (void *)rsovScriptInvokeReduce; break; case RS_HAL_SAMPLER_INIT: fnPtr[0] = (void *)rsovSamplerInit; break; case RS_HAL_SAMPLER_DESTROY: fnPtr[0] = (void *)rsovSamplerDestroy; break; case RS_HAL_SAMPLER_UPDATE_CACHED_OBJECT: fnPtr[0] = (void *)rsovSamplerUpdateCachedObject; break; case RS_HAL_TYPE_INIT: fnPtr[0] = (void *)rsovTypeInit; break; case RS_HAL_TYPE_DESTROY: fnPtr[0] = (void *)rsovTypeDestroy; break; case RS_HAL_TYPE_UPDATE_CACHED_OBJECT: fnPtr[0] = (void *)rsovTypeUpdateCachedObject; break; case RS_HAL_ELEMENT_INIT: fnPtr[0] = (void *)rsovElementInit; break; case RS_HAL_ELEMENT_DESTROY: fnPtr[0] = (void *)rsovElementDestroy; break; case RS_HAL_ELEMENT_UPDATE_CACHED_OBJECT: fnPtr[0] = (void *)rsovElementUpdateCachedObject; break; case RS_HAL_SCRIPT_GROUP_INIT: fnPtr[0] = (void *)rsovScriptGroupInit; break; case RS_HAL_SCRIPT_GROUP_DESTROY: fnPtr[0] = (void *)rsovScriptGroupDestroy; break; case RS_HAL_SCRIPT_GROUP_UPDATE_CACHED_OBJECT: fnPtr[0] = (void *)nullptr; break; case RS_HAL_SCRIPT_GROUP_SET_INPUT: fnPtr[0] = (void *)rsovScriptGroupSetInput; break; case RS_HAL_SCRIPT_GROUP_SET_OUTPUT: fnPtr[0] = (void *)rsovScriptGroupSetOutput; break; case RS_HAL_SCRIPT_GROUP_EXECUTE: fnPtr[0] = (void *)rsovScriptGroupExecute; break; // Ignore entries for the legacy graphics api, default: ALOGE("ERROR: unknown RenderScript HAL API query, %i", entry); return false; } return true; } extern "C" void rsdHalAbort(RsContext) {} extern "C" bool rsdHalQueryVersion(uint32_t *major, uint32_t *minor) { *major = RS_HAL_VERSION; *minor = 0; return true; } extern "C" bool rsdHalInit(RsContext c, uint32_t version_major, uint32_t version_minor) { Context *rsc = (Context *)c; std::unique_ptr<RSoVHal> hal(new RSoVHal()); if (!hal) { ALOGE("Failed creating RSoV driver hal."); return false; } std::unique_ptr<rsov::RSoVContext> rsov(rsov::RSoVContext::create()); if (!rsov) { ALOGE("RSoVContext::create for driver hal failed."); return false; } std::unique_ptr<RsdCpuReference> cpuref(RsdCpuReference::create(rsc, version_major, version_minor, &lookupRuntimeStubs, &rsov::lookupCpuScript)); if (!cpuref) { ALOGE("RsdCpuReference::create for driver hal failed."); return false; } hal->mRSoV = rsov.release(); hal->mCpuRef = cpuref.release(); rsc->mHal.drv = hal.release(); return true; } } // namespace renderscript } // namespace android