Add support for KHR_buffer_device_address

This commit is contained in:
sean 2022-06-08 17:46:56 +02:00
parent 334e0cee69
commit 83c0ca60fb
No known key found for this signature in database
GPG Key ID: 92153B567CA6D7A4
7 changed files with 51 additions and 1 deletions

View File

@ -88,6 +88,10 @@ extern "C" {
#endif
/** Building with Xcode versions. */
#ifndef MVK_XCODE_14
# define MVK_XCODE_14 ((__MAC_OS_X_VERSION_MAX_ALLOWED >= 130000) || \
(__IPHONE_OS_VERSION_MAX_ALLOWED >= 160000)) // Also covers tvOS
#endif
#ifndef MVK_XCODE_13
# define MVK_XCODE_13 ((__MAC_OS_X_VERSION_MAX_ALLOWED >= 120000) || \
(__IPHONE_OS_VERSION_MAX_ALLOWED >= 150000)) // Also covers tvOS

View File

@ -79,7 +79,9 @@ public:
/** Returns the Metal buffer used as a cache for host-coherent texel buffers. */
id<MTLBuffer> getMTLBufferCache();
/** Returns the GPU address for this MTLBuffer, respecting its offset. */
uint64_t getMTLBufferGPUAddress();
#pragma mark Construction

View File

@ -212,6 +212,13 @@ id<MTLBuffer> MVKBuffer::getMTLBufferCache() {
return _mtlBufferCache;
}
uint64_t MVKBuffer::getMTLBufferGPUAddress() {
#if MVK_XCODE_14
return [getMTLBuffer() gpuAddress] + getMTLBufferOffset();
#endif
return 0;
}
#pragma mark Construction
MVKBuffer::MVKBuffer(MVKDevice* device, const VkBufferCreateInfo* pCreateInfo) : MVKResource(device), _usage(pCreateInfo->usage) {

View File

@ -291,6 +291,12 @@ void MVKPhysicalDevice::getFeatures(VkPhysicalDeviceFeatures2* features) {
auto* barycentricProperties = (VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR*)next;
barycentricProperties->fragmentShaderBarycentric = true;
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
auto* bufferDeviceAddressFeatures = (VkPhysicalDeviceBufferDeviceAddressFeatures*)next;
bufferDeviceAddressFeatures->bufferDeviceAddress = true;
bufferDeviceAddressFeatures->bufferDeviceAddressCaptureReplay = false;
bufferDeviceAddressFeatures->bufferDeviceAddressMultiDevice = false;
}
default:
break;

View File

@ -626,6 +626,9 @@ void MVKInstance::initProcAddrs() {
ADD_INST_EXT_ENTRY_POINT(vkGetMTLCommandQueueMVK, MVK_MOLTENVK);
// Device extension functions:
ADD_DVC_EXT_ENTRY_POINT(vkGetBufferDeviceAddressKHR, KHR_BUFFER_DEVICE_ADDRESS);
ADD_DVC_EXT_ENTRY_POINT(vkGetBufferOpaqueCaptureAddressKHR, KHR_BUFFER_DEVICE_ADDRESS);
ADD_DVC_EXT_ENTRY_POINT(vkGetDeviceMemoryOpaqueCaptureAddressKHR, KHR_BUFFER_DEVICE_ADDRESS);
ADD_DVC_EXT_ENTRY_POINT(vkCreateRenderPass2KHR, KHR_CREATE_RENDERPASS_2);
ADD_DVC_EXT_ENTRY_POINT(vkCmdBeginRenderPass2KHR, KHR_CREATE_RENDERPASS_2);
ADD_DVC_EXT_ENTRY_POINT(vkCmdNextSubpass2KHR, KHR_CREATE_RENDERPASS_2);

View File

@ -44,6 +44,7 @@
MVK_EXTENSION(KHR_16bit_storage, KHR_16BIT_STORAGE, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_8bit_storage, KHR_8BIT_STORAGE, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_bind_memory2, KHR_BIND_MEMORY_2, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_buffer_device_address, KHR_BUFFER_DEVICE_ADDRESS, DEVICE, 13.0, 16.0)
MVK_EXTENSION(KHR_create_renderpass2, KHR_CREATE_RENDERPASS_2, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_dedicated_allocation, KHR_DEDICATED_ALLOCATION, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_depth_stencil_resolve, KHR_DEPTH_STENCIL_RESOLVE, DEVICE, 10.11, 8.0)

View File

@ -2325,6 +2325,33 @@ MVK_PUBLIC_VULKAN_CORE_ALIAS(vkBindBufferMemory2);
MVK_PUBLIC_VULKAN_CORE_ALIAS(vkBindImageMemory2);
#pragma mark -
#pragma mark VK_KHR_buffer_device_address
MVK_PUBLIC_VULKAN_SYMBOL VkDeviceAddress vkGetBufferDeviceAddressKHR(
VkDevice device,
const VkBufferDeviceAddressInfo* pInfo) {
MVKTraceVulkanCallStart();
uint64_t result = ((MVKBuffer*)pInfo->buffer)->getMTLBufferGPUAddress();
MVKTraceVulkanCallEnd();
return (VkDeviceAddress)result;
}
MVK_PUBLIC_VULKAN_SYMBOL uint64_t vkGetBufferOpaqueCaptureAddressKHR(
VkDevice device,
const VkBufferDeviceAddressInfo* pInfo) {
return 0;
}
MVK_PUBLIC_VULKAN_SYMBOL uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR(
VkDevice device,
const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
return 0;
}
#pragma mark -
#pragma mark VK_KHR_create_renderpass2 extension