|
34 | 34 | #include "OpenGLRenderer.h" |
35 | 35 | #include "DisplayListRenderer.h" |
36 | 36 | #include "PathRenderer.h" |
| 37 | +#include "Properties.h" |
37 | 38 | #include "Vector.h" |
38 | 39 |
|
39 | 40 | namespace android { |
@@ -117,23 +118,24 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) { |
117 | 118 | memcpy(mMeshVertices, gMeshVertices, sizeof(gMeshVertices)); |
118 | 119 |
|
119 | 120 | mFirstSnapshot = new Snapshot; |
| 121 | + |
| 122 | + mScissorOptimizationDisabled = false; |
120 | 123 | } |
121 | 124 |
|
122 | 125 | OpenGLRenderer::~OpenGLRenderer() { |
123 | 126 | // The context has already been destroyed at this point, do not call |
124 | 127 | // GL APIs. All GL state should be kept in Caches.h |
125 | 128 | } |
126 | 129 |
|
127 | | -/////////////////////////////////////////////////////////////////////////////// |
128 | | -// Debug |
129 | | -/////////////////////////////////////////////////////////////////////////////// |
130 | | - |
131 | | -void OpenGLRenderer::startMark(const char* name) const { |
132 | | - mCaches.startMark(0, name); |
133 | | -} |
134 | | - |
135 | | -void OpenGLRenderer::endMark() const { |
136 | | - mCaches.endMark(); |
| 130 | +void OpenGLRenderer::initProperties() { |
| 131 | + char property[PROPERTY_VALUE_MAX]; |
| 132 | + if (property_get(PROPERTY_DISABLE_SCISSOR_OPTIMIZATION, property, "false")) { |
| 133 | + mScissorOptimizationDisabled = !strcasecmp(property, "true"); |
| 134 | + INIT_LOGD(" Scissor optimization %s", |
| 135 | + mScissorOptimizationDisabled ? "disabled" : "enabled"); |
| 136 | + } else { |
| 137 | + INIT_LOGD(" Scissor optimization enabled"); |
| 138 | + } |
137 | 139 | } |
138 | 140 |
|
139 | 141 | /////////////////////////////////////////////////////////////////////////////// |
@@ -268,40 +270,6 @@ void OpenGLRenderer::finish() { |
268 | 270 | } |
269 | 271 | } |
270 | 272 |
|
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 | | - |
305 | 273 | void OpenGLRenderer::interrupt() { |
306 | 274 | if (mCaches.currentProgram) { |
307 | 275 | if (mCaches.currentProgram->isInUse()) { |
@@ -438,6 +406,52 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) { |
438 | 406 | return result; |
439 | 407 | } |
440 | 408 |
|
| 409 | +/////////////////////////////////////////////////////////////////////////////// |
| 410 | +// Debug |
| 411 | +/////////////////////////////////////////////////////////////////////////////// |
| 412 | + |
| 413 | +void OpenGLRenderer::startMark(const char* name) const { |
| 414 | + mCaches.startMark(0, name); |
| 415 | +} |
| 416 | + |
| 417 | +void OpenGLRenderer::endMark() const { |
| 418 | + mCaches.endMark(); |
| 419 | +} |
| 420 | + |
| 421 | +void OpenGLRenderer::debugOverdraw(bool enable, bool clear) { |
| 422 | + if (mCaches.debugOverdraw && getTargetFbo() == 0) { |
| 423 | + if (clear) { |
| 424 | + mCaches.disableScissor(); |
| 425 | + mCaches.stencil.clear(); |
| 426 | + } |
| 427 | + if (enable) { |
| 428 | + mCaches.stencil.enableDebugWrite(); |
| 429 | + } else { |
| 430 | + mCaches.stencil.disable(); |
| 431 | + } |
| 432 | + } |
| 433 | +} |
| 434 | + |
| 435 | +void OpenGLRenderer::renderOverdraw() { |
| 436 | + if (mCaches.debugOverdraw && getTargetFbo() == 0) { |
| 437 | + const Rect* clip = mTilingSnapshot->clipRect; |
| 438 | + |
| 439 | + mCaches.enableScissor(); |
| 440 | + mCaches.setScissor(clip->left, mTilingSnapshot->height - clip->bottom, |
| 441 | + clip->right - clip->left, clip->bottom - clip->top); |
| 442 | + |
| 443 | + mCaches.stencil.enableDebugTest(2); |
| 444 | + drawColor(0x2f0000ff, SkXfermode::kSrcOver_Mode); |
| 445 | + mCaches.stencil.enableDebugTest(3); |
| 446 | + drawColor(0x2f00ff00, SkXfermode::kSrcOver_Mode); |
| 447 | + mCaches.stencil.enableDebugTest(4); |
| 448 | + drawColor(0x3fff0000, SkXfermode::kSrcOver_Mode); |
| 449 | + mCaches.stencil.enableDebugTest(4, true); |
| 450 | + drawColor(0x7fff0000, SkXfermode::kSrcOver_Mode); |
| 451 | + mCaches.stencil.disable(); |
| 452 | + } |
| 453 | +} |
| 454 | + |
441 | 455 | /////////////////////////////////////////////////////////////////////////////// |
442 | 456 | // Layers |
443 | 457 | /////////////////////////////////////////////////////////////////////////////// |
@@ -1248,7 +1262,7 @@ bool OpenGLRenderer::quickReject(float left, float top, float right, float botto |
1248 | 1262 |
|
1249 | 1263 | bool rejected = !clipRect.intersects(r); |
1250 | 1264 | if (!isDeferred() && !rejected) { |
1251 | | - mCaches.setScissorEnabled(!clipRect.contains(r)); |
| 1265 | + mCaches.setScissorEnabled(mScissorOptimizationDisabled || !clipRect.contains(r)); |
1252 | 1266 | } |
1253 | 1267 |
|
1254 | 1268 | return rejected; |
@@ -2711,7 +2725,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* pain |
2711 | 2725 | debugLayerUpdate = mCaches.debugLayersUpdates; |
2712 | 2726 | } |
2713 | 2727 |
|
2714 | | - mCaches.setScissorEnabled(!clip.contains(transformed)); |
| 2728 | + mCaches.setScissorEnabled(mScissorOptimizationDisabled || !clip.contains(transformed)); |
2715 | 2729 | mCaches.activeTexture(0); |
2716 | 2730 |
|
2717 | 2731 | if (CC_LIKELY(!layer->region.isEmpty())) { |
|
0 commit comments