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