Revert "Revert "Allow FPs to elevate default precision for the entire fragment program""
authorBrian Osman <brianosman@google.com>
Fri, 31 Mar 2017 20:39:56 +0000 (20:39 +0000)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Fri, 31 Mar 2017 20:40:05 +0000 (20:40 +0000)
This reverts commit 903c3f70400462e191ccbca63393b2df3fe2dd11.

Reason for revert: Vulkan issue fixed in compiler.

Original change's description:
> Revert "Allow FPs to elevate default precision for the entire fragment program"
>
> This reverts commit 92d7ccafdf896cf19764e025873d13315a76842d.
>
> Reason for revert: Vulkan errors.
>
> Original change's description:
> > Allow FPs to elevate default precision for the entire fragment program
> >
> > Currently, GrConfigConversionEffect is able to round-trip on many mobile
> > GPUs because it uses highp for all intermediate variables (including the
> > texture fetch result). Separating the texture sample into a different
> > processor breaks that.
> >
> > This is a blunt instrument, not to be used lightly.
> >
> > Bug: skia:
> > Change-Id: I2ab365e3da79628069e2eb727c43c2bf45bfd789
> > Reviewed-on: https://skia-review.googlesource.com/10162
> > Reviewed-by: Brian Salomon <bsalomon@google.com>
> > Commit-Queue: Brian Osman <brianosman@google.com>
> >
>
> TBR=bsalomon@google.com,robertphillips@google.com,brianosman@google.com,ethannicholas@google.com,reviews@skia.org
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
>
> Change-Id: Iee5bb409f86a9cabecc76bd1273a5b3cef6af179
> Reviewed-on: https://skia-review.googlesource.com/10967
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: Brian Osman <brianosman@google.com>
>

TBR=bsalomon@google.com,robertphillips@google.com,reviews@skia.org,brianosman@google.com,ethannicholas@google.com
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Change-Id: I733a0ecc40b58d8727f0259b5498c8e6610cedce
Reviewed-on: https://skia-review.googlesource.com/11010
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>

13 files changed:
bench/GLInstancedArraysBench.cpp
bench/GLVec4ScalarBench.cpp
bench/GLVertexAttributesBench.cpp
include/gpu/GrTypesPriv.h
include/private/GrGLSL.h
src/gpu/GrCoordTransform.cpp
src/gpu/GrGeometryProcessor.h
src/gpu/GrShaderCaps.cpp
src/gpu/gl/GrGLCaps.cpp
src/gpu/gl/GrGLGpu.cpp
src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp
src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
src/gpu/glsl/GrGLSLVarying.cpp

index 5268dd6e72a12d90c34a694c3e36490eb68856da..fc5e8fb17f73b007d8cab015bc0852ecd8bfb8f6 100644 (file)
@@ -133,7 +133,7 @@ GrGLuint GLCpuPosInstancedArraysBench::setupShader(const GrGLContext* ctx) {
     // setup fragment shader
     GrShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
     SkString fshaderTxt(version);
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *shaderCaps, &fshaderTxt);
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(kMedium_GrSLPrecision, *shaderCaps, &fshaderTxt);
     oColor.setTypeModifier(GrShaderVar::kIn_TypeModifier);
     oColor.appendDecl(shaderCaps, &fshaderTxt);
     fshaderTxt.append(";\n");
index 26f9220750a31c59711dbe0605d805300163a922..b5c7e22a49c4e28d6433427a84514ed03bc3778d 100644 (file)
@@ -131,7 +131,7 @@ GrGLuint GLVec4ScalarBench::setupShader(const GrGLContext* ctx) {
     // next stage.
     GrShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
     SkString fshaderTxt(version);
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *shaderCaps, &fshaderTxt);
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(kMedium_GrSLPrecision, *shaderCaps, &fshaderTxt);
     oPosition.setTypeModifier(GrShaderVar::kIn_TypeModifier);
     oPosition.appendDecl(shaderCaps, &fshaderTxt);
     fshaderTxt.append(";\n");
