Skip to content

Commit 87e2f75

Browse files
author
Romain Guy
committed
Add a property to disable libhwui's scissor optimization
Bug #7158326 When scissor optimization is enabled, OpenGLRenderer will attempt to minimize the use of scissor by selectively enabling and disabling the GL scissor test. When the optimization is disabled, OpenGLRenderer will keep the GL scissor test enabled and change the scissor rect as needed. Some GPUs (for instance the SGX 540) perform better when changing the scissor rect often than when enabling/disabling the scissor test often. Change-Id: Idb68862e287a23358f9188d577ae0f86161902fd
1 parent 97dc917 commit 87e2f75

File tree

4 files changed

+91
-48
lines changed

4 files changed

+91
-48
lines changed

core/jni/android_view_GLES20Canvas.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ static void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz
116116

117117
static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
118118
RENDERER_LOGD("Create OpenGLRenderer");
119-
return new OpenGLRenderer;
119+
OpenGLRenderer* renderer = new OpenGLRenderer();
120+
renderer->initProperties();
121+
return renderer;
120122
}
121123

122124
static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
@@ -734,7 +736,9 @@ static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz,
734736
static OpenGLRenderer* android_view_GLES20Canvas_createLayerRenderer(JNIEnv* env,
735737
jobject clazz, Layer* layer) {
736738
if (layer) {
737-
return new LayerRenderer(layer);
739+
OpenGLRenderer* renderer = new LayerRenderer(layer);
740+
renderer->initProperties();
741+
return renderer;
738742
}
739743
return NULL;
740744
}

libs/hwui/OpenGLRenderer.cpp

Lines changed: 60 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "OpenGLRenderer.h"
3535
#include "DisplayListRenderer.h"
3636
#include "PathRenderer.h"
37+
#include "Properties.h"
3738
#include "Vector.h"
3839

3940
namespace android {
@@ -117,23 +118,24 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) {
117118
memcpy(mMeshVertices, gMeshVertices, sizeof(gMeshVertices));
118119

119120
mFirstSnapshot = new Snapshot;
121+
122+
mScissorOptimizationDisabled = false;
120123
}
121124

122125
OpenGLRenderer::~OpenGLRenderer() {
123126
// The context has already been destroyed at this point, do not call
124127
// GL APIs. All GL state should be kept in Caches.h
125128
}
126129

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+
}
137139
}
138140

139141
///////////////////////////////////////////////////////////////////////////////
@@ -268,40 +270,6 @@ void OpenGLRenderer::finish() {
268270
}
269271
}
270272

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-
305273
void OpenGLRenderer::interrupt() {
306274
if (mCaches.currentProgram) {
307275
if (mCaches.currentProgram->isInUse()) {
@@ -438,6 +406,52 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) {
438406
return result;
439407
}
440408

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+
441455
///////////////////////////////////////////////////////////////////////////////
442456
// Layers
443457
///////////////////////////////////////////////////////////////////////////////
@@ -1248,7 +1262,7 @@ bool OpenGLRenderer::quickReject(float left, float top, float right, float botto
12481262

12491263
bool rejected = !clipRect.intersects(r);
12501264
if (!isDeferred() && !rejected) {
1251-
mCaches.setScissorEnabled(!clipRect.contains(r));
1265+
mCaches.setScissorEnabled(mScissorOptimizationDisabled || !clipRect.contains(r));
12521266
}
12531267

12541268
return rejected;
@@ -2711,7 +2725,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* pain
27112725
debugLayerUpdate = mCaches.debugLayersUpdates;
27122726
}
27132727

2714-
mCaches.setScissorEnabled(!clip.contains(transformed));
2728+
mCaches.setScissorEnabled(mScissorOptimizationDisabled || !clip.contains(transformed));
27152729
mCaches.activeTexture(0);
27162730

27172731
if (CC_LIKELY(!layer->region.isEmpty())) {

libs/hwui/OpenGLRenderer.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ class OpenGLRenderer {
6363
ANDROID_API OpenGLRenderer();
6464
virtual ~OpenGLRenderer();
6565

66+
/**
67+
* Read externally defined properties to control the behavior
68+
* of the renderer.
69+
*/
70+
ANDROID_API void initProperties();
71+
6672
/**
6773
* Indicates whether this renderer executes drawing commands immediately.
6874
* If this method returns true, the drawing commands will be executed
@@ -804,6 +810,10 @@ class OpenGLRenderer {
804810
// Indicate whether we are drawing an opaque frame
805811
bool mOpaqueFrame;
806812

813+
// See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
814+
// Properties.h
815+
bool mScissorOptimizationDisabled;
816+
807817
friend class DisplayListRenderer;
808818

809819
}; // class OpenGLRenderer

libs/hwui/Properties.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,21 @@ enum DebugLevel {
6767
*/
6868
#define PROPERTY_DEBUG_OVERDRAW "debug.hwui.show_overdraw"
6969

70+
/**
71+
* Used to enable/disable scissor optimization. The accepted values are
72+
* "true" and "false". The default value is "false".
73+
*
74+
* When scissor optimization is enabled, OpenGLRenderer will attempt to
75+
* minimize the use of scissor by selectively enabling and disabling the
76+
* GL scissor test.
77+
* When the optimization is disabled, OpenGLRenderer will keep the GL
78+
* scissor test enabled and change the scissor rect as needed.
79+
* Some GPUs (for instance the SGX 540) perform better when changing
80+
* the scissor rect often than when enabling/disabling the scissor test
81+
* often.
82+
*/
83+
#define PROPERTY_DISABLE_SCISSOR_OPTIMIZATION "ro.hwui.disable_scissor_opt"
84+
7085
// These properties are defined in mega-bytes
7186
#define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size"
7287
#define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size"

0 commit comments

Comments
 (0)