@@ -193,6 +193,8 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto
193193 mTilingSnapshot = mSnapshot ;
194194 startTiling (mTilingSnapshot , true );
195195
196+ debugOverdraw (true , true );
197+
196198 if (!opaque) {
197199 mCaches .enableScissor ();
198200 mCaches .setScissor (left, mSnapshot ->height - bottom, right - left, bottom - top);
@@ -230,6 +232,7 @@ void OpenGLRenderer::endTiling() {
230232}
231233
232234void OpenGLRenderer::finish () {
235+ renderOverdraw ();
233236 endTiling ();
234237
235238 if (!suppressErrorChecks ()) {
@@ -264,6 +267,40 @@ void OpenGLRenderer::finish() {
264267 }
265268}
266269
270+ void OpenGLRenderer::debugOverdraw (bool enable, bool clear) {
271+ if (mCaches .debugOverdraw && getTargetFbo () == 0 ) {
272+ if (clear) {
273+ mCaches .disableScissor ();
274+ mCaches .stencil .clear ();
275+ }
276+ if (enable) {
277+ mCaches .stencil .enableDebugWrite ();
278+ } else {
279+ mCaches .stencil .disable ();
280+ }
281+ }
282+ }
283+
284+ void OpenGLRenderer::renderOverdraw () {
285+ if (mCaches .debugOverdraw && getTargetFbo () == 0 ) {
286+ const Rect* clip = mTilingSnapshot ->clipRect ;
287+
288+ mCaches .enableScissor ();
289+ mCaches .setScissor (clip->left , mTilingSnapshot ->height - clip->bottom ,
290+ clip->right - clip->left , clip->bottom - clip->top );
291+
292+ mCaches .stencil .enableDebugTest (2 );
293+ drawColor (0x2f0000ff , SkXfermode::kSrcOver_Mode );
294+ mCaches .stencil .enableDebugTest (3 );
295+ drawColor (0x2f00ff00 , SkXfermode::kSrcOver_Mode );
296+ mCaches .stencil .enableDebugTest (4 );
297+ drawColor (0x3fff0000 , SkXfermode::kSrcOver_Mode );
298+ mCaches .stencil .enableDebugTest (4 , true );
299+ drawColor (0x7fff0000 , SkXfermode::kSrcOver_Mode );
300+ mCaches .stencil .disable ();
301+ }
302+ }
303+
267304void OpenGLRenderer::interrupt () {
268305 if (mCaches .currentProgram ) {
269306 if (mCaches .currentProgram ->isInUse ()) {
@@ -275,12 +312,14 @@ void OpenGLRenderer::interrupt() {
275312 mCaches .unbindIndicesBuffer ();
276313 mCaches .resetVertexPointers ();
277314 mCaches .disbaleTexCoordsVertexArray ();
315+ debugOverdraw (false , false );
278316}
279317
280318void OpenGLRenderer::resume () {
281319 sp<Snapshot> snapshot = (mSnapshot != NULL ) ? mSnapshot : mFirstSnapshot ;
282320 glViewport (0 , 0 , snapshot->viewport .getWidth (), snapshot->viewport .getHeight ());
283321 glBindFramebuffer (GL_FRAMEBUFFER, snapshot->fbo );
322+ debugOverdraw (true , false );
284323
285324 glClearColor (0 .0f , 0 .0f , 0 .0f , 0 .0f );
286325
@@ -301,6 +340,7 @@ void OpenGLRenderer::resumeAfterLayer() {
301340 sp<Snapshot> snapshot = (mSnapshot != NULL ) ? mSnapshot : mFirstSnapshot ;
302341 glViewport (0 , 0 , snapshot->viewport .getWidth (), snapshot->viewport .getHeight ());
303342 glBindFramebuffer (GL_FRAMEBUFFER, snapshot->fbo );
343+ debugOverdraw (true , false );
304344
305345 mCaches .resetScissor ();
306346 dirtyClip ();
@@ -406,7 +446,10 @@ bool OpenGLRenderer::updateLayer(Layer* layer, bool inFrame) {
406446 OpenGLRenderer* renderer = layer->renderer ;
407447 Rect& dirty = layer->dirtyRect ;
408448
409- if (inFrame) endTiling ();
449+ if (inFrame) {
450+ endTiling ();
451+ debugOverdraw (false , false );
452+ }
410453
411454 renderer->setViewport (layer->layer .getWidth (), layer->layer .getHeight ());
412455 renderer->prepareDirty (dirty.left , dirty.top , dirty.right , dirty.bottom , !layer->isBlend ());
@@ -731,6 +774,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui
731774 mSnapshot ->orthoMatrix .load (mOrthoMatrix );
732775
733776 endTiling ();
777+ debugOverdraw (false , false );
734778 // Bind texture to FBO
735779 glBindFramebuffer (GL_FRAMEBUFFER, layer->getFbo ());
736780 layer->bindTexture ();
@@ -779,6 +823,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) {
779823 glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0 , 0 );
780824 // Unbind current FBO and restore previous one
781825 glBindFramebuffer (GL_FRAMEBUFFER, previous->fbo );
826+ debugOverdraw (true , false );
782827
783828 startTiling (previous);
784829 }
0 commit comments