Add drawArraysBaseVertexIsBroken flag
authorChris Dalton <csmartdalton@google.com>
Wed, 17 May 2017 21:15:50 +0000 (15:15 -0600)
committerSkia Commit-Bot <skia-commit-bot@chromium.org>
Thu, 18 May 2017 16:41:10 +0000 (16:41 +0000)
A non-zero base vertex in glDrawArrays appears to not always work on
Adreno.

Bug: skia:6650
Change-Id: I301eaba8c7790ed814a2ab8d8c53dd2b9e0d77d1
Reviewed-on: https://skia-review.googlesource.com/17083
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
src/gpu/gl/GrGLCaps.cpp
src/gpu/gl/GrGLCaps.h
src/gpu/gl/GrGLGpu.cpp

index 977670d..ba05316 100644 (file)
@@ -54,6 +54,7 @@ GrGLCaps::GrGLCaps(const GrContextOptions& contextOptions,
     fSRGBDecodeDisableSupport = false;
     fSRGBDecodeDisableAffectsMipmaps = false;
     fClearToOpaqueBlackIsBroken = false;
+    fDrawArraysBaseVertexIsBroken = false;
 
     fBlitFramebufferFlags = kNoSupport_BlitFramebufferFlag;
 
@@ -573,6 +574,9 @@ void GrGLCaps::init(const GrContextOptions& contextOptions,
         fClearToOpaqueBlackIsBroken = true;
     }
 #endif
+    if (kQualcomm_GrGLVendor == ctxInfo.vendor()) {
+        fDrawArraysBaseVertexIsBroken = true;
+    }
 
     // Requires fTextureRedSupport, fTextureSwizzleSupport, msaa support, ES compatibility have
     // already been detected.
index bba4d8e..6948583 100644 (file)
@@ -360,6 +360,12 @@ public:
     }
 
     bool clearToOpaqueBlackIsBroken() const { return fClearToOpaqueBlackIsBroken; }
+
+    // Adreno/MSAA drops a draw on the imagefiltersbase GM if the base vertex param to
+    // glDrawArrays is nonzero.
+    // https://bugs.chromium.org/p/skia/issues/detail?id=6650
+    bool drawArraysBaseVertexIsBroken() const { return fDrawArraysBaseVertexIsBroken; }
+
     bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc,
                             bool* rectsMustMatch, bool* disallowSubrect) const override;
 
@@ -432,6 +438,7 @@ private:
     bool fSRGBDecodeDisableSupport : 1;
     bool fSRGBDecodeDisableAffectsMipmaps : 1;
     bool fClearToOpaqueBlackIsBroken : 1;
+    bool fDrawArraysBaseVertexIsBroken : 1;
 
     uint32_t fBlitFramebufferFlags;
 
index 51fef2c..c52d1d1 100644 (file)
@@ -2649,7 +2649,7 @@ void GrGLGpu::draw(const GrPipeline& pipeline,
             for (const GrMesh::PatternBatch batch : mesh) {
                 this->setupGeometry(primProc, mesh.indexBuffer(), mesh.vertexBuffer(),
                                     batch.fBaseVertex);
-                // mesh.baseVertex() was accounted for by setupGeometry.
+                // batch.fBaseVertex was accounted for by setupGeometry.
                 if (this->glCaps().drawRangeElementsSupport()) {
                     // We assume here that the GrMeshDrawOps that generated the mesh used the full
                     // 0..vertexCount()-1 range.
@@ -2665,8 +2665,14 @@ void GrGLGpu::draw(const GrPipeline& pipeline,
                 fStats.incNumDraws();
             }
         } else {
-            this->setupGeometry(primProc, mesh.indexBuffer(), mesh.vertexBuffer(), 0);
-            GL_CALL(DrawArrays(primType, mesh.baseVertex(), mesh.vertexCount()));
+            if (this->glCaps().drawArraysBaseVertexIsBroken()) {
+                this->setupGeometry(primProc, mesh.indexBuffer(), mesh.vertexBuffer(),
+                                    mesh.baseVertex());
+                GL_CALL(DrawArrays(primType, 0, mesh.vertexCount()));
+            } else {
+                this->setupGeometry(primProc, mesh.indexBuffer(), mesh.vertexBuffer(), 0);
+                GL_CALL(DrawArrays(primType, mesh.baseVertex(), mesh.vertexCount()));
+            }
             fStats.incNumDraws();
         }
     }