1cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth/*
2cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * Copyright 2012 Google Inc.
3cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth *
4cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * Use of this source code is governed by a BSD-style license that can be
5cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * found in the LICENSE file.
6cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth */
7cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
8cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon#include "GrShaderCaps.h"
10cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
11b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel#include "GrContextOptions.h"
1271a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman#include "SkJSONWriter.h"
13b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel
14cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth////////////////////////////////////////////////////////////////////////////////////////////
15cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
1694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian SalomonGrShaderCaps::GrShaderCaps(const GrContextOptions& options) {
1794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fGLSLGeneration = k330_GrGLSLGeneration;
1894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fShaderDerivativeSupport = false;
1994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fGeometryShaderSupport = false;
20f1b47bb299e72456d70cf3eae8086a5e01766c67Chris Dalton    fGSInvocationsSupport = false;
2194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fPathRenderingSupport = false;
2294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fDstReadInShaderSupport = false;
2394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fDualSourceBlendingSupport = false;
2494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fIntegerSupport = false;
2594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fTexelBufferSupport = false;
2694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fImageLoadStoreSupport = false;
27cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fDropsTileOnZeroDivide = false;
28cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fFBFetchSupport = false;
29cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fFBFetchNeedsCustomOutput = false;
30f529439fea003851d986a0573a7e0465754b2a48egdaniel    fUsesPrecisionModifiers = false;
31472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    fCanUseAnyFunctionInShader = true;
328dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fCanUseMinAndAbsTogether = true;
338a0044f1bd415bbef7167aa95ce897e2d7349dccFlorin Malita    fCanUseFractForNegativeValues = true;
348dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fMustForceNegatedAtanParamToFloat = false;
3580a08dd2e5cc379100ae944b3f3fadf887d518f0Greg Daniel    fAtan2ImplementedAsAtanYOverX = false;
3610ed243e2ee7d733f73c9e5947ab5189fd6d46e3Greg Daniel    fMustDoOpBetweenFloorAndAbs = false;
37138c26300f2686175f68b5a3528133f5c9edb596egdaniel    fRequiresLocalOutputColorForFBFetch = false;
38ac1e4964e7816de1f4977b52fa5f2f372537468bBrian Osman    fMustObfuscateUniformColor = false;
39dff5d4368dde7f27870b30c3724a4acc702f879cBrian Osman    fMustGuardDivisionEvenAfterExplicitZeroCheck = false;
40cd3261ac65b579bf8555973362e58629b7adda6bBrian Osman    fCanUseFragCoord = true;
41dba65f95e40fb1a4ea936b453b9bcb3fdbe178e1Brian Salomon    fInterpolantsAreInaccurate = false;
42c08f196648463d44eb85e17c5815dbf8f709a42acdalton    fFlatInterpolationSupport = false;
434127456bd631e79f1755fe974de90dd6c42e767fBrian Salomon    fPreferFlatInterpolation = false;
44c08f196648463d44eb85e17c5815dbf8f709a42acdalton    fNoPerspectiveInterpolationSupport = false;
459c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fExternalTextureSupport = false;
46f8a6ce8d8c54cab5456d3099fa07e460c889c2e6cdalton    fTexelFetchSupport = false;
471d6163577c8a4f1372208e2c9e03b1a69906d385Chris Dalton    fVertexIDSupport = false;
4847c8ed3c064f5176750f370b88119735163c0e8aChris Dalton    fFloatIs32Bits = true;
4947c8ed3c064f5176750f370b88119735163c0e8aChris Dalton    fHalfIs32Bits = false;
5094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon
51472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    fVersionDeclString = nullptr;
52574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    fShaderDerivativeExtensionString = nullptr;
538fd7955d03aa37e65493a6d4eeaa5a36dd45c278Chris Dalton    fGeometryShaderExtensionString = nullptr;
54f1b47bb299e72456d70cf3eae8086a5e01766c67Chris Dalton    fGSInvocationsExtensionString = nullptr;
558dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fFragCoordConventionsExtensionString = nullptr;
568dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fSecondaryOutputExtensionString = nullptr;
577ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    fExternalTextureExtensionString = nullptr;
58f8a6ce8d8c54cab5456d3099fa07e460c889c2e6cdalton    fTexelBufferExtensionString = nullptr;
59c08f196648463d44eb85e17c5815dbf8f709a42acdalton    fNoPerspectiveInterpolationExtensionString = nullptr;
6096fcdcc219d2a0d3579719b84b28bede76efba64halcanary    fFBFetchColorName = nullptr;
6196fcdcc219d2a0d3579719b84b28bede76efba64halcanary    fFBFetchExtensionString = nullptr;
62f26f7a063aae6eb29f526a54c7886538ac1e817bBrian Salomon    fImageLoadStoreExtensionString = nullptr;
639c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxVertexSamplers = 0;
649c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxGeometrySamplers = 0;
659c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxFragmentSamplers = 0;
669c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxCombinedSamplers = 0;
6798a83a9f0699a97a0ed2d1b15ec8d050c647a99ajvanverth    fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction;
680b4d8aa108f2fd14f1ee4de1affacab166d7a357Brian Salomon
69762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon    // TODO: Default this to 0 and only enable image multitexturing when a "safe" threshold is
70762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon    // known for a GPU class.
71762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon    fDisableImageMultitexturingDstRectAreaThreshold = std::numeric_limits<size_t>::max();
72cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth}
73cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
7471a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osmanvoid GrShaderCaps::dumpJSON(SkJSONWriter* writer) const {
7571a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->beginObject();
7694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon
7771a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Shader Derivative Support", fShaderDerivativeSupport);
7871a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Geometry Shader Support", fGeometryShaderSupport);
79f1b47bb299e72456d70cf3eae8086a5e01766c67Chris Dalton    writer->appendBool("Geometry Shader Invocations Support", fGSInvocationsSupport);
8071a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Path Rendering Support", fPathRenderingSupport);
8171a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Dst Read In Shader Support", fDstReadInShaderSupport);
8271a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Dual Source Blending Support", fDualSourceBlendingSupport);
8371a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Integer Support", fIntegerSupport);
8471a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Texel Buffer Support", fTexelBufferSupport);
8571a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Image Load Store Support", fImageLoadStoreSupport);
8671a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman
87cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    static const char* kAdvBlendEqInteractionStr[] = {
88cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "Not Supported",
89cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "Automatic",
90cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "General Enable",
91cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "Specific Enables",
92cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    };
93cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction);
94cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction);
95cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction);
96cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction);
97cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1);
98cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
9971a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("FB Fetch Support", fFBFetchSupport);
10071a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Drops tile on zero divide", fDropsTileOnZeroDivide);
10171a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Uses precision modifiers", fUsesPrecisionModifiers);
10271a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Can use any() function", fCanUseAnyFunctionInShader);
10371a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Can use min() and abs() together", fCanUseMinAndAbsTogether);
10471a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Can use fract() for negative values", fCanUseFractForNegativeValues);
10571a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Must force negated atan param to float", fMustForceNegatedAtanParamToFloat);
10610ed243e2ee7d733f73c9e5947ab5189fd6d46e3Greg Daniel    writer->appendBool("Must do op between floor and abs", fMustDoOpBetweenFloorAndAbs);
10771a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Must use local out color for FBFetch", fRequiresLocalOutputColorForFBFetch);
10871a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Must obfuscate uniform color", fMustObfuscateUniformColor);
10971a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Must guard division even after explicit zero check",
11071a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman                       fMustGuardDivisionEvenAfterExplicitZeroCheck);
111cd3261ac65b579bf8555973362e58629b7adda6bBrian Osman    writer->appendBool("Can use gl_FragCoord", fCanUseFragCoord);
112dba65f95e40fb1a4ea936b453b9bcb3fdbe178e1Brian Salomon    writer->appendBool("Interpolants are inaccurate", fInterpolantsAreInaccurate);
11371a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("Flat interpolation support", fFlatInterpolationSupport);
1144127456bd631e79f1755fe974de90dd6c42e767fBrian Salomon    writer->appendBool("Prefer flat interpolation", fPreferFlatInterpolation);
11571a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("No perspective interpolation support", fNoPerspectiveInterpolationSupport);
11671a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("External texture support", fExternalTextureSupport);
11771a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("texelFetch support", fTexelFetchSupport);
11871a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendBool("sk_VertexID support", fVertexIDSupport);
11947c8ed3c064f5176750f370b88119735163c0e8aChris Dalton    writer->appendBool("float == fp32", fFloatIs32Bits);
12047c8ed3c064f5176750f370b88119735163c0e8aChris Dalton    writer->appendBool("half == fp32", fHalfIs32Bits);
12171a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman
12271a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendS32("Max VS Samplers", fMaxVertexSamplers);
12371a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendS32("Max GS Samplers", fMaxGeometrySamplers);
12471a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendS32("Max FS Samplers", fMaxFragmentSamplers);
12571a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendS32("Max Combined Samplers", fMaxFragmentSamplers);
12671a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->appendString("Advanced blend equation interaction",
12771a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman                         kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]);
128762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon    writer->appendU64("Disable image multitexturing dst area threshold",
129762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon                      fDisableImageMultitexturingDstRectAreaThreshold);
13071a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman
13171a1889a1432715e515e000f1f4ef277e90e9ae1Brian Osman    writer->endObject();
132cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth}
133cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
13494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomonvoid GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) {
13501b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon    if (options.fDisableDriverCorrectnessWorkarounds) {
13601b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(fCanUseAnyFunctionInShader);
13701b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(fCanUseMinAndAbsTogether);
13801b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(fCanUseFractForNegativeValues);
13901b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fMustForceNegatedAtanParamToFloat);
14001b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fAtan2ImplementedAsAtanYOverX);
14101b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fMustDoOpBetweenFloorAndAbs);
14201b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fRequiresLocalOutputColorForFBFetch);
14301b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fMustObfuscateUniformColor);
14401b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fMustGuardDivisionEvenAfterExplicitZeroCheck);
14501b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(fCanUseFragCoord);
14601b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon        SkASSERT(!fInterpolantsAreInaccurate);
14701b476a02825b926436dff8d0bcb2e0e07640b56Brian Salomon    }
148195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman#if GR_TEST_UTILS
14994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending;
150762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon    if (options.fDisableImageMultitexturing) {
151762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon        fDisableImageMultitexturingDstRectAreaThreshold = 0;
152762d5e7e1ce918ce3dd7652cc7becdcbc69f47d5Brian Salomon    }
153195c05b6d5afbd65f803816938e24eebd51292c8Brian Osman#endif
154b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel}
155