maybe fixed?
diff --git a/src/sksl/SkSLInterpreter.h b/src/sksl/SkSLInterpreter.h
index 398a9b7..f4d0750 100644
--- a/src/sksl/SkSLInterpreter.h
+++ b/src/sksl/SkSLInterpreter.h
@@ -166,7 +166,9 @@
Vector* stack = fMemory + MEMORY_SIZE;
int stackCount = f->fStackSlotCount + f->fParameterSlotCount;
stack -= stackCount;
- memcpy(stack, args, f->fParameterSlotCount * sizeof(Vector));
+ if (f->fParameterSlotCount) {
+ memcpy(stack, args, f->fParameterSlotCount * sizeof(Vector));
+ }
Context context(fMemory, stack, condStack, maskStack, loopStack, continueStack);
if (this->innerRun(f, context, 0, outResult)) {
int slot = 0;
diff --git a/src/sksl/SkSLUtil.cpp b/src/sksl/SkSLUtil.cpp
index b2c5162..686ece3 100644
--- a/src/sksl/SkSLUtil.cpp
+++ b/src/sksl/SkSLUtil.cpp
@@ -9,6 +9,10 @@
#include "src/sksl/SkSLStringStream.h"
+#if !defined(SKSL_STANDALONE) & SK_SUPPORT_GPU
+#include "include/gpu/GrContextOptions.h"
+#endif
+
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
@@ -73,4 +77,177 @@
}
}
+#if !defined(SKSL_STANDALONE) & SK_SUPPORT_GPU
+sk_sp<GrShaderCaps> ShaderCapsFactory::Default() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fShaderDerivativeSupport = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::Version450Core() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 450 core";
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::Version110() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 110";
+ result->fGLSLGeneration = GrGLSLGeneration::k110_GrGLSLGeneration;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::UsesPrecisionModifiers() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fUsesPrecisionModifiers = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::CannotUseMinAndAbsTogether() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fCanUseMinAndAbsTogether = false;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::CannotUseFractForNegativeValues() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fCanUseFractForNegativeValues = false;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::MustForceNegatedAtanParamToFloat() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fMustForceNegatedAtanParamToFloat = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::ShaderDerivativeExtensionString() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fShaderDerivativeSupport = true;
+ result->fShaderDerivativeExtensionString = "GL_OES_standard_derivatives";
+ result->fUsesPrecisionModifiers = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::FragCoordsOld() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 110";
+ result->fGLSLGeneration = GrGLSLGeneration::k110_GrGLSLGeneration;
+ result->fFragCoordConventionsExtensionString = "GL_ARB_fragment_coord_conventions";
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::FragCoordsNew() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fFragCoordConventionsExtensionString = "GL_ARB_fragment_coord_conventions";
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::GeometryShaderSupport() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fGeometryShaderSupport = true;
+ result->fGSInvocationsSupport = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::NoGSInvocationsSupport() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fGeometryShaderSupport = true;
+ result->fGSInvocationsSupport = false;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::GeometryShaderExtensionString() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 310es";
+ result->fGeometryShaderSupport = true;
+ result->fGeometryShaderExtensionString = "GL_EXT_geometry_shader";
+ result->fGSInvocationsSupport = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::GSInvocationsExtensionString() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fGeometryShaderSupport = true;
+ result->fGSInvocationsSupport = true;
+ result->fGSInvocationsExtensionString = "GL_ARB_gpu_shader5";
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::VariousCaps() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fExternalTextureSupport = true;
+ result->fFBFetchSupport = false;
+ result->fCanUseAnyFunctionInShader = false;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::CannotUseFragCoord() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fCanUseFragCoord = false;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::IncompleteShortIntPrecision() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 310es";
+ result->fUsesPrecisionModifiers = true;
+ result->fIncompleteShortIntPrecision = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::AddAndTrueToLoopCondition() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fAddAndTrueToLoopCondition = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::UnfoldShortCircuitAsTernary() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fUnfoldShortCircuitAsTernary = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::EmulateAbsIntFunction() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fEmulateAbsIntFunction = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::RewriteDoWhileLoops() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fRewriteDoWhileLoops = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::RemovePowWithConstantExponent() {
+ sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
+ result->fVersionDeclString = "#version 400";
+ result->fRemovePowWithConstantExponent = true;
+ return result;
+}
+
+sk_sp<GrShaderCaps> ShaderCapsFactory::SampleMaskSupport() {
+ sk_sp<GrShaderCaps> result = Default();
+ result->fSampleMaskSupport = true;
+ return result;
+}
+#endif
+
} // namespace
diff --git a/src/sksl/SkSLUtil.h b/src/sksl/SkSLUtil.h
index 08f2842..73aa171 100644
--- a/src/sksl/SkSLUtil.h
+++ b/src/sksl/SkSLUtil.h
@@ -17,13 +17,12 @@
#ifndef SKSL_STANDALONE
#include "include/core/SkTypes.h"
-#if SK_SUPPORT_GPU
-#include "include/gpu/GrContextOptions.h"
-#include "src/gpu/GrShaderCaps.h"
-#endif // SK_SUPPORT_GPU
#endif // SKSL_STANDALONE
-class GrShaderCaps;
+#if SK_SUPPORT_GPU
+#include "include/core/SkRefCnt.h"
+#include "src/gpu/GrShaderCaps.h"
+#endif // SK_SUPPORT_GPU
namespace SkSL {
@@ -221,176 +220,51 @@
// Various sets of caps for use in tests
class ShaderCapsFactory {
public:
- static sk_sp<GrShaderCaps> Default() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fShaderDerivativeSupport = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> Default();
- static sk_sp<GrShaderCaps> Version450Core() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 450 core";
- return result;
- }
+ static sk_sp<GrShaderCaps> Version450Core();
- static sk_sp<GrShaderCaps> Version110() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 110";
- result->fGLSLGeneration = GrGLSLGeneration::k110_GrGLSLGeneration;
- return result;
- }
+ static sk_sp<GrShaderCaps> Version110();
- static sk_sp<GrShaderCaps> UsesPrecisionModifiers() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fUsesPrecisionModifiers = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> UsesPrecisionModifiers();
- static sk_sp<GrShaderCaps> CannotUseMinAndAbsTogether() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fCanUseMinAndAbsTogether = false;
- return result;
- }
+ static sk_sp<GrShaderCaps> CannotUseMinAndAbsTogether();
- static sk_sp<GrShaderCaps> CannotUseFractForNegativeValues() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fCanUseFractForNegativeValues = false;
- return result;
- }
+ static sk_sp<GrShaderCaps> CannotUseFractForNegativeValues();
- static sk_sp<GrShaderCaps> MustForceNegatedAtanParamToFloat() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fMustForceNegatedAtanParamToFloat = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> MustForceNegatedAtanParamToFloat();
- static sk_sp<GrShaderCaps> ShaderDerivativeExtensionString() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fShaderDerivativeSupport = true;
- result->fShaderDerivativeExtensionString = "GL_OES_standard_derivatives";
- result->fUsesPrecisionModifiers = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> ShaderDerivativeExtensionString();
- static sk_sp<GrShaderCaps> FragCoordsOld() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 110";
- result->fGLSLGeneration = GrGLSLGeneration::k110_GrGLSLGeneration;
- result->fFragCoordConventionsExtensionString = "GL_ARB_fragment_coord_conventions";
- return result;
- }
+ static sk_sp<GrShaderCaps> FragCoordsOld();
- static sk_sp<GrShaderCaps> FragCoordsNew() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fFragCoordConventionsExtensionString = "GL_ARB_fragment_coord_conventions";
- return result;
- }
+ static sk_sp<GrShaderCaps> FragCoordsNew();
- static sk_sp<GrShaderCaps> GeometryShaderSupport() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fGeometryShaderSupport = true;
- result->fGSInvocationsSupport = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> GeometryShaderSupport();
- static sk_sp<GrShaderCaps> NoGSInvocationsSupport() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fGeometryShaderSupport = true;
- result->fGSInvocationsSupport = false;
- return result;
- }
+ static sk_sp<GrShaderCaps> NoGSInvocationsSupport();
- static sk_sp<GrShaderCaps> GeometryShaderExtensionString() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 310es";
- result->fGeometryShaderSupport = true;
- result->fGeometryShaderExtensionString = "GL_EXT_geometry_shader";
- result->fGSInvocationsSupport = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> GeometryShaderExtensionString();
- static sk_sp<GrShaderCaps> GSInvocationsExtensionString() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fGeometryShaderSupport = true;
- result->fGSInvocationsSupport = true;
- result->fGSInvocationsExtensionString = "GL_ARB_gpu_shader5";
- return result;
- }
+ static sk_sp<GrShaderCaps> GSInvocationsExtensionString();
- static sk_sp<GrShaderCaps> VariousCaps() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fExternalTextureSupport = true;
- result->fFBFetchSupport = false;
- result->fCanUseAnyFunctionInShader = false;
- return result;
- }
+ static sk_sp<GrShaderCaps> VariousCaps();
- static sk_sp<GrShaderCaps> CannotUseFragCoord() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fCanUseFragCoord = false;
- return result;
- }
+ static sk_sp<GrShaderCaps> CannotUseFragCoord();
- static sk_sp<GrShaderCaps> IncompleteShortIntPrecision() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 310es";
- result->fUsesPrecisionModifiers = true;
- result->fIncompleteShortIntPrecision = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> IncompleteShortIntPrecision();
- static sk_sp<GrShaderCaps> AddAndTrueToLoopCondition() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fAddAndTrueToLoopCondition = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> AddAndTrueToLoopCondition();
- static sk_sp<GrShaderCaps> UnfoldShortCircuitAsTernary() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fUnfoldShortCircuitAsTernary = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> UnfoldShortCircuitAsTernary();
- static sk_sp<GrShaderCaps> EmulateAbsIntFunction() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fEmulateAbsIntFunction = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> EmulateAbsIntFunction();
- static sk_sp<GrShaderCaps> RewriteDoWhileLoops() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fRewriteDoWhileLoops = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> RewriteDoWhileLoops();
- static sk_sp<GrShaderCaps> RemovePowWithConstantExponent() {
- sk_sp<GrShaderCaps> result = sk_make_sp<GrShaderCaps>(GrContextOptions());
- result->fVersionDeclString = "#version 400";
- result->fRemovePowWithConstantExponent = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> RemovePowWithConstantExponent();
- static sk_sp<GrShaderCaps> SampleMaskSupport() {
- sk_sp<GrShaderCaps> result = Default();
- result->fSampleMaskSupport = true;
- return result;
- }
+ static sk_sp<GrShaderCaps> SampleMaskSupport();
};
#endif