~sircmpwn/mesa

c6cb9b197d4e82432cacae7cec04e7d6ee73ceba — Bas Nieuwenhuizen 11 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 @@ TBD.

<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 @@ static void radv_handle_image_transition(struct radv_cmd_buffer *cmd_buffer,
		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 @@ EXTENSIONS = [
    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 @@ radv_image_create(VkDevice _device,
	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 @@ unsigned radv_image_queue_family_mask(const struct radv_image *image, uint32_t f
{
	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;