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