am 908a4323: Merge into jb-mr1-dev
* commit '908a43234aca51af5021249c03030cec6b36417f': Add a property to disable libhwui's scissor optimization Bug #7158326
This commit is contained in:
committed by
Android Git Automerger
commit
3142c96e89
@@ -116,7 +116,9 @@ static void android_view_GLES20Canvas_terminateCaches(JNIEnv* env, jobject clazz
|
||||
|
||||
static OpenGLRenderer* android_view_GLES20Canvas_createRenderer(JNIEnv* env, jobject clazz) {
|
||||
RENDERER_LOGD("Create OpenGLRenderer");
|
||||
return new OpenGLRenderer;
|
||||
OpenGLRenderer* renderer = new OpenGLRenderer();
|
||||
renderer->initProperties();
|
||||
return renderer;
|
||||
}
|
||||
|
||||
static void android_view_GLES20Canvas_destroyRenderer(JNIEnv* env, jobject clazz,
|
||||
@@ -734,7 +736,9 @@ static void android_view_GLES20Canvas_resume(JNIEnv* env, jobject clazz,
|
||||
static OpenGLRenderer* android_view_GLES20Canvas_createLayerRenderer(JNIEnv* env,
|
||||
jobject clazz, Layer* layer) {
|
||||
if (layer) {
|
||||
return new LayerRenderer(layer);
|
||||
OpenGLRenderer* renderer = new LayerRenderer(layer);
|
||||
renderer->initProperties();
|
||||
return renderer;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "OpenGLRenderer.h"
|
||||
#include "DisplayListRenderer.h"
|
||||
#include "PathRenderer.h"
|
||||
#include "Properties.h"
|
||||
#include "Vector.h"
|
||||
|
||||
namespace android {
|
||||
@@ -117,6 +118,8 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) {
|
||||
memcpy(mMeshVertices, gMeshVertices, sizeof(gMeshVertices));
|
||||
|
||||
mFirstSnapshot = new Snapshot;
|
||||
|
||||
mScissorOptimizationDisabled = false;
|
||||
}
|
||||
|
||||
OpenGLRenderer::~OpenGLRenderer() {
|
||||
@@ -124,16 +127,15 @@ OpenGLRenderer::~OpenGLRenderer() {
|
||||
// GL APIs. All GL state should be kept in Caches.h
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Debug
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void OpenGLRenderer::startMark(const char* name) const {
|
||||
mCaches.startMark(0, name);
|
||||
}
|
||||
|
||||
void OpenGLRenderer::endMark() const {
|
||||
mCaches.endMark();
|
||||
void OpenGLRenderer::initProperties() {
|
||||
char property[PROPERTY_VALUE_MAX];
|
||||
if (property_get(PROPERTY_DISABLE_SCISSOR_OPTIMIZATION, property, "false")) {
|
||||
mScissorOptimizationDisabled = !strcasecmp(property, "true");
|
||||
INIT_LOGD(" Scissor optimization %s",
|
||||
mScissorOptimizationDisabled ? "disabled" : "enabled");
|
||||
} else {
|
||||
INIT_LOGD(" Scissor optimization enabled");
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -268,40 +270,6 @@ void OpenGLRenderer::finish() {
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLRenderer::debugOverdraw(bool enable, bool clear) {
|
||||
if (mCaches.debugOverdraw && getTargetFbo() == 0) {
|
||||
if (clear) {
|
||||
mCaches.disableScissor();
|
||||
mCaches.stencil.clear();
|
||||
}
|
||||
if (enable) {
|
||||
mCaches.stencil.enableDebugWrite();
|
||||
} else {
|
||||
mCaches.stencil.disable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLRenderer::renderOverdraw() {
|
||||
if (mCaches.debugOverdraw && getTargetFbo() == 0) {
|
||||
const Rect* clip = mTilingSnapshot->clipRect;
|
||||
|
||||
mCaches.enableScissor();
|
||||
mCaches.setScissor(clip->left, mTilingSnapshot->height - clip->bottom,
|
||||
clip->right - clip->left, clip->bottom - clip->top);
|
||||
|
||||
mCaches.stencil.enableDebugTest(2);
|
||||
drawColor(0x2f0000ff, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.enableDebugTest(3);
|
||||
drawColor(0x2f00ff00, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.enableDebugTest(4);
|
||||
drawColor(0x3fff0000, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.enableDebugTest(4, true);
|
||||
drawColor(0x7fff0000, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.disable();
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLRenderer::interrupt() {
|
||||
if (mCaches.currentProgram) {
|
||||
if (mCaches.currentProgram->isInUse()) {
|
||||
@@ -438,6 +406,52 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) {
|
||||
return result;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Debug
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void OpenGLRenderer::startMark(const char* name) const {
|
||||
mCaches.startMark(0, name);
|
||||
}
|
||||
|
||||
void OpenGLRenderer::endMark() const {
|
||||
mCaches.endMark();
|
||||
}
|
||||
|
||||
void OpenGLRenderer::debugOverdraw(bool enable, bool clear) {
|
||||
if (mCaches.debugOverdraw && getTargetFbo() == 0) {
|
||||
if (clear) {
|
||||
mCaches.disableScissor();
|
||||
mCaches.stencil.clear();
|
||||
}
|
||||
if (enable) {
|
||||
mCaches.stencil.enableDebugWrite();
|
||||
} else {
|
||||
mCaches.stencil.disable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OpenGLRenderer::renderOverdraw() {
|
||||
if (mCaches.debugOverdraw && getTargetFbo() == 0) {
|
||||
const Rect* clip = mTilingSnapshot->clipRect;
|
||||
|
||||
mCaches.enableScissor();
|
||||
mCaches.setScissor(clip->left, mTilingSnapshot->height - clip->bottom,
|
||||
clip->right - clip->left, clip->bottom - clip->top);
|
||||
|
||||
mCaches.stencil.enableDebugTest(2);
|
||||
drawColor(0x2f0000ff, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.enableDebugTest(3);
|
||||
drawColor(0x2f00ff00, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.enableDebugTest(4);
|
||||
drawColor(0x3fff0000, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.enableDebugTest(4, true);
|
||||
drawColor(0x7fff0000, SkXfermode::kSrcOver_Mode);
|
||||
mCaches.stencil.disable();
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Layers
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@@ -1248,7 +1262,7 @@ bool OpenGLRenderer::quickReject(float left, float top, float right, float botto
|
||||
|
||||
bool rejected = !clipRect.intersects(r);
|
||||
if (!isDeferred() && !rejected) {
|
||||
mCaches.setScissorEnabled(!clipRect.contains(r));
|
||||
mCaches.setScissorEnabled(mScissorOptimizationDisabled || !clipRect.contains(r));
|
||||
}
|
||||
|
||||
return rejected;
|
||||
@@ -2711,7 +2725,7 @@ status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* pain
|
||||
debugLayerUpdate = mCaches.debugLayersUpdates;
|
||||
}
|
||||
|
||||
mCaches.setScissorEnabled(!clip.contains(transformed));
|
||||
mCaches.setScissorEnabled(mScissorOptimizationDisabled || !clip.contains(transformed));
|
||||
mCaches.activeTexture(0);
|
||||
|
||||
if (CC_LIKELY(!layer->region.isEmpty())) {
|
||||
|
||||
@@ -63,6 +63,12 @@ public:
|
||||
ANDROID_API OpenGLRenderer();
|
||||
virtual ~OpenGLRenderer();
|
||||
|
||||
/**
|
||||
* Read externally defined properties to control the behavior
|
||||
* of the renderer.
|
||||
*/
|
||||
ANDROID_API void initProperties();
|
||||
|
||||
/**
|
||||
* Indicates whether this renderer executes drawing commands immediately.
|
||||
* If this method returns true, the drawing commands will be executed
|
||||
@@ -804,6 +810,10 @@ private:
|
||||
// Indicate whether we are drawing an opaque frame
|
||||
bool mOpaqueFrame;
|
||||
|
||||
// See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
|
||||
// Properties.h
|
||||
bool mScissorOptimizationDisabled;
|
||||
|
||||
friend class DisplayListRenderer;
|
||||
|
||||
}; // class OpenGLRenderer
|
||||
|
||||
@@ -67,6 +67,21 @@ enum DebugLevel {
|
||||
*/
|
||||
#define PROPERTY_DEBUG_OVERDRAW "debug.hwui.show_overdraw"
|
||||
|
||||
/**
|
||||
* Used to enable/disable scissor optimization. The accepted values are
|
||||
* "true" and "false". The default value is "false".
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#define PROPERTY_DISABLE_SCISSOR_OPTIMIZATION "ro.hwui.disable_scissor_opt"
|
||||
|
||||
// These properties are defined in mega-bytes
|
||||
#define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size"
|
||||
#define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size"
|
||||
|
||||
Reference in New Issue
Block a user