diff --git a/renderdoc/common/wrapped_pool.h b/renderdoc/common/wrapped_pool.h index 0be9ab0d2..68a123b49 100644 --- a/renderdoc/common/wrapped_pool.h +++ b/renderdoc/common/wrapped_pool.h @@ -134,7 +134,7 @@ class WrappingPool WrappingPool() { #ifdef INCLUDE_TYPE_NAMES - RDCDEBUG("WrappingPool<%s>: %p -> %p", GetTypeName::Name(), &m_ImmediatePool.items[0], &m_ImmediatePool.items[AllocCount-1]); + RDCDEBUG("WrappingPool<%s> %d in %.2fMB: %p -> %p", GetTypeName::Name(), PoolCount, float(PoolCount*AllocByteSize)/(1024.0f*1024.0f), &m_ImmediatePool.items[0], &m_ImmediatePool.items[AllocCount-1]); #endif RDCCOMPILE_ASSERT(PoolCount*AllocByteSize <= MaxPoolByteSize, "Pool is bigger than max pool size cap"); diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 66de7d995..95ee9c24b 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -24,6 +24,40 @@ #include "vk_resources.h" +WRAPPED_POOL_INST(WrappedVkInstance) +WRAPPED_POOL_INST(WrappedVkPhysicalDevice) +WRAPPED_POOL_INST(WrappedVkDevice) +WRAPPED_POOL_INST(WrappedVkQueue) +WRAPPED_POOL_INST(WrappedVkCmdBuffer) +WRAPPED_POOL_INST(WrappedVkFence) +WRAPPED_POOL_INST(WrappedVkDeviceMemory) +WRAPPED_POOL_INST(WrappedVkBuffer) +WRAPPED_POOL_INST(WrappedVkImage) +WRAPPED_POOL_INST(WrappedVkSemaphore) +WRAPPED_POOL_INST(WrappedVkEvent) +WRAPPED_POOL_INST(WrappedVkQueryPool) +WRAPPED_POOL_INST(WrappedVkBufferView) +WRAPPED_POOL_INST(WrappedVkImageView) +WRAPPED_POOL_INST(WrappedVkAttachmentView) +WRAPPED_POOL_INST(WrappedVkShaderModule) +WRAPPED_POOL_INST(WrappedVkShader) +WRAPPED_POOL_INST(WrappedVkPipelineCache) +WRAPPED_POOL_INST(WrappedVkPipelineLayout) +WRAPPED_POOL_INST(WrappedVkRenderPass) +WRAPPED_POOL_INST(WrappedVkPipeline) +WRAPPED_POOL_INST(WrappedVkDescriptorSetLayout) +WRAPPED_POOL_INST(WrappedVkSampler) +WRAPPED_POOL_INST(WrappedVkDescriptorPool) +WRAPPED_POOL_INST(WrappedVkDescriptorSet) +WRAPPED_POOL_INST(WrappedVkDynamicViewportState) +WRAPPED_POOL_INST(WrappedVkDynamicRasterState) +WRAPPED_POOL_INST(WrappedVkDynamicColorBlendState) +WRAPPED_POOL_INST(WrappedVkDynamicDepthStencilState) +WRAPPED_POOL_INST(WrappedVkFramebuffer) +WRAPPED_POOL_INST(WrappedVkCmdPool) + +WRAPPED_POOL_INST(WrappedVkSwapChainWSI) + bool IsBlockFormat(VkFormat f) { switch(f) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 0830d1602..508663983 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -25,9 +25,201 @@ #pragma once #include "core/resource_manager.h" +#include "common/wrapped_pool.h" #include "vk_common.h" +struct VkResourceRecord; + +struct WrappedVkRes +{ + WrappedVkRes() : real(0), id(), record(NULL) {} + + // constructor for non-dispatchable types + template WrappedVkRes(T obj, ResourceId objId) : real(obj.handle), id(objId), record(NULL) {} + // constructors for dispatchable types + WrappedVkRes(VkInstance obj, ResourceId objId) : real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) {} + WrappedVkRes(VkPhysicalDevice obj, ResourceId objId) : real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) {} + WrappedVkRes(VkDevice obj, ResourceId objId) : real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) {} + WrappedVkRes(VkQueue obj, ResourceId objId) : real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) {} + WrappedVkRes(VkCmdBuffer obj, ResourceId objId) : real((uint64_t)(uintptr_t)obj), id(objId), record(NULL) {} + + uint64_t real; + ResourceId id; + union + { + VkResourceRecord *record; + // Do we need something here for per-object replay information? + void *replayInformation; + }; + // dispatch table pointer could be here, at the cost of an extra pointer +}; + +// ensure the struct doesn't accidentally get made larger +RDCCOMPILE_ASSERT(sizeof(WrappedVkRes) == sizeof(uint64_t)*3, "VkWrappedRes has changed size! This is bad"); + +// these are expanded out so that IDE autocompletion etc works without having to process through macros +struct WrappedVkInstance : WrappedVkRes +{ + WrappedVkInstance(VkInstance obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkInstance InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkInstance); +}; +struct WrappedVkPhysicalDevice : WrappedVkRes +{ + WrappedVkPhysicalDevice(VkPhysicalDevice obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkPhysicalDevice InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkPhysicalDevice); +}; +struct WrappedVkDevice : WrappedVkRes +{ + WrappedVkDevice(VkDevice obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDevice InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDevice); +}; +struct WrappedVkQueue : WrappedVkRes +{ + WrappedVkQueue(VkQueue obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkQueue InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkQueue); +}; +struct WrappedVkCmdBuffer : WrappedVkRes +{ + WrappedVkCmdBuffer(VkCmdBuffer obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkCmdBuffer InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkCmdBuffer); +}; +struct WrappedVkFence : WrappedVkRes +{ + WrappedVkFence(VkFence obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkFence InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkFence); +}; +struct WrappedVkDeviceMemory : WrappedVkRes +{ + WrappedVkDeviceMemory(VkDeviceMemory obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDeviceMemory InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDeviceMemory); +}; +struct WrappedVkBuffer : WrappedVkRes +{ + WrappedVkBuffer(VkBuffer obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkBuffer InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkBuffer); +}; +struct WrappedVkImage : WrappedVkRes +{ + WrappedVkImage(VkImage obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkImage InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkImage); +}; +struct WrappedVkSemaphore : WrappedVkRes +{ + WrappedVkSemaphore(VkSemaphore obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkSemaphore InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkSemaphore); +}; +struct WrappedVkEvent : WrappedVkRes +{ + WrappedVkEvent(VkEvent obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkEvent InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkEvent); +}; +struct WrappedVkQueryPool : WrappedVkRes +{ + WrappedVkQueryPool(VkQueryPool obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkQueryPool InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkQueryPool); +}; +struct WrappedVkBufferView : WrappedVkRes +{ + WrappedVkBufferView(VkBufferView obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkBufferView InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkBufferView); +}; +struct WrappedVkImageView : WrappedVkRes +{ + WrappedVkImageView(VkImageView obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkImageView InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkImageView); +}; +struct WrappedVkAttachmentView : WrappedVkRes +{ + WrappedVkAttachmentView(VkAttachmentView obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkAttachmentView InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkAttachmentView); +}; +struct WrappedVkShaderModule : WrappedVkRes +{ + WrappedVkShaderModule(VkShaderModule obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkShaderModule InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkShaderModule); +}; +struct WrappedVkShader : WrappedVkRes +{ + WrappedVkShader(VkShader obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkShader InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkShader); +}; +struct WrappedVkPipelineCache : WrappedVkRes +{ + WrappedVkPipelineCache(VkPipelineCache obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkPipelineCache InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkPipelineCache); +}; +struct WrappedVkPipelineLayout : WrappedVkRes +{ + WrappedVkPipelineLayout(VkPipelineLayout obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkPipelineLayout InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkPipelineLayout); +}; +struct WrappedVkRenderPass : WrappedVkRes +{ + WrappedVkRenderPass(VkRenderPass obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkRenderPass InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkRenderPass); +}; +struct WrappedVkPipeline : WrappedVkRes +{ + WrappedVkPipeline(VkPipeline obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkPipeline InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkPipeline); +}; +struct WrappedVkDescriptorSetLayout : WrappedVkRes +{ + WrappedVkDescriptorSetLayout(VkDescriptorSetLayout obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDescriptorSetLayout InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDescriptorSetLayout); +}; +struct WrappedVkSampler : WrappedVkRes +{ + WrappedVkSampler(VkSampler obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkSampler InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkSampler); +}; +struct WrappedVkDescriptorPool : WrappedVkRes +{ + WrappedVkDescriptorPool(VkDescriptorPool obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDescriptorPool InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDescriptorPool); +}; +struct WrappedVkDescriptorSet : WrappedVkRes +{ + WrappedVkDescriptorSet(VkDescriptorSet obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDescriptorSet InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDescriptorSet); +}; +struct WrappedVkDynamicViewportState : WrappedVkRes +{ + WrappedVkDynamicViewportState(VkDynamicViewportState obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDynamicViewportState InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDynamicViewportState); +}; +struct WrappedVkDynamicRasterState : WrappedVkRes +{ + WrappedVkDynamicRasterState(VkDynamicRasterState obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDynamicRasterState InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDynamicRasterState); +}; +struct WrappedVkDynamicColorBlendState : WrappedVkRes +{ + WrappedVkDynamicColorBlendState(VkDynamicColorBlendState obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDynamicColorBlendState InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDynamicColorBlendState); +}; +struct WrappedVkDynamicDepthStencilState : WrappedVkRes +{ + WrappedVkDynamicDepthStencilState(VkDynamicDepthStencilState obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkDynamicDepthStencilState InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkDynamicDepthStencilState); +}; +struct WrappedVkFramebuffer : WrappedVkRes +{ + WrappedVkFramebuffer(VkFramebuffer obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkFramebuffer InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkFramebuffer); +}; +struct WrappedVkCmdPool : WrappedVkRes +{ + WrappedVkCmdPool(VkCmdPool obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkCmdPool InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkCmdPool); +}; +struct WrappedVkSwapChainWSI : WrappedVkRes +{ + WrappedVkSwapChainWSI(VkSwapChainWSI obj, ResourceId objId) : WrappedVkRes(obj, objId) {} + typedef VkSwapChainWSI InnerType; ALLOCATE_WITH_WRAPPED_POOL(WrappedVkSwapChainWSI); +}; + enum VkNamespace { eResUnknown = 0,