@@ -194,6 +194,8 @@ int OpenGLRenderer::prepareDirty(float left, float top, float right, float botto
194194 mTilingSnapshot = mSnapshot ;
195195 startTiling (mTilingSnapshot , true );
196196
197+ debugOverdraw (true , true );
198+
197199 if (!opaque) {
198200 mCaches .enableScissor ();
199201 mCaches .setScissor (left, mSnapshot ->height - bottom, right - left, bottom - top);
@@ -231,6 +233,7 @@ void OpenGLRenderer::endTiling() {
231233}
232234
233235void OpenGLRenderer::finish () {
236+ renderOverdraw ();
234237 endTiling ();
235238
236239 if (!suppressErrorChecks ()) {
@@ -265,6 +268,40 @@ void OpenGLRenderer::finish() {
265268 }
266269}
267270
271+ void OpenGLRenderer::debugOverdraw (bool enable, bool clear) {
272+ if (mCaches .debugOverdraw && getTargetFbo () == 0 ) {
273+ if (clear) {
274+ mCaches .disableScissor ();
275+ mCaches .stencil .clear ();
276+ }
277+ if (enable) {
278+ mCaches .stencil .enableDebugWrite ();
279+ } else {
280+ mCaches .stencil .disable ();
281+ }
282+ }
283+ }
284+
285+ void OpenGLRenderer::renderOverdraw () {
286+ if (mCaches .debugOverdraw && getTargetFbo () == 0 ) {
287+ const Rect* clip = mTilingSnapshot ->clipRect ;
288+
289+ mCaches .enableScissor ();
290+ mCaches .setScissor (clip->left , mTilingSnapshot ->height - clip->bottom ,
291+ clip->right - clip->left , clip->bottom - clip->top );
292+
293+ mCaches .stencil .enableDebugTest (2 );
294+ drawColor (0x2f0000ff , SkXfermode::kSrcOver_Mode );
295+ mCaches .stencil .enableDebugTest (3 );
296+ drawColor (0x2f00ff00 , SkXfermode::kSrcOver_Mode );
297+ mCaches .stencil .enableDebugTest (4 );
298+ drawColor (0x3fff0000 , SkXfermode::kSrcOver_Mode );
299+ mCaches .stencil .enableDebugTest (4 , true );
300+ drawColor (0x7fff0000 , SkXfermode::kSrcOver_Mode );
301+ mCaches .stencil .disable ();
302+ }
303+ }
304+
268305void OpenGLRenderer::interrupt () {
269306 if (mCaches .currentProgram ) {
270307 if (mCaches .currentProgram ->isInUse ()) {
@@ -276,12 +313,14 @@ void OpenGLRenderer::interrupt() {
276313 mCaches .unbindIndicesBuffer ();
277314 mCaches .resetVertexPointers ();
278315 mCaches .disbaleTexCoordsVertexArray ();
316+ debugOverdraw (false , false );
279317}
280318
281319void OpenGLRenderer::resume () {
282320 sp<Snapshot> snapshot = (mSnapshot != NULL ) ? mSnapshot : mFirstSnapshot ;
283321 glViewport (0 , 0 , snapshot->viewport .getWidth (), snapshot->viewport .getHeight ());
284322 glBindFramebuffer (GL_FRAMEBUFFER, snapshot->fbo );
323+ debugOverdraw (true , false );
285324
286325 glClearColor (0 .0f , 0 .0f , 0 .0f , 0 .0f );
287326
@@ -302,6 +341,7 @@ void OpenGLRenderer::resumeAfterLayer() {
302341 sp<Snapshot> snapshot = (mSnapshot != NULL ) ? mSnapshot : mFirstSnapshot ;
303342 glViewport (0 , 0 , snapshot->viewport .getWidth (), snapshot->viewport .getHeight ());
304343 glBindFramebuffer (GL_FRAMEBUFFER, snapshot->fbo );
344+ debugOverdraw (true , false );
305345
306346 mCaches .resetScissor ();
307347 dirtyClip ();
@@ -407,7 +447,10 @@ bool OpenGLRenderer::updateLayer(Layer* layer, bool inFrame) {
407447 OpenGLRenderer* renderer = layer->renderer ;
408448 Rect& dirty = layer->dirtyRect ;
409449
410- if (inFrame) endTiling ();
450+ if (inFrame) {
451+ endTiling ();
452+ debugOverdraw (false , false );
453+ }
411454
412455 renderer->setViewport (layer->layer .getWidth (), layer->layer .getHeight ());
413456 renderer->prepareDirty (dirty.left , dirty.top , dirty.right , dirty.bottom , !layer->isBlend ());
@@ -724,6 +767,7 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLui
724767 mSnapshot ->orthoMatrix .load (mOrthoMatrix );
725768
726769 endTiling ();
770+ debugOverdraw (false , false );
727771 // Bind texture to FBO
728772 glBindFramebuffer (GL_FRAMEBUFFER, layer->getFbo ());
729773 layer->bindTexture ();
@@ -772,6 +816,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) {
772816 glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0 , 0 );
773817 // Unbind current FBO and restore previous one
774818 glBindFramebuffer (GL_FRAMEBUFFER, previous->fbo );
819+ debugOverdraw (true , false );
775820
776821 startTiling (previous);
777822 }
0 commit comments