GrShaderCaps.h revision c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59
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
679c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    bool externalTextureSupport() const { return fExternalTextureSupport; }
689c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton
69c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton    bool bufferTextureSupport() const { return fBufferTextureSupport; }
70c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton
71cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    AdvBlendEqInteraction advBlendEqInteraction() const { return fAdvBlendEqInteraction; }
72cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
73cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool mustEnableAdvBlendEqs() const {
74cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        return fAdvBlendEqInteraction >= kGeneralEnable_AdvBlendEqInteraction;
75cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    }
76cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
77cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool mustEnableSpecificAdvBlendEqs() const {
78cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        return fAdvBlendEqInteraction == kSpecificEnables_AdvBlendEqInteraction;
79cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    }
80cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
81cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool mustDeclareFragmentShaderOutput() const {
82cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        return fGLSLGeneration > k110_GrGLSLGeneration;
83cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    }
84cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
85f529439fea003851d986a0573a7e0465754b2a48egdaniel    bool usesPrecisionModifiers() const { return fUsesPrecisionModifiers; }
86f529439fea003851d986a0573a7e0465754b2a48egdaniel
87472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    // Returns whether we can use the glsl funciton any() in our shader code.
88472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    bool canUseAnyFunctionInShader() const { return fCanUseAnyFunctionInShader; }
89472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel
908dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    bool canUseMinAndAbsTogether() const { return fCanUseMinAndAbsTogether; }
918dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel
928dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    bool mustForceNegatedAtanParamToFloat() const { return fMustForceNegatedAtanParamToFloat; }
938dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel
94574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    // Returns the string of an extension that must be enabled in the shader to support
95574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    // derivatives. If nullptr is returned then no extension needs to be enabled. Before calling
96574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    // this function, the caller should check that shaderDerivativeSupport exists.
97574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    const char* shaderDerivativeExtensionString() const {
98574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel        SkASSERT(this->shaderDerivativeSupport());
99574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel        return fShaderDerivativeExtensionString;
100574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    }
10133ad701bc30387127c427fb1e38c781d5de33491cdalton
1028dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // Returns the string of an extension that will do all necessary coord transfomations needed
1038dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // when reading the fragment position. If such an extension does not exisits, this function
1048dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // returns a nullptr, and all transforms of the frag position must be done manually in the
1058dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // shader.
1068dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    const char* fragCoordConventionsExtensionString() const {
1078dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel        return fFragCoordConventionsExtensionString;
1088dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    }
1098dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel
1108dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // This returns the name of an extension that must be enabled in the shader, if such a thing is
1118dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // required in order to use a secondary output in the shader. This returns a nullptr if no such
1128dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // extension is required. However, the return value of this function does not say whether dual
1138dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // source blending is supported.
1148dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    const char* secondaryOutputExtensionString() const {
1158dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel        return fSecondaryOutputExtensionString;
1168dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    }
117574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel
1187ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    const char* externalTextureExtensionString() const {
1199c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton        SkASSERT(this->externalTextureSupport());
1207ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon        return fExternalTextureExtensionString;
1217ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    }
1227ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon
123c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton    const char* bufferTextureExtensionString() const {
124c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton        SkASSERT(this->bufferTextureSupport());
125c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton        return fBufferTextureExtensionString;
126c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton    }
127c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton
128c08f196648463d44eb85e17c5815dbf8f709a42acdalton    const char* noperspectiveInterpolationExtensionString() const {
129c08f196648463d44eb85e17c5815dbf8f709a42acdalton        SkASSERT(this->noperspectiveInterpolationSupport());
130c08f196648463d44eb85e17c5815dbf8f709a42acdalton        return fNoPerspectiveInterpolationExtensionString;
131c08f196648463d44eb85e17c5815dbf8f709a42acdalton    }
132c08f196648463d44eb85e17c5815dbf8f709a42acdalton
1334a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    const char* multisampleInterpolationExtensionString() const {
1344a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton        SkASSERT(this->multisampleInterpolationSupport());
1354a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton        return fMultisampleInterpolationExtensionString;
1364a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    }
1374a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton
13833ad701bc30387127c427fb1e38c781d5de33491cdalton    const char* sampleVariablesExtensionString() const {
13933ad701bc30387127c427fb1e38c781d5de33491cdalton        SkASSERT(this->sampleVariablesSupport());
14033ad701bc30387127c427fb1e38c781d5de33491cdalton        return fSampleVariablesExtensionString;
14133ad701bc30387127c427fb1e38c781d5de33491cdalton    }
14233ad701bc30387127c427fb1e38c781d5de33491cdalton
1439c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    int maxVertexSamplers() const { return fMaxVertexSamplers; }
1449c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton
1459c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    int maxGeometrySamplers() const { return fMaxGeometrySamplers; }
1469c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton
1479c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    int maxFragmentSamplers() const { return fMaxFragmentSamplers; }
1489c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton
1499c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    int maxCombinedSamplers() const { return fMaxCombinedSamplers; }
1509c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton
151b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel    /**
152cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon     * Given a texture's config, this determines what swizzle must be appended to accesses to the
153cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon     * texture in generated shader code. Swizzling may be implemented in texture parameters or a
1547f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon     * sampler rather than in the shader. In this case the returned swizzle will always be "rgba".
155b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel     */
156cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon    const GrSwizzle& configTextureSwizzle(GrPixelConfig config) const {
157cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon        return fConfigTextureSwizzle[config];
158cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon    }
159b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel
1607f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon    /** Swizzle that should occur on the fragment shader outputs for a given config. */
1617f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon    const GrSwizzle& configOutputSwizzle(GrPixelConfig config) const {
1627f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon        return fConfigOutputSwizzle[config];
1637f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon    }
1647f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon
165cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GrGLSLGeneration generation() const { return fGLSLGeneration; }
166cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
167cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    /**
168cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    * Returns a string containing the caps info.
169cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    */
170cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    SkString dump() const override;
171cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
172cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverthprivate:
173b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel    void onApplyOptionsOverrides(const GrContextOptions& options) override;
174b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel
175cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GrGLSLGeneration fGLSLGeneration;
176cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
177cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool fDropsTileOnZeroDivide : 1;
178cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool fFBFetchSupport : 1;
179cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool fFBFetchNeedsCustomOutput : 1;
180cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    bool fBindlessTextureSupport : 1;
181f529439fea003851d986a0573a7e0465754b2a48egdaniel    bool fUsesPrecisionModifiers : 1;
182472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    bool fCanUseAnyFunctionInShader : 1;
183c08f196648463d44eb85e17c5815dbf8f709a42acdalton    bool fFlatInterpolationSupport : 1;
184c08f196648463d44eb85e17c5815dbf8f709a42acdalton    bool fNoPerspectiveInterpolationSupport : 1;
1854a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    bool fMultisampleInterpolationSupport : 1;
18633ad701bc30387127c427fb1e38c781d5de33491cdalton    bool fSampleVariablesSupport : 1;
18733ad701bc30387127c427fb1e38c781d5de33491cdalton    bool fSampleMaskOverrideCoverageSupport : 1;
1889c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    bool fExternalTextureSupport : 1;
189c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton    bool fBufferTextureSupport : 1;
190f529439fea003851d986a0573a7e0465754b2a48egdaniel
1918dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    // Used for specific driver bug work arounds
1928dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    bool fCanUseMinAndAbsTogether : 1;
1938dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    bool fMustForceNegatedAtanParamToFloat : 1;
1948dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel
195472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    const char* fVersionDeclString;
196cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
197574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    const char* fShaderDerivativeExtensionString;
1988dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    const char* fFragCoordConventionsExtensionString;
1998dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    const char* fSecondaryOutputExtensionString;
2007ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    const char* fExternalTextureExtensionString;
201c04ce676d4516a8c64e29e1f60bb72cd2c6c0a59cdalton    const char* fBufferTextureExtensionString;
202c08f196648463d44eb85e17c5815dbf8f709a42acdalton    const char* fNoPerspectiveInterpolationExtensionString;
2034a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    const char* fMultisampleInterpolationExtensionString;
20433ad701bc30387127c427fb1e38c781d5de33491cdalton    const char* fSampleVariablesExtensionString;
205574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel
206cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    const char* fFBFetchColorName;
207cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    const char* fFBFetchExtensionString;
208cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
2099c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    uint8_t fMaxVertexSamplers;
2109c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    uint8_t fMaxGeometrySamplers;
2119c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    uint8_t fMaxFragmentSamplers;
2129c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    uint8_t fMaxCombinedSamplers;
2139c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton
214cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    AdvBlendEqInteraction fAdvBlendEqInteraction;
215cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
216cdee009886babe6df7743a9b5b3e2cc0a5f21adfbsalomon    GrSwizzle fConfigTextureSwizzle[kGrPixelConfigCnt];
2177f9b2e4a45775e8cdd3f98260a66c0c6e1840550bsalomon    GrSwizzle fConfigOutputSwizzle[kGrPixelConfigCnt];
218b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel
219cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    friend class GrGLCaps;  // For initialization.
220fa8963252e122c5288c8e92b5ecc25a8fea21c3begdaniel    friend class GrVkCaps;
221cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
222cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    typedef GrShaderCaps INHERITED;
223cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth};
224cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
225cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth#endif
226