Allow a few EXT & IHV vulkan extensions

* VK_EXT_astc_decode_mode
* VK_EXT_swapchain_colorspace - this will cause slight artifacts as we won't
  interpret pixels in the right color space, but it's minor.
* VK_EXT_validation_cache - we don't serialise this but we do allow it during
  capture and pass-through straight. We don't wrap the VkValidationCacheEXT
  object at all which makes support simpler.
* VK_EXT_external_memory_dma_buf - this is just a new memory type for external
  memory, we don't need to do anything special to handle it.
* VK_AMD_mixed_attachment_samples & VK_AMD_shader_core_properties - these are
  no-op once enabled
* Many shader-only extensions:
  - VK_AMD_gpu_shader_int16
  - VK_AMD_shader_fragment_mask
  - VK_AMD_image_load_store_lod
  - VK_AMD_texture_gather_bias_lod
  - VK_NV_compute_shader_derivatives
  - VK_NV_fragment_shader_barycentric
  - VK_NV_geometry_shader_passthrough
  - VK_NV_sample_mask_override_coverage
  - VK_NV_shader_image_footprint
  - VK_NV_shader_subgroup_partitioned
  - VK_NV_viewport_array2
This commit is contained in:
baldurk
2018-10-11 19:18:02 +01:00
parent 48f4ac3edb
commit 2b7070eddf
9 changed files with 171 additions and 3 deletions
+10
View File
@@ -467,6 +467,10 @@ size_t GetNextPatchSize(const void *pNext)
else if(next->sType == VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO)
memSize += sizeof(VkDeviceGroupRenderPassBeginInfo);
// VkShaderModuleCreateInfo
if(next->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT)
memSize += sizeof(VkValidationCacheCreateInfoEXT);
next = next->pNext;
}
@@ -786,6 +790,12 @@ void UnwrapNextChain(CaptureState state, const char *structName, byte *&tempMem,
CopyNextChainedStruct<VkPipelineVertexInputDivisorStateCreateInfoEXT>(tempMem, nextInput,
nextChainTail);
}
else if(nextInput->sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT)
{
if(IsCaptureMode(state))
CopyNextChainedStruct<VkShaderModuleValidationCacheCreateInfoEXT>(tempMem, nextInput,
nextChainTail);
}
else
{
RDCERR("unrecognised struct %d in %s pNext chain", nextInput->sType, structName);
+2
View File
@@ -652,6 +652,8 @@ DECLARE_REFLECTION_STRUCT(VkDeviceGroupRenderPassBeginInfo);
DECLARE_REFLECTION_STRUCT(VkMemoryAllocateFlagsInfo);
DECLARE_REFLECTION_STRUCT(VkProtectedSubmitInfo);
DECLARE_REFLECTION_STRUCT(VkImageFormatListCreateInfoKHR);
DECLARE_REFLECTION_STRUCT(VkImageViewASTCDecodeModeEXT);
DECLARE_REFLECTION_STRUCT(VkShaderModuleValidationCacheCreateInfoEXT);
DECLARE_REFLECTION_STRUCT(VkDispatchIndirectCommand);
DECLARE_REFLECTION_STRUCT(VkDrawIndirectCommand);
DECLARE_REFLECTION_STRUCT(VkDrawIndexedIndirectCommand);
+56
View File
@@ -575,24 +575,46 @@ static const VkExtensionProperties supportedExtensions[] = {
{
VK_AMD_GPU_SHADER_HALF_FLOAT_EXTENSION_NAME, VK_AMD_GPU_SHADER_HALF_FLOAT_SPEC_VERSION,
},
{
VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME, VK_AMD_GPU_SHADER_INT16_SPEC_VERSION,
},
{
VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME, VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION,
},
{
VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_EXTENSION_NAME, VK_AMD_NEGATIVE_VIEWPORT_HEIGHT_SPEC_VERSION,
},
{
VK_AMD_SHADER_BALLOT_EXTENSION_NAME, VK_AMD_SHADER_BALLOT_SPEC_VERSION,
},
{
VK_AMD_SHADER_CORE_PROPERTIES_EXTENSION_NAME, VK_AMD_SHADER_CORE_PROPERTIES_SPEC_VERSION,
},
{
VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME,
VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION,
},
{
VK_AMD_SHADER_FRAGMENT_MASK_EXTENSION_NAME, VK_AMD_SHADER_FRAGMENT_MASK_SPEC_VERSION,
},
{
VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_EXTENSION_NAME,
VK_AMD_SHADER_IMAGE_LOAD_STORE_LOD_SPEC_VERSION,
},
{
VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME, VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION,
},
{
VK_AMD_TEXTURE_GATHER_BIAS_LOD_EXTENSION_NAME, VK_AMD_TEXTURE_GATHER_BIAS_LOD_SPEC_VERSION,
},
#ifdef VK_EXT_acquire_xlib_display
{
VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME, VK_EXT_ACQUIRE_XLIB_DISPLAY_SPEC_VERSION,
},
#endif
{
VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, VK_EXT_ASTC_DECODE_MODE_SPEC_VERSION,
},
{
VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME,
VK_EXT_CONSERVATIVE_RASTERIZATION_SPEC_VERSION,
@@ -618,6 +640,9 @@ static const VkExtensionProperties supportedExtensions[] = {
{
VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, VK_EXT_DISPLAY_SURFACE_COUNTER_SPEC_VERSION,
},
{
VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME, VK_EXT_EXTERNAL_MEMORY_DMA_BUF_SPEC_VERSION,
},
{
VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME, VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION,
},
@@ -643,6 +668,12 @@ static const VkExtensionProperties supportedExtensions[] = {
VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME,
VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_SPEC_VERSION,
},
{
VK_EXT_SWAPCHAIN_COLOR_SPACE_EXTENSION_NAME, VK_EXT_SWAPCHAIN_COLOR_SPACE_SPEC_VERSION,
},
{
VK_EXT_VALIDATION_CACHE_EXTENSION_NAME, VK_EXT_VALIDATION_CACHE_SPEC_VERSION,
},
{
VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME, VK_EXT_VALIDATION_FLAGS_SPEC_VERSION,
},
@@ -834,6 +865,9 @@ static const VkExtensionProperties supportedExtensions[] = {
VK_MVK_MACOS_SURFACE_EXTENSION_NAME, VK_MVK_MACOS_SURFACE_SPEC_VERSION,
},
#endif
{
VK_NV_COMPUTE_SHADER_DERIVATIVES_EXTENSION_NAME, VK_NV_COMPUTE_SHADER_DERIVATIVES_SPEC_VERSION,
},
{
VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME, VK_NV_DEDICATED_ALLOCATION_SPEC_VERSION,
},
@@ -849,6 +883,28 @@ static const VkExtensionProperties supportedExtensions[] = {
VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, VK_NV_EXTERNAL_MEMORY_WIN32_SPEC_VERSION,
},
#endif
{
VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME,
VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION,
},
{
VK_NV_GEOMETRY_SHADER_PASSTHROUGH_EXTENSION_NAME,
VK_NV_GEOMETRY_SHADER_PASSTHROUGH_SPEC_VERSION,
},
{
VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_EXTENSION_NAME,
VK_NV_SAMPLE_MASK_OVERRIDE_COVERAGE_SPEC_VERSION,
},
{
VK_NV_SHADER_IMAGE_FOOTPRINT_EXTENSION_NAME, VK_NV_SHADER_IMAGE_FOOTPRINT_SPEC_VERSION,
},
{
VK_NV_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME,
VK_NV_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION,
},
{
VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME, VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION,
},
#ifdef VK_NV_win32_keyed_mutex
{
VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME, VK_NV_WIN32_KEYED_MUTEX_SPEC_VERSION,
+15
View File
@@ -1897,4 +1897,19 @@ public:
VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset,
uint32_t maxDrawCount, uint32_t stride);
// VK_EXT_validation_cache
VkResult vkCreateValidationCacheEXT(VkDevice device,
const VkValidationCacheCreateInfoEXT *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkValidationCacheEXT *pValidationCache);
void vkDestroyValidationCacheEXT(VkDevice device, VkValidationCacheEXT validationCache,
const VkAllocationCallbacks *pAllocator);
VkResult vkMergeValidationCachesEXT(VkDevice device, VkValidationCacheEXT dstCache,
uint32_t srcCacheCount, const VkValidationCacheEXT *pSrcCaches);
VkResult vkGetValidationCacheDataEXT(VkDevice device, VkValidationCacheEXT validationCache,
size_t *pDataSize, void *pData);
};
+15 -1
View File
@@ -349,7 +349,8 @@
CheckExt(KHR_sampler_ycbcr_conversion, VK11); \
CheckExt(KHR_device_group, VK11); \
CheckExt(MVK_moltenvk, VKXX); \
CheckExt(KHR_draw_indirect_count, VKXX);
CheckExt(KHR_draw_indirect_count, VKXX); \
CheckExt(EXT_validation_cache, VKXX);
#define HookInitVulkanInstanceExts() \
HookInitExtension(KHR_surface, DestroySurfaceKHR); \
@@ -461,6 +462,10 @@
HookInitExtension(protected_memory, GetDeviceQueue2); \
HookInitExtension(KHR_draw_indirect_count, CmdDrawIndirectCountKHR); \
HookInitExtension(KHR_draw_indirect_count, CmdDrawIndexedIndirectCountKHR); \
HookInitExtension(EXT_validation_cache, CreateValidationCacheEXT); \
HookInitExtension(EXT_validation_cache, DestroyValidationCacheEXT); \
HookInitExtension(EXT_validation_cache, MergeValidationCachesEXT); \
HookInitExtension(EXT_validation_cache, GetValidationCacheDataEXT); \
HookInitDevice_PlatformSpecific()
#define DefineHooks() \
@@ -977,6 +982,15 @@
HookDefine7(void, vkCmdDrawIndexedIndirectCountKHR, VkCommandBuffer, commandBuffer, VkBuffer, \
buffer, VkDeviceSize, offset, VkBuffer, countBuffer, VkDeviceSize, \
countBufferOffset, uint32_t, maxDrawCount, uint32_t, stride); \
HookDefine4(VkResult, vkCreateValidationCacheEXT, VkDevice, device, \
const VkValidationCacheCreateInfoEXT *, pCreateInfo, const VkAllocationCallbacks *, \
pAllocator, VkValidationCacheEXT *, pValidationCache); \
HookDefine3(void, vkDestroyValidationCacheEXT, VkDevice, device, VkValidationCacheEXT, \
validationCache, const VkAllocationCallbacks *, pAllocator); \
HookDefine4(VkResult, vkMergeValidationCachesEXT, VkDevice, device, VkValidationCacheEXT, \
dstCache, uint32_t, srcCacheCount, const VkValidationCacheEXT *, pSrcCaches); \
HookDefine4(VkResult, vkGetValidationCacheDataEXT, VkDevice, device, VkValidationCacheEXT, \
validationCache, size_t *, pDataSize, void *, pData); \
HookDefine_PlatformSpecific()
struct VkLayerInstanceDispatchTableExtended : VkLayerInstanceDispatchTable
+31 -1
View File
@@ -255,7 +255,14 @@ SERIALISE_VK_HANDLES();
PNEXT_STRUCT(VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VkRenderPassMultiviewCreateInfo) \
\
/* VK_KHR_image_format_list */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR)
PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR, VkImageFormatListCreateInfoKHR) \
\
/* VK_EXT_astc_decode_mode */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT, VkImageViewASTCDecodeModeEXT) \
\
/* VK_EXT_validation_cache */ \
PNEXT_STRUCT(VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT, \
VkShaderModuleValidationCacheCreateInfoEXT)
template <typename SerialiserType>
static void SerialiseNext(SerialiserType &ser, VkStructureType &sType, const void *&pNext)
@@ -2532,6 +2539,27 @@ void Deserialise(const VkImageFormatListCreateInfoKHR &el)
delete[] el.pViewFormats;
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkImageViewASTCDecodeModeEXT &el)
{
RDCASSERT(ser.IsReading() || el.sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT);
SerialiseNext(ser, el.sType, el.pNext);
SERIALISE_MEMBER(decodeMode);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkShaderModuleValidationCacheCreateInfoEXT &el)
{
RDCASSERT(ser.IsReading() ||
el.sType == VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT);
SerialiseNext(ser, el.sType, el.pNext);
// we skip this, because it's unwrapped and has no ResourceId. The presence of this struct is
// enough
// SERIALISE_MEMBER(validationCache);
}
template <typename SerialiserType>
void DoSerialise(SerialiserType &ser, VkDispatchIndirectCommand &el)
{
@@ -3147,6 +3175,8 @@ INSTANTIATE_SERIALISE_TYPE(VkDeviceGroupRenderPassBeginInfo);
INSTANTIATE_SERIALISE_TYPE(VkMemoryAllocateFlagsInfo);
INSTANTIATE_SERIALISE_TYPE(VkProtectedSubmitInfo);
INSTANTIATE_SERIALISE_TYPE(VkImageFormatListCreateInfoKHR);
INSTANTIATE_SERIALISE_TYPE(VkImageViewASTCDecodeModeEXT);
INSTANTIATE_SERIALISE_TYPE(VkShaderModuleValidationCacheCreateInfoEXT);
INSTANTIATE_SERIALISE_TYPE(VkDispatchIndirectCommand);
INSTANTIATE_SERIALISE_TYPE(VkDrawIndirectCommand);
INSTANTIATE_SERIALISE_TYPE(VkDrawIndexedIndirectCommand);
@@ -997,6 +997,10 @@ bool WrappedVulkan::Serialise_vkCreateDevice(SerialiserType &ser, VkPhysicalDevi
if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_DEBUG_MARKER_EXTENSION_NAME))
continue;
// don't include the validation cache extension
if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_VALIDATION_CACHE_EXTENSION_NAME))
continue;
// don't include direct-display WSI extensions
if(!strcmp(createInfo.ppEnabledExtensionNames[i], VK_KHR_DISPLAY_SWAPCHAIN_EXTENSION_NAME) ||
!strcmp(createInfo.ppEnabledExtensionNames[i], VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME))
@@ -643,4 +643,35 @@ void WrappedVulkan::vkGetDeviceGroupPeerMemoryFeatures(VkDevice device, uint32_t
{
return ObjDisp(device)->GetDeviceGroupPeerMemoryFeatures(
Unwrap(device), heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
}
VkResult WrappedVulkan::vkCreateValidationCacheEXT(VkDevice device,
const VkValidationCacheCreateInfoEXT *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkValidationCacheEXT *pValidationCache)
{
return ObjDisp(device)->CreateValidationCacheEXT(Unwrap(device), pCreateInfo, pAllocator,
pValidationCache);
}
void WrappedVulkan::vkDestroyValidationCacheEXT(VkDevice device, VkValidationCacheEXT validationCache,
const VkAllocationCallbacks *pAllocator)
{
return ObjDisp(device)->DestroyValidationCacheEXT(Unwrap(device), validationCache, pAllocator);
}
VkResult WrappedVulkan::vkMergeValidationCachesEXT(VkDevice device, VkValidationCacheEXT dstCache,
uint32_t srcCacheCount,
const VkValidationCacheEXT *pSrcCaches)
{
return ObjDisp(device)->MergeValidationCachesEXT(Unwrap(device), dstCache, srcCacheCount,
pSrcCaches);
}
VkResult WrappedVulkan::vkGetValidationCacheDataEXT(VkDevice device,
VkValidationCacheEXT validationCache,
size_t *pDataSize, void *pData)
{
return ObjDisp(device)->GetValidationCacheDataEXT(Unwrap(device), validationCache, pDataSize,
pData);
}
@@ -218,7 +218,13 @@ bool WrappedVulkan::Serialise_vkCreateShaderModule(SerialiserType &ser, VkDevice
{
VkShaderModule sh = VK_NULL_HANDLE;
VkResult ret = ObjDisp(device)->CreateShaderModule(Unwrap(device), &CreateInfo, NULL, &sh);
VkShaderModuleCreateInfo patched = CreateInfo;
byte *tempMem = GetTempMemory(GetNextPatchSize(patched.pNext));
UnwrapNextChain(m_State, "VkShaderModuleCreateInfo", tempMem, (VkBaseInStructure *)&patched);
VkResult ret = ObjDisp(device)->CreateShaderModule(Unwrap(device), &patched, NULL, &sh);
if(ret != VK_SUCCESS)
{