Revert "Clear and discard stencil buffers on tilers"
This reverts commit 7b2c85577d79bf1bda6b57d9af8ad793e2fc4862.
Reason for revert: nanobench hangs on chromebook bots during mipmap regeneration
Original change's description:
> Clear and discard stencil buffers on tilers
>
> Bug: skia:
> Change-Id: I42e99cb75567825ac7751fc0ec56e4c45132628b
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/210425
> Reviewed-by: Greg Daniel <egdaniel@google.com>
> Commit-Queue: Chris Dalton <csmartdalton@google.com>
TBR=egdaniel@google.com,robertphillips@google.com,csmartdalton@google.com
Change-Id: I69e04c4797b6bde934d86c83bf0348c8abadcfc3
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: skia:
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213824
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index 4822bf4..d235c77 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -170,7 +170,6 @@
kImagination_GrGLVendor == ctxInfo.vendor() ||
kQualcomm_GrGLVendor == ctxInfo.vendor() ) {
fPreferFullscreenClears = true;
- fDiscardStencilAfterCommandBuffer = true;
}
if (GR_IS_GR_GL(standard)) {
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 67f58b2..5798f72 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -1685,7 +1685,7 @@
this->disableScissor();
this->disableWindowRectangles();
this->flushColorWrite(true);
- this->flushClearColor({0, 0, 0, 0});
+ this->flushClearColor(0, 0, 0, 0);
GL_CALL(Clear(GR_GL_COLOR_BUFFER_BIT));
this->unbindTextureFBOForPixelOps(GR_GL_FRAMEBUFFER, tex.get());
fHWBoundRenderTargetUniqueID.makeInvalid();
@@ -2233,7 +2233,16 @@
this->flushScissor(clip.scissorState(), glRT->getViewport(), origin);
this->flushWindowRectangles(clip.windowRectsState(), glRT, origin);
this->flushColorWrite(true);
- this->flushClearColor(color);
+
+ GrGLfloat r = color.fR, g = color.fG, b = color.fB, a = color.fA;
+ if (this->glCaps().clearToBoundaryValuesIsBroken() &&
+ (1 == r || 0 == r) && (1 == g || 0 == g) && (1 == b || 0 == b) && (1 == a || 0 == a)) {
+ static const GrGLfloat safeAlpha1 = nextafter(1.f, 2.f);
+ static const GrGLfloat safeAlpha0 = nextafter(0.f, -1.f);
+ a = (1 == a) ? safeAlpha1 : safeAlpha0;
+ }
+ this->flushClearColor(r, g, b, a);
+
GL_CALL(Clear(GR_GL_COLOR_BUFFER_BIT));
}
@@ -2244,8 +2253,10 @@
return;
}
- // this should only be called internally when we know we have a stencil buffer.
- SkASSERT(target->renderTargetPriv().getStencilAttachment());
+ GrStencilAttachment* sb = target->renderTargetPriv().getStencilAttachment();
+ // this should only be called internally when we know we have a
+ // stencil buffer.
+ SkASSERT(sb);
GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target);
this->flushRenderTargetNoColorWrites(glRT);
@@ -2257,79 +2268,9 @@
GL_CALL(ClearStencil(clearValue));
GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT));
fHWStencilSettings.invalidate();
-}
-
-void GrGLGpu::beginCommandBuffer(GrRenderTarget* rt, const ColorLoadAndStoreInfo& colorLoadStore,
- const StencilLoadAndStoreInfo& stencilLoadStore) {
- SkASSERT(!fIsExecutingCommandBuffer_DebugOnly);
-
- this->handleDirtyContext();
-
- auto glRT = static_cast<GrGLRenderTarget*>(rt);
- this->flushRenderTarget(glRT);
- SkDEBUGCODE(fIsExecutingCommandBuffer_DebugOnly = true);
-
- GrGLbitfield clearMask = 0;
- if (GrLoadOp::kClear == colorLoadStore.fLoadOp) {
- SkASSERT(!this->caps()->performColorClearsAsDraws());
- this->flushClearColor(colorLoadStore.fClearColor);
- this->flushColorWrite(true);
- clearMask |= GR_GL_COLOR_BUFFER_BIT;
+ if (!clearValue) {
+ sb->cleared();
}
- if (GrLoadOp::kClear == stencilLoadStore.fLoadOp) {
- SkASSERT(!this->caps()->performStencilClearsAsDraws());
- GL_CALL(StencilMask(0xffffffff));
- GL_CALL(ClearStencil(0));
- clearMask |= GR_GL_STENCIL_BUFFER_BIT;
- }
- if (clearMask) {
- this->disableScissor();
- this->disableWindowRectangles();
- GL_CALL(Clear(clearMask));
- }
-}
-
-void GrGLGpu::endCommandBuffer(GrRenderTarget* rt, const ColorLoadAndStoreInfo& colorLoadStore,
- const StencilLoadAndStoreInfo& stencilLoadStore) {
- SkASSERT(fIsExecutingCommandBuffer_DebugOnly);
-
- this->handleDirtyContext();
-
- if (rt->uniqueID() != fHWBoundRenderTargetUniqueID) {
-#ifdef SK_DEBUG
- SkDebugf("WARNING: GL framebuffer changed in the middle of a command buffer. This will "
- "kill performance.\n");
- fIsExecutingCommandBuffer_DebugOnly = false;
-#endif
- return;
- }
-
- if (this->caps()->discardRenderTargetSupport()) {
- auto glRT = static_cast<GrGLRenderTarget*>(rt);
-
- SkSTArray<2, GrGLenum> discardAttachments;
- if (GrStoreOp::kStore != colorLoadStore.fStoreOp) {
- discardAttachments.push_back(
- (0 == glRT->renderFBOID()) ? GR_GL_COLOR : GR_GL_COLOR_ATTACHMENT0);
- }
- if (GrStoreOp::kStore != stencilLoadStore.fStoreOp) {
- discardAttachments.push_back(
- (0 == glRT->renderFBOID()) ? GR_GL_STENCIL : GR_GL_STENCIL_ATTACHMENT);
- }
-
- if (!discardAttachments.empty()) {
- if (GrGLCaps::kInvalidate_InvalidateFBType == this->glCaps().invalidateFBType()) {
- GL_CALL(InvalidateFramebuffer(GR_GL_FRAMEBUFFER, discardAttachments.count(),
- discardAttachments.begin()));
- } else {
- SkASSERT(GrGLCaps::kDiscard_InvalidateFBType == this->glCaps().invalidateFBType());
- GL_CALL(DiscardFramebuffer(GR_GL_FRAMEBUFFER, discardAttachments.count(),
- discardAttachments.begin()));
- }
- }
- }
-
- SkDEBUGCODE(fIsExecutingCommandBuffer_DebugOnly = false);
}
void GrGLGpu::clearStencilClip(const GrFixedClip& clip,
@@ -3234,14 +3175,7 @@
}
}
-void GrGLGpu::flushClearColor(const SkPMColor4f& color) {
- GrGLfloat r = color.fR, g = color.fG, b = color.fB, a = color.fA;
- if (this->glCaps().clearToBoundaryValuesIsBroken() &&
- (1 == r || 0 == r) && (1 == g || 0 == g) && (1 == b || 0 == b) && (1 == a || 0 == a)) {
- static const GrGLfloat safeAlpha1 = nextafter(1.f, 2.f);
- static const GrGLfloat safeAlpha0 = nextafter(0.f, -1.f);
- a = (1 == a) ? safeAlpha1 : safeAlpha0;
- }
+void GrGLGpu::flushClearColor(GrGLfloat r, GrGLfloat g, GrGLfloat b, GrGLfloat a) {
if (r != fHWClearColor[0] || g != fHWClearColor[1] ||
b != fHWClearColor[2] || a != fHWClearColor[3]) {
GL_CALL(ClearColor(r, g, b, a));
diff --git a/src/gpu/gl/GrGLGpu.h b/src/gpu/gl/GrGLGpu.h
index 85c6773..e8d5be1 100644
--- a/src/gpu/gl/GrGLGpu.h
+++ b/src/gpu/gl/GrGLGpu.h
@@ -122,15 +122,6 @@
// stencil buffer as not dirty?
void clearStencil(GrRenderTarget*, int clearValue);
- using ColorLoadAndStoreInfo = GrGpuRTCommandBuffer::LoadAndStoreInfo;
- using StencilLoadAndStoreInfo = GrGpuRTCommandBuffer::StencilLoadAndStoreInfo;
-
- void beginCommandBuffer(
- GrRenderTarget*, const ColorLoadAndStoreInfo&, const StencilLoadAndStoreInfo&);
-
- void endCommandBuffer(
- GrRenderTarget*, const ColorLoadAndStoreInfo&, const StencilLoadAndStoreInfo&);
-
GrGpuRTCommandBuffer* getCommandBuffer(
GrRenderTarget*, GrSurfaceOrigin, const SkRect&,
const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
@@ -361,7 +352,7 @@
};
void flushColorWrite(bool writeColor);
- void flushClearColor(const SkPMColor4f&);
+ void flushClearColor(GrGLfloat r, GrGLfloat g, GrGLfloat b, GrGLfloat a);
// flushes the scissor. see the note on flushBoundTextureAndParams about
// flushing the scissor after that function is called.
@@ -685,9 +676,6 @@
GrGLsync fSync;
};
std::list<FinishCallback> fFinishCallbacks;
-
- SkDEBUGCODE(bool fIsExecutingCommandBuffer_DebugOnly = false);
-
friend class GrGLPathRendering; // For accessing setTextureUnit.
typedef GrGpu INHERITED;
diff --git a/src/gpu/gl/GrGLGpuCommandBuffer.cpp b/src/gpu/gl/GrGLGpuCommandBuffer.cpp
index 655b915..1412aa3 100644
--- a/src/gpu/gl/GrGLGpuCommandBuffer.cpp
+++ b/src/gpu/gl/GrGLGpuCommandBuffer.cpp
@@ -11,9 +11,22 @@
#include "src/gpu/GrFixedClip.h"
#include "src/gpu/GrRenderTargetPriv.h"
-void GrGLGpuRTCommandBuffer::set(
- GrRenderTarget* rt, GrSurfaceOrigin origin, const LoadAndStoreInfo& colorInfo,
- const StencilLoadAndStoreInfo& stencilInfo) {
+void GrGLGpuRTCommandBuffer::begin() {
+ if (GrLoadOp::kClear == fColorLoadAndStoreInfo.fLoadOp) {
+ fGpu->clear(GrFixedClip::Disabled(), fColorLoadAndStoreInfo.fClearColor,
+ fRenderTarget, fOrigin);
+ }
+ if (GrLoadOp::kClear == fStencilLoadAndStoreInfo.fLoadOp) {
+ GrStencilAttachment* sb = fRenderTarget->renderTargetPriv().getStencilAttachment();
+ if (sb && (sb->isDirty() || fRenderTarget->alwaysClearStencil())) {
+ fGpu->clearStencil(fRenderTarget, 0x0);
+ }
+ }
+}
+
+void GrGLGpuRTCommandBuffer::set(GrRenderTarget* rt, GrSurfaceOrigin origin,
+ const GrGpuRTCommandBuffer::LoadAndStoreInfo& colorInfo,
+ const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo& stencilInfo) {
SkASSERT(fGpu);
SkASSERT(!fRenderTarget);
SkASSERT(fGpu == rt->getContext()->priv().getGpu());
diff --git a/src/gpu/gl/GrGLGpuCommandBuffer.h b/src/gpu/gl/GrGLGpuCommandBuffer.h
index 9831b63..0f9370f 100644
--- a/src/gpu/gl/GrGLGpuCommandBuffer.h
+++ b/src/gpu/gl/GrGLGpuCommandBuffer.h
@@ -55,13 +55,8 @@
public:
GrGLGpuRTCommandBuffer(GrGLGpu* gpu) : fGpu(gpu) {}
- void begin() override {
- fGpu->beginCommandBuffer(fRenderTarget, fColorLoadAndStoreInfo, fStencilLoadAndStoreInfo);
- }
-
- void end() override {
- fGpu->endCommandBuffer(fRenderTarget, fColorLoadAndStoreInfo, fStencilLoadAndStoreInfo);
- }
+ void begin() override;
+ void end() override {}
void discard() override { }
@@ -84,8 +79,9 @@
srcRect.height(), bufferColorType, transferBuffer, offset);
}
- void set(GrRenderTarget*, GrSurfaceOrigin, const LoadAndStoreInfo&, const
- StencilLoadAndStoreInfo&);
+ void set(GrRenderTarget*, GrSurfaceOrigin,
+ const GrGpuRTCommandBuffer::LoadAndStoreInfo&,
+ const GrGpuRTCommandBuffer::StencilLoadAndStoreInfo&);
void reset() {
fRenderTarget = nullptr;