blob: 2909fe8caa288786bb222a630411bdad0018ad2e [file] [log] [blame]
/*
* 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