You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
339 lines
9.6 KiB
339 lines
9.6 KiB
/* |
|
* 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
|
|
|