Implement FlushCaches TODO

Change-Id: Id05429e98ffe0858275b32c41fb215c1d8d930b2
This commit is contained in:
John Reck
2014-05-23 15:11:19 -07:00
parent ec41d7abab
commit e1628b7c6f
6 changed files with 34 additions and 3 deletions

View File

@@ -33,8 +33,6 @@ import java.io.PrintWriter;
/**
* Hardware renderer that proxies the rendering to a render thread. Most calls
* are currently synchronous.
* TODO: Make draw() async.
* TODO: Figure out how to share the DisplayList between two threads (global lock?)
*
* The UI thread can block on the RenderThread, but RenderThread must never
* block on the UI thread.
@@ -117,7 +115,7 @@ public class ThreadedRenderer extends HardwareRenderer {
@Override
void destroyHardwareResources(View view) {
destroyResources(view);
// TODO: GLES20Canvas.flushCaches(GLES20Canvas.FLUSH_CACHES_LAYERS);
nFlushCaches(mNativeProxy, GLES20Canvas.FLUSH_CACHES_LAYERS);
}
private static void destroyResources(View view) {
@@ -368,6 +366,8 @@ public class ThreadedRenderer extends HardwareRenderer {
private static native boolean nCopyLayerInto(long nativeProxy, long layer, long bitmap);
private static native void nDestroyLayer(long nativeProxy, long layer);
private static native void nFlushCaches(long nativeProxy, int flushMode);
private static native void nFence(long nativeProxy);
private static native void nNotifyFramePending(long nativeProxy);
}

View File

@@ -293,6 +293,12 @@ static void android_view_ThreadedRenderer_destroyLayer(JNIEnv* env, jobject claz
proxy->destroyLayer(layer);
}
static void android_view_ThreadedRenderer_flushCaches(JNIEnv* env, jobject clazz,
jlong proxyPtr, jint flushMode) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
proxy->flushCaches(static_cast<Caches::FlushMode>(flushMode));
}
static void android_view_ThreadedRenderer_fence(JNIEnv* env, jobject clazz,
jlong proxyPtr) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -334,6 +340,7 @@ static JNINativeMethod gMethods[] = {
{ "nCreateTextureLayer", "(J)J", (void*) android_view_ThreadedRenderer_createTextureLayer },
{ "nCopyLayerInto", "(JJJ)Z", (void*) android_view_ThreadedRenderer_copyLayerInto },
{ "nDestroyLayer", "(JJ)V", (void*) android_view_ThreadedRenderer_destroyLayer },
{ "nFlushCaches", "(JI)V", (void*) android_view_ThreadedRenderer_flushCaches },
{ "nFence", "(J)V", (void*) android_view_ThreadedRenderer_fence },
{ "nNotifyFramePending", "(J)V", (void*) android_view_ThreadedRenderer_notifyFramePending },
#endif

View File

@@ -556,6 +556,13 @@ bool CanvasContext::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap)
return LayerRenderer::copyLayer(layer->backingLayer(), bitmap);
}
void CanvasContext::flushCaches(Caches::FlushMode flushMode) {
if (mGlobalContext->hasContext()) {
requireGlContext();
Caches::getInstance().flush(flushMode);
}
}
void CanvasContext::runWithGlContext(RenderTask* task) {
requireGlContext();
task->run();

View File

@@ -63,6 +63,8 @@ public:
bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
void flushCaches(Caches::FlushMode flushMode);
void invokeFunctor(Functor* functor);
void runWithGlContext(RenderTask* task);

View File

@@ -282,6 +282,18 @@ void RenderProxy::destroyLayer(DeferredLayerUpdater* layer) {
post(task);
}
CREATE_BRIDGE2(flushCaches, CanvasContext* context, Caches::FlushMode flushMode) {
args->context->flushCaches(args->flushMode);
return NULL;
}
void RenderProxy::flushCaches(Caches::FlushMode flushMode) {
SETUP_TASK(flushCaches);
args->context = mContext;
args->flushMode = flushMode;
post(task);
}
CREATE_BRIDGE0(fence) {
// Intentionally empty
return NULL;

View File

@@ -29,6 +29,7 @@
#include <utils/StrongPointer.h>
#include <utils/Vector.h>
#include "../Caches.h"
#include "DrawFrameTask.h"
namespace android {
@@ -81,6 +82,8 @@ public:
ANDROID_API bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
ANDROID_API void destroyLayer(DeferredLayerUpdater* layer);
ANDROID_API void flushCaches(Caches::FlushMode flushMode);
ANDROID_API void fence();
ANDROID_API void notifyFramePending();