c6cb9b197d4e82432cacae7cec04e7d6ee73ceba — Bas Nieuwenhuizen 3 months ago 8a05325
radv: Support VK_EXT_queue_family_foreign.

Basically same as external for now.

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Only case we might need to handle differently in the near future
is Raven's case of displayable DCC which is not renderable. But
we don't support that yet.
M docs/relnotes/19.2.0.html => docs/relnotes/19.2.0.html +1 -0
@@ 40,6 40,7 @@   <ul>
  <li>EGL_EXT_platform_device</li>
+ <li>VK_EXT_queue_family_foreign for radv</li>
  </ul>
  
  <h2>Bug fixes</h2>

M src/amd/vulkan/radv_cmd_buffer.c => src/amd/vulkan/radv_cmd_buffer.c +2 -1
@@ 5111,7 5111,8 @@ assert(src_family == cmd_buffer->queue_family_index ||
  		       dst_family == cmd_buffer->queue_family_index);
  
- 		if (src_family == VK_QUEUE_FAMILY_EXTERNAL)
+ 		if (src_family == VK_QUEUE_FAMILY_EXTERNAL ||
+ 		    src_family == VK_QUEUE_FAMILY_FOREIGN_EXT)
  			return;
  
  		if (cmd_buffer->queue_family_index == RADV_QUEUE_TRANSFER)

M src/amd/vulkan/radv_extensions.py => src/amd/vulkan/radv_extensions.py +1 -0
@@ 120,6 120,7 @@ Extension('VK_EXT_memory_priority',                   1, True),
      Extension('VK_EXT_pci_bus_info',                      2, True),
      Extension('VK_EXT_pipeline_creation_feedback',        1, True),
+     Extension('VK_EXT_queue_family_foreign',              1, True),
      Extension('VK_EXT_sample_locations',                  1, True),
      Extension('VK_EXT_sampler_filter_minmax',             1, 'device->rad_info.chip_class >= GFX7'),
      Extension('VK_EXT_scalar_block_layout',               1, 'device->rad_info.chip_class >= GFX7'),

M src/amd/vulkan/radv_image.c => src/amd/vulkan/radv_image.c +4 -2
@@ 1125,7 1125,8 @@ image->exclusive = pCreateInfo->sharingMode == VK_SHARING_MODE_EXCLUSIVE;
  	if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) {
  		for (uint32_t i = 0; i < pCreateInfo->queueFamilyIndexCount; ++i)
- 			if (pCreateInfo->pQueueFamilyIndices[i] == VK_QUEUE_FAMILY_EXTERNAL)
+ 			if (pCreateInfo->pQueueFamilyIndices[i] == VK_QUEUE_FAMILY_EXTERNAL ||
+ 			    pCreateInfo->pQueueFamilyIndices[i] == VK_QUEUE_FAMILY_FOREIGN_EXT)
  				image->queue_family_mask |= (1u << RADV_MAX_QUEUE_FAMILIES) - 1u;
  			else
  				image->queue_family_mask |= 1u << pCreateInfo->pQueueFamilyIndices[i];


@@ 1471,7 1472,8 @@ {
  	if (!image->exclusive)
  		return image->queue_family_mask;
- 	if (family == VK_QUEUE_FAMILY_EXTERNAL)
+ 	if (family == VK_QUEUE_FAMILY_EXTERNAL ||
+ 	    family == VK_QUEUE_FAMILY_FOREIGN_EXT)
  		return (1u << RADV_MAX_QUEUE_FAMILIES) - 1u;
  	if (family == VK_QUEUE_FAMILY_IGNORED)
  		return 1u << queue_family;