diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2012-09-25 09:26:06 -0700 |
---|---|---|
committer | Jean-Baptiste Queru <jbq@google.com> | 2012-09-25 09:26:09 -0700 |
commit | 908a43234aca51af5021249c03030cec6b36417f (patch) | |
tree | 411d7bbf6e146b601b88b69b2434b049b8639018 /libs | |
parent | 6fb2514cdf77e2657d7b73b0cd97e060aefc6b53 (diff) | |
parent | 87e2f757be9b24d369bab354e37c276e851b1fc7 (diff) | |
download | frameworks_base-908a43234aca51af5021249c03030cec6b36417f.zip frameworks_base-908a43234aca51af5021249c03030cec6b36417f.tar.gz frameworks_base-908a43234aca51af5021249c03030cec6b36417f.tar.bz2 |
Merge into jb-mr1-dev
Change-Id: I7b777c7a4818d699582419d2eb4fc1f5cc0f4f46
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 106 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.h | 10 | ||||
-rw-r--r-- | libs/hwui/Properties.h | 15 |
3 files changed, 85 insertions, 46 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index a4403c8..35cc716 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -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()) { @@ -439,6 +407,52 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) { } /////////////////////////////////////////////////////////////////////////////// +// 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())) { diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index 46e66cb..c29e3fb 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -64,6 +64,12 @@ public: 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 * later. @@ -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 diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 31e60e4..1e8765b 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -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" |