| /* |
| * Copyright 2019 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SKSL_EXTERNALVALUE |
| #define SKSL_EXTERNALVALUE |
| |
| #include "src/sksl/ir/SkSLSymbol.h" |
| |
| namespace SkSL { |
| |
| class String; |
| class Type; |
| |
| class ExternalValue : public Symbol { |
| public: |
| ExternalValue(const char* name, const Type& type) |
| : INHERITED(-1, kExternal_Kind, name) |
| , fType(type) {} |
| |
| virtual bool canRead() const { |
| return false; |
| } |
| |
| virtual bool canWrite() const { |
| return false; |
| } |
| |
| virtual bool canCall() const { |
| return false; |
| } |
| |
| /** |
| * Returns the type for purposes of read and write operations. |
| */ |
| virtual const Type& type() const { |
| return fType; |
| } |
| |
| virtual int callParameterCount() const { |
| return -1; |
| } |
| |
| /** |
| * Fills in the outTypes array with pointers to the parameter types. outTypes must be able to |
| * hold callParameterCount() pointers. |
| */ |
| virtual void getCallParameterTypes(const Type** outTypes) const { |
| SkASSERT(false); |
| } |
| |
| /** |
| * Returns the return type resulting from a call operation. |
| */ |
| virtual const Type& callReturnType() const { |
| return fType; |
| } |
| |
| /** |
| * Reads the external value and stores the resulting data in target. The caller must ensure |
| * that target is a valid pointer to a region of sufficient size to hold the data contained |
| * in this external value. |
| * 'index' is the element index ([0 .. N-1]) within a call to ByteCode::run() |
| */ |
| virtual void read(int index, float* target) { |
| SkASSERT(false); |
| } |
| |
| /** |
| * Copies the value in src into this external value. The caller must ensure that src is a |
| * pointer to the type of data expected by this external value. |
| * 'index' is the element index ([0 .. N-1]) within a call to ByteCode::run() |
| */ |
| virtual void write(int index, float* src) { |
| SkASSERT(false); |
| } |
| |
| /** |
| * Calls the value as a function with the specified parameters. arguments must be a pointer to |
| * a structure containing the arguments expected by the external value in source order, and |
| * outResult must be a pointer to a region of sufficient size to hold the function's return |
| * value. |
| * 'index' is the element index ([0 .. N-1]) within a call to ByteCode::run() |
| */ |
| virtual void call(int index, float* arguments, float* outResult) { |
| SkASSERT(false); |
| } |
| |
| /** |
| * Resolves 'name' within this context and returns an ExternalValue which represents it, or |
| * null if no such child exists. If the implementation of this method creates new |
| * ExternalValues and there isn't a more convenient place for ownership of the objects to |
| * reside, the compiler's takeOwnership method may be useful. |
| * |
| * The 'name' string may not persist after this call; do not store this pointer. |
| */ |
| virtual ExternalValue* getChild(const char* name) const { |
| return nullptr; |
| } |
| |
| #ifdef SK_DEBUG |
| String description() const override { |
| return String("external<") + fName + ">"; |
| } |
| #endif |
| |
| private: |
| typedef Symbol INHERITED; |
| |
| const Type& fType; |
| }; |
| |
| } // namespace |
| |
| #endif |