/* * 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. */ #ifndef RSOV_SCRIPT_H #define RSOV_SCRIPT_H #include <vulkan/vulkan.h> #include <map> #include <vector> #include "bcinfo/MetadataExtractor.h" #include "rsDefines.h" #include "rs_hal.h" #include "rsd_cpu.h" namespace android { namespace renderscript { class Allocation; class Context; class Element; class Script; class ScriptC; namespace rsov { class RSoVAllocation; class RSoVBuffer; class RSoVContext; // TODO: CpuScript is a bad name for the base class. Fix with a refactoring. class RSoVScript : RsdCpuReference::CpuScript { public: RSoVScript(RSoVContext *context, std::vector<uint32_t> &&spvWords, bcinfo::MetadataExtractor *ME, std::map<std::string, int> *GAMapping); RSoVScript(RSoVContext *context, const std::vector<uint32_t> &spvWords, bcinfo::MetadataExtractor *ME, std::map<std::string, int> *GAMapping) = delete; virtual ~RSoVScript(); static bool isScriptCpuBacked(const Script *s); static void initScriptOnCpu(Script *s, RsdCpuReference::CpuScript *cs); static void initScriptOnRSoV(Script *s, RSoVScript *rsovScript); void populateScript(Script *) override; void invokeFunction(uint32_t slot, const void *params, size_t paramLength) override; int invokeRoot() override; void invokeForEach(uint32_t slot, const Allocation **ains, uint32_t inLen, Allocation *aout, const void *usr, uint32_t usrLen, const RsScriptCall *sc) override; void invokeReduce(uint32_t slot, const Allocation **ains, uint32_t inLen, Allocation *aout, const RsScriptCall *sc) override; void invokeInit() override; void invokeFreeChildren() override; void setGlobalVar(uint32_t slot, const void *data, size_t dataLength) override; void getGlobalVar(uint32_t slot, void *data, size_t dataLength) override; void setGlobalVarWithElemDims(uint32_t slot, const void *data, size_t dataLength, const Element *e, const uint32_t *dims, size_t dimLength) override; void setGlobalBind(uint32_t slot, Allocation *data) override; void setGlobalObj(uint32_t slot, ObjectBase *obj) override; Allocation *getAllocationForPointer(const void *ptr) const override; // Returns number of global variables in this Script (may be 0 if // compiler is not configured to emit this information). int getGlobalEntries() const override; // Returns the name of the global variable at index i. const char *getGlobalName(int i) const override; // Returns the CPU address of the global variable at index i. const void *getGlobalAddress(int i) const override; // Returns the size (in bytes) of the global variable at index i. size_t getGlobalSize(int i) const override; // Returns the properties of the global variable at index i. uint32_t getGlobalProperties(int i) const override; void setCpuScript(RsdCpuReference::CpuScript *cs) { mCpuScript = cs; } RsdCpuReference::CpuScript *getCpuScript() const { return mCpuScript; } private: void InitDescriptorAndPipelineLayouts(uint32_t inLen); void InitShader(uint32_t slot); void InitDescriptorPool(uint32_t inLen); void InitDescriptorSet(const std::vector<RSoVAllocation *> &inputAllocations, RSoVAllocation *outputAllocation); void InitPipelineCache(); void InitPipeline(); void MarshalTypeInfo(); void runForEach(uint32_t slot, uint32_t inLen, const std::vector<RSoVAllocation *> &input, RSoVAllocation *output); // Gets the offset for the global variable with the given slot number in // the global buffer uint32_t GetExportedVarOffset(uint32_t slot) const { // High-level Java or C++ API has verified that slot is in range return mExportedVarOffsets[slot]; } static constexpr int CPU_SCRIPT_MAGIC_NUMBER = 0x60000; RSoVContext *mRSoV; VkDevice mDevice; std::vector<uint32_t> mSPIRVWords; RsdCpuReference::CpuScript *mCpuScript; static constexpr int NUM_DESCRIPTOR_SETS = 1; std::vector<VkDescriptorSetLayout> mDescLayout; VkPipelineLayout mPipelineLayout; VkPipeline mComputePipeline; // TODO: Multiple stages for multiple kernels VkPipelineShaderStageCreateInfo mShaderStage; VkDescriptorPool mDescPool; std::vector<VkDescriptorSet> mDescSet; // For kernel names const bcinfo::MetadataExtractor *mME; std::unique_ptr<RSoVBuffer> mGlobals; std::vector<uint32_t> mExportedVarOffsets; // Metadata of global allocations std::unique_ptr<RSoVBuffer> mGlobalAllocationMetadata; // Mapping of global allocation to rsov-assigned ID std::unique_ptr<std::map<std::string, int> > mGAMapping; }; } // namespace rsov } // namespace renderscript } // namespace android extern bool rsovScriptInit(const android::renderscript::Context *rsc, android::renderscript::ScriptC *script, char const *resName, char const *cacheDir, uint8_t const *bitcode, size_t bitcodeSize, uint32_t flags); extern bool rsovInitIntrinsic(const android::renderscript::Context *rsc, android::renderscript::Script *s, RsScriptIntrinsicID iid, android::renderscript::Element *e); extern void rsovScriptInvokeFunction(const android::renderscript::Context *dc, android::renderscript::Script *script, uint32_t slot, const void *params, size_t paramLength); extern void rsovScriptInvokeForEach( const android::renderscript::Context *rsc, android::renderscript::Script *s, uint32_t slot, const android::renderscript::Allocation *ain, android::renderscript::Allocation *aout, const void *usr, size_t usrLen, const RsScriptCall *sc); extern void rsovScriptInvokeReduce( const android::renderscript::Context *rsc, android::renderscript::Script *s, uint32_t slot, const android::renderscript::Allocation **ains, size_t inLen, android::renderscript::Allocation *aout, const RsScriptCall *sc); extern void rsovScriptInvokeForEachMulti( const android::renderscript::Context *rsc, android::renderscript::Script *s, uint32_t slot, const android::renderscript::Allocation **ains, size_t inLen, android::renderscript::Allocation *aout, const void *usr, size_t usrLen, const RsScriptCall *sc); extern int rsovScriptInvokeRoot(const android::renderscript::Context *dc, android::renderscript::Script *script); extern void rsovScriptInvokeInit(const android::renderscript::Context *dc, android::renderscript::Script *script); extern void rsovScriptInvokeFreeChildren( const android::renderscript::Context *dc, android::renderscript::Script *script); extern void rsovScriptSetGlobalVar(const android::renderscript::Context *, const android::renderscript::Script *, uint32_t slot, void *data, size_t dataLen); extern void rsovScriptGetGlobalVar(const android::renderscript::Context *, const android::renderscript::Script *, uint32_t slot, void *data, size_t dataLen); extern void rsovScriptSetGlobalVarWithElemDims( const android::renderscript::Context *, const android::renderscript::Script *, uint32_t slot, void *data, size_t dataLength, const android::renderscript::Element *, const uint32_t *dims, size_t dimLength); extern void rsovScriptSetGlobalBind(const android::renderscript::Context *, const android::renderscript::Script *, uint32_t slot, android::renderscript::Allocation *data); extern void rsovScriptSetGlobalObj(const android::renderscript::Context *, const android::renderscript::Script *, uint32_t slot, android::renderscript::ObjectBase *data); extern void rsovScriptSetGlobal(const android::renderscript::Context *dc, const android::renderscript::Script *script, uint32_t slot, void *data, size_t dataLength); extern void rsovScriptGetGlobal(const android::renderscript::Context *dc, const android::renderscript::Script *script, uint32_t slot, void *data, size_t dataLength); extern void rsovScriptDestroy(const android::renderscript::Context *dc, android::renderscript::Script *script); extern android::renderscript::Allocation *rsovScriptGetAllocationForPointer( const android::renderscript::Context *dc, const android::renderscript::Script *script, const void *); extern void rsovScriptUpdateCachedObject( const android::renderscript::Context *rsc, const android::renderscript::Script *script, android::renderscript::rs_script *obj); #endif // RSOV_SCRIPT_H