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/protocols/renderControl/renderControl.attrib b/protocols/renderControl/renderControl.attrib
index 5cd75f0..16f2f12 100644
--- a/protocols/renderControl/renderControl.attrib
+++ b/protocols/renderControl/renderControl.attrib
@@ -117,3 +117,6 @@
     len pixels pixels_size
     var_flag pixels DMA
 
+rcSetProcessMetadata
+    len key (strlen(key) + 1)
+    len valuePtr valueSize
diff --git a/protocols/renderControl/renderControl.in b/protocols/renderControl/renderControl.in
index af60fe9..7a2a88e 100644
--- a/protocols/renderControl/renderControl.in
+++ b/protocols/renderControl/renderControl.in
@@ -66,3 +66,4 @@
 GL_ENTRY(int, rcGetFBDisplayConfigsCount);
 GL_ENTRY(int, rcGetFBDisplayConfigsParam, int configId, EGLint param);
 GL_ENTRY(int, rcGetFBDisplayActiveConfig);
+GL_ENTRY(void, rcSetProcessMetadata, char* key, RenderControlByte* valuePtr, uint32_t valueSize);
diff --git a/protocols/renderControl/renderControl.types b/protocols/renderControl/renderControl.types
index 578492b..ceb63b4 100644
--- a/protocols/renderControl/renderControl.types
+++ b/protocols/renderControl/renderControl.types
@@ -12,3 +12,5 @@
 GLuint* 32 0x%08x
 void* 32 0x%08x
 uint64_t* 32 0x%08x
+char* 32 %s
+RenderControlByte* 32 %p
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;