Reduce window rectangles cap to 8
authorcsmartdalton <csmartdalton@google.com>
Tue, 23 Aug 2016 13:51:00 +0000 (06:51 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 23 Aug 2016 13:51:00 +0000 (06:51 -0700)
Lowers the cap to 8 and adds a warning message if this value is ever
exceeded. The largest (only) implementation currently supports 8, so
there isn't yet reason to go higher.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2254013002

Committed: https://skia.googlesource.com/skia/+/52d721580ee22525c285e2d13cf3975a7a1b2843
Review-Url: https://codereview.chromium.org/2254013002

src/gpu/GrCaps.cpp
src/gpu/GrWindowRectangles.h
src/gpu/gl/GrGLGpu.cpp

index 622c685..9f92210 100644 (file)
@@ -141,6 +141,8 @@ void GrCaps::applyOptionsOverrides(const GrContextOptions& options) {
         fMaxTileSize = options.fMaxTileSizeOverride;
     }
     if (fMaxWindowRectangles > GrWindowRectangles::kMaxWindows) {
+        SkDebugf("WARNING: capping window rectangles at %i. HW advertises support for %i.\n",
+                 GrWindowRectangles::kMaxWindows, fMaxWindowRectangles);
         fMaxWindowRectangles = GrWindowRectangles::kMaxWindows;
     }
 }
index 682af93..b2f6e1a 100644 (file)
@@ -13,7 +13,7 @@
 
 class GrWindowRectangles {
 public:
-    constexpr static int kMaxWindows = 16;
+    constexpr static int kMaxWindows = 8;
 
     enum class Mode : bool {
         kExclusive,
@@ -25,7 +25,7 @@ public:
     ~GrWindowRectangles() { SkSafeUnref(this->rec()); }
 
     Mode mode() const { return fMode; }
-    uint16_t count() const { return fCount; }
+    int count() const { return fCount; }
     bool disabled() const { return Mode::kExclusive == fMode && !fCount; }
     const SkIRect* data() const;
 
index 3e44138..83d2df2 100644 (file)
@@ -2004,17 +2004,21 @@ void GrGLGpu::flushWindowRectangles(const GrWindowRectangles& windows, const GrG
     if (!this->caps()->maxWindowRectangles() ||
         fHWWindowRects.equal(rt->origin(), rt->getViewport(), windows)) {
         return;
-
     }
 
+    // This is purely a workaround for a spurious warning generated by gcc. Otherwise the above
+    // assert would be sufficient. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=5912
+    int numWindows = SkTMin(windows.count(), int(GrWindowRectangles::kMaxWindows));
+    SkASSERT(windows.count() == numWindows);
+
     GrGLIRect glwindows[GrWindowRectangles::kMaxWindows];
     const SkIRect* skwindows = windows.data();
-    for (int i = 0; i < windows.count(); ++i) {
+    for (int i = 0; i < numWindows; ++i) {
         glwindows[i].setRelativeTo(rt->getViewport(), skwindows[i], rt->origin());
     }
 
     GrGLenum glmode = (Mode::kExclusive == windows.mode()) ? GR_GL_EXCLUSIVE : GR_GL_INCLUSIVE;
-    GL_CALL(WindowRectangles(glmode, windows.count(), glwindows->asInts()));
+    GL_CALL(WindowRectangles(glmode, numWindows, glwindows->asInts()));
 
     fHWWindowRects.set(rt->origin(), rt->getViewport(), windows);
 }