Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2e4ebb9b authored by Ricardo Cerqueira's avatar Ricardo Cerqueira Committed by Gerrit Code Review
Browse files

Merge "libhwui: Delete display list objects and resources on the UI thread" into ics

parents d8f6fd0e 41951f0d
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -629,7 +629,7 @@ static void android_view_GLES20Canvas_resetDisplayListRenderer(JNIEnv* env,


static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env,
static void android_view_GLES20Canvas_destroyDisplayList(JNIEnv* env,
        jobject clazz, DisplayList* displayList) {
        jobject clazz, DisplayList* displayList) {
    delete displayList;
    DisplayList::destroyDisplayListDeferred(displayList);
}
}


static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
static bool android_view_GLES20Canvas_drawDisplayList(JNIEnv* env,
+13 −0
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <utils/String8.h>
#include <utils/String8.h>


#include "Caches.h"
#include "Caches.h"
#include "DisplayListRenderer.h"
#include "Properties.h"
#include "Properties.h"
#include "LayerRenderer.h"
#include "LayerRenderer.h"


@@ -178,6 +179,13 @@ void Caches::clearGarbage() {
        LayerRenderer::destroyLayer(layer);
        LayerRenderer::destroyLayer(layer);
    }
    }
    mLayerGarbage.clear();
    mLayerGarbage.clear();

    count = mDisplayListGarbage.size();
    for (size_t i = 0; i < count; i++) {
        DisplayList* displayList = mDisplayListGarbage.itemAt(i);
        delete displayList;
    }
    mDisplayListGarbage.clear();
}
}


void Caches::deleteLayerDeferred(Layer* layer) {
void Caches::deleteLayerDeferred(Layer* layer) {
@@ -185,6 +193,11 @@ void Caches::deleteLayerDeferred(Layer* layer) {
    mLayerGarbage.push(layer);
    mLayerGarbage.push(layer);
}
}


void Caches::deleteDisplayListDeferred(DisplayList* displayList) {
    Mutex::Autolock _l(mGarbageLock);
    mDisplayListGarbage.push(displayList);
}

void Caches::flush(FlushMode mode) {
void Caches::flush(FlushMode mode) {
    FLUSH_LOGD("Flushing caches (mode %d)", mode);
    FLUSH_LOGD("Flushing caches (mode %d)", mode);


+8 −0
Original line number Original line Diff line number Diff line
@@ -84,6 +84,8 @@ struct CacheLogger {
// Caches
// Caches
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////


class DisplayList;

class ANDROID_API Caches: public Singleton<Caches> {
class ANDROID_API Caches: public Singleton<Caches> {
    Caches();
    Caches();


@@ -99,6 +101,7 @@ class ANDROID_API Caches: public Singleton<Caches> {


    mutable Mutex mGarbageLock;
    mutable Mutex mGarbageLock;
    Vector<Layer*> mLayerGarbage;
    Vector<Layer*> mLayerGarbage;
    Vector<DisplayList*> mDisplayListGarbage;


public:
public:
    enum FlushMode {
    enum FlushMode {
@@ -144,6 +147,11 @@ public:
     */
     */
    void deleteLayerDeferred(Layer* layer);
    void deleteLayerDeferred(Layer* layer);


    /*
     * Can be used to delete a display list from a non EGL thread.
     */
    void deleteDisplayListDeferred(DisplayList* layer);

    /**
    /**
     * Binds the VBO used to render simple textured quads.
     * Binds the VBO used to render simple textured quads.
     */
     */
+7 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,13 @@ DisplayList::~DisplayList() {
    clearResources();
    clearResources();
}
}


void DisplayList::destroyDisplayListDeferred(DisplayList* displayList) {
    if (displayList) {
        DISPLAY_LIST_LOGD("Deferring display list destruction");
        Caches::getInstance().deleteDisplayListDeferred(displayList);
    }
}

void DisplayList::clearResources() {
void DisplayList::clearResources() {
    sk_free((void*) mReader.base());
    sk_free((void*) mReader.base());


+4 −4
Original line number Original line Diff line number Diff line
@@ -107,16 +107,16 @@ public:


    static const char* OP_NAMES[];
    static const char* OP_NAMES[];


    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);

    ANDROID_API size_t getSize();
    ANDROID_API size_t getSize();
    ANDROID_API static void destroyDisplayListDeferred(DisplayList* displayList);
    ANDROID_API static void outputLogBuffer(int fd);

    void initFromDisplayListRenderer(const DisplayListRenderer& recorder, bool reusing = false);


    bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);
    bool replay(OpenGLRenderer& renderer, Rect& dirty, uint32_t level = 0);


    void output(OpenGLRenderer& renderer, uint32_t level = 0);
    void output(OpenGLRenderer& renderer, uint32_t level = 0);


    ANDROID_API static void outputLogBuffer(int fd);

    void setRenderable(bool renderable) {
    void setRenderable(bool renderable) {
        mIsRenderable = renderable;
        mIsRenderable = renderable;
    }
    }