index 4783d5510a924463196fa4d25c4022ad70d33b21..7efd9847621f87f7d19703cb9a48950429ae7404 100644 (file)
@@ -117,7 +117,7 @@ GrGLuint GLVertexAttributesBench::setupShader(const GrGLContext* ctx, uint32_t a
     // setup fragment shader
     GrShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
     SkString fshaderTxt(version);
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *shaderCaps, &fshaderTxt);
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(kMedium_GrSLPrecision, *shaderCaps, &fshaderTxt);
 
     const char* fsOutName;
     if (shaderCaps->mustDeclareFragmentShaderOutput()) {
index 5db1c24765975e49667bbe97152dd603b7db8aa8..cbff7d8a3ba918915ac56a86460bb9026333ce8d 100644 (file)
@@ -116,11 +116,14 @@ enum GrSLPrecision {
     kMedium_GrSLPrecision,
     kHigh_GrSLPrecision,
 
-    // Default precision is medium. This is because on OpenGL ES 2 highp support is not
-    // guaranteed. On (non-ES) OpenGL the specifiers have no effect on precision.
-    kDefault_GrSLPrecision = kMedium_GrSLPrecision,
-
-    kLast_GrSLPrecision = kHigh_GrSLPrecision
+    // Default precision is a special tag that means "whatever the default for the program/type
+    // combination is". In other words, it maps to the empty string in shader code. There are some
+    // scenarios where kDefault is not allowed (as the default precision for a program, or for
+    // varyings, for example).
+    kDefault_GrSLPrecision,
+
+    // We only consider the "real" precisions here
+    kLast_GrSLPrecision = kHigh_GrSLPrecision,
 };
 
 static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
index ed33c1cf4cc594fe54ed34e1dcf4c432e11f6e8a..66f7be84d1435c16e34e94772c4529c38b7946bd 100644 (file)
@@ -74,6 +74,8 @@ static inline const char* GrGLSLPrecisionString(GrSLPrecision p) {
             return "mediump";
         case kHigh_GrSLPrecision:
             return "highp";
+        case kDefault_GrSLPrecision:
+            return "";
         default:
             SkFAIL("Unexpected precision type.");
             return "";
index b22f3258fc889fabbf71d6090037aad16b4c1ce3..9c6815ec840e47cfe862c7167ec3253ee500e672 100644 (file)
 static GrSLPrecision compute_precision(const GrShaderCaps* caps,
                                        int width, int height,
                                        GrSamplerParams::FilterMode filter) {
-    // Always start at kDefault. Then if precisions differ we see if the precision needs to be
+    // Always start at kMedium. Then if precisions differ we see if the precision needs to be
     // increased. Our rule is that we want at least 4 subpixel values in the representation for
     // coords between 0 to 1 when bi- or tri-lerping and 1 value when nearest filtering. Note that
     // this still might not be enough when drawing with repeat or mirror-repeat modes but that case
     // can be arbitrarily bad.
     int subPixelThresh = filter > GrSamplerParams::kNone_FilterMode ? 4 : 1;
-    GrSLPrecision precision = kDefault_GrSLPrecision;
+    GrSLPrecision precision = kMedium_GrSLPrecision;
     if (caps) {
         if (caps->floatPrecisionVaries()) {
             int maxD = SkTMax(width, height);
index 2711b9a608fa60130856ba7b921da144b322eea1..e5222bf80a41ccb3067cc7b936ca050436d52b2b 100644 (file)
@@ -51,6 +51,7 @@ protected:
      */
     const Attribute& addVertexAttrib(const char* name, GrVertexAttribType type,
                                      GrSLPrecision precision = kDefault_GrSLPrecision) {
+        precision = (kDefault_GrSLPrecision == precision) ? kMedium_GrSLPrecision : precision;
         fAttribs.emplace_back(name, type, precision);
         fVertexStride += fAttribs.back().fOffset;
         return fAttribs.back();
index e3e6b0736120525c508ee290063fe851ce9e5442..636b955ab726a668b837062491b297399007be64 100644 (file)
@@ -32,8 +32,10 @@ static const char* precision_to_string(GrSLPrecision p) {
         return "medium";
     case kHigh_GrSLPrecision:
         return "high";
+    default:
+        SkFAIL("Unexpected precision type.");
+        return "";
     }
-    return "";
 }
 
 GrShaderCaps::GrShaderCaps(const GrContextOptions& options) {
@@ -201,7 +203,7 @@ void GrShaderCaps::initSamplerPrecisionTable() {
         }
 
         uint8_t* table = fSamplerPrecisions[visibility];
-        table[kUnknown_GrPixelConfig]        = kDefault_GrSLPrecision;
+        table[kUnknown_GrPixelConfig]        = lowp;
         table[kAlpha_8_GrPixelConfig]        = lowp;
         table[kGray_8_GrPixelConfig]         = lowp;
         table[kRGB_565_GrPixelConfig]        = lowp;
index 2ec95347f8fbb77287121eaef73bd3e213d1e3a5..06085b5e86cfa96ab2bad58d1fa8ff7329cfe828 100644 (file)
@@ -1255,9 +1255,10 @@ static GrGLenum precision_to_gl_float_type(GrSLPrecision p) {
         return GR_GL_MEDIUM_FLOAT;
     case kHigh_GrSLPrecision:
         return GR_GL_HIGH_FLOAT;
+    default:
+        SkFAIL("Unexpected precision type.");
+        return -1;
     }
-    SkFAIL("Unknown precision.");
-    return -1;
 }
 
 static GrGLenum shader_type_to_gl_shader(GrShaderType type) {
index 6cdda0672a3dd8b1b3d9a1bc339ff80993ce9f0a..17572a9bb33dda1bfd84263ec57a66aa18ae4a3e 100644 (file)
@@ -3569,7 +3569,7 @@ bool GrGLGpu::createCopyProgram(GrTexture* srcTex) {
         fshaderTxt.appendf("#extension %s : require\n",
                            shaderCaps->externalTextureExtensionString());
     }
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *shaderCaps,
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(kMedium_GrSLPrecision, *shaderCaps,
                                                  &fshaderTxt);
     vTexCoord.setTypeModifier(GrShaderVar::kIn_TypeModifier);
     vTexCoord.appendDecl(shaderCaps, &fshaderTxt);
@@ -3707,7 +3707,7 @@ bool GrGLGpu::createMipmapProgram(int progIdx) {
             fshaderTxt.appendf("#extension %s : require\n", extension);
         }
     }
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, *shaderCaps,
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(kMedium_GrSLPrecision, *shaderCaps,
                                                  &fshaderTxt);
     for (int i = 0; i < numTaps; ++i) {
         vTexCoords[i].setTypeModifier(GrShaderVar::kIn_TypeModifier);
@@ -3822,7 +3822,7 @@ bool GrGLGpu::createWireRectProgram() {
     GrShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
 
     SkString fshaderTxt(version);
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision,
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(kMedium_GrSLPrecision,
                                                  *this->caps()->shaderCaps(),
                                                  &fshaderTxt);
     uColor.appendDecl(this->caps()->shaderCaps(), &fshaderTxt);
index a1f517343639efc3c19eb7e72762f70fc6213cc3..484bd7821157dd6ec4936959410b61c6576f2901 100644 (file)
@@ -85,7 +85,8 @@ GrGLSLFragmentShaderBuilder::GrGLSLFragmentShaderBuilder(GrGLSLProgramBuilder* p
     , fCustomColorOutputIndex(-1)
     , fHasSecondaryOutput(false)
     , fUsedSampleOffsetArrays(0)
-    , fHasInitializedSampleMask(false) {
+    , fHasInitializedSampleMask(false)
+    , fDefaultPrecision(kMedium_GrSLPrecision) {
     fSubstageIndices.push_back(0);
 #ifdef SK_DEBUG
     fUsedProcessorFeatures = GrProcessor::kNone_RequiredFeatures;
@@ -178,6 +179,10 @@ void GrGLSLFragmentShaderBuilder::overrideSampleCoverage(const char* mask) {
     fHasInitializedSampleMask = true;
 }
 
+void GrGLSLFragmentShaderBuilder::elevateDefaultPrecision(GrSLPrecision precision) {
+    fDefaultPrecision = SkTMax(fDefaultPrecision, precision);
+}
+
 const char* GrGLSLFragmentShaderBuilder::dstColor() {
     SkDEBUGCODE(fHasReadDstColor = true;)
 
@@ -279,7 +284,7 @@ GrSurfaceOrigin GrGLSLFragmentShaderBuilder::getSurfaceOrigin() const {
 
 void GrGLSLFragmentShaderBuilder::onFinalize() {
     fProgramBuilder->varyingHandler()->getFragDecls(&this->inputs(), &this->outputs());
-    GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision,
+    GrGLSLAppendDefaultFloatPrecisionDeclaration(fDefaultPrecision,
                                                  *fProgramBuilder->shaderCaps(),
                                                  &this->precisionQualifier());
     if (fUsedSampleOffsetArrays & (1 << kSkiaDevice_Coordinates)) {
index 764f3bd8129282dabf9a41d9a9f751c98ed5ff93..65bcb8dae6f52539b7adb4acd34a14769e031785 100644 (file)
@@ -93,6 +93,13 @@ public:
         space coordinates. */
     virtual const char* distanceVectorName() const = 0;
 
+    /**
+     * Overrides the default precision for the entire fragment program. Processors that require
+     * high precision input (eg from incoming texture samples) may use this. For calculations that
+     * are limited to a single processor's code, it is better to annotate individual declarations.
+     */
+    virtual void elevateDefaultPrecision(GrSLPrecision) = 0;
+
     /**
      * Fragment procs with child procs should call these functions before/after calling emitCode
      * on a child proc.
@@ -167,6 +174,7 @@ public:
     void appendOffsetToSample(const char* sampleIdx, Coordinates) override;
     void maskSampleCoverage(const char* mask, bool invert = false) override;
     void overrideSampleCoverage(const char* mask) override;
+    void elevateDefaultPrecision(GrSLPrecision) override;
     const SkString& getMangleString() const override { return fMangleString; }
     void onBeforeChildProcEmitCode() override;
     void onAfterChildProcEmitCode() override;
@@ -225,13 +233,14 @@ private:
      */
     SkString fMangleString;
 
-    bool       fSetupFragPosition;
-    bool       fHasCustomColorOutput;
-    int        fCustomColorOutputIndex;
-    bool       fHasSecondaryOutput;
-    uint8_t    fUsedSampleOffsetArrays;
-    bool       fHasInitializedSampleMask;
-    SkString   fDistanceVectorOutput;
+    bool          fSetupFragPosition;
+    bool          fHasCustomColorOutput;
+    int           fCustomColorOutputIndex;
+    bool          fHasSecondaryOutput;
+    uint8_t       fUsedSampleOffsetArrays;
+    bool          fHasInitializedSampleMask;
+    SkString      fDistanceVectorOutput;
+    GrSLPrecision fDefaultPrecision;
 
 #ifdef SK_DEBUG
     // some state to verify shaders and effects are consistent, this is reset between effects by
index 7d841f54173f1cf5bd76b81a5cd1af46bcbf0ae0..ef3fe8af237751144c3e2aaec3b3dea4a61ce975 100644 (file)
@@ -42,7 +42,7 @@ void GrGLSLVaryingHandler::internalAddVarying(const char* name,
 
     SkASSERT(varying);
     v.fType = varying->fType;
-    v.fPrecision = precision;
+    v.fPrecision = (kDefault_GrSLPrecision == precision) ? kMedium_GrSLPrecision : precision;
     v.fIsFlat = flat;
     fProgramBuilder->nameVariable(&v.fVsOut, 'v', name);
     v.fVisibility = kNone_GrShaderFlags;