GrShaderCaps.h revision 4a98cdb7612493a062358cebd1141c9bcaa37ab1
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 9cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth#ifndef GrGLSLCaps_DEFINED 10cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth#define GrGLSLCaps_DEFINED 11cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 12cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth#include "GrCaps.h" 13cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth#include "GrGLSL.h" 14cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon#include "GrSwizzle.h" 15cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 16cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverthclass GrGLSLCaps : public GrShaderCaps { 17cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverthpublic: 182766c00fc0b6a07d46e5f74cdad45da2ef625237mtklein 19cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 20cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth /** 21cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * Indicates how GLSL must interact with advanced blend equations. The KHR extension requires 22cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * special layout qualifiers in the fragment shader. 23cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth */ 24cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth enum AdvBlendEqInteraction { 25cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth kNotSupported_AdvBlendEqInteraction, //<! No _blend_equation_advanced extension 26cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth kAutomatic_AdvBlendEqInteraction, //<! No interaction required 27cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth kGeneralEnable_AdvBlendEqInteraction, //<! layout(blend_support_all_equations) out 28cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth kSpecificEnables_AdvBlendEqInteraction, //<! Specific layout qualifiers per equation 29cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 30cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth kLast_AdvBlendEqInteraction = kSpecificEnables_AdvBlendEqInteraction 31cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth }; 32cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 33cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth /** 34cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * Initializes the GrGLSLCaps to a default set of features 35cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth */ 36cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth GrGLSLCaps(const GrContextOptions&); 37cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 38cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth /** 39cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * Some helper functions for encapsulating various extensions to read FB Buffer on openglES 40cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * 41cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * TODO(joshualitt) On desktop opengl 4.2+ we can achieve something similar to this effect 42cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth */ 43cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool fbFetchSupport() const { return fFBFetchSupport; } 44cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 45cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool fbFetchNeedsCustomOutput() const { return fFBFetchNeedsCustomOutput; } 46cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 47cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool bindlessTextureSupport() const { return fBindlessTextureSupport; } 48cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 49472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel const char* versionDeclString() const { return fVersionDeclString; } 50472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel 51cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth const char* fbFetchColorName() const { return fFBFetchColorName; } 52cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 53cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth const char* fbFetchExtensionString() const { return fFBFetchExtensionString; } 54cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 55cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool dropsTileOnZeroDivide() const { return fDropsTileOnZeroDivide; } 56cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 57c08f196648463d44eb85e17c5815dbf8f709a42acdalton bool flatInterpolationSupport() const { return fFlatInterpolationSupport; } 58c08f196648463d44eb85e17c5815dbf8f709a42acdalton 59c08f196648463d44eb85e17c5815dbf8f709a42acdalton bool noperspectiveInterpolationSupport() const { return fNoPerspectiveInterpolationSupport; } 60c08f196648463d44eb85e17c5815dbf8f709a42acdalton 614a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton bool multisampleInterpolationSupport() const { return fMultisampleInterpolationSupport; } 624a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton 6333ad701bc30387127c427fb1e38c781d5de33491cdalton bool sampleVariablesSupport() const { return fSampleVariablesSupport; } 6433ad701bc30387127c427fb1e38c781d5de33491cdalton 6533ad701bc30387127c427fb1e38c781d5de33491cdalton bool sampleMaskOverrideCoverageSupport() const { return fSampleMaskOverrideCoverageSupport; } 6633ad701bc30387127c427fb1e38c781d5de33491cdalton 67cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth AdvBlendEqInteraction advBlendEqInteraction() const { return fAdvBlendEqInteraction; } 68cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 69cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool mustEnableAdvBlendEqs() const { 70cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth return fAdvBlendEqInteraction >= kGeneralEnable_AdvBlendEqInteraction; 71cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth } 72cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 73cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool mustEnableSpecificAdvBlendEqs() const { 74cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth return fAdvBlendEqInteraction == kSpecificEnables_AdvBlendEqInteraction; 75cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth } 76cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 77cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool mustDeclareFragmentShaderOutput() const { 78cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth return fGLSLGeneration > k110_GrGLSLGeneration; 79cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth } 80cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 81f529439fea003851d986a0573a7e0465754b2a48egdaniel bool usesPrecisionModifiers() const { return fUsesPrecisionModifiers; } 82f529439fea003851d986a0573a7e0465754b2a48egdaniel 83472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel // Returns whether we can use the glsl funciton any() in our shader code. 84472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel bool canUseAnyFunctionInShader() const { return fCanUseAnyFunctionInShader; } 85472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel 868dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel bool canUseMinAndAbsTogether() const { return fCanUseMinAndAbsTogether; } 878dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel 888dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel bool mustForceNegatedAtanParamToFloat() const { return fMustForceNegatedAtanParamToFloat; } 898dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel 90574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel // Returns the string of an extension that must be enabled in the shader to support 91574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel // derivatives. If nullptr is returned then no extension needs to be enabled. Before calling 92574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel // this function, the caller should check that shaderDerivativeSupport exists. 93574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel const char* shaderDerivativeExtensionString() const { 94574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel SkASSERT(this->shaderDerivativeSupport()); 95574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel return fShaderDerivativeExtensionString; 96574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel } 9733ad701bc30387127c427fb1e38c781d5de33491cdalton 988dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // Returns the string of an extension that will do all necessary coord transfomations needed 998dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // when reading the fragment position. If such an extension does not exisits, this function 1008dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // returns a nullptr, and all transforms of the frag position must be done manually in the 1018dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // shader. 1028dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel const char* fragCoordConventionsExtensionString() const { 1038dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel return fFragCoordConventionsExtensionString; 1048dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel } 1058dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel 1068dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // This returns the name of an extension that must be enabled in the shader, if such a thing is 1078dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // required in order to use a secondary output in the shader. This returns a nullptr if no such 1088dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // extension is required. However, the return value of this function does not say whether dual 1098dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // source blending is supported. 1108dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel const char* secondaryOutputExtensionString() const { 1118dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel return fSecondaryOutputExtensionString; 1128dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel } 113574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel 1147ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon const char* externalTextureExtensionString() const { 1157ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon return fExternalTextureExtensionString; 1167ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon } 1177ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon 118c08f196648463d44eb85e17c5815dbf8f709a42acdalton const char* noperspectiveInterpolationExtensionString() const { 119c08f196648463d44eb85e17c5815dbf8f709a42acdalton SkASSERT(this->noperspectiveInterpolationSupport()); 120c08f196648463d44eb85e17c5815dbf8f709a42acdalton return fNoPerspectiveInterpolationExtensionString; 121c08f196648463d44eb85e17c5815dbf8f709a42acdalton } 122c08f196648463d44eb85e17c5815dbf8f709a42acdalton 1234a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton const char* multisampleInterpolationExtensionString() const { 1244a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton SkASSERT(this->multisampleInterpolationSupport()); 1254a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton return fMultisampleInterpolationExtensionString; 1264a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton } 1274a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton 12833ad701bc30387127c427fb1e38c781d5de33491cdalton const char* sampleVariablesExtensionString() const { 12933ad701bc30387127c427fb1e38c781d5de33491cdalton SkASSERT(this->sampleVariablesSupport()); 13033ad701bc30387127c427fb1e38c781d5de33491cdalton return fSampleVariablesExtensionString; 13133ad701bc30387127c427fb1e38c781d5de33491cdalton } 13233ad701bc30387127c427fb1e38c781d5de33491cdalton 133b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel /** 134cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon * Given a texture's config, this determines what swizzle must be appended to accesses to the 135cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon * texture in generated shader code. Swizzling may be implemented in texture parameters or a 1367f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon * sampler rather than in the shader. In this case the returned swizzle will always be "rgba". 137b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel */ 138cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon const GrSwizzle& configTextureSwizzle(GrPixelConfig config) const { 139cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon return fConfigTextureSwizzle[config]; 140cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon } 141b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel 1427f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon /** Swizzle that should occur on the fragment shader outputs for a given config. */ 1437f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon const GrSwizzle& configOutputSwizzle(GrPixelConfig config) const { 1447f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon return fConfigOutputSwizzle[config]; 1457f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon } 1467f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon 147cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth GrGLSLGeneration generation() const { return fGLSLGeneration; } 148cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 149cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth /** 150cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth * Returns a string containing the caps info. 151cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth */ 152cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth SkString dump() const override; 153cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 154cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverthprivate: 155b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel void onApplyOptionsOverrides(const GrContextOptions& options) override; 156b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel 157cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth GrGLSLGeneration fGLSLGeneration; 158cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 159cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool fDropsTileOnZeroDivide : 1; 160cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool fFBFetchSupport : 1; 161cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool fFBFetchNeedsCustomOutput : 1; 162cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth bool fBindlessTextureSupport : 1; 163f529439fea003851d986a0573a7e0465754b2a48egdaniel bool fUsesPrecisionModifiers : 1; 164472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel bool fCanUseAnyFunctionInShader : 1; 165c08f196648463d44eb85e17c5815dbf8f709a42acdalton bool fFlatInterpolationSupport : 1; 166c08f196648463d44eb85e17c5815dbf8f709a42acdalton bool fNoPerspectiveInterpolationSupport : 1; 1674a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton bool fMultisampleInterpolationSupport : 1; 16833ad701bc30387127c427fb1e38c781d5de33491cdalton bool fSampleVariablesSupport : 1; 16933ad701bc30387127c427fb1e38c781d5de33491cdalton bool fSampleMaskOverrideCoverageSupport : 1; 170f529439fea003851d986a0573a7e0465754b2a48egdaniel 1718dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel // Used for specific driver bug work arounds 1728dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel bool fCanUseMinAndAbsTogether : 1; 1738dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel bool fMustForceNegatedAtanParamToFloat : 1; 1748dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel 175472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel const char* fVersionDeclString; 176cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 177574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel const char* fShaderDerivativeExtensionString; 1788dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel const char* fFragCoordConventionsExtensionString; 1798dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel const char* fSecondaryOutputExtensionString; 1807ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon const char* fExternalTextureExtensionString; 181c08f196648463d44eb85e17c5815dbf8f709a42acdalton const char* fNoPerspectiveInterpolationExtensionString; 1824a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton const char* fMultisampleInterpolationExtensionString; 18333ad701bc30387127c427fb1e38c781d5de33491cdalton const char* fSampleVariablesExtensionString; 184574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel 185cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth const char* fFBFetchColorName; 186cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth const char* fFBFetchExtensionString; 187cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 188cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth AdvBlendEqInteraction fAdvBlendEqInteraction; 189cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 190cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon GrSwizzle fConfigTextureSwizzle[kGrPixelConfigCnt]; 1917f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon GrSwizzle fConfigOutputSwizzle[kGrPixelConfigCnt]; 192b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel 193cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth friend class GrGLCaps; // For initialization. 194fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel friend class GrVkCaps; 195cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 196cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth typedef GrShaderCaps INHERITED; 197cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth}; 198cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth 199cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth#endif 200