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