Merge "Make attachFunctor blocking"

This commit is contained in:
John Reck
2014-04-10 22:23:22 +00:00
committed by Android (Google) Code Review
6 changed files with 9 additions and 115 deletions

View File

@@ -190,12 +190,12 @@ public class ThreadedRenderer extends HardwareRenderer {
@Override
void detachFunctor(long functor) {
nDetachFunctor(mNativeProxy, functor);
// no-op, we never attach functors to need to detach them
}
@Override
void attachFunctor(AttachInfo attachInfo, long functor) {
nAttachFunctor(mNativeProxy, functor);
invokeFunctor(functor, true);
}
@Override
@@ -289,8 +289,6 @@ public class ThreadedRenderer extends HardwareRenderer {
private static native void nRunWithGlContext(long nativeProxy, Runnable runnable);
private static native void nDestroyCanvas(long nativeProxy);
private static native void nAttachFunctor(long nativeProxy, long functor);
private static native void nDetachFunctor(long nativeProxy, long functor);
private static native void nInvokeFunctor(long nativeProxy, long functor, boolean waitForCompletion);
private static native long nCreateDisplayListLayer(long nativeProxy, int width, int height);

View File

@@ -127,20 +127,6 @@ static void android_view_ThreadedRenderer_destroyCanvas(JNIEnv* env, jobject cla
proxy->destroyCanvas();
}
static void android_view_ThreadedRenderer_attachFunctor(JNIEnv* env, jobject clazz,
jlong proxyPtr, jlong functorPtr) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
Functor* functor = reinterpret_cast<Functor*>(functorPtr);
proxy->attachFunctor(functor);
}
static void android_view_ThreadedRenderer_detachFunctor(JNIEnv* env, jobject clazz,
jlong proxyPtr, jlong functorPtr) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
Functor* functor = reinterpret_cast<Functor*>(functorPtr);
proxy->detachFunctor(functor);
}
static void android_view_ThreadedRenderer_invokeFunctor(JNIEnv* env, jobject clazz,
jlong proxyPtr, jlong functorPtr, jboolean waitForCompletion) {
RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr);
@@ -209,8 +195,6 @@ static JNINativeMethod gMethods[] = {
{ "nSetup", "(JII)V", (void*) android_view_ThreadedRenderer_setup },
{ "nDrawDisplayList", "(JJIIII)V", (void*) android_view_ThreadedRenderer_drawDisplayList },
{ "nDestroyCanvas", "(J)V", (void*) android_view_ThreadedRenderer_destroyCanvas },
{ "nAttachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_attachFunctor },
{ "nDetachFunctor", "(JJ)V", (void*) android_view_ThreadedRenderer_detachFunctor },
{ "nInvokeFunctor", "(JJZ)V", (void*) android_view_ThreadedRenderer_invokeFunctor },
{ "nRunWithGlContext", "(JLjava/lang/Runnable;)V", (void*) android_view_ThreadedRenderer_runWithGlContext },
{ "nCreateDisplayListLayer", "(JII)J", (void*) android_view_ThreadedRenderer_createDisplayListLayer },

View File

@@ -313,14 +313,11 @@ CanvasContext::CanvasContext(bool translucent)
, mDirtyRegionsEnabled(false)
, mOpaque(!translucent)
, mCanvas(0)
, mHaveNewSurface(false)
, mInvokeFunctorsPending(false)
, mInvokeFunctorsTask(this) {
, mHaveNewSurface(false) {
mGlobalContext = GlobalContext::get();
}
CanvasContext::~CanvasContext() {
removeFunctorsTask();
destroyCanvas();
}
@@ -432,55 +429,17 @@ void CanvasContext::drawDisplayList(RenderNode* displayList, Rect* dirty) {
}
}
void InvokeFunctorsTask::run() {
mContext->invokeFunctors();
}
void CanvasContext::attachFunctor(Functor* functor) {
if (!mCanvas) return;
mCanvas->attachFunctor(functor);
removeFunctorsTask();
queueFunctorsTask(0);
}
void CanvasContext::detachFunctor(Functor* functor) {
if (!mCanvas) return;
mCanvas->detachFunctor(functor);
}
void CanvasContext::invokeFunctor(Functor* functor) {
ATRACE_CALL();
DrawGlInfo::Mode mode = DrawGlInfo::kModeProcessNoContext;
if (mGlobalContext->hasContext()) {
requireGlContext();
mode = DrawGlInfo::kModeProcess;
}
(*functor)(mode, NULL);
}
void CanvasContext::invokeFunctors() {
mInvokeFunctorsPending = false;
if (!mCanvas) return;
requireSurface();
Rect dirty;
mCanvas->invokeFunctors(dirty);
}
void CanvasContext::removeFunctorsTask() {
if (!mInvokeFunctorsPending) return;
mInvokeFunctorsPending = false;
mRenderThread.remove(&mInvokeFunctorsTask);
}
void CanvasContext::queueFunctorsTask(int delayMs) {
if (mInvokeFunctorsPending) return;
mInvokeFunctorsPending = true;
mRenderThread.queueDelayed(&mInvokeFunctorsTask, delayMs);
// TODO: Remove the dummy info in the future
DrawGlInfo dummyInfo;
memset(&dummyInfo, 0, sizeof(DrawGlInfo));
(*functor)(mode, &dummyInfo);
}
bool CanvasContext::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) {

View File

@@ -43,17 +43,6 @@ class GlobalContext;
class CanvasContext;
class RenderThread;
class InvokeFunctorsTask : public RenderTask {
public:
InvokeFunctorsTask(CanvasContext* context)
: mContext(context) {}
virtual void run();
private:
CanvasContext* mContext;
};
// This per-renderer class manages the bridge between the global EGL context
// and the render surface.
class CanvasContext {
@@ -71,8 +60,6 @@ public:
bool copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap);
void attachFunctor(Functor* functor);
void detachFunctor(Functor* functor);
void invokeFunctor(Functor* functor);
void runWithGlContext(RenderTask* task);
@@ -85,11 +72,6 @@ private:
void swapBuffers();
void requireSurface();
friend class InvokeFunctorsTask;
void invokeFunctors();
void removeFunctorsTask();
void queueFunctorsTask(int delayMs = FUNCTOR_PROCESS_DELAY);
void requireGlContext();
GlobalContext* mGlobalContext;
@@ -100,10 +82,6 @@ private:
bool mOpaque;
OpenGLRenderer* mCanvas;
bool mHaveNewSurface;
bool mInvokeFunctorsPending;
InvokeFunctorsTask mInvokeFunctorsTask;
};
} /* namespace renderthread */

