Implement extension VK_KHR_maintenance2. Closes #818

This commit is contained in:
baldurk
2018-04-24 19:06:05 +01:00
parent bbc0581e7e
commit a1f5dbdaa6
10 changed files with 155 additions and 47 deletions
+3
View File
@@ -423,6 +423,9 @@ struct Tessellation
{
DOCUMENT("The number of control points in each input patch.");
uint32_t numControlPoints = 0;
DOCUMENT("``True`` if the tessellation domain origin is upper-left, ``False`` if lower-left.");
bool domainOriginUpperLeft = true;
};
DOCUMENT("Describes a combined viewport and scissor region.");
+8
View File
@@ -618,6 +618,10 @@ DECLARE_REFLECTION_STRUCT(VkDescriptorUpdateTemplateCreateInfoKHR);
DECLARE_REFLECTION_STRUCT(VkBindBufferMemoryInfoKHR);
DECLARE_REFLECTION_STRUCT(VkBindImageMemoryInfoKHR);
DECLARE_REFLECTION_STRUCT(VkPipelineRasterizationConservativeStateCreateInfoEXT);
DECLARE_REFLECTION_STRUCT(VkPipelineTessellationDomainOriginStateCreateInfoKHR);
DECLARE_REFLECTION_STRUCT(VkImageViewUsageCreateInfoKHR);
DECLARE_REFLECTION_STRUCT(VkInputAttachmentAspectReference);
DECLARE_REFLECTION_STRUCT(VkRenderPassInputAttachmentAspectCreateInfoKHR);
DECLARE_DESERIALISE_TYPE(VkDeviceCreateInfo);
DECLARE_DESERIALISE_TYPE(VkBufferCreateInfo);
@@ -658,6 +662,9 @@ DECLARE_DESERIALISE_TYPE(VkDebugMarkerMarkerInfoEXT);
DECLARE_DESERIALISE_TYPE(VkBindBufferMemoryInfoKHR);
DECLARE_DESERIALISE_TYPE(VkBindImageMemoryInfoKHR);
DECLARE_DESERIALISE_TYPE(VkPipelineRasterizationConservativeStateCreateInfoEXT);
DECLARE_DESERIALISE_TYPE(VkPipelineTessellationDomainOriginStateCreateInfoKHR);
DECLARE_DESERIALISE_TYPE(VkImageViewUsageCreateInfoKHR);
DECLARE_DESERIALISE_TYPE(VkRenderPassInputAttachmentAspectCreateInfoKHR);
DECLARE_REFLECTION_ENUM(VkFlagWithNoBits);
DECLARE_REFLECTION_ENUM(VkQueueFlagBits);
@@ -724,3 +731,4 @@ DECLARE_REFLECTION_ENUM(VkColorSpaceKHR);
DECLARE_REFLECTION_ENUM(VkPresentModeKHR);
DECLARE_REFLECTION_ENUM(VkDescriptorUpdateTemplateType);
DECLARE_REFLECTION_ENUM(VkConservativeRasterizationModeEXT);
DECLARE_REFLECTION_ENUM(VkTessellationDomainOriginKHR);
+3
View File
@@ -637,6 +637,9 @@ static const VkExtensionProperties supportedExtensions[] = {
{
VK_KHR_MAINTENANCE1_EXTENSION_NAME, VK_KHR_MAINTENANCE1_SPEC_VERSION,
},
{
VK_KHR_MAINTENANCE2_EXTENSION_NAME, VK_KHR_MAINTENANCE2_SPEC_VERSION,
},
{
VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME, VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION,
},
@@ -298,6 +298,7 @@
CheckExt(NV_external_memory_win32, VKXX); \
CheckExt(NV_win32_keyed_mutex, VKXX); \
CheckExt(KHR_maintenance1, VK11); \
CheckExt(KHR_maintenance2, VK11); \
CheckExt(EXT_display_control, VKXX); \
CheckExt(KHR_external_memory, VK11); \
CheckExt(KHR_external_memory_win32, VKXX); \
+11
View File
@@ -228,6 +228,15 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk
else
patchControlPoints = 0;
tessellationDomainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
const VkPipelineTessellationDomainOriginStateCreateInfoKHR *tessDomain =
(const VkPipelineTessellationDomainOriginStateCreateInfoKHR *)FindNextStruct(
pCreateInfo->pTessellationState,
VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO);
if(tessDomain)
tessellationDomainOrigin = tessDomain->domainOrigin;
if(pCreateInfo->pViewportState)
viewportCount = pCreateInfo->pViewportState->viewportCount;
else
@@ -421,6 +430,8 @@ void VulkanCreationInfo::Pipeline::Init(VulkanResourceManager *resourceMan, Vulk
patchControlPoints = 0;
tessellationDomainOrigin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
viewportCount = 0;
// VkPipelineRasterStateCreateInfo
+3
View File
@@ -174,6 +174,9 @@ struct VulkanCreationInfo
// VkPipelineTessellationStateCreateInfo
uint32_t patchControlPoints;
// VkPipelineTessellationDomainOriginStateCreateInfoKHR
VkTessellationDomainOriginKHR tessellationDomainOrigin;
// VkPipelineViewportStateCreateInfo
uint32_t viewportCount;
vector<VkViewport> viewports;
+3
View File
@@ -910,6 +910,9 @@ void VulkanReplay::SavePipelineState()
// Tessellation
m_VulkanPipelineState.tessellation.numControlPoints = p.patchControlPoints;
m_VulkanPipelineState.tessellation.domainOriginUpperLeft =
p.tessellationDomainOrigin == VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
// Viewport/Scissors
size_t numViewScissors = p.viewportCount;
m_VulkanPipelineState.viewportScissor.viewportScissors.resize(numViewScissors);
+110 -46
View File
@@ -120,51 +120,58 @@ void DoSerialiseViaResourceId(SerialiserType &ser, type &el)
SERIALISE_VK_HANDLES();
// pNext structure type dispatch
#define HANDLE_PNEXT() \
/* we can ignore all external memory extension structs entirely. We don't need to */ \
/* serialise or replay it as we won't actually use external memory and will just create */ \
/* normal memory to replay with. */ \
\
/* VK_NV_external_memory / VK_NV_external_memory_win32 */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV) \
\
/* VK_NV_win32_keyed_mutex */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV) \
\
/* VK_KHR_external_memory / ..._fd / .._win32 */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR) \
\
/* VK_KHR_external_semaphore / .._fd / ..._win32 */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR) \
\
/* we don't create real swapchains on replay, so we can ignore surface counters */ \
/* VK_EXT_display_control */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT) \
\
/* for now we don't serialise dedicated memory on replay as it's only a performance */ \
/* hint, and is only required in conjunction with shared memory (which we don't */ \
/* replay). In future it might be helpful to serialise this for informational purposes. */ \
\
/* VK_NV_dedicated_allocation */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV) \
\
/* VK_KHR_dedicated_allocation */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR) \
\
/* VK_EXT_conservative_rasterization */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \
VkPipelineRasterizationConservativeStateCreateInfoEXT)
#define HANDLE_PNEXT() \
/* we can ignore all external memory extension structs entirely. We don't need to */ \
/* serialise or replay it as we won't actually use external memory and will just create */ \
/* normal memory to replay with. */ \
\
/* VK_NV_external_memory / VK_NV_external_memory_win32 */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV) \
\
/* VK_NV_win32_keyed_mutex */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV) \
\
/* VK_KHR_external_memory / ..._fd / .._win32 */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR) \
\
/* VK_KHR_external_semaphore / .._fd / ..._win32 */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR) \
\
/* we don't create real swapchains on replay, so we can ignore surface counters */ \
/* VK_EXT_display_control */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT) \
\
/* for now we don't serialise dedicated memory on replay as it's only a performance */ \
/* hint, and is only required in conjunction with shared memory (which we don't */ \
/* replay). In future it might be helpful to serialise this for informational purposes. */ \
\
/* VK_NV_dedicated_allocation */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV) \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV) \
\
/* VK_KHR_dedicated_allocation */ \
PNEXT_IGNORE(VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR) \
\
/* VK_EXT_conservative_rasterization */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT, \
VkPipelineRasterizationConservativeStateCreateInfoEXT) \
\
/* VK_KHR_maintenance2 */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR, \
VkPipelineTessellationDomainOriginStateCreateInfoKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR, VkImageViewUsageCreateInfoKHR) \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR, \
VkRenderPassInputAttachmentAspectCreateInfoKHR)
template <typename SerialiserType>
static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const void *&pNext)
@@ -1981,7 +1988,7 @@ void DoSerialise(SerialiserType &ser, VkClearRect &el)
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkClearAttachment &el)
{
SERIALISE_MEMBER(aspectMask);
SERIALISE_MEMBER_TYPED(VkImageAspectFlagBits, aspectMask);
SERIALISE_MEMBER(colorAttachment);
SERIALISE_MEMBER(clearValue);
}
@@ -2230,6 +2237,63 @@ void Deserialise(const VkPipelineRasterizationConservativeStateCreateInfoEXT &el
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkPipelineTessellationDomainOriginStateCreateInfoKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(domainOrigin);
}
template <>
void Deserialise(const VkPipelineTessellationDomainOriginStateCreateInfoKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkImageViewUsageCreateInfoKHR &el)
{
RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER_TYPED(VkImageUsageFlagBits, usage);
}
template <>
void Deserialise(const VkImageViewUsageCreateInfoKHR &el)
{
DeserialiseNext(el.pNext);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkInputAttachmentAspectReference &el)
{
SERIALISE_MEMBER(subpass);
SERIALISE_MEMBER(inputAttachmentIndex);
SERIALISE_MEMBER_TYPED(VkImageAspectFlagBits, aspectMask);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkRenderPassInputAttachmentAspectCreateInfoKHR &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(aspectReferenceCount);
SERIALISE_MEMBER_ARRAY(pAspectReferences, aspectReferenceCount);
}
template <>
void Deserialise(const VkRenderPassInputAttachmentAspectCreateInfoKHR &el)
{
DeserialiseNext(el.pNext);
delete[] el.pAspectReferences;
}
INSTANTIATE_SERIALISE_TYPE(VkOffset2D);
INSTANTIATE_SERIALISE_TYPE(VkExtent2D);
INSTANTIATE_SERIALISE_TYPE(VkMemoryType);
+11
View File
@@ -1700,6 +1700,17 @@ std::string DoStringise(const VkConservativeRasterizationModeEXT &el)
END_ENUM_STRINGISE();
}
template <>
std::string DoStringise(const VkTessellationDomainOriginKHR &el)
{
BEGIN_ENUM_STRINGISE(VkTessellationDomainOriginKHR);
{
STRINGISE_ENUM(VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT)
STRINGISE_ENUM(VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT)
}
END_ENUM_STRINGISE();
}
template <>
std::string DoStringise(const VkExtent3D &el)
{
+2 -1
View File
@@ -1871,8 +1871,9 @@ template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VKPipe::Tessellation &el)
{
SERIALISE_MEMBER(numControlPoints);
SERIALISE_MEMBER(domainOriginUpperLeft);
SIZE_CHECK(4);
SIZE_CHECK(8);
}
template <typename SerialiserType>