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.
378 lines
14 KiB
378 lines
14 KiB
/*
|
|
* Copyright (C) 2011-2012 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 "../cpu_ref/rsd_cpu.h"
|
|
|
|
#include "rsdCore.h"
|
|
#include "rsdAllocation.h"
|
|
#include "rsdBcc.h"
|
|
#include "rsdElement.h"
|
|
#include "rsdType.h"
|
|
#if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
|
|
#include "rsdGL.h"
|
|
#include "rsdProgramStore.h"
|
|
#include "rsdProgramRaster.h"
|
|
#include "rsdProgramVertex.h"
|
|
#include "rsdProgramFragment.h"
|
|
#include "rsdMesh.h"
|
|
#include "rsdFrameBuffer.h"
|
|
#else
|
|
#include <dlfcn.h>
|
|
#endif
|
|
#include "rsdSampler.h"
|
|
#include "rsdScriptGroup.h"
|
|
|
|
#include <malloc.h>
|
|
#include "rsContext.h"
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/resource.h>
|
|
#include <sched.h>
|
|
#include <sys/syscall.h>
|
|
#include <string.h>
|
|
|
|
using android::renderscript::Allocation;
|
|
using android::renderscript::Context;
|
|
using android::renderscript::RsHalInitEnums;
|
|
using android::renderscript::RsdCpuReference;
|
|
using android::renderscript::Script;
|
|
|
|
static void Shutdown(Context *rsc);
|
|
static void SetPriority(const Context *rsc, int32_t priority);
|
|
|
|
#ifndef RS_COMPATIBILITY_LIB
|
|
#define NATIVE_FUNC(a) a
|
|
#else
|
|
#define NATIVE_FUNC(a) nullptr
|
|
#endif
|
|
|
|
namespace android {
|
|
namespace renderscript {
|
|
|
|
extern "C" bool rsdHalQueryHal(RsHalInitEnums entry, void **fnPtr) {
|
|
switch(entry) {
|
|
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 *)rsdAllocRuntimeMem; break;
|
|
case RS_HAL_CORE_FREE_RUNTIME_MEM:
|
|
fnPtr[0] = (void *)rsdFreeRuntimeMem; break;
|
|
case RS_HAL_CORE_FINISH:
|
|
fnPtr[0] = (void *)nullptr; break;
|
|
|
|
case RS_HAL_SCRIPT_INIT:
|
|
fnPtr[0] = (void *)rsdScriptInit; break;
|
|
case RS_HAL_SCRIPT_INIT_INTRINSIC:
|
|
fnPtr[0] = (void *)rsdInitIntrinsic; break;
|
|
case RS_HAL_SCRIPT_INVOKE_FUNCTION:
|
|
fnPtr[0] = (void *)rsdScriptInvokeFunction; break;
|
|
case RS_HAL_SCRIPT_INVOKE_ROOT:
|
|
fnPtr[0] = (void *)rsdScriptInvokeRoot; break;
|
|
case RS_HAL_SCRIPT_INVOKE_FOR_EACH:
|
|
fnPtr[0] = (void *)rsdScriptInvokeForEach; break;
|
|
case RS_HAL_SCRIPT_INVOKE_INIT:
|
|
fnPtr[0] = (void *)rsdScriptInvokeInit; break;
|
|
case RS_HAL_SCRIPT_INVOKE_FREE_CHILDREN:
|
|
fnPtr[0] = (void *)rsdScriptInvokeFreeChildren; break;
|
|
case RS_HAL_SCRIPT_SET_GLOBAL_VAR:
|
|
fnPtr[0] = (void *)rsdScriptSetGlobalVar; break;
|
|
case RS_HAL_SCRIPT_GET_GLOBAL_VAR:
|
|
fnPtr[0] = (void *)rsdScriptGetGlobalVar; break;
|
|
case RS_HAL_SCRIPT_SET_GLOBAL_VAR_WITH_ELEMENT_DIM:
|
|
fnPtr[0] = (void *)rsdScriptSetGlobalVarWithElemDims; break;
|
|
case RS_HAL_SCRIPT_SET_GLOBAL_BIND:
|
|
fnPtr[0] = (void *)rsdScriptSetGlobalBind; break;
|
|
case RS_HAL_SCRIPT_SET_GLOBAL_OBJECT:
|
|
fnPtr[0] = (void *)rsdScriptSetGlobalObj; break;
|
|
case RS_HAL_SCRIPT_DESTROY:
|
|
fnPtr[0] = (void *)rsdScriptDestroy; break;
|
|
case RS_HAL_SCRIPT_INVOKE_FOR_EACH_MULTI:
|
|
fnPtr[0] = (void *)rsdScriptInvokeForEachMulti; break;
|
|
case RS_HAL_SCRIPT_UPDATE_CACHED_OBJECT:
|
|
fnPtr[0] = (void *)rsdScriptUpdateCachedObject; break;
|
|
case RS_HAL_SCRIPT_INVOKE_REDUCE:
|
|
fnPtr[0] = (void *)rsdScriptInvokeReduce; break;
|
|
|
|
case RS_HAL_ALLOCATION_INIT:
|
|
fnPtr[0] = (void *)rsdAllocationInit; break;
|
|
case RS_HAL_ALLOCATION_INIT_OEM:
|
|
fnPtr[0] = (void *)nullptr; break;
|
|
case RS_HAL_ALLOCATION_INIT_ADAPTER:
|
|
fnPtr[0] = (void *)rsdAllocationAdapterInit; break;
|
|
case RS_HAL_ALLOCATION_DESTROY:
|
|
fnPtr[0] = (void *)rsdAllocationDestroy; break;
|
|
case RS_HAL_ALLOCATION_GET_GRALLOC_BITS:
|
|
fnPtr[0] = (void *)rsdAllocationGrallocBits; break;
|
|
case RS_HAL_ALLOCATION_RESIZE:
|
|
fnPtr[0] = (void *)rsdAllocationResize; break;
|
|
case RS_HAL_ALLOCATION_SYNC_ALL:
|
|
fnPtr[0] = (void *)rsdAllocationSyncAll; break;
|
|
case RS_HAL_ALLOCATION_MARK_DIRTY:
|
|
fnPtr[0] = (void *)rsdAllocationMarkDirty; break;
|
|
case RS_HAL_ALLOCATION_SET_SURFACE:
|
|
fnPtr[0] = (void *)NATIVE_FUNC(rsdAllocationSetSurface); break;
|
|
case RS_HAL_ALLOCATION_IO_SEND:
|
|
fnPtr[0] = (void *)NATIVE_FUNC(rsdAllocationIoSend); break;
|
|
case RS_HAL_ALLOCATION_IO_RECEIVE:
|
|
fnPtr[0] = (void *)NATIVE_FUNC(rsdAllocationIoReceive); break;
|
|
case RS_HAL_ALLOCATION_DATA_1D:
|
|
fnPtr[0] = (void *)rsdAllocationData1D; break;
|
|
case RS_HAL_ALLOCATION_DATA_2D:
|
|
fnPtr[0] = (void *)rsdAllocationData2D; break;
|
|
case RS_HAL_ALLOCATION_DATA_3D:
|
|
fnPtr[0] = (void *)rsdAllocationData3D; break;
|
|
case RS_HAL_ALLOCATION_READ_1D:
|
|
fnPtr[0] = (void *)rsdAllocationRead1D; break;
|
|
case RS_HAL_ALLOCATION_READ_2D:
|
|
fnPtr[0] = (void *)rsdAllocationRead2D; break;
|
|
case RS_HAL_ALLOCATION_READ_3D:
|
|
fnPtr[0] = (void *)rsdAllocationRead3D; break;
|
|
case RS_HAL_ALLOCATION_LOCK_1D:
|
|
fnPtr[0] = (void *)rsdAllocationLock1D; break;
|
|
case RS_HAL_ALLOCATION_UNLOCK_1D:
|
|
fnPtr[0] = (void *)rsdAllocationUnlock1D; break;
|
|
case RS_HAL_ALLOCATION_COPY_1D:
|
|
fnPtr[0] = (void *)rsdAllocationData1D_alloc; break;
|
|
case RS_HAL_ALLOCATION_COPY_2D:
|
|
fnPtr[0] = (void *)rsdAllocationData2D_alloc; break;
|
|
case RS_HAL_ALLOCATION_COPY_3D:
|
|
fnPtr[0] = (void *)rsdAllocationData3D_alloc; break;
|
|
case RS_HAL_ALLOCATION_ELEMENT_DATA:
|
|
fnPtr[0] = (void *)rsdAllocationElementData; break;
|
|
case RS_HAL_ALLOCATION_ELEMENT_READ:
|
|
fnPtr[0] = (void *)rsdAllocationElementRead; break;
|
|
case RS_HAL_ALLOCATION_GENERATE_MIPMAPS:
|
|
fnPtr[0] = (void *)rsdAllocationGenerateMipmaps; break;
|
|
case RS_HAL_ALLOCATION_UPDATE_CACHED_OBJECT:
|
|
fnPtr[0] = (void *)rsdAllocationUpdateCachedObject; break;
|
|
case RS_HAL_ALLOCATION_ADAPTER_OFFSET:
|
|
fnPtr[0] = (void *)rsdAllocationAdapterOffset; break;
|
|
case RS_HAL_ALLOCATION_GET_POINTER:
|
|
fnPtr[0] = (void *)nullptr; break;
|
|
#ifdef RS_COMPATIBILITY_LIB
|
|
case RS_HAL_ALLOCATION_INIT_STRIDED:
|
|
fnPtr[0] = (void *)rsdAllocationInitStrided; break;
|
|
#endif
|
|
|
|
case RS_HAL_SAMPLER_INIT:
|
|
fnPtr[0] = (void *)rsdSamplerInit; break;
|
|
case RS_HAL_SAMPLER_DESTROY:
|
|
fnPtr[0] = (void *)rsdSamplerDestroy; break;
|
|
case RS_HAL_SAMPLER_UPDATE_CACHED_OBJECT:
|
|
fnPtr[0] = (void *)rsdSamplerUpdateCachedObject; break;
|
|
|
|
case RS_HAL_TYPE_INIT:
|
|
fnPtr[0] = (void *)rsdTypeInit; break;
|
|
case RS_HAL_TYPE_DESTROY:
|
|
fnPtr[0] = (void *)rsdTypeDestroy; break;
|
|
case RS_HAL_TYPE_UPDATE_CACHED_OBJECT:
|
|
fnPtr[0] = (void *)rsdTypeUpdateCachedObject; break;
|
|
|
|
case RS_HAL_ELEMENT_INIT:
|
|
fnPtr[0] = (void *)rsdElementInit; break;
|
|
case RS_HAL_ELEMENT_DESTROY:
|
|
fnPtr[0] = (void *)rsdElementDestroy; break;
|
|
case RS_HAL_ELEMENT_UPDATE_CACHED_OBJECT:
|
|
fnPtr[0] = (void *)rsdElementUpdateCachedObject; break;
|
|
|
|
case RS_HAL_SCRIPT_GROUP_INIT:
|
|
fnPtr[0] = (void *)rsdScriptGroupInit; break;
|
|
case RS_HAL_SCRIPT_GROUP_DESTROY:
|
|
fnPtr[0] = (void *)rsdScriptGroupDestroy; break;
|
|
case RS_HAL_SCRIPT_GROUP_UPDATE_CACHED_OBJECT:
|
|
fnPtr[0] = (void *)nullptr; break;
|
|
case RS_HAL_SCRIPT_GROUP_SET_INPUT:
|
|
fnPtr[0] = (void *)rsdScriptGroupSetInput; break;
|
|
case RS_HAL_SCRIPT_GROUP_SET_OUTPUT:
|
|
fnPtr[0] = (void *)rsdScriptGroupSetOutput; break;
|
|
case RS_HAL_SCRIPT_GROUP_EXECUTE:
|
|
fnPtr[0] = (void *)rsdScriptGroupExecute; break;
|
|
|
|
|
|
|
|
// Functions below this point are for the legacy graphics api,
|
|
// vendor drivers are NOT expected to implement these. They will never be called
|
|
// for an external driver.
|
|
#if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
|
|
case RS_HAL_GRAPHICS_INIT:
|
|
fnPtr[0] = (void *)rsdGLInit; break;
|
|
case RS_HAL_GRAPHICS_SHUTDOWN:
|
|
fnPtr[0] = (void *)rsdGLShutdown; break;
|
|
case RS_HAL_GRAPHICS_SWAP:
|
|
fnPtr[0] = (void *)rsdGLSwap; break;
|
|
case RS_HAL_GRAPHICS_SET_SURFACE:
|
|
fnPtr[0] = (void *)rsdGLSetSurface; break;
|
|
case RS_HAL_GRAPHICS_RASTER_INIT:
|
|
fnPtr[0] = (void *)rsdProgramRasterInit; break;
|
|
case RS_HAL_GRAPHICS_RASTER_SET_ACTIVE:
|
|
fnPtr[0] = (void *)rsdProgramRasterSetActive; break;
|
|
case RS_HAL_GRAPHICS_RASTER_DESTROY:
|
|
fnPtr[0] = (void *)rsdProgramRasterDestroy; break;
|
|
case RS_HAL_GRAPHICS_VERTEX_INIT:
|
|
fnPtr[0] = (void *)rsdProgramVertexInit; break;
|
|
case RS_HAL_GRAPHICS_VERTEX_SET_ACTIVE:
|
|
fnPtr[0] = (void *)rsdProgramVertexSetActive; break;
|
|
case RS_HAL_GRAPHICS_VERTEX_DESTROY:
|
|
fnPtr[0] = (void *)rsdProgramVertexDestroy; break;
|
|
case RS_HAL_GRAPHICS_FRAGMENT_INIT:
|
|
fnPtr[0] = (void *)rsdProgramFragmentInit; break;
|
|
case RS_HAL_GRAPHICS_FRAGMENT_SET_ACTIVE:
|
|
fnPtr[0] = (void *)rsdProgramFragmentSetActive; break;
|
|
case RS_HAL_GRAPHICS_FRAGMENT_DESTROY:
|
|
fnPtr[0] = (void *)rsdProgramFragmentDestroy; break;
|
|
case RS_HAL_GRAPHICS_MESH_INIT:
|
|
fnPtr[0] = (void *)rsdMeshInit; break;
|
|
case RS_HAL_GRAPHICS_MESH_DRAW:
|
|
fnPtr[0] = (void *)rsdMeshDraw; break;
|
|
case RS_HAL_GRAPHICS_MESH_DESTROY:
|
|
fnPtr[0] = (void *)rsdMeshDestroy; break;
|
|
case RS_HAL_GRAPHICS_FB_INIT:
|
|
fnPtr[0] = (void *)rsdFrameBufferInit; break;
|
|
case RS_HAL_GRAPHICS_FB_SET_ACTIVE:
|
|
fnPtr[0] = (void *)rsdFrameBufferSetActive; break;
|
|
case RS_HAL_GRAPHICS_FB_DESTROY:
|
|
fnPtr[0] = (void *)rsdFrameBufferDestroy; break;
|
|
case RS_HAL_GRAPHICS_STORE_INIT:
|
|
fnPtr[0] = (void *)rsdProgramStoreInit; break;
|
|
case RS_HAL_GRAPHICS_STORE_SET_ACTIVE:
|
|
fnPtr[0] = (void *)rsdProgramStoreSetActive; break;
|
|
case RS_HAL_GRAPHICS_STORE_DESTROY:
|
|
fnPtr[0] = (void *)rsdProgramStoreDestroy; break;
|
|
#endif
|
|
|
|
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;
|
|
}
|
|
|
|
} // namespace renderscript
|
|
} // namespace android
|
|
|
|
extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name);
|
|
|
|
static RsdCpuReference::CpuScript * LookupScript(Context *, const Script *s) {
|
|
return (RsdCpuReference::CpuScript *)s->mHal.drv;
|
|
}
|
|
|
|
#ifdef RS_COMPATIBILITY_LIB
|
|
typedef void (*sAllocationDestroyFnPtr) (const Context *rsc, Allocation *alloc);
|
|
typedef void (*sAllocationIoSendFnPtr) (const Context *rsc, Allocation *alloc);
|
|
typedef void (*sAllocationSetSurfaceFnPtr) (const Context *rsc, Allocation *alloc, ANativeWindow *nw);
|
|
static sAllocationDestroyFnPtr sAllocationDestroy;
|
|
static sAllocationIoSendFnPtr sAllocationIoSend;
|
|
static sAllocationSetSurfaceFnPtr sAllocationSetSurface;
|
|
|
|
static bool loadIOSuppLibSyms() {
|
|
void* handleIO = nullptr;
|
|
handleIO = dlopen("libRSSupportIO.so", RTLD_LAZY | RTLD_LOCAL);
|
|
if (handleIO == nullptr) {
|
|
ALOGE("Couldn't load libRSSupportIO.so");
|
|
return false;
|
|
}
|
|
sAllocationDestroy = (sAllocationDestroyFnPtr)dlsym(handleIO, "rscAllocationDestroy");
|
|
if (sAllocationDestroy==nullptr) {
|
|
ALOGE("Failed to initialize sAllocationDestroy");
|
|
return false;
|
|
}
|
|
sAllocationIoSend = (sAllocationIoSendFnPtr)dlsym(handleIO, "rscAllocationIoSend");
|
|
if (sAllocationIoSend==nullptr) {
|
|
ALOGE("Failed to initialize sAllocationIoSend");
|
|
return false;
|
|
}
|
|
sAllocationSetSurface = (sAllocationSetSurfaceFnPtr)dlsym(handleIO, "rscAllocationSetSurface");
|
|
if (sAllocationSetSurface==nullptr) {
|
|
ALOGE("Failed to initialize sAllocationIoSend");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
#endif
|
|
|
|
extern "C" bool rsdHalInit(RsContext c, uint32_t version_major,
|
|
uint32_t version_minor) {
|
|
Context *rsc = (Context*) c;
|
|
#ifdef RS_COMPATIBILITY_LIB
|
|
if (loadIOSuppLibSyms()) {
|
|
rsc->mHal.funcs.allocation.destroy = sAllocationDestroy;
|
|
rsc->mHal.funcs.allocation.ioSend = sAllocationIoSend;
|
|
rsc->mHal.funcs.allocation.setSurface = sAllocationSetSurface;
|
|
}
|
|
#endif
|
|
|
|
RsdHal *dc = (RsdHal *)calloc(1, sizeof(RsdHal));
|
|
if (!dc) {
|
|
ALOGE("Calloc for driver hal failed.");
|
|
return false;
|
|
}
|
|
rsc->mHal.drv = dc;
|
|
|
|
dc->mCpuRef = RsdCpuReference::create(rsc, version_major, version_minor,
|
|
&rsdLookupRuntimeStub, &LookupScript);
|
|
if (!dc->mCpuRef) {
|
|
ALOGE("RsdCpuReference::create for driver hal failed.");
|
|
rsc->mHal.drv = nullptr;
|
|
free(dc);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void SetPriority(const Context *rsc, int32_t priority) {
|
|
RsdHal *dc = (RsdHal *)rsc->mHal.drv;
|
|
|
|
dc->mCpuRef->setPriority(priority);
|
|
|
|
#if !defined(RS_VENDOR_LIB) && !defined(RS_COMPATIBILITY_LIB)
|
|
if (dc->mHasGraphics) {
|
|
rsdGLSetPriority(rsc, priority);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void Shutdown(Context *rsc) {
|
|
RsdHal *dc = (RsdHal *)rsc->mHal.drv;
|
|
delete dc->mCpuRef;
|
|
free(dc);
|
|
rsc->mHal.drv = nullptr;
|
|
}
|
|
|
|
void* rsdAllocRuntimeMem(size_t size, uint32_t flags) {
|
|
void* buffer = calloc(size, sizeof(char));
|
|
return buffer;
|
|
}
|
|
|
|
void rsdFreeRuntimeMem(void* ptr) {
|
|
free(ptr);
|
|
}
|