View File

@@ -151,36 +151,13 @@ void RenderProxy::destroyCanvas() {
post(task);
}
CREATE_BRIDGE2(attachFunctor, CanvasContext* context, Functor* functor) {
args->context->attachFunctor(args->functor);
return NULL;
}
void RenderProxy::attachFunctor(Functor* functor) {
SETUP_TASK(attachFunctor);
args->context = mContext;
args->functor = functor;
post(task);
}
CREATE_BRIDGE2(detachFunctor, CanvasContext* context, Functor* functor) {
args->context->detachFunctor(args->functor);
return NULL;
}
void RenderProxy::detachFunctor(Functor* functor) {
SETUP_TASK(detachFunctor);
args->context = mContext;
args->functor = functor;
post(task);
}
CREATE_BRIDGE2(invokeFunctor, CanvasContext* context, Functor* functor) {
args->context->invokeFunctor(args->functor);
return NULL;
}
void RenderProxy::invokeFunctor(Functor* functor, bool waitForCompletion) {
ATRACE_CALL();
SETUP_TASK(invokeFunctor);
args->context = mContext;
args->functor = functor;

View File

@@ -67,8 +67,6 @@ public:
int dirtyLeft, int dirtyTop, int dirtyRight, int dirtyBottom);
ANDROID_API void destroyCanvas();
ANDROID_API void attachFunctor(Functor* functor);
ANDROID_API void detachFunctor(Functor* functor);
ANDROID_API void invokeFunctor(Functor* functor, bool waitForCompletion);
ANDROID_API void runWithGlContext(RenderTask* task);