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