| /* |
| * 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 |