diff options
author | John Reck <jreck@google.com> | 2013-11-05 13:27:50 -0800 |
---|---|---|
committer | John Reck <jreck@google.com> | 2013-12-09 15:57:09 -0800 |
commit | cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fc (patch) | |
tree | 9b2287a705b0634197262c13433f5c32aa848bdc /libs | |
parent | 4598ea4e5e6b2accce5165a76f5e2d04ce46c74c (diff) | |
download | frameworks_base-cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fc.zip frameworks_base-cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fc.tar.gz frameworks_base-cec24ae16e9a0a7c3075f1a8d9149bb7fb3813fc.tar.bz2 |
RenderThread work
Hacky prototype needs a private API to enable
Change-Id: I21e0ddf3cdbd38a4036354b5d6012449e1a34849
Diffstat (limited to 'libs')
-rw-r--r-- | libs/hwui/Android.mk | 5 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderTask.cpp | 35 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderTask.h | 39 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.cpp | 86 | ||||
-rw-r--r-- | libs/hwui/renderthread/RenderThread.h | 58 |
5 files changed, 223 insertions, 0 deletions
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index ce8364e..1f37925 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -45,6 +45,11 @@ ifeq ($(USE_OPENGL_RENDERER),true) TextureCache.cpp \ TextDropShadowCache.cpp + # RenderThread stuff + LOCAL_SRC_FILES += \ + renderthread/RenderTask.cpp \ + renderthread/RenderThread.cpp + intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,) LOCAL_C_INCLUDES += \ diff --git a/libs/hwui/renderthread/RenderTask.cpp b/libs/hwui/renderthread/RenderTask.cpp new file mode 100644 index 0000000..2da91c5 --- /dev/null +++ b/libs/hwui/renderthread/RenderTask.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "RenderTask" + +#include "RenderTask.h" + +#include <utils/Log.h> + +namespace android { +namespace uirenderer { +namespace renderthread { + +RenderTask::RenderTask() : mNext(0) { +} + +RenderTask::~RenderTask() { +} + +} /* namespace renderthread */ +} /* namespace uirenderer */ +} /* namespace android */ diff --git a/libs/hwui/renderthread/RenderTask.h b/libs/hwui/renderthread/RenderTask.h new file mode 100644 index 0000000..865b1e6 --- /dev/null +++ b/libs/hwui/renderthread/RenderTask.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RENDERTASK_H_ +#define RENDERTASK_H_ + +#include <cutils/compiler.h> + +namespace android { +namespace uirenderer { +namespace renderthread { + +class ANDROID_API RenderTask { +public: + ANDROID_API RenderTask(); + ANDROID_API virtual ~RenderTask(); + + ANDROID_API virtual void run() = 0; + + RenderTask* mNext; +}; + +} /* namespace renderthread */ +} /* namespace uirenderer */ +} /* namespace android */ +#endif /* RENDERTASK_H_ */ diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp new file mode 100644 index 0000000..18d9300 --- /dev/null +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "RenderThread" + +#include "RenderThread.h" + +#include <utils/Log.h> + +namespace android { +using namespace uirenderer::renderthread; +ANDROID_SINGLETON_STATIC_INSTANCE(RenderThread); + +namespace uirenderer { +namespace renderthread { + +RenderThread::RenderThread() : Thread(true), Singleton<RenderThread>() + , mQueueHead(0), mQueueTail(0) { + mLooper = new Looper(false); + run("RenderThread"); +} + +RenderThread::~RenderThread() { +} + +bool RenderThread::threadLoop() { + for (;;) { + int result = mLooper->pollAll(-1); + if (result == ALOOPER_POLL_ERROR) { + // TODO Something? + break; + } + // Process our queue, if we have anything + while (RenderTask* task = nextTask()) { + task->run(); + delete task; + } + } + + return false; +} + +void RenderThread::queue(RenderTask* task) { + AutoMutex _lock(mLock); + if (mQueueTail) { + mQueueTail->mNext = task; + } else { + mQueueHead = task; + } + mQueueTail = task; + if (mQueueHead == task) { + // Only wake if this is the first task + mLooper->wake(); + } +} + +RenderTask* RenderThread::nextTask() { + AutoMutex _lock(mLock); + RenderTask* ret = mQueueHead; + if (ret) { + if (mQueueTail == mQueueHead) { + mQueueTail = mQueueHead = 0; + } else { + mQueueHead = ret->mNext; + } + ret->mNext = 0; + } + return ret; +} + +} /* namespace renderthread */ +} /* namespace uirenderer */ +} /* namespace android */ diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h new file mode 100644 index 0000000..4edd575 --- /dev/null +++ b/libs/hwui/renderthread/RenderThread.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef RENDERTHREAD_H_ +#define RENDERTHREAD_H_ + +#include "RenderTask.h" +#include <cutils/compiler.h> +#include <utils/Looper.h> +#include <utils/Mutex.h> +#include <utils/Singleton.h> +#include <utils/Thread.h> + +namespace android { +namespace uirenderer { +namespace renderthread { + +class ANDROID_API RenderThread : public Thread, public Singleton<RenderThread> { +public: + // RenderThread takes complete ownership of tasks that are queued + // and will delete them after they are run + ANDROID_API void queue(RenderTask* task); + +protected: + virtual bool threadLoop(); + +private: + friend class Singleton<RenderThread>; + + RenderThread(); + virtual ~RenderThread(); + + RenderTask* nextTask(); + + sp<Looper> mLooper; + Mutex mLock; + + RenderTask* mQueueHead; + RenderTask* mQueueTail; +}; + +} /* namespace renderthread */ +} /* namespace uirenderer */ +} /* namespace android */ +#endif /* RENDERTHREAD_H_ */ |