diff options
author | Michael Yu <warty@google.com> | 2021-05-03 22:16:42 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-05-03 22:16:42 +0000 |
commit | 7f6d161578542139e29457cc60f76f71cb8fec00 (patch) | |
tree | ada9cf83e640b59124e4a6b683b166669b49c372 | |
parent | 9712586ece428535595d9c68519d9f905d253fe8 (diff) | |
parent | 22c96f326c6ce63560e43b02d2b3cb3ae0377b44 (diff) | |
download | vulkan-cereal-7f6d161578542139e29457cc60f76f71cb8fec00.tar.gz |
Reenable multiple syncthreads am: ac36396038 am: 883bcf3575 am: 22c96f326c
Original change: https://android-review.googlesource.com/c/device/generic/vulkan-cereal/+/1694245
Change-Id: Ib7b12ddf3a7ca9e1bc421710f358d78fe88e89e9
-rw-r--r-- | base/ThreadPool.h | 1 | ||||
-rw-r--r-- | stream-servers/SyncThread.cpp | 17 |
2 files changed, 12 insertions, 6 deletions
diff --git a/base/ThreadPool.h b/base/ThreadPool.h index ceacd10e..f21a628d 100644 --- a/base/ThreadPool.h +++ b/base/ThreadPool.h @@ -121,6 +121,7 @@ public: void enqueue(Item&& item) { // Iterate over the worker threads until we find a one that's running. + // TODO(b/187082169, warty): We rely on this round-robin strategy in SyncThread for (;;) { int currentIndex = mNextWorkerIndex.fetch_add(1, std::memory_order_relaxed); diff --git a/stream-servers/SyncThread.cpp b/stream-servers/SyncThread.cpp index 1b3e0e74..f0744294 100644 --- a/stream-servers/SyncThread.cpp +++ b/stream-servers/SyncThread.cpp @@ -66,7 +66,7 @@ static GlobalSyncThread* sGlobalSyncThread() { static const uint32_t kTimelineInterval = 1; static const uint64_t kDefaultTimeoutNsecs = 5ULL * 1000ULL * 1000ULL * 1000ULL; -static const uint64_t kNumWorkerThreads = 1u; +static const uint64_t kNumWorkerThreads = 4u; SyncThread::SyncThread() : android::base::Thread(android::base::ThreadFlags::MaskSignals, 512 * 1024), @@ -132,9 +132,13 @@ void SyncThread::cleanup() { void SyncThread::initSyncContext() { DPRINT("enter"); - SyncThreadCmd to_send; - to_send.opCode = SYNC_THREAD_INIT; - sendAndWaitForResult(to_send); + // TODO(b/187082169, warty): The thread pool's command-assignment strategy + // is round-robin, so as a hack, create one command for each worker. + for (int i = 0; i < mWorkerThreadPool.numWorkers(); i++) { + SyncThreadCmd to_send; + to_send.opCode = SYNC_THREAD_INIT; + sendAndWaitForResult(to_send); + } DPRINT("exit"); } @@ -313,8 +317,9 @@ void SyncThread::doSyncBlockedWaitNoTimeline(SyncThreadCmd* cmd) { wait_result); if (wait_result != EGL_CONDITION_SATISFIED_KHR) { - fprintf(stderr, "error: eglClientWaitSync abnormal exit 0x%x %p\n", - wait_result, cmd->fenceSync); + EGLint error = s_egl.eglGetError(); + fprintf(stderr, "error: eglClientWaitSync abnormal exit 0x%x %p %#x\n", + wait_result, cmd->fenceSync, error); } } |