diff options
author | Kaiyi Li <kaiyili@google.com> | 2022-07-26 18:44:53 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-07-26 18:44:53 +0000 |
commit | acd8c0edc7d06ecd0646e2a1d853eb8a62ced1be (patch) | |
tree | 50f750c00dbad6b6987ed7bd6894b4e839546093 | |
parent | 821579defb396c6ff5dba192ca6ee7a40b5bb054 (diff) | |
parent | 5914749544ee40e8463fc914c242f1aaab02009a (diff) | |
download | gfxstream-protocols-acd8c0edc7d06ecd0646e2a1d853eb8a62ced1be.tar.gz |
Merge "GuestDebugMarkers for NVidia extension." am: 5914749544
Original change: https://android-review.googlesource.com/c/platform/external/gfxstream-protocols/+/2163369
Change-Id: I48b53a9d9ba980f733f65388a664ac2c150f2589
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | registry/vulkan/scripts/cereal/common/codegen.py | 11 | ||||
-rw-r--r-- | registry/vulkan/scripts/cereal/decoder.py | 69 | ||||
-rw-r--r-- | registry/vulkan/scripts/cereal/decodersnapshot.py | 11 | ||||
-rw-r--r-- | registry/vulkan/scripts/cereal/subdecode.py | 31 | ||||
-rw-r--r-- | registry/vulkan/scripts/cerealgenerator.py | 3 |
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 { |