[Mesa-dev] [PATCH 5/7] anv: Implement VK_KHX_external_memory_capabilities (v2)
Jason Ekstrand
jason at jlekstrand.net
Tue Feb 28 23:50:17 UTC 2017
On Tue, Feb 28, 2017 at 2:38 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:
> On Tue, Feb 28, 2017 at 10:58 AM, Chad Versace <chadversary at chromium.org>
> wrote:
>
>> This is a complete but trivial implementation. It's trivial becasue We
>> support no external memory capabilities yet. Most of the real work in
>> this commit is in reworking the UUIDs advertised by the driver.
>>
>> v2 (chadv):
>> - Fix chain traversal in vkGetPhysicalDeviceImageFormatProperties2KHR.
>> Extract VkPhysicalDeviceExternalImageFormatInfoKHX from the chain of
>> input structs, not the chain of output structs.
>> - In vkGetPhysicalDeviceImageFormatProperties2KHR, iterate over the
>> input chain and the output chain separately. Reduces diff in future
>> dma_buf patches.
>>
>> Co-authored-with: Jason Ekstrand <jason.ekstrand at intel.com>
>> ---
>>
>> On my branch wip/anv-external-memory.
>> http://git.kiwitree.net/cgit/~chadv/mesa/log/?h=wip/anv-external-memory
>>
>> src/intel/vulkan/anv_device.c | 53 ++++++++++++++++++++---
>> src/intel/vulkan/anv_entrypoints_gen.py | 1 +
>> src/intel/vulkan/anv_formats.c | 75
>> +++++++++++++++++++++++++++++----
>> src/intel/vulkan/anv_private.h | 2 +
>> 4 files changed, 117 insertions(+), 14 deletions(-)
>>
>> diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.
>> c
>> index 3609670b348..9ee2e02ed51 100644
>> --- a/src/intel/vulkan/anv_device.c
>> +++ b/src/intel/vulkan/anv_device.c
>> @@ -74,11 +74,37 @@ anv_physical_device_init_uuids(struct
>> anv_physical_device *device)
>> if (sha1_ctx == NULL)
>> return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
>>
>> + /* The pipeline cache UUID is used for determining when a pipeline
>> cache is
>> + * invalid. It needs both a driver build and the PCI ID of the
>> device.
>> + */
>> _mesa_sha1_update(sha1_ctx, build_id_data(note), build_id_len);
>> _mesa_sha1_update(sha1_ctx, &device->chipset_id,
>> sizeof(device->chipset_id));
>> _mesa_sha1_final(sha1_ctx, sha1);
>> memcpy(device->pipeline_cache_uuid, sha1, VK_UUID_SIZE);
>>
>> + /* The driver UUID is used for determining sharability of images and
>> memory
>> + * between two Vulkan instances in separate processes. People who
>> want to
>> + * share memory need to also check the device UUID (below) so all this
>> + * needs to be is the build-id.
>> + */
>> + memcpy(device->driver_uuid, build_id_data(note), VK_UUID_SIZE);
>> +
>> + sha1_ctx = _mesa_sha1_init();
>> + if (sha1_ctx == NULL)
>> + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
>> +
>> + /* The device UUID uniquely identifies the given device within the
>> machine.
>> + * Since we never have more than one device, this doesn't need to be
>> a real
>> + * UUID. However, on the off-chance that someone tries to use this to
>> + * cache pre-tiled images or something of the like, we use the PCI ID
>> and
>> + * some bits if ISL info to ensure that this is safe.
>> + */
>> + _mesa_sha1_update(sha1_ctx, &device->chipset_id,
>> sizeof(device->chipset_id));
>> + _mesa_sha1_update(sha1_ctx, &device->isl_dev.has_bit6_swizzling,
>> + sizeof(device->isl_dev.has_bit6_swizzling));
>> + _mesa_sha1_final(sha1_ctx, sha1);
>> + memcpy(device->device_uuid, sha1, VK_UUID_SIZE);
>> +
>> return VK_SUCCESS;
>> }
>>
>> @@ -163,10 +189,6 @@ anv_physical_device_init(struct anv_physical_device
>> *device,
>> goto fail;
>> }
>>
>> - result = anv_physical_device_init_uuids(device);
>> - if (result != VK_SUCCESS)
>> - goto fail;
>> -
>> bool swizzled = anv_gem_get_bit6_swizzle(fd, I915_TILING_X);
>>
>> /* GENs prior to 8 do not support EU/Subslice info */
>> @@ -206,14 +228,18 @@ anv_physical_device_init(struct
>> anv_physical_device *device,
>> device->compiler->shader_debug_log = compiler_debug_log;
>> device->compiler->shader_perf_log = compiler_perf_log;
>>
>> + isl_device_init(&device->isl_dev, &device->info, swizzled);
>> +
>> + result = anv_physical_device_init_uuids(device);
>> + if (result != VK_SUCCESS)
>> + goto fail;
>> +
>> result = anv_init_wsi(device);
>> if (result != VK_SUCCESS) {
>> ralloc_free(device->compiler);
>> goto fail;
>> }
>>
>> - isl_device_init(&device->isl_dev, &device->info, swizzled);
>> -
>> device->local_fd = fd;
>> return VK_SUCCESS;
>>
>> @@ -257,6 +283,10 @@ static const VkExtensionProperties
>> global_extensions[] = {
>> .extensionName = VK_KHR_GET_PHYSICAL_DEVICE_PRO
>> PERTIES_2_EXTENSION_NAME,
>> .specVersion = 1,
>> },
>> + {
>> + .extensionName = VK_KHX_EXTERNAL_MEMORY_CAPABIL
>> ITIES_EXTENSION_NAME,
>> + .specVersion = 1,
>> + },
>> };
>>
>> static const VkExtensionProperties device_extensions[] = {
>> @@ -668,10 +698,21 @@ void anv_GetPhysicalDeviceProperties2KHR(
>> VkPhysicalDevice physicalDevice,
>> VkPhysicalDeviceProperties2KHR* pProperties)
>> {
>> + ANV_FROM_HANDLE(anv_physical_device, pdevice, physicalDevice);
>> +
>> anv_GetPhysicalDeviceProperties(physicalDevice,
>> &pProperties->properties);
>>
>> vk_foreach_struct(ext, pProperties->pNext) {
>> switch (ext->sType) {
>> + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHX: {
>> + VkPhysicalDeviceIDPropertiesKHX *id_props =
>> + (VkPhysicalDeviceIDPropertiesKHX *)ext;
>> + memcpy(id_props->deviceUUID, pdevice->device_uuid,
>> VK_UUID_SIZE);
>> + memcpy(id_props->driverUUID, pdevice->driver_uuid,
>> VK_UUID_SIZE);
>> + /* The LUID is for Windows. */
>> + id_props->deviceLUIDValid = false;
>> + break;
>> + }
>> default:
>> anv_debug_ignored_stype(ext->sType);
>> break;
>> diff --git a/src/intel/vulkan/anv_entrypoints_gen.py
>> b/src/intel/vulkan/anv_entrypoints_gen.py
>> index 93511ec95e4..6cf9f5f4ddf 100644
>> --- a/src/intel/vulkan/anv_entrypoints_gen.py
>> +++ b/src/intel/vulkan/anv_entrypoints_gen.py
>> @@ -37,6 +37,7 @@ supported_extensions = [
>> 'VK_KHR_wayland_surface',
>> 'VK_KHR_xcb_surface',
>> 'VK_KHR_xlib_surface',
>> + 'VK_KHX_external_memory_capabilities',
>> ]
>>
>> # We generate a static hash table for entry point lookup
>> diff --git a/src/intel/vulkan/anv_formats.c
>> b/src/intel/vulkan/anv_formats.c
>> index 6005791be5d..f91ba437f1e 100644
>> --- a/src/intel/vulkan/anv_formats.c
>> +++ b/src/intel/vulkan/anv_formats.c
>> @@ -658,26 +658,74 @@ VkResult anv_GetPhysicalDeviceImageForm
>> atProperties(
>>
>> VkResult anv_GetPhysicalDeviceImageFormatProperties2KHR(
>> VkPhysicalDevice physicalDevice,
>> - const VkPhysicalDeviceImageFormatInfo2KHR* pImageFormatInfo,
>> - VkImageFormatProperties2KHR* pImageFormatProperties)
>> + const VkPhysicalDeviceImageFormatInfo2KHR* base_info,
>> + VkImageFormatProperties2KHR* base_props)
>> {
>> ANV_FROM_HANDLE(anv_physical_device, physical_device,
>> physicalDevice);
>> + const VkPhysicalDeviceExternalImageFormatInfoKHX *external_info =
>> NULL;
>> + VkExternalImageFormatPropertiesKHX *external_props = NULL;
>> VkResult result;
>>
>> - result = anv_get_image_format_properties(physical_device,
>> pImageFormatInfo,
>> - &pImageFormatProperties->imageFormatProperties);
>> + result = anv_get_image_format_properties(physical_device, base_info,
>> + &base_props->imageFormatProperties);
>> if (result != VK_SUCCESS)
>> - return result;
>> + goto fail;
>>
>> - vk_foreach_struct(ext, pImageFormatProperties->pNext) {
>> - switch (ext->sType) {
>> + /* Extract input structs */
>> + vk_foreach_struct_const(s, base_info->pNext) {
>> + switch (s->sType) {
>> + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO
>> _KHX:
>> + external_info = (const void *) s;
>> + break;
>> default:
>> - anv_debug_ignored_stype(ext->sType);
>> + anv_debug_ignored_stype(s->sType);
>> + break;
>> + }
>> + }
>> +
>> + /* Extract output structs */
>> + vk_foreach_struct(s, base_props->pNext) {
>> + switch (s->sType) {
>> + case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHX:
>> + external_props = (void *) s;
>> + break;
>> + default:
>> + anv_debug_ignored_stype(s->sType);
>>
>
> We have a find_struct helper precisely for doing this. I guess this is
> marginally more efficient if we have a bunch of them but it's kind-of ugly.
> :-( I'll see your dma-buf patches before I cast final judgment though.
>
I rescind my comment. Yours is way cleaner than mine.
> break;
>> }
>> }
>>
>> + /* From the Vulkan 1.0.42 spec:
>> + *
>> + * If handleType is 0, vkGetPhysicalDeviceImageFormatProperties2KHR
>> will
>> + * behave as if VkPhysicalDeviceExternalImageFormatInfoKHX was not
>> + * present and VkExternalImageFormatPropertiesKHX will be ignored.
>> + */
>> + if (external_info->handleType != 0) {
>> + /* FINISHME: Support at least one external memory type for images.
>> */
>> + (void) external_props;
>> +
>> + result = vk_errorf(VK_ERROR_FORMAT_NOT_SUPPORTED,
>> + "unsupported VkExternalMemoryTypeFlagBitsKHX
>> 0x%x",
>> + external_info->handleType);
>> + goto fail;
>> + }
>> +
>> return VK_SUCCESS;
>> +
>> + fail:
>> + if (result == VK_ERROR_FORMAT_NOT_SUPPORTED) {
>> + /* From the Vulkan 1.0.42 spec:
>> + *
>> + * If the combination of parameters to
>> + * vkGetPhysicalDeviceImageFormatProperties2KHR is not
>> supported by
>> + * the implementation for use in vkCreateImage, then all
>> members of
>> + * imageFormatProperties will be filled with zero.
>> + */
>> + base_props->imageFormatProperties = (VkImageFormatProperties) {0};
>> + }
>> +
>> + return result;
>> }
>>
>> void anv_GetPhysicalDeviceSparseImageFormatProperties(
>> @@ -703,3 +751,14 @@ void anv_GetPhysicalDeviceSparseIma
>> geFormatProperties2KHR(
>> /* Sparse images are not yet supported. */
>> *pPropertyCount = 0;
>> }
>> +
>> +void anv_GetPhysicalDeviceExternalBufferPropertiesKHX(
>> + VkPhysicalDevice physicalDevice,
>> + const VkPhysicalDeviceExternalBufferInfoKHX* pExternalBufferInfo,
>> + VkExternalBufferPropertiesKHX*
>> pExternalBufferProperties)
>> +{
>> + anv_finishme("Handle external buffers");
>> +
>> + pExternalBufferProperties->externalMemoryProperties =
>> + (VkExternalMemoryPropertiesKHX) {0};
>> +}
>> diff --git a/src/intel/vulkan/anv_private.h
>> b/src/intel/vulkan/anv_private.h
>> index a4fd707fe9e..816ee8a509b 100644
>> --- a/src/intel/vulkan/anv_private.h
>> +++ b/src/intel/vulkan/anv_private.h
>> @@ -531,6 +531,8 @@ struct anv_physical_device {
>> uint32_t subslice_total;
>>
>> uint8_t
>> pipeline_cache_uuid[VK_UUID_SIZE];
>> + uint8_t
>> driver_uuid[VK_UUID_SIZE];
>> + uint8_t
>> device_uuid[VK_UUID_SIZE];
>>
>> struct wsi_device wsi_device;
>> int local_fd;
>> --
>> 2.11.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170228/beb77c3a/attachment-0001.html>
More information about the mesa-dev
mailing list