summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaiyi Li <kaiyili@google.com>2022-07-26 18:22:03 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2022-07-26 18:22:03 +0000
commit5914749544ee40e8463fc914c242f1aaab02009a (patch)
tree50f750c00dbad6b6987ed7bd6894b4e839546093
parent17f97eb70a8147b5df0d188005303a121836102c (diff)
parent850fd053ad0f033535ecb46786a5dfcee84872cc (diff)
downloadgfxstream-protocols-5914749544ee40e8463fc914c242f1aaab02009a.tar.gz
Merge "GuestDebugMarkers for NVidia extension."
-rw-r--r--registry/vulkan/scripts/cereal/common/codegen.py11
-rw-r--r--registry/vulkan/scripts/cereal/decoder.py69
-rw-r--r--registry/vulkan/scripts/cereal/decodersnapshot.py11
-rw-r--r--registry/vulkan/scripts/cereal/subdecode.py31
-rw-r--r--registry/vulkan/scripts/cerealgenerator.py3
5 files changed, 71 insertions, 54 deletions
diff --git a/registry/vulkan/scripts/cereal/common/codegen.py b/registry/vulkan/scripts/cereal/common/codegen.py
index e8f18dd0..e63d20b1 100644
--- a/registry/vulkan/scripts/cereal/common/codegen.py
+++ b/registry/vulkan/scripts/cereal/common/codegen.py
@@ -577,7 +577,7 @@ class CodeGen(object):
def generalLengthAccessGuard(self, vulkanType, parentVarName="parent"):
return self.makeLengthAccess(vulkanType, parentVarName)[1]
- def vkApiCall(self, api, customPrefix="", customParameters=None, retVarDecl=True, retVarAssign=True):
+ def vkApiCall(self, api, customPrefix="", globalStatePrefix="", customParameters=None, checkForDeviceLost=False):
callLhs = None
retTypeName = api.getRetTypeExpr()
@@ -585,10 +585,8 @@ class CodeGen(object):
if retTypeName != "void":
retVar = api.getRetVarExpr()
- if retVarDecl:
- self.stmt("%s %s = (%s)0" % (retTypeName, retVar, retTypeName))
- if retVarAssign:
- callLhs = retVar
+ self.stmt("%s %s = (%s)0" % (retTypeName, retVar, retTypeName))
+ callLhs = retVar
if customParameters is None:
self.funcCall(
@@ -597,6 +595,9 @@ class CodeGen(object):
self.funcCall(
callLhs, customPrefix + api.name, customParameters)
+ if retTypeName == "VkResult" and checkForDeviceLost:
+ self.stmt("if ((%s) == VK_ERROR_DEVICE_LOST) %sDeviceLost()" % (callLhs, globalStatePrefix))
+
return (retTypeName, retVar)
def makeCheckVkSuccess(self, expr):
diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py
index e43c53e1..961f2524 100644
--- a/registry/vulkan/scripts/cereal/decoder.py
+++ b/registry/vulkan/scripts/cereal/decoder.py
@@ -21,6 +21,8 @@ DELAYED_DECODER_DELETES = [
"vkDestroyPipelineLayout",
]
+global_state_prefix = "m_state->on_"
+
decoder_decl_preamble = """
class IOStream;
@@ -30,7 +32,7 @@ public:
VkDecoder();
~VkDecoder();
void setForSnapshotLoad(bool forSnapshotLoad);
- size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr);
+ size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, emugl::GfxApiLogger& gfx_logger);
private:
class Impl;
std::unique_ptr<Impl> mImpl;
@@ -39,6 +41,7 @@ private:
decoder_impl_preamble ="""
using emugl::vkDispatch;
+using emugl::GfxApiLogger;
using namespace goldfish_vk;
@@ -59,7 +62,7 @@ public:
m_forSnapshotLoad = forSnapshotLoad;
}
- size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr);
+ size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger);
private:
bool m_logCalls;
@@ -85,8 +88,8 @@ void VkDecoder::setForSnapshotLoad(bool forSnapshotLoad) {
mImpl->setForSnapshotLoad(forSnapshotLoad);
}
-size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr) {
- return mImpl->decode(buf, bufsize, stream, seqnoPtr);
+size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger) {
+ return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger);
}
// VkDecoder::Impl::decode to follow
@@ -296,7 +299,8 @@ def emit_dispatch_call(api, cgen):
else:
cgen.stmt("m_state->lock()")
- cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams)
+ cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams, \
+ globalStatePrefix=global_state_prefix, checkForDeviceLost=True)
if api.name in driver_workarounds_global_lock_apis:
if not delay:
@@ -307,14 +311,17 @@ def emit_dispatch_call(api, cgen):
if delay:
cgen.line("};")
-def emit_global_state_wrapped_call(api, cgen):
+def emit_global_state_wrapped_call(api, cgen, logger):
if api.name in DELAYED_DECODER_DELETES:
print("Error: Cannot generate a global state wrapped call that is also a delayed delete (yet)");
raise
customParams = ["&m_pool"] + list(map(lambda p: p.paramName, api.parameters))
- cgen.vkApiCall(api, customPrefix="m_state->on_", \
- customParameters=customParams)
+ if logger:
+ customParams += ["gfx_logger"]
+ cgen.vkApiCall(api, customPrefix=global_state_prefix, \
+ customParameters=customParams, globalStatePrefix=global_state_prefix, \
+ checkForDeviceLost=True)
def emit_decode_parameters_writeback(typeInfo, api, cgen, autobox=True):
decodingParams = DecodingParameters(api)
@@ -444,15 +451,19 @@ def emit_snapshot(typeInfo, api, cgen):
cgen.vkApiCall(apiForSnapshot, customPrefix="m_state->snapshot()->")
cgen.endIf()
-def emit_default_decoding(typeInfo, api, cgen):
+def emit_decoding(typeInfo, api, cgen, globalWrapped=False, logger=False):
isAcquire = api.name in RELAXED_APIS
- emit_decode_parameters(typeInfo, api, cgen)
+ emit_decode_parameters(typeInfo, api, cgen, globalWrapped)
if isAcquire:
emit_seqno_incr(api, cgen)
- emit_dispatch_call(api, cgen)
- emit_decode_parameters_writeback(typeInfo, api, cgen)
+ if globalWrapped:
+ emit_global_state_wrapped_call(api, cgen, logger)
+ else:
+ emit_dispatch_call(api, cgen)
+
+ emit_decode_parameters_writeback(typeInfo, api, cgen, autobox=not globalWrapped)
emit_decode_return_writeback(api, cgen)
emit_decode_finish(api, cgen)
emit_snapshot(typeInfo, api, cgen)
@@ -462,23 +473,14 @@ def emit_default_decoding(typeInfo, api, cgen):
if not isAcquire:
emit_seqno_incr(api, cgen)
-def emit_global_state_wrapped_decoding(typeInfo, api, cgen):
- isAcquire = api.name in RELAXED_APIS
-
- emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
+def emit_default_decoding(typeInfo, api, cgen):
+ emit_decoding(typeInfo, api, cgen)
- if isAcquire:
- emit_seqno_incr(api, cgen)
+def emit_global_state_wrapped_decoding(typeInfo, api, cgen):
+ emit_decoding(typeInfo, api, cgen, globalWrapped=True)
- emit_global_state_wrapped_call(api, cgen)
- emit_decode_parameters_writeback(typeInfo, api, cgen, autobox=False)
- emit_decode_return_writeback(api, cgen)
- emit_decode_finish(api, cgen)
- emit_snapshot(typeInfo, api, cgen)
- emit_destroyed_handle_cleanup(api, cgen)
- emit_pool_free(cgen)
- if not isAcquire:
- emit_seqno_incr(api, cgen)
+def emit_global_state_wrapped_decoding_with_logger(typeInfo, api, cgen):
+ emit_decoding(typeInfo, api, cgen, globalWrapped=True, logger=True)
## Custom decoding definitions##################################################
def decode_vkFlushMappedMemoryRanges(typeInfo: VulkanTypeInfo, api, cgen):
@@ -622,8 +624,8 @@ custom_decodes = {
"vkCmdExecuteCommands" : emit_global_state_wrapped_decoding,
"vkQueueSubmit" : emit_global_state_wrapped_decoding,
"vkQueueWaitIdle" : emit_global_state_wrapped_decoding,
- "vkBeginCommandBuffer" : emit_global_state_wrapped_decoding,
- "vkEndCommandBuffer" : emit_global_state_wrapped_decoding,
+ "vkBeginCommandBuffer" : emit_global_state_wrapped_decoding_with_logger,
+ "vkEndCommandBuffer" : emit_global_state_wrapped_decoding_with_logger,
"vkResetCommandBuffer" : emit_global_state_wrapped_decoding,
"vkFreeCommandBuffers" : emit_global_state_wrapped_decoding,
"vkCreateCommandPool" : emit_global_state_wrapped_decoding,
@@ -672,8 +674,8 @@ custom_decodes = {
"vkUpdateDescriptorSetWithTemplateSizedGOOGLE" : emit_global_state_wrapped_decoding,
# VK_GOOGLE_gfxstream
- "vkBeginCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding,
- "vkEndCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding,
+ "vkBeginCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding_with_logger,
+ "vkEndCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding_with_logger,
"vkResetCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding,
"vkCommandBufferHostSyncGOOGLE" : emit_global_state_wrapped_decoding,
"vkCreateImageWithRequirementsGOOGLE" : emit_global_state_wrapped_decoding,
@@ -684,7 +686,7 @@ custom_decodes = {
"vkQueueBindSparseAsyncGOOGLE" : emit_global_state_wrapped_decoding,
"vkGetLinearImageLayoutGOOGLE" : emit_global_state_wrapped_decoding,
"vkGetLinearImageLayout2GOOGLE" : emit_global_state_wrapped_decoding,
- "vkQueueFlushCommandsGOOGLE" : emit_global_state_wrapped_decoding,
+ "vkQueueFlushCommandsGOOGLE" : emit_global_state_wrapped_decoding_with_logger,
"vkQueueCommitDescriptorSetUpdatesGOOGLE" : emit_global_state_wrapped_decoding,
"vkCollectDescriptorPoolIdsGOOGLE" : emit_global_state_wrapped_decoding,
"vkQueueSignalReleaseImageANDROIDAsyncGOOGLE" : emit_global_state_wrapped_decoding,
@@ -710,7 +712,7 @@ class VulkanDecoder(VulkanWrapperGenerator):
self.module.appendImpl(decoder_impl_preamble)
self.module.appendImpl(
- "size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr)\n")
+ "size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger)\n")
self.cgen.beginBlock() # function body
@@ -729,6 +731,7 @@ class VulkanDecoder(VulkanWrapperGenerator):
self.cgen.stmt("uint32_t opcode = *(uint32_t *)ptr")
self.cgen.stmt("uint32_t packetLen = *(uint32_t *)(ptr + 4)")
self.cgen.stmt("if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+ self.cgen.stmt("gfx_logger.record(ptr, std::min(size_t(packetLen + 8), size_t(end - ptr)))")
self.cgen.stmt("stream()->setStream(ioStream)")
self.cgen.stmt("VulkanStream* %s = stream()" % WRITE_STREAM)
diff --git a/registry/vulkan/scripts/cereal/decodersnapshot.py b/registry/vulkan/scripts/cereal/decodersnapshot.py
index 668efb81..308c1cd6 100644
--- a/registry/vulkan/scripts/cereal/decodersnapshot.py
+++ b/registry/vulkan/scripts/cereal/decodersnapshot.py
@@ -25,7 +25,7 @@ public:
~VkDecoderSnapshot();
void save(android::base::Stream* stream);
- void load(android::base::Stream* stream);
+ void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger);
"""
decoder_snapshot_decl_postamble = """
@@ -39,6 +39,7 @@ private:
decoder_snapshot_impl_preamble ="""
using namespace goldfish_vk;
+using emugl::GfxApiLogger;
class VkDecoderSnapshot::Impl {
public:
@@ -48,8 +49,8 @@ public:
mReconstruction.save(stream);
}
- void load(android::base::Stream* stream) {
- mReconstruction.load(stream);
+ void load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
+ mReconstruction.load(stream, gfx_logger);
}
"""
@@ -67,8 +68,8 @@ void VkDecoderSnapshot::save(android::base::Stream* stream) {
mImpl->save(stream);
}
-void VkDecoderSnapshot::load(android::base::Stream* stream) {
- mImpl->load(stream);
+void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
+ mImpl->load(stream, gfx_logger);
}
VkDecoderSnapshot::~VkDecoderSnapshot() = default;
diff --git a/registry/vulkan/scripts/cereal/subdecode.py b/registry/vulkan/scripts/cereal/subdecode.py
index 6e693c4a..02f93e24 100644
--- a/registry/vulkan/scripts/cereal/subdecode.py
+++ b/registry/vulkan/scripts/cereal/subdecode.py
@@ -14,6 +14,8 @@ decoder_decl_preamble = """
decoder_impl_preamble = """
"""
+global_state_prefix = "this->on_"
+
READ_STREAM = "readStream"
WRITE_STREAM = "vkStream"
@@ -251,17 +253,19 @@ def emit_dispatch_call(api, cgen):
cgen.stmt("lock()")
cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams,
- retVarDecl=False, retVarAssign=False)
+ checkForDeviceLost=True, globalStatePrefix=global_state_prefix)
if api.name in driver_workarounds_global_lock_apis:
cgen.stmt("unlock()")
-def emit_global_state_wrapped_call(api, cgen):
+def emit_global_state_wrapped_call(api, cgen, logger=False):
customParams = ["pool", "(VkCommandBuffer)(boxed_dispatchHandle)"] + \
list(map(lambda p: p.paramName, api.parameters[1:]))
- cgen.vkApiCall(api, customPrefix="this->on_",
- customParameters=customParams, retVarDecl=False, retVarAssign=False)
+ if logger:
+ customParams += ["gfx_logger"];
+ cgen.vkApiCall(api, customPrefix=global_state_prefix,
+ customParameters=customParams, checkForDeviceLost=True, globalStatePrefix=global_state_prefix)
def emit_default_decoding(typeInfo, api, cgen):
@@ -273,20 +277,24 @@ def emit_global_state_wrapped_decoding(typeInfo, api, cgen):
emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
emit_global_state_wrapped_call(api, cgen)
+def emit_global_state_wrapped_decoding_with_logger(typeInfo, api, cgen):
+ emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
+ emit_global_state_wrapped_call(api, cgen, logger=True)
+
custom_decodes = {
"vkCmdCopyBufferToImage": emit_global_state_wrapped_decoding,
"vkCmdCopyImage": emit_global_state_wrapped_decoding,
"vkCmdCopyImageToBuffer": emit_global_state_wrapped_decoding,
"vkCmdExecuteCommands": emit_global_state_wrapped_decoding,
- "vkBeginCommandBuffer": emit_global_state_wrapped_decoding,
- "vkEndCommandBuffer": emit_global_state_wrapped_decoding,
+ "vkBeginCommandBuffer": emit_global_state_wrapped_decoding_with_logger,
+ "vkEndCommandBuffer": emit_global_state_wrapped_decoding_with_logger,
"vkResetCommandBuffer": emit_global_state_wrapped_decoding,
"vkCmdPipelineBarrier": emit_global_state_wrapped_decoding,
"vkCmdBindPipeline": emit_global_state_wrapped_decoding,
"vkCmdBindDescriptorSets": emit_global_state_wrapped_decoding,
- "vkBeginCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding,
- "vkEndCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding,
+ "vkBeginCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding_with_logger,
+ "vkEndCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding_with_logger,
"vkResetCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding,
"vkCommandBufferHostSyncGOOGLE": emit_global_state_wrapped_decoding,
}
@@ -303,7 +311,7 @@ class VulkanSubDecoder(VulkanWrapperGenerator):
"#define MAX_STACK_ITEMS %s\n" % MAX_STACK_ITEMS)
self.module.appendImpl(
- "size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle, void* dispatchHandle, VkDeviceSize dataSize, const void* pData)\n")
+ "size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle, void* dispatchHandle, VkDeviceSize dataSize, const void* pData, GfxApiLogger& gfx_logger)\n")
self.cgen.beginBlock() # function body
@@ -321,8 +329,9 @@ class VulkanSubDecoder(VulkanWrapperGenerator):
self.cgen.stmt("uint32_t opcode = *(uint32_t *)ptr")
self.cgen.stmt("uint32_t packetLen = *(uint32_t *)(ptr + 4)")
- self.cgen.stmt(
- "if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+ self.cgen.stmt("if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+ self.cgen.stmt("gfx_logger.record(ptr, std::min(size_t(packetLen + 8), size_t(end - ptr)))")
+
self.cgen.stmt("%s->setBuf((uint8_t*)(ptr + 8))" % READ_STREAM)
self.cgen.stmt(
diff --git a/registry/vulkan/scripts/cerealgenerator.py b/registry/vulkan/scripts/cerealgenerator.py
index ec8292b6..0c5ab259 100644
--- a/registry/vulkan/scripts/cerealgenerator.py
+++ b/registry/vulkan/scripts/cerealgenerator.py
@@ -345,6 +345,7 @@ using DlSymFunc = void* (void*, const char*);
decoderSnapshotHeaderIncludes = """
#include <memory>
+#include "base/GfxApiLogger.h"
#include "common/goldfish_vk_private_defs.h"
"""
decoderSnapshotImplIncludes = f"""
@@ -356,6 +357,8 @@ using DlSymFunc = void* (void*, const char*);
"""
decoderHeaderIncludes = """
+#include "base/GfxApiLogger.h"
+
#include <memory>
namespace android {