radv: Split out layout code from image creation.
So we can delay the layout until later in some import cases. Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
@@ -1255,73 +1255,21 @@ static void radv_image_disable_htile(struct radv_image *image)
|
|||||||
image->planes[i].surface.htile_size = 0;
|
image->planes[i].surface.htile_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult
|
static void
|
||||||
radv_image_create(VkDevice _device,
|
radv_image_create_layout(struct radv_device *device,
|
||||||
const struct radv_image_create_info *create_info,
|
const struct radv_image_create_info *create_info,
|
||||||
const VkAllocationCallbacks* alloc,
|
struct radv_image *image)
|
||||||
VkImage *pImage)
|
|
||||||
{
|
{
|
||||||
RADV_FROM_HANDLE(radv_device, device, _device);
|
/* Check that we did not initialize things earlier */
|
||||||
const VkImageCreateInfo *pCreateInfo = create_info->vk_info;
|
assert(!image->planes[0].surface.surf_size);
|
||||||
struct radv_image *image = NULL;
|
|
||||||
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
|
|
||||||
|
|
||||||
const unsigned plane_count = vk_format_get_plane_count(pCreateInfo->format);
|
|
||||||
const size_t image_struct_size = sizeof(*image) + sizeof(struct radv_image_plane) * plane_count;
|
|
||||||
|
|
||||||
radv_assert(pCreateInfo->mipLevels > 0);
|
|
||||||
radv_assert(pCreateInfo->arrayLayers > 0);
|
|
||||||
radv_assert(pCreateInfo->samples > 0);
|
|
||||||
radv_assert(pCreateInfo->extent.width > 0);
|
|
||||||
radv_assert(pCreateInfo->extent.height > 0);
|
|
||||||
radv_assert(pCreateInfo->extent.depth > 0);
|
|
||||||
|
|
||||||
image = vk_zalloc2(&device->alloc, alloc, image_struct_size, 8,
|
|
||||||
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
|
||||||
if (!image)
|
|
||||||
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
|
||||||
|
|
||||||
image->type = pCreateInfo->imageType;
|
|
||||||
image->info.width = pCreateInfo->extent.width;
|
|
||||||
image->info.height = pCreateInfo->extent.height;
|
|
||||||
image->info.depth = pCreateInfo->extent.depth;
|
|
||||||
image->info.samples = pCreateInfo->samples;
|
|
||||||
image->info.storage_samples = pCreateInfo->samples;
|
|
||||||
image->info.array_size = pCreateInfo->arrayLayers;
|
|
||||||
image->info.levels = pCreateInfo->mipLevels;
|
|
||||||
image->info.num_channels = vk_format_get_nr_components(pCreateInfo->format);
|
|
||||||
|
|
||||||
image->vk_format = pCreateInfo->format;
|
|
||||||
image->tiling = pCreateInfo->tiling;
|
|
||||||
image->usage = pCreateInfo->usage;
|
|
||||||
image->flags = pCreateInfo->flags;
|
|
||||||
|
|
||||||
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 ||
|
|
||||||
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];
|
|
||||||
}
|
|
||||||
|
|
||||||
image->shareable = vk_find_struct_const(pCreateInfo->pNext,
|
|
||||||
EXTERNAL_MEMORY_IMAGE_CREATE_INFO) != NULL;
|
|
||||||
if (!vk_format_is_depth_or_stencil(pCreateInfo->format) &&
|
|
||||||
!radv_surface_has_scanout(device, create_info) && !image->shareable) {
|
|
||||||
image->info.surf_index = &device->image_mrt_offset_counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
image->plane_count = plane_count;
|
|
||||||
image->size = 0;
|
image->size = 0;
|
||||||
image->alignment = 1;
|
image->alignment = 1;
|
||||||
for (unsigned plane = 0; plane < plane_count; ++plane) {
|
for (unsigned plane = 0; plane < image->plane_count; ++plane) {
|
||||||
struct ac_surf_info info = image->info;
|
struct ac_surf_info info = image->info;
|
||||||
radv_init_surface(device, image, &image->planes[plane].surface, plane, create_info);
|
|
||||||
|
|
||||||
if (plane) {
|
if (plane) {
|
||||||
const struct vk_format_description *desc = vk_format_description(pCreateInfo->format);
|
const struct vk_format_description *desc = vk_format_description(image->vk_format);
|
||||||
assert(info.width % desc->width_divisor == 0);
|
assert(info.width % desc->width_divisor == 0);
|
||||||
assert(info.height % desc->height_divisor == 0);
|
assert(info.height % desc->height_divisor == 0);
|
||||||
|
|
||||||
@@ -1378,7 +1326,75 @@ radv_image_create(VkDevice _device,
|
|||||||
radv_image_disable_htile(image);
|
radv_image_disable_htile(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
|
assert(image->planes[0].surface.surf_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
VkResult
|
||||||
|
radv_image_create(VkDevice _device,
|
||||||
|
const struct radv_image_create_info *create_info,
|
||||||
|
const VkAllocationCallbacks* alloc,
|
||||||
|
VkImage *pImage)
|
||||||
|
{
|
||||||
|
RADV_FROM_HANDLE(radv_device, device, _device);
|
||||||
|
const VkImageCreateInfo *pCreateInfo = create_info->vk_info;
|
||||||
|
struct radv_image *image = NULL;
|
||||||
|
assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO);
|
||||||
|
|
||||||
|
const unsigned plane_count = vk_format_get_plane_count(pCreateInfo->format);
|
||||||
|
const size_t image_struct_size = sizeof(*image) + sizeof(struct radv_image_plane) * plane_count;
|
||||||
|
|
||||||
|
radv_assert(pCreateInfo->mipLevels > 0);
|
||||||
|
radv_assert(pCreateInfo->arrayLayers > 0);
|
||||||
|
radv_assert(pCreateInfo->samples > 0);
|
||||||
|
radv_assert(pCreateInfo->extent.width > 0);
|
||||||
|
radv_assert(pCreateInfo->extent.height > 0);
|
||||||
|
radv_assert(pCreateInfo->extent.depth > 0);
|
||||||
|
|
||||||
|
image = vk_zalloc2(&device->alloc, alloc, image_struct_size, 8,
|
||||||
|
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
|
||||||
|
if (!image)
|
||||||
|
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||||
|
|
||||||
|
image->type = pCreateInfo->imageType;
|
||||||
|
image->info.width = pCreateInfo->extent.width;
|
||||||
|
image->info.height = pCreateInfo->extent.height;
|
||||||
|
image->info.depth = pCreateInfo->extent.depth;
|
||||||
|
image->info.samples = pCreateInfo->samples;
|
||||||
|
image->info.storage_samples = pCreateInfo->samples;
|
||||||
|
image->info.array_size = pCreateInfo->arrayLayers;
|
||||||
|
image->info.levels = pCreateInfo->mipLevels;
|
||||||
|
image->info.num_channels = vk_format_get_nr_components(pCreateInfo->format);
|
||||||
|
|
||||||
|
image->vk_format = pCreateInfo->format;
|
||||||
|
image->tiling = pCreateInfo->tiling;
|
||||||
|
image->usage = pCreateInfo->usage;
|
||||||
|
image->flags = pCreateInfo->flags;
|
||||||
|
image->plane_count = plane_count;
|
||||||
|
|
||||||
|
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 ||
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
|
image->shareable = vk_find_struct_const(pCreateInfo->pNext,
|
||||||
|
EXTERNAL_MEMORY_IMAGE_CREATE_INFO) != NULL;
|
||||||
|
if (!vk_format_is_depth_or_stencil(pCreateInfo->format) &&
|
||||||
|
!radv_surface_has_scanout(device, create_info) && !image->shareable) {
|
||||||
|
image->info.surf_index = &device->image_mrt_offset_counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned plane = 0; plane < image->plane_count; ++plane) {
|
||||||
|
radv_init_surface(device, image, &image->planes[plane].surface, plane, create_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
radv_image_create_layout(device, create_info, image);
|
||||||
|
|
||||||
|
if (image->flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) {
|
||||||
image->alignment = MAX2(image->alignment, 4096);
|
image->alignment = MAX2(image->alignment, 4096);
|
||||||
image->size = align64(image->size, image->alignment);
|
image->size = align64(image->size, image->alignment);
|
||||||
image->offset = 0;
|
image->offset = 0;
|
||||||
|
Reference in New Issue
Block a user