summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Yu <warty@google.com>2021-05-03 22:16:42 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2021-05-03 22:16:42 +0000
commit7f6d161578542139e29457cc60f76f71cb8fec00 (patch)
treeada9cf83e640b59124e4a6b683b166669b49c372
parent9712586ece428535595d9c68519d9f905d253fe8 (diff)
parent22c96f326c6ce63560e43b02d2b3cb3ae0377b44 (diff)
downloadvulkan-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.h1
-rw-r--r--stream-servers/SyncThread.cpp17
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);
}
}