180 lines
5.8 KiB
C++
180 lines
5.8 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef RSD_BCC_H
|
|
#define RSD_BCC_H
|
|
|
|
#include <rs_hal.h>
|
|
#include <rsRuntime.h>
|
|
|
|
#ifndef RS_COMPATIBILITY_LIB
|
|
#include <bcc/ExecutionEngine/CompilerRTSymbolResolver.h>
|
|
#include <bcc/ExecutionEngine/SymbolResolverProxy.h>
|
|
#include <vector>
|
|
#include <utility>
|
|
#endif
|
|
|
|
#include "rsCpuCore.h"
|
|
|
|
namespace bcc {
|
|
class BCCContext;
|
|
class RSCompilerDriver;
|
|
class RSExecutable;
|
|
}
|
|
|
|
namespace bcinfo {
|
|
class MetadataExtractor;
|
|
}
|
|
|
|
namespace android {
|
|
namespace renderscript {
|
|
|
|
|
|
|
|
class RsdCpuScriptImpl : public RsdCpuReferenceImpl::CpuScript {
|
|
public:
|
|
typedef void (*outer_foreach_t)(
|
|
const RsForEachStubParamStruct *,
|
|
uint32_t x1, uint32_t x2,
|
|
uint32_t instep, uint32_t outstep);
|
|
#ifdef RS_COMPATIBILITY_LIB
|
|
typedef void (* InvokeFunc_t)(void);
|
|
typedef void (* ForEachFunc_t)(void);
|
|
typedef int (* RootFunc_t)(void);
|
|
typedef void (*WorkerCallback_t)(void *usr, uint32_t idx);
|
|
#endif
|
|
|
|
bool init(char const *resName, char const *cacheDir,
|
|
uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags,
|
|
char const *bccPluginName = NULL);
|
|
virtual void populateScript(Script *);
|
|
|
|
virtual void invokeFunction(uint32_t slot, const void *params, size_t paramLength);
|
|
virtual int invokeRoot();
|
|
virtual void preLaunch(uint32_t slot, const Allocation * ain,
|
|
Allocation * aout, const void * usr,
|
|
uint32_t usrLen, const RsScriptCall *sc);
|
|
virtual void postLaunch(uint32_t slot, const Allocation * ain,
|
|
Allocation * aout, const void * usr,
|
|
uint32_t usrLen, const RsScriptCall *sc);
|
|
virtual void invokeForEach(uint32_t slot,
|
|
const Allocation * ain,
|
|
Allocation * aout,
|
|
const void * usr,
|
|
uint32_t usrLen,
|
|
const RsScriptCall *sc);
|
|
|
|
virtual void invokeForEachMulti(uint32_t slot,
|
|
const Allocation** ains,
|
|
uint32_t inLen,
|
|
Allocation* aout,
|
|
const void* usr,
|
|
uint32_t usrLen,
|
|
const RsScriptCall* sc);
|
|
virtual void invokeInit();
|
|
virtual void invokeFreeChildren();
|
|
|
|
virtual void setGlobalVar(uint32_t slot, const void *data, size_t dataLength);
|
|
virtual void getGlobalVar(uint32_t slot, void *data, size_t dataLength);
|
|
virtual void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength,
|
|
const Element *e, const uint32_t *dims, size_t dimLength);
|
|
virtual void setGlobalBind(uint32_t slot, Allocation *data);
|
|
virtual void setGlobalObj(uint32_t slot, ObjectBase *data);
|
|
|
|
|
|
virtual ~RsdCpuScriptImpl();
|
|
RsdCpuScriptImpl(RsdCpuReferenceImpl *ctx, const Script *s);
|
|
|
|
const Script * getScript() {return mScript;}
|
|
|
|
void forEachMtlsSetup(const Allocation * ain, Allocation * aout,
|
|
const void * usr, uint32_t usrLen,
|
|
const RsScriptCall *sc, MTLaunchStruct *mtls);
|
|
|
|
void forEachMtlsSetup(const Allocation ** ains, uint32_t inLen,
|
|
Allocation * aout, const void * usr, uint32_t usrLen,
|
|
const RsScriptCall *sc, MTLaunchStruct *mtls);
|
|
|
|
virtual void forEachKernelSetup(uint32_t slot, MTLaunchStruct *mtls);
|
|
|
|
|
|
const RsdCpuReference::CpuSymbol * lookupSymbolMath(const char *sym);
|
|
static void * lookupRuntimeStub(void* pContext, char const* name);
|
|
|
|
virtual Allocation * getAllocationForPointer(const void *ptr) const;
|
|
|
|
#ifndef RS_COMPATIBILITY_LIB
|
|
virtual void * getRSExecutable() { return mExecutable; }
|
|
#endif
|
|
|
|
protected:
|
|
RsdCpuReferenceImpl *mCtx;
|
|
const Script *mScript;
|
|
|
|
#ifndef RS_COMPATIBILITY_LIB
|
|
// Returns the path to the core library we'll use.
|
|
const char* findCoreLib(const bcinfo::MetadataExtractor& bitCodeMetaData, const char* bitcode,
|
|
size_t bitcodeSize);
|
|
int (*mRoot)();
|
|
int (*mRootExpand)();
|
|
void (*mInit)();
|
|
void (*mFreeChildren)();
|
|
|
|
std::vector<std::pair<const char *, uint32_t> > mExportedForEachFuncList;
|
|
|
|
bcc::BCCContext *mCompilerContext;
|
|
bcc::RSCompilerDriver *mCompilerDriver;
|
|
bcc::CompilerRTSymbolResolver mCompilerRuntime;
|
|
bcc::LookupFunctionSymbolResolver<void *> mRSRuntime;
|
|
bcc::SymbolResolverProxy mResolver;
|
|
bcc::RSExecutable *mExecutable;
|
|
#else
|
|
void *mScriptSO;
|
|
RootFunc_t mRoot;
|
|
RootFunc_t mRootExpand;
|
|
InvokeFunc_t mInit;
|
|
InvokeFunc_t mFreeChildren;
|
|
InvokeFunc_t *mInvokeFunctions;
|
|
ForEachFunc_t *mForEachFunctions;
|
|
|
|
void **mFieldAddress;
|
|
bool *mFieldIsObject;
|
|
uint32_t *mForEachSignatures;
|
|
|
|
// for populate script
|
|
//int mVersionMajor;
|
|
//int mVersionMinor;
|
|
size_t mExportedVariableCount;
|
|
size_t mExportedFunctionCount;
|
|
#endif
|
|
|
|
Allocation **mBoundAllocs;
|
|
void * mIntrinsicData;
|
|
bool mIsThreadable;
|
|
};
|
|
|
|
Allocation * rsdScriptGetAllocationForPointer(
|
|
const Context *dc,
|
|
const Script *script,
|
|
const void *);
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|