From ae05926336285b90979d06b9a683162b374b95cb Mon Sep 17 00:00:00 2001 From: Huan Song Date: Fri, 22 Jan 2021 14:48:56 -0800 Subject: Use VirtioGpu flush to post, host side Bug: 178423317 Change-Id: I9591511d21434112e30a212931546898c9f09217 --- protocols/renderControl/renderControl.attrib | 10 +++++++ protocols/renderControl/renderControl.in | 3 ++ stream-servers/FrameBuffer.cpp | 8 +++-- stream-servers/FrameBuffer.h | 2 +- stream-servers/PostWorker.cpp | 3 -- stream-servers/RenderControl.cpp | 22 ++++++++++++-- .../renderControl_dec/renderControl_dec.cpp | 35 ++++++++++++++++++++++ .../renderControl_dec/renderControl_opcodes.h | 4 ++- .../renderControl_server_context.cpp | 2 ++ .../renderControl_server_context.h | 2 ++ .../renderControl_dec/renderControl_server_proc.h | 2 ++ 11 files changed, 83 insertions(+), 10 deletions(-) diff --git a/protocols/renderControl/renderControl.attrib b/protocols/renderControl/renderControl.attrib index 25377007..d8c3ac1a 100644 --- a/protocols/renderControl/renderControl.attrib +++ b/protocols/renderControl/renderControl.attrib @@ -101,3 +101,13 @@ rcComposeAsync rcDestroySyncKHRAsync flag flushOnEncode + +rcComposeWithoutPost + dir buffer in + len buffer bufferSize + flag flushOnEncode + +rcComposeAsyncWithoutPost + dir buffer in + len buffer bufferSize + flag flushOnEncode diff --git a/protocols/renderControl/renderControl.in b/protocols/renderControl/renderControl.in index c1fd83e4..47c41c66 100644 --- a/protocols/renderControl/renderControl.in +++ b/protocols/renderControl/renderControl.in @@ -58,3 +58,6 @@ GL_ENTRY(void, rcSetTracingForPuid, uint64_t puid, uint32_t enable, uint64_t gue GL_ENTRY(void, rcMakeCurrentAsync, uint32_t context, uint32_t drawSurf, uint32_t readSurf) GL_ENTRY(void, rcComposeAsync, uint32_t bufferSize, void *buffer); GL_ENTRY(void, rcDestroySyncKHRAsync, uint64_t sync); +GL_ENTRY(GLint, rcComposeWithoutPost, uint32_t bufferSize, void *buffer); +GL_ENTRY(void, rcComposeAsyncWithoutPost, uint32_t bufferSize, void *buffer); + diff --git a/stream-servers/FrameBuffer.cpp b/stream-servers/FrameBuffer.cpp index d410cd52..c1836b2b 100644 --- a/stream-servers/FrameBuffer.cpp +++ b/stream-servers/FrameBuffer.cpp @@ -2747,7 +2747,7 @@ bool FrameBuffer::decColorBufferRefCountLocked(HandleType p_colorbuffer) { return false; } -bool FrameBuffer::compose(uint32_t bufferSize, void* buffer) { +bool FrameBuffer::compose(uint32_t bufferSize, void* buffer, bool needPost) { ComposeDevice* p = (ComposeDevice*)buffer; AutoLock mutex(m_lock); @@ -2759,7 +2759,9 @@ bool FrameBuffer::compose(uint32_t bufferSize, void* buffer) { memcpy(composeCmd.composeBuffer.data(), buffer, bufferSize); composeCmd.cmd = PostCmd::Compose; sendPostWorkerCmd(composeCmd); - post(p->targetHandle, false); + if(needPost) { + post(p->targetHandle, false); + } return true; } @@ -2777,7 +2779,7 @@ bool FrameBuffer::compose(uint32_t bufferSize, void* buffer) { memcpy(composeCmd.composeBuffer.data(), buffer, bufferSize); composeCmd.cmd = PostCmd::Compose; sendPostWorkerCmd(composeCmd); - if (p2->displayId == 0) { + if (p2->displayId == 0 && needPost) { post(p2->targetHandle, false); } return true; diff --git a/stream-servers/FrameBuffer.h b/stream-servers/FrameBuffer.h index 6fc45a10..71ce1ec0 100644 --- a/stream-servers/FrameBuffer.h +++ b/stream-servers/FrameBuffer.h @@ -483,7 +483,7 @@ class FrameBuffer { void setShuttingDown() { m_shuttingDown = true; } bool isShuttingDown() const { return m_shuttingDown; } - bool compose(uint32_t bufferSize, void* buffer); + bool compose(uint32_t bufferSize, void* buffer, bool post = true); ~FrameBuffer(); diff --git a/stream-servers/PostWorker.cpp b/stream-servers/PostWorker.cpp index fcd146a3..8f3f374f 100644 --- a/stream-servers/PostWorker.cpp +++ b/stream-servers/PostWorker.cpp @@ -68,7 +68,6 @@ void PostWorker::postImpl(ColorBuffer* cb) { if (!m_mainThreadPostingOnly && !m_initialized) { m_initialized = mBindSubwin(); } - float dpr = mFb->getDpr(); int windowWidth = mFb->windowWidth(); int windowHeight = mFb->windowHeight(); @@ -197,7 +196,6 @@ void PostWorker::composeImpl(ComposeDevice* p) { if (!m_mainThreadPostingOnly && !m_initialized) { m_initialized = mBindSubwin(); } - ComposeLayer* l = (ComposeLayer*)p->layer; GLint vport[4] = { 0, }; s_gles2.glGetIntegerv(GL_VIEWPORT, vport); @@ -248,7 +246,6 @@ void PostWorker::composev2Impl(ComposeDevice_v2* p) { if (!m_mainThreadPostingOnly && !m_initialized) { m_initialized = mBindSubwin(); } - ComposeLayer* l = (ComposeLayer*)p->layer; GLint vport[4] = { 0, }; s_gles2.glGetIntegerv(GL_VIEWPORT, vport); diff --git a/stream-servers/RenderControl.cpp b/stream-servers/RenderControl.cpp index 1641da8b..6ba28d43 100644 --- a/stream-servers/RenderControl.cpp +++ b/stream-servers/RenderControl.cpp @@ -1211,7 +1211,15 @@ static int rcCompose(uint32_t bufferSize, void* buffer) { if (!fb) { return -1; } - return fb->compose(bufferSize, buffer); + return fb->compose(bufferSize, buffer, true); +} + +static int rcComposeWithoutPost(uint32_t bufferSize, void* buffer) { + FrameBuffer *fb = FrameBuffer::getFB(); + if (!fb) { + return -1; + } + return fb->compose(bufferSize, buffer, false); } static int rcCreateDisplay(uint32_t* displayId) { @@ -1427,7 +1435,15 @@ static void rcComposeAsync(uint32_t bufferSize, void* buffer) { if (!fb) { return; } - fb->compose(bufferSize, buffer); + fb->compose(bufferSize, buffer, true); +} + +static void rcComposeAsyncWithoutPost(uint32_t bufferSize, void* buffer) { + FrameBuffer *fb = FrameBuffer::getFB(); + if (!fb) { + return; + } + fb->compose(bufferSize, buffer, false); } static void rcDestroySyncKHRAsync(uint64_t handle) { @@ -1498,4 +1514,6 @@ void initRenderControlContext(renderControl_decoder_context_t *dec) dec->rcMakeCurrentAsync = rcMakeCurrentAsync; dec->rcComposeAsync = rcComposeAsync; dec->rcDestroySyncKHRAsync = rcDestroySyncKHRAsync; + dec->rcComposeWithoutPost = rcComposeWithoutPost; + dec->rcComposeAsyncWithoutPost = rcComposeAsyncWithoutPost; } diff --git a/stream-servers/renderControl_dec/renderControl_dec.cpp b/stream-servers/renderControl_dec/renderControl_dec.cpp index 5c9af254..9f859ce3 100644 --- a/stream-servers/renderControl_dec/renderControl_dec.cpp +++ b/stream-servers/renderControl_dec/renderControl_dec.cpp @@ -1187,6 +1187,41 @@ size_t renderControl_decoder_context_t::decode(void *buf, size_t len, IOStream * android::base::endTrace(); break; } + case OP_rcComposeWithoutPost: { + android::base::beginTrace("rcComposeWithoutPost decode"); + uint32_t var_bufferSize = Unpack(ptr + 8); + uint32_t size_buffer __attribute__((unused)) = Unpack(ptr + 8 + 4); + InputBuffer inptr_buffer(ptr + 8 + 4 + 4, size_buffer); + if (useChecksum) { + ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + 4 + size_buffer, ptr + 8 + 4 + 4 + size_buffer, checksumSize, + "renderControl_decoder_context_t::decode, OP_rcComposeWithoutPost: GL checksumCalculator failure\n"); + } + size_t totalTmpSize = sizeof(GLint); + totalTmpSize += checksumSize; + unsigned char *tmpBuf = stream->alloc(totalTmpSize); + *(GLint *)(&tmpBuf[0]) = this->rcComposeWithoutPost(var_bufferSize, (void*)(inptr_buffer.get())); + if (useChecksum) { + ChecksumCalculatorThreadInfo::writeChecksum(checksumCalc, &tmpBuf[0], totalTmpSize - checksumSize, &tmpBuf[totalTmpSize - checksumSize], checksumSize); + } + stream->flush(); + SET_LASTCALL("rcComposeWithoutPost"); + android::base::endTrace(); + break; + } + case OP_rcComposeAsyncWithoutPost: { + android::base::beginTrace("rcComposeAsyncWithoutPost decode"); + uint32_t var_bufferSize = Unpack(ptr + 8); + uint32_t size_buffer __attribute__((unused)) = Unpack(ptr + 8 + 4); + InputBuffer inptr_buffer(ptr + 8 + 4 + 4, size_buffer); + if (useChecksum) { + ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + 4 + size_buffer, ptr + 8 + 4 + 4 + size_buffer, checksumSize, + "renderControl_decoder_context_t::decode, OP_rcComposeAsyncWithoutPost: GL checksumCalculator failure\n"); + } + this->rcComposeAsyncWithoutPost(var_bufferSize, (void*)(inptr_buffer.get())); + SET_LASTCALL("rcComposeAsyncWithoutPost"); + android::base::endTrace(); + break; + } default: return ptr - (unsigned char*)buf; } //switch diff --git a/stream-servers/renderControl_dec/renderControl_opcodes.h b/stream-servers/renderControl_dec/renderControl_opcodes.h index 2fb8e711..a3a6e27c 100644 --- a/stream-servers/renderControl_dec/renderControl_opcodes.h +++ b/stream-servers/renderControl_dec/renderControl_opcodes.h @@ -63,7 +63,9 @@ #define OP_rcMakeCurrentAsync 10057 #define OP_rcComposeAsync 10058 #define OP_rcDestroySyncKHRAsync 10059 -#define OP_last 10060 +#define OP_rcComposeWithoutPost 10060 +#define OP_rcComposeAsyncWithoutPost 10061 +#define OP_last 10062 #endif diff --git a/stream-servers/renderControl_dec/renderControl_server_context.cpp b/stream-servers/renderControl_dec/renderControl_server_context.cpp index 1d335814..60ca587a 100644 --- a/stream-servers/renderControl_dec/renderControl_server_context.cpp +++ b/stream-servers/renderControl_dec/renderControl_server_context.cpp @@ -70,6 +70,8 @@ int renderControl_server_context_t::initDispatchByName(void *(*getProc)(const ch rcMakeCurrentAsync = (rcMakeCurrentAsync_server_proc_t) getProc("rcMakeCurrentAsync", userData); rcComposeAsync = (rcComposeAsync_server_proc_t) getProc("rcComposeAsync", userData); rcDestroySyncKHRAsync = (rcDestroySyncKHRAsync_server_proc_t) getProc("rcDestroySyncKHRAsync", userData); + rcComposeWithoutPost = (rcComposeWithoutPost_server_proc_t) getProc("rcComposeWithoutPost", userData); + rcComposeAsyncWithoutPost = (rcComposeAsyncWithoutPost_server_proc_t) getProc("rcComposeAsyncWithoutPost", userData); return 0; } diff --git a/stream-servers/renderControl_dec/renderControl_server_context.h b/stream-servers/renderControl_dec/renderControl_server_context.h index bee01916..fdd46d03 100644 --- a/stream-servers/renderControl_dec/renderControl_server_context.h +++ b/stream-servers/renderControl_dec/renderControl_server_context.h @@ -70,6 +70,8 @@ struct renderControl_server_context_t { rcMakeCurrentAsync_server_proc_t rcMakeCurrentAsync; rcComposeAsync_server_proc_t rcComposeAsync; rcDestroySyncKHRAsync_server_proc_t rcDestroySyncKHRAsync; + rcComposeWithoutPost_server_proc_t rcComposeWithoutPost; + rcComposeAsyncWithoutPost_server_proc_t rcComposeAsyncWithoutPost; virtual ~renderControl_server_context_t() {} int initDispatchByName( void *(*getProc)(const char *name, void *userData), void *userData); }; diff --git a/stream-servers/renderControl_dec/renderControl_server_proc.h b/stream-servers/renderControl_dec/renderControl_server_proc.h index 519e81d7..50f25aeb 100644 --- a/stream-servers/renderControl_dec/renderControl_server_proc.h +++ b/stream-servers/renderControl_dec/renderControl_server_proc.h @@ -72,6 +72,8 @@ typedef void (renderControl_APIENTRY *rcSetTracingForPuid_server_proc_t) (uint64 typedef void (renderControl_APIENTRY *rcMakeCurrentAsync_server_proc_t) (uint32_t, uint32_t, uint32_t); typedef void (renderControl_APIENTRY *rcComposeAsync_server_proc_t) (uint32_t, void*); typedef void (renderControl_APIENTRY *rcDestroySyncKHRAsync_server_proc_t) (uint64_t); +typedef GLint (renderControl_APIENTRY *rcComposeWithoutPost_server_proc_t) (uint32_t, void*); +typedef void (renderControl_APIENTRY *rcComposeAsyncWithoutPost_server_proc_t) (uint32_t, void*); #endif -- cgit v1.2.3