summaryrefslogtreecommitdiff
path: root/registry/vulkan/scripts/cereal/subdecode.py
diff options
context:
space:
mode:
Diffstat (limited to 'registry/vulkan/scripts/cereal/subdecode.py')
-rw-r--r--registry/vulkan/scripts/cereal/subdecode.py88
1 files changed, 52 insertions, 36 deletions
diff --git a/registry/vulkan/scripts/cereal/subdecode.py b/registry/vulkan/scripts/cereal/subdecode.py
index eae02540..3bd5b786 100644
--- a/registry/vulkan/scripts/cereal/subdecode.py
+++ b/registry/vulkan/scripts/cereal/subdecode.py
@@ -1,16 +1,13 @@
-from .common.codegen import CodeGen, VulkanWrapperGenerator, VulkanAPIWrapper
-from .common.vulkantypes import \
- VulkanAPI, makeVulkanTypeSimple, iterateVulkanType, DISPATCHABLE_HANDLE_TYPES, NON_DISPATCHABLE_HANDLE_TYPES
+from .common.codegen import CodeGen, VulkanWrapperGenerator
+from .common.vulkantypes import VulkanAPI, iterateVulkanType, VulkanType
from .reservedmarshaling import VulkanReservedMarshalingCodegen
-from .transform import TransformCodegen, genTransformsForVulkanType
+from .transform import TransformCodegen
-from .wrapperdefs import API_PREFIX_MARSHAL
-from .wrapperdefs import API_PREFIX_UNMARSHAL, API_PREFIX_RESERVEDUNMARSHAL
+from .wrapperdefs import API_PREFIX_RESERVEDUNMARSHAL
+from .wrapperdefs import MAX_PACKET_LENGTH
from .wrapperdefs import ROOT_TYPE_DEFAULT_VALUE
-from .wrapperdefs import VULKAN_STREAM_TYPE
-from copy import copy
decoder_decl_preamble = """
"""
@@ -18,6 +15,8 @@ decoder_decl_preamble = """
decoder_impl_preamble = """
"""
+global_state_prefix = "this->on_"
+
READ_STREAM = "readStream"
WRITE_STREAM = "vkStream"
@@ -149,20 +148,12 @@ def emit_transform(typeInfo, param, cgen, variant="tohost"):
class DecodingParameters(object):
- def __init__(self, api):
- self.params = []
- self.toRead = []
- self.toWrite = []
-
- i = 0
-
- for param in api.parameters[1:]:
- param.nonDispatchableHandleCreate = False
- param.nonDispatchableHandleDestroy = False
- param.dispatchHandle = False
- param.dispatchableHandleCreate = False
- param.dispatchableHandleDestroy = False
+ def __init__(self, api: VulkanAPI):
+ self.params: list[VulkanType] = []
+ self.toRead: list[VulkanType] = []
+ self.toWrite: list[VulkanType] = []
+ for i, param in enumerate(api.parameters[1:]):
if i == 0 and param.isDispatchableHandleType():
param.dispatchHandle = True
@@ -185,8 +176,6 @@ class DecodingParameters(object):
self.params.append(param)
- i += 1
-
def emit_call_log(api, cgen):
decodingParams = DecodingParameters(api)
@@ -264,17 +253,22 @@ def emit_dispatch_call(api, cgen):
if api.name in driver_workarounds_global_lock_apis:
cgen.stmt("lock()")
- cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams)
+ cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams,
+ 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, context=False):
customParams = ["pool", "(VkCommandBuffer)(boxed_dispatchHandle)"] + \
list(map(lambda p: p.paramName, api.parameters[1:]))
- cgen.vkApiCall(api, customPrefix="this->on_",
- customParameters=customParams)
+ if logger:
+ customParams += ["gfx_logger"];
+ if context:
+ customParams += ["context"];
+ cgen.vkApiCall(api, customPrefix=global_state_prefix,
+ customParameters=customParams, checkForDeviceLost=True, globalStatePrefix=global_state_prefix)
def emit_default_decoding(typeInfo, api, cgen):
@@ -286,19 +280,28 @@ 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)
+
+def emit_global_state_wrapped_decoding_with_context(typeInfo, api, cgen):
+ emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
+ emit_global_state_wrapped_call(api, cgen, context=True)
custom_decodes = {
- "vkCmdCopyBufferToImage": emit_global_state_wrapped_decoding,
+ "vkCmdCopyBufferToImage": emit_global_state_wrapped_decoding_with_context,
"vkCmdCopyImage": emit_global_state_wrapped_decoding,
"vkCmdCopyImageToBuffer": emit_global_state_wrapped_decoding,
"vkCmdExecuteCommands": emit_global_state_wrapped_decoding,
- "vkBeginCommandBuffer": 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,
+ "vkCmdCopyQueryPoolResults": 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,
}
@@ -315,10 +318,15 @@ 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")
+ "#define MAX_PACKET_LENGTH %s\n" % MAX_PACKET_LENGTH)
+
+ self.module.appendImpl(
+ "size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle, void* dispatchHandle, VkDeviceSize dataSize, const void* pData, const VkDecoderContext& context)\n")
self.cgen.beginBlock() # function body
+ self.cgen.stmt("auto& gfx_logger = *context.gfxApiLogger")
+ self.cgen.stmt("auto& metricsLogger = *context.metricsLogger")
self.cgen.stmt("uint32_t count = 0")
self.cgen.stmt("unsigned char *buf = (unsigned char *)pData")
self.cgen.stmt("android::base::BumpPool* pool = readStream->pool()")
@@ -332,9 +340,17 @@ class VulkanSubDecoder(VulkanWrapperGenerator):
self.cgen.beginBlock() # while loop
self.cgen.stmt("uint32_t opcode = *(uint32_t *)ptr")
- self.cgen.stmt("int32_t packetLen = *(int32_t *)(ptr + 4)")
- self.cgen.stmt(
- "if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+ self.cgen.stmt("uint32_t packetLen = *(uint32_t *)(ptr + 4)")
+ self.cgen.line("""
+ // packetLen should be at least 8 (op code and packet length) and should not be excessively large
+ if (packetLen < 8 || packetLen > MAX_PACKET_LENGTH) {
+ WARN("Bad packet length %d detected, subdecode may fail", packetLen);
+ metricsLogger.logMetricEvent(MetricEventBadPacketLength{ .len = packetLen });
+ }
+ """)
+ 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(
@@ -370,7 +386,7 @@ class VulkanSubDecoder(VulkanWrapperGenerator):
self.cgen.line("default:")
self.cgen.beginBlock()
self.cgen.stmt(
- "GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << \"Unrecognized opcode \" << opcode")
+ "GFXSTREAM_ABORT(::emugl::FatalError(::emugl::ABORT_REASON_OTHER)) << \"Unrecognized opcode \" << opcode")
self.cgen.endBlock()
self.cgen.endBlock() # switch stmt