Adds rcSetProcessMetadata
... which is useful for attaching debug information to commands
from the guest.
Authored by natsu@, updated by willho@
Additions include attaching process name to render thread
monitors.
Bug: b/165022040, b/239845234
Test: Built and ran emulator
Change-Id: Icd28cdf9e88e50703c411a18719252e874bdc9b2
diff --git a/stream-servers/RenderControl.cpp b/stream-servers/RenderControl.cpp
index 8cbf516..f8d9072 100644
--- a/stream-servers/RenderControl.cpp
+++ b/stream-servers/RenderControl.cpp
@@ -16,30 +16,31 @@
#include "RenderControl.h"
+#include <inttypes.h>
+#include <string.h>
+
+#include <atomic>
+#include <memory>
+
+#include "ChecksumCalculatorThreadInfo.h"
#include "DispatchTables.h"
#include "FbConfig.h"
#include "FenceSync.h"
#include "FrameBuffer.h"
#include "GLESVersionDetector.h"
+#include "OpenGLESDispatch/EGLDispatch.h"
#include "RenderContext.h"
#include "RenderThreadInfo.h"
#include "SyncThread.h"
-#include "ChecksumCalculatorThreadInfo.h"
-#include "OpenGLESDispatch/EGLDispatch.h"
+#include "base/Tracing.h"
+#include "host-common/dma_device.h"
+#include "host-common/feature_control.h"
+#include "host-common/misc.h"
+#include "host-common/sync_device.h"
+#include "math.h"
#include "vulkan/VkCommonOperations.h"
#include "vulkan/VkDecoderGlobalState.h"
-#include "base/Tracing.h"
-#include "host-common/feature_control.h"
-#include "host-common/sync_device.h"
-#include "host-common/dma_device.h"
-#include "host-common/misc.h"
-#include "math.h"
-
-#include <atomic>
-#include <inttypes.h>
-#include <string.h>
-
using android::base::AutoLock;
using android::base::Lock;
using emugl::emugl_sync_device_exists;
@@ -1557,6 +1558,14 @@
return 0;
}
+static void rcSetProcessMetadata(char* key, RenderControlByte* valuePtr, uint32_t valueSize) {
+ RenderThreadInfo* tInfo = RenderThreadInfo::get();
+ if (strcmp(key, "process_name") == 0) {
+ // We know this is a c formatted string
+ tInfo->m_processName = std::string((char*) valuePtr);
+ }
+}
+
void initRenderControlContext(renderControl_decoder_context_t *dec)
{
dec->rcGetRendererVersion = rcGetRendererVersion;
@@ -1624,4 +1633,5 @@
dec->rcCreateDisplayById = rcCreateDisplayById;
dec->rcSetDisplayPoseDpi = rcSetDisplayPoseDpi;
dec->rcReadColorBufferDMA = rcReadColorBufferDMA;
+ dec->rcSetProcessMetadata = rcSetProcessMetadata;
}
diff --git a/stream-servers/RenderThread.cpp b/stream-servers/RenderThread.cpp
index 8a00801..e59ed7e 100644
--- a/stream-servers/RenderThread.cpp
+++ b/stream-servers/RenderThread.cpp
@@ -48,6 +48,8 @@
#include <assert.h>
#include <string.h>
+#include <unordered_map>
+
using android::base::AutoLock;
using android::base::EventHangMetadata;
using android::base::MessageChannel;
@@ -421,10 +423,16 @@
bool progress;
do {
- HealthWatchdog watchdog(
- FrameBuffer::getFB()->getHealthMonitor(),
- WATCHDOG_DATA("RenderThread decode operation",
- EventHangMetadata::HangType::kRenderThread, nullptr));
+ std::unique_ptr<std::unordered_map<std::string, std::string>> renderThreadData =
+ std::make_unique<std::unordered_map<std::string, std::string>>();
+ if (tInfo.m_processName) {
+ renderThreadData->insert(
+ {{"renderthread_guest_process", tInfo.m_processName.value()}});
+ }
+ HealthWatchdog watchdog(FrameBuffer::getFB()->getHealthMonitor(),
+ WATCHDOG_DATA("RenderThread decode operation",
+ EventHangMetadata::HangType::kRenderThread,
+ std::move(renderThreadData)));
if (!seqnoPtr && tInfo.m_puid) {
seqnoPtr = FrameBuffer::getFB()->getProcessSequenceNumberPtr(tInfo.m_puid);
diff --git a/stream-servers/RenderThreadInfo.h b/stream-servers/RenderThreadInfo.h
index ecf4c7d..1da5591 100644
--- a/stream-servers/RenderThreadInfo.h
+++ b/stream-servers/RenderThreadInfo.h
@@ -75,6 +75,7 @@
// The unique id of owner guest process of this render thread
uint64_t m_puid = 0;
+ std::optional<std::string> m_processName;
// Functions to save / load a snapshot
// They must be called after Framebuffer snapshot
diff --git a/stream-servers/renderControl_dec/renderControl_dec.cpp b/stream-servers/renderControl_dec/renderControl_dec.cpp
index bec187f..36b3c7a 100644
--- a/stream-servers/renderControl_dec/renderControl_dec.cpp
+++ b/stream-servers/renderControl_dec/renderControl_dec.cpp
@@ -1421,6 +1421,23 @@
android::base::endTrace();
break;
}
+ case OP_rcSetProcessMetadata: {
+ android::base::beginTrace("rcSetProcessMetadata decode");
+ uint32_t size_key __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8);
+ InputBuffer inptr_key(ptr + 8 + 4, size_key);
+ uint32_t size_valuePtr __attribute__((unused)) = Unpack<uint32_t,uint32_t>(ptr + 8 + 4 + size_key);
+ InputBuffer inptr_valuePtr(ptr + 8 + 4 + size_key + 4, size_valuePtr);
+ uint32_t var_valueSize = Unpack<uint32_t,uint32_t>(ptr + 8 + 4 + size_key + 4 + size_valuePtr);
+ if (useChecksum) {
+ ChecksumCalculatorThreadInfo::validOrDie(checksumCalc, ptr, 8 + 4 + size_key + 4 + size_valuePtr + 4, ptr + 8 + 4 + size_key + 4 + size_valuePtr + 4, checksumSize,
+ "renderControl_decoder_context_t::decode, OP_rcSetProcessMetadata: GL checksumCalculator failure\n");
+ }
+ DECODER_DEBUG_LOG("renderControl(%p): rcSetProcessMetadata(key:%p(%u) valuePtr:%p(%u) valueSize:0x%08x )", stream, (char*)(inptr_key.get()), size_key, (RenderControlByte*)(inptr_valuePtr.get()), size_valuePtr, var_valueSize);
+ this->rcSetProcessMetadata((char*)(inptr_key.get()), (RenderControlByte*)(inptr_valuePtr.get()), var_valueSize);
+ SET_LASTCALL("rcSetProcessMetadata");
+ android::base::endTrace();
+ break;
+ }
default:
return ptr - (unsigned char*)buf;
} //switch
diff --git a/stream-servers/renderControl_dec/renderControl_dec.h b/stream-servers/renderControl_dec/renderControl_dec.h
index e99c5ac..334f6ba 100644
--- a/stream-servers/renderControl_dec/renderControl_dec.h
+++ b/stream-servers/renderControl_dec/renderControl_dec.h
@@ -12,7 +12,7 @@
struct renderControl_decoder_context_t : public renderControl_server_context_t {
- size_t decode(void* buf, size_t bufsize, IOStream* stream, ChecksumCalculator* checksumCalc);
+ size_t decode(void *buf, size_t bufsize, IOStream *stream, ChecksumCalculator* checksumCalc);
};
diff --git a/stream-servers/renderControl_dec/renderControl_opcodes.h b/stream-servers/renderControl_dec/renderControl_opcodes.h
index cf4ff82..ddb1f73 100644
--- a/stream-servers/renderControl_dec/renderControl_opcodes.h
+++ b/stream-servers/renderControl_dec/renderControl_opcodes.h
@@ -71,7 +71,8 @@
#define OP_rcGetFBDisplayConfigsCount 10065
#define OP_rcGetFBDisplayConfigsParam 10066
#define OP_rcGetFBDisplayActiveConfig 10067
-#define OP_last 10068
+#define OP_rcSetProcessMetadata 10068
+#define OP_last 10069
#endif
diff --git a/stream-servers/renderControl_dec/renderControl_server_context.cpp b/stream-servers/renderControl_dec/renderControl_server_context.cpp
index 3cbc6f6..ec30cea 100644
--- a/stream-servers/renderControl_dec/renderControl_server_context.cpp
+++ b/stream-servers/renderControl_dec/renderControl_server_context.cpp
@@ -78,6 +78,7 @@
rcGetFBDisplayConfigsCount = (rcGetFBDisplayConfigsCount_server_proc_t) getProc("rcGetFBDisplayConfigsCount", userData);
rcGetFBDisplayConfigsParam = (rcGetFBDisplayConfigsParam_server_proc_t) getProc("rcGetFBDisplayConfigsParam", userData);
rcGetFBDisplayActiveConfig = (rcGetFBDisplayActiveConfig_server_proc_t) getProc("rcGetFBDisplayActiveConfig", userData);
+ rcSetProcessMetadata = (rcSetProcessMetadata_server_proc_t) getProc("rcSetProcessMetadata", userData);
return 0;
}
diff --git a/stream-servers/renderControl_dec/renderControl_server_context.h b/stream-servers/renderControl_dec/renderControl_server_context.h
index eed5112..b583fe5 100644
--- a/stream-servers/renderControl_dec/renderControl_server_context.h
+++ b/stream-servers/renderControl_dec/renderControl_server_context.h
@@ -78,6 +78,7 @@
rcGetFBDisplayConfigsCount_server_proc_t rcGetFBDisplayConfigsCount;
rcGetFBDisplayConfigsParam_server_proc_t rcGetFBDisplayConfigsParam;
rcGetFBDisplayActiveConfig_server_proc_t rcGetFBDisplayActiveConfig;
+ rcSetProcessMetadata_server_proc_t rcSetProcessMetadata;
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 2c99796..413a993 100644
--- a/stream-servers/renderControl_dec/renderControl_server_proc.h
+++ b/stream-servers/renderControl_dec/renderControl_server_proc.h
@@ -80,6 +80,7 @@
typedef int (renderControl_APIENTRY *rcGetFBDisplayConfigsCount_server_proc_t) ();
typedef int (renderControl_APIENTRY *rcGetFBDisplayConfigsParam_server_proc_t) (int, EGLint);
typedef int (renderControl_APIENTRY *rcGetFBDisplayActiveConfig_server_proc_t) ();
+typedef void (renderControl_APIENTRY *rcSetProcessMetadata_server_proc_t) (char*, RenderControlByte*, uint32_t);
#endif
diff --git a/stream-servers/renderControl_dec/renderControl_types.h b/stream-servers/renderControl_dec/renderControl_types.h
index da215bb..fb5ced9 100644
--- a/stream-servers/renderControl_dec/renderControl_types.h
+++ b/stream-servers/renderControl_dec/renderControl_types.h
@@ -26,3 +26,5 @@
#define FB_FPS 5
#define FB_MIN_SWAP_INTERVAL 6
#define FB_MAX_SWAP_INTERVAL 7
+
+using RenderControlByte = char;