GrShaderCaps.cpp revision dff5d4368dde7f27870b30c3724a4acc702f879c
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"
12b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel
13cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth////////////////////////////////////////////////////////////////////////////////////////////
14cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
1594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomonstatic const char* shader_type_to_string(GrShaderType type) {
1694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    switch (type) {
1794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    case kVertex_GrShaderType:
1894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        return "vertex";
1994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    case kGeometry_GrShaderType:
2094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        return "geometry";
2194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    case kFragment_GrShaderType:
2294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        return "fragment";
2394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    }
2494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    return "";
2594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon}
2694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon
2794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomonstatic const char* precision_to_string(GrSLPrecision p) {
2894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    switch (p) {
2994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    case kLow_GrSLPrecision:
3094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        return "low";
3194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    case kMedium_GrSLPrecision:
3294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        return "medium";
3394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    case kHigh_GrSLPrecision:
3494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        return "high";
3533aa2c7b5c351c17a11ce2bf7d7cd70a3d86ceccBrian Osman    default:
3633aa2c7b5c351c17a11ce2bf7d7cd70a3d86ceccBrian Osman        SkFAIL("Unexpected precision type.");
3733aa2c7b5c351c17a11ce2bf7d7cd70a3d86ceccBrian Osman        return "";
3894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    }
3994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon}
4098a83a9f0699a97a0ed2d1b15ec8d050c647a99ajvanverth
4194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian SalomonGrShaderCaps::GrShaderCaps(const GrContextOptions& options) {
4294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fGLSLGeneration = k330_GrGLSLGeneration;
4394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fShaderDerivativeSupport = false;
4494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fGeometryShaderSupport = false;
4594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fPathRenderingSupport = false;
4694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fDstReadInShaderSupport = false;
4794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fDualSourceBlendingSupport = false;
4894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fIntegerSupport = false;
4994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fTexelBufferSupport = false;
5094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fImageLoadStoreSupport = false;
5194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fShaderPrecisionVaries = false;
52cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fDropsTileOnZeroDivide = false;
53cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fFBFetchSupport = false;
54cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fFBFetchNeedsCustomOutput = false;
55cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    fBindlessTextureSupport = false;
56f529439fea003851d986a0573a7e0465754b2a48egdaniel    fUsesPrecisionModifiers = false;
57472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    fCanUseAnyFunctionInShader = true;
588dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fCanUseMinAndAbsTogether = true;
598dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fMustForceNegatedAtanParamToFloat = false;
6080a08dd2e5cc379100ae944b3f3fadf887d518f0Greg Daniel    fAtan2ImplementedAsAtanYOverX = false;
61138c26300f2686175f68b5a3528133f5c9edb596egdaniel    fRequiresLocalOutputColorForFBFetch = false;
622e777ead127b03a06ccc7dfc983e1b28e1aa2f86csmartdalton    fMustImplementGSInvocationsWithLoop = false;
63ac1e4964e7816de1f4977b52fa5f2f372537468bBrian Osman    fMustObfuscateUniformColor = false;
64dff5d4368dde7f27870b30c3724a4acc702f879cBrian Osman    fMustGuardDivisionEvenAfterExplicitZeroCheck = false;
65c08f196648463d44eb85e17c5815dbf8f709a42acdalton    fFlatInterpolationSupport = false;
66c08f196648463d44eb85e17c5815dbf8f709a42acdalton    fNoPerspectiveInterpolationSupport = false;
674a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    fMultisampleInterpolationSupport = false;
6833ad701bc30387127c427fb1e38c781d5de33491cdalton    fSampleVariablesSupport = false;
6933ad701bc30387127c427fb1e38c781d5de33491cdalton    fSampleMaskOverrideCoverageSupport = false;
709c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fExternalTextureSupport = false;
71f8a6ce8d8c54cab5456d3099fa07e460c889c2e6cdalton    fTexelFetchSupport = false;
721d6163577c8a4f1372208e2c9e03b1a69906d385Chris Dalton    fVertexIDSupport = false;
7394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon
74472d44e8f881f87449d11ba66515d3c1c5e69891egdaniel    fVersionDeclString = nullptr;
75574a4c153d8a3f42b2806848f5c23cbf55e18bbbegdaniel    fShaderDerivativeExtensionString = nullptr;
768dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fFragCoordConventionsExtensionString = nullptr;
778dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    fSecondaryOutputExtensionString = nullptr;
787ea33f5e1ae9eb1fb1e7377d6edf6acdcf71d103bsalomon    fExternalTextureExtensionString = nullptr;
79f8a6ce8d8c54cab5456d3099fa07e460c889c2e6cdalton    fTexelBufferExtensionString = nullptr;
80c08f196648463d44eb85e17c5815dbf8f709a42acdalton    fNoPerspectiveInterpolationExtensionString = nullptr;
814a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    fMultisampleInterpolationExtensionString = nullptr;
8233ad701bc30387127c427fb1e38c781d5de33491cdalton    fSampleVariablesExtensionString = nullptr;
8396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    fFBFetchColorName = nullptr;
8496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    fFBFetchExtensionString = nullptr;
85f26f7a063aae6eb29f526a54c7886538ac1e817bBrian Salomon    fImageLoadStoreExtensionString = nullptr;
869c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxVertexSamplers = 0;
879c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxGeometrySamplers = 0;
889c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxFragmentSamplers = 0;
899c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    fMaxCombinedSamplers = 0;
90f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    fMaxVertexImageStorages = 0;
91f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    fMaxGeometryImageStorages = 0;
92f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    fMaxFragmentImageStorages = 0;
93f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    fMaxCombinedImageStorages   = 0;
9498a83a9f0699a97a0ed2d1b15ec8d050c647a99ajvanverth    fAdvBlendEqInteraction = kNotSupported_AdvBlendEqInteraction;
95cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth}
96cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
9794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian SalomonSkString GrShaderCaps::dump() const {
9894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    SkString r;
9994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    static const char* gNY[] = { "NO", "YES" };
10094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Shader Derivative Support          : %s\n", gNY[fShaderDerivativeSupport]);
10194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Geometry Shader Support            : %s\n", gNY[fGeometryShaderSupport]);
10294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Path Rendering Support             : %s\n", gNY[fPathRenderingSupport]);
10394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Dst Read In Shader Support         : %s\n", gNY[fDstReadInShaderSupport]);
10494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Dual Source Blending Support       : %s\n", gNY[fDualSourceBlendingSupport]);
10594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Integer Support                    : %s\n", gNY[fIntegerSupport]);
10694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Texel Buffer Support               : %s\n", gNY[fTexelBufferSupport]);
10794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Image Load Store Support           : %s\n", gNY[fImageLoadStoreSupport]);
10894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon
10994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    r.appendf("Shader Float Precisions (varies: %s):\n", gNY[fShaderPrecisionVaries]);
11094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon
11194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    for (int s = 0; s < kGrShaderTypeCount; ++s) {
11294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        GrShaderType shaderType = static_cast<GrShaderType>(s);
11394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        r.appendf("\t%s:\n", shader_type_to_string(shaderType));
11494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        for (int p = 0; p < kGrSLPrecisionCount; ++p) {
11594efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon            if (fFloatPrecisions[s][p].supported()) {
11694efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon                GrSLPrecision precision = static_cast<GrSLPrecision>(p);
11794efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon                r.appendf("\t\t%s: log_low: %d log_high: %d bits: %d\n",
11894efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon                    precision_to_string(precision),
11994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon                    fFloatPrecisions[s][p].fLogRangeLow,
12094efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon                    fFloatPrecisions[s][p].fLogRangeHigh,
12194efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon                    fFloatPrecisions[s][p].fBits);
12294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon            }
12394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon        }
12494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    }
125cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
126cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    static const char* kAdvBlendEqInteractionStr[] = {
127cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "Not Supported",
128cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "Automatic",
129cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "General Enable",
130cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth        "Specific Enables",
131cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    };
132cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(0 == kNotSupported_AdvBlendEqInteraction);
133cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(1 == kAutomatic_AdvBlendEqInteraction);
134cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(2 == kGeneralEnable_AdvBlendEqInteraction);
135cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(3 == kSpecificEnables_AdvBlendEqInteraction);
136cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAdvBlendEqInteractionStr) == kLast_AdvBlendEqInteraction + 1);
137cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
138cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    r.appendf("--- GLSL-Specific ---\n");
139cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
140cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    r.appendf("FB Fetch Support: %s\n", (fFBFetchSupport ? "YES" : "NO"));
141cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    r.appendf("Drops tile on zero divide: %s\n", (fDropsTileOnZeroDivide ? "YES" : "NO"));
142cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    r.appendf("Bindless texture support: %s\n", (fBindlessTextureSupport ? "YES" : "NO"));
143f529439fea003851d986a0573a7e0465754b2a48egdaniel    r.appendf("Uses precision modifiers: %s\n", (fUsesPrecisionModifiers ? "YES" : "NO"));
1448dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    r.appendf("Can use any() function: %s\n", (fCanUseAnyFunctionInShader ? "YES" : "NO"));
1458dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    r.appendf("Can use min() and abs() together: %s\n", (fCanUseMinAndAbsTogether ? "YES" : "NO"));
1468dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel    r.appendf("Must force negated atan param to float: %s\n", (fMustForceNegatedAtanParamToFloat ?
1478dcdedc4a087ea46ce1e2458d335d60918e56310egdaniel                                                               "YES" : "NO"));
148138c26300f2686175f68b5a3528133f5c9edb596egdaniel    r.appendf("Must use local out color for FBFetch: %s\n", (fRequiresLocalOutputColorForFBFetch ?
149138c26300f2686175f68b5a3528133f5c9edb596egdaniel                                                             "YES" : "NO"));
1502e777ead127b03a06ccc7dfc983e1b28e1aa2f86csmartdalton    r.appendf("Must implement geo shader invocations with loop : %s\n",
1512e777ead127b03a06ccc7dfc983e1b28e1aa2f86csmartdalton              (fMustImplementGSInvocationsWithLoop ? "YES" : "NO"));
152ac1e4964e7816de1f4977b52fa5f2f372537468bBrian Osman    r.appendf("Must obfuscate uniform color: %s\n", (fMustObfuscateUniformColor ? "YES" : "NO"));
153dff5d4368dde7f27870b30c3724a4acc702f879cBrian Osman    r.appendf("Must guard division even after explicit zero check: %s\n",
154dff5d4368dde7f27870b30c3724a4acc702f879cBrian Osman              (fMustGuardDivisionEvenAfterExplicitZeroCheck ? "YES" : "NO"));
155c08f196648463d44eb85e17c5815dbf8f709a42acdalton    r.appendf("Flat interpolation support: %s\n", (fFlatInterpolationSupport ?  "YES" : "NO"));
156c08f196648463d44eb85e17c5815dbf8f709a42acdalton    r.appendf("No perspective interpolation support: %s\n", (fNoPerspectiveInterpolationSupport ?
157c08f196648463d44eb85e17c5815dbf8f709a42acdalton                                                             "YES" : "NO"));
1584a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton    r.appendf("Multisample interpolation support: %s\n", (fMultisampleInterpolationSupport ?
1594a98cdb7612493a062358cebd1141c9bcaa37ab1cdalton                                                          "YES" : "NO"));
16033ad701bc30387127c427fb1e38c781d5de33491cdalton    r.appendf("Sample variables support: %s\n", (fSampleVariablesSupport ? "YES" : "NO"));
16133ad701bc30387127c427fb1e38c781d5de33491cdalton    r.appendf("Sample mask override coverage support: %s\n", (fSampleMaskOverrideCoverageSupport ?
16233ad701bc30387127c427fb1e38c781d5de33491cdalton                                                              "YES" : "NO"));
1639c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    r.appendf("External texture support: %s\n", (fExternalTextureSupport ? "YES" : "NO"));
164f8a6ce8d8c54cab5456d3099fa07e460c889c2e6cdalton    r.appendf("texelFetch support: %s\n", (fTexelFetchSupport ? "YES" : "NO"));
1651d6163577c8a4f1372208e2c9e03b1a69906d385Chris Dalton    r.appendf("sk_VertexID support: %s\n", (fVertexIDSupport ? "YES" : "NO"));
1669c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    r.appendf("Max VS Samplers: %d\n", fMaxVertexSamplers);
1679c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    r.appendf("Max GS Samplers: %d\n", fMaxGeometrySamplers);
1689c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    r.appendf("Max FS Samplers: %d\n", fMaxFragmentSamplers);
1699c3f14327a38e79ab7d0cf30dfd9bf89676fde06cdalton    r.appendf("Max Combined Samplers: %d\n", fMaxFragmentSamplers);
170f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    r.appendf("Max VS Image Storages: %d\n", fMaxVertexImageStorages);
171f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    r.appendf("Max GS Image Storages: %d\n", fMaxGeometryImageStorages);
172f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    r.appendf("Max FS Image Storages: %d\n", fMaxFragmentImageStorages);
173f9f451213a3951d8a61568998de2ddbd643f6693Brian Salomon    r.appendf("Max Combined Image Storages: %d\n", fMaxFragmentImageStorages);
174cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    r.appendf("Advanced blend equation interaction: %s\n",
175cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth              kAdvBlendEqInteractionStr[fAdvBlendEqInteraction]);
176cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth    return r;
177cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth}
178cba99b88fd5fb39def7a094dc32c0745c7a1cfeajvanverth
17994efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomonvoid GrShaderCaps::initSamplerPrecisionTable() {
180a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    // Determine the largest precision qualifiers that are effectively the same as lowp/mediump.
181a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    //   e.g. if lowp == mediump, then use mediump instead of lowp.
182a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    GrSLPrecision effectiveMediumP[kGrShaderTypeCount];
183a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    GrSLPrecision effectiveLowP[kGrShaderTypeCount];
184a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    for (int s = 0; s < kGrShaderTypeCount; ++s) {
185a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        const PrecisionInfo* info = fFloatPrecisions[s];
186a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        effectiveMediumP[s] = info[kHigh_GrSLPrecision] == info[kMedium_GrSLPrecision] ?
187a6b92ad1f7b79106caef6a4c721903544f507a02cdalton                                  kHigh_GrSLPrecision : kMedium_GrSLPrecision;
188a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        effectiveLowP[s] = info[kMedium_GrSLPrecision] == info[kLow_GrSLPrecision] ?
189a6b92ad1f7b79106caef6a4c721903544f507a02cdalton                               effectiveMediumP[s] : kLow_GrSLPrecision;
190a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    }
191a6b92ad1f7b79106caef6a4c721903544f507a02cdalton
192a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    // Determine which precision qualifiers should be used with samplers.
193a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    for (int visibility = 0; visibility < (1 << kGrShaderTypeCount); ++visibility) {
194a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        GrSLPrecision mediump = kHigh_GrSLPrecision;
195a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        GrSLPrecision lowp = kHigh_GrSLPrecision;
196a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        for (int s = 0; s < kGrShaderTypeCount; ++s) {
197a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            if (visibility & (1 << s)) {
198a6b92ad1f7b79106caef6a4c721903544f507a02cdalton                mediump = SkTMin(mediump, effectiveMediumP[s]);
199a6b92ad1f7b79106caef6a4c721903544f507a02cdalton                lowp = SkTMin(lowp, effectiveLowP[s]);
200a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            }
201a6b92ad1f7b79106caef6a4c721903544f507a02cdalton
202a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT(0 == kLow_GrSLPrecision);
203a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT(1 == kMedium_GrSLPrecision);
204a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT(2 == kHigh_GrSLPrecision);
205a6b92ad1f7b79106caef6a4c721903544f507a02cdalton
206a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT((1 << kVertex_GrShaderType) == kVertex_GrShaderFlag);
207a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT((1 << kGeometry_GrShaderType) == kGeometry_GrShaderFlag);
208a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT((1 << kFragment_GrShaderType) == kFragment_GrShaderFlag);
209a6b92ad1f7b79106caef6a4c721903544f507a02cdalton            GR_STATIC_ASSERT(3 == kGrShaderTypeCount);
210a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        }
211a6b92ad1f7b79106caef6a4c721903544f507a02cdalton
212a6b92ad1f7b79106caef6a4c721903544f507a02cdalton        uint8_t* table = fSamplerPrecisions[visibility];
21333aa2c7b5c351c17a11ce2bf7d7cd70a3d86ceccBrian Osman        table[kUnknown_GrPixelConfig]        = lowp;
214bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kAlpha_8_GrPixelConfig]        = lowp;
215986563bcff26300ea4317b4dd84917d5240bb723Brian Osman        table[kGray_8_GrPixelConfig]         = lowp;
216bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kRGB_565_GrPixelConfig]        = lowp;
217bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kRGBA_4444_GrPixelConfig]      = lowp;
218bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kRGBA_8888_GrPixelConfig]      = lowp;
219bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kBGRA_8888_GrPixelConfig]      = lowp;
220bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kSRGBA_8888_GrPixelConfig]     = lowp;
221bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kSBGRA_8888_GrPixelConfig]     = lowp;
222bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kRGBA_8888_sint_GrPixelConfig] = lowp;
223bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kRGBA_float_GrPixelConfig]     = kHigh_GrSLPrecision;
2246aa0e1150ecf7eb5462744a32c356a0006d63c9ecsmartdalton        table[kRG_float_GrPixelConfig]       = kHigh_GrSLPrecision;
225bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kAlpha_half_GrPixelConfig]     = mediump;
226bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon        table[kRGBA_half_GrPixelConfig]      = mediump;
227bf7b620b1e44985b164a8bd68031a7613fe0bb9bBrian Salomon
22892de631edd3eb9b3430332d1f1d566e903ea2ea9Robert Phillips        GR_STATIC_ASSERT(14 == kGrPixelConfigCnt);
229a6b92ad1f7b79106caef6a4c721903544f507a02cdalton    }
230a6b92ad1f7b79106caef6a4c721903544f507a02cdalton}
231a6b92ad1f7b79106caef6a4c721903544f507a02cdalton
23294efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomonvoid GrShaderCaps::applyOptionsOverrides(const GrContextOptions& options) {
23394efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian Salomon    fDualSourceBlendingSupport = fDualSourceBlendingSupport && !options.fSuppressDualSourceBlending;
234b7e7d5748d74c7482436b33733d7770484bb62e3egdaniel}
235