Loading core/jni/android_view_GLES20Canvas.cpp +6 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; } Loading libs/hwui/OpenGLRenderer.cpp +60 −46 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include "OpenGLRenderer.h" #include "DisplayListRenderer.h" #include "PathRenderer.h" #include "Properties.h" #include "Vector.h" namespace android { Loading Loading @@ -117,6 +118,8 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) { memcpy(mMeshVertices, gMeshVertices, sizeof(gMeshVertices)); mFirstSnapshot = new Snapshot; mScissorOptimizationDisabled = false; } OpenGLRenderer::~OpenGLRenderer() { Loading @@ -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::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"); } void OpenGLRenderer::endMark() const { mCaches.endMark(); } /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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()) { Loading Loading @@ -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 /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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; Loading Loading @@ -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())) { Loading libs/hwui/OpenGLRenderer.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading libs/hwui/Properties.h +15 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading
core/jni/android_view_GLES20Canvas.cpp +6 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; } Loading
libs/hwui/OpenGLRenderer.cpp +60 −46 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include "OpenGLRenderer.h" #include "DisplayListRenderer.h" #include "PathRenderer.h" #include "Properties.h" #include "Vector.h" namespace android { Loading Loading @@ -117,6 +118,8 @@ OpenGLRenderer::OpenGLRenderer(): mCaches(Caches::getInstance()) { memcpy(mMeshVertices, gMeshVertices, sizeof(gMeshVertices)); mFirstSnapshot = new Snapshot; mScissorOptimizationDisabled = false; } OpenGLRenderer::~OpenGLRenderer() { Loading @@ -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::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"); } void OpenGLRenderer::endMark() const { mCaches.endMark(); } /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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()) { Loading Loading @@ -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 /////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -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; Loading Loading @@ -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())) { Loading
libs/hwui/OpenGLRenderer.h +10 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
libs/hwui/Properties.h +15 −0 Original line number Diff line number Diff line Loading @@ -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" Loading