From 70e52aa6f26c348e3207f6e5ed6933db2f9362d1 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 8 Jan 2020 14:04:19 +0100 Subject: [PATCH] [dxvk] Factor out image view creation --- src/dxvk/dxvk_image.cpp | 32 ++++++++++++++++++-------------- src/dxvk/dxvk_image.h | 2 ++ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/dxvk/dxvk_image.cpp b/src/dxvk/dxvk_image.cpp index 162527b7..439488ae 100644 --- a/src/dxvk/dxvk_image.cpp +++ b/src/dxvk/dxvk_image.cpp @@ -130,15 +130,25 @@ namespace dxvk { const Rc& image, const DxvkImageViewCreateInfo& info) : m_vkd(vkd), m_image(image), m_info(info) { - // Since applications tend to bind views + createViews(); + } + + + DxvkImageView::~DxvkImageView() { + for (uint32_t i = 0; i < ViewCount; i++) + m_vkd->vkDestroyImageView(m_vkd->device(), m_views[i], nullptr); + } + + + void DxvkImageView::createViews() { for (uint32_t i = 0; i < ViewCount; i++) m_views[i] = VK_NULL_HANDLE; - switch (info.type) { + switch (m_info.type) { case VK_IMAGE_VIEW_TYPE_1D: case VK_IMAGE_VIEW_TYPE_1D_ARRAY: { this->createView(VK_IMAGE_VIEW_TYPE_1D, 1); - this->createView(VK_IMAGE_VIEW_TYPE_1D_ARRAY, info.numLayers); + this->createView(VK_IMAGE_VIEW_TYPE_1D_ARRAY, m_info.numLayers); } break; case VK_IMAGE_VIEW_TYPE_2D: @@ -148,10 +158,10 @@ namespace dxvk { case VK_IMAGE_VIEW_TYPE_CUBE: case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: { - this->createView(VK_IMAGE_VIEW_TYPE_2D_ARRAY, info.numLayers); + this->createView(VK_IMAGE_VIEW_TYPE_2D_ARRAY, m_info.numLayers); if (m_image->info().flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) { - uint32_t cubeCount = info.numLayers / 6; + uint32_t cubeCount = m_info.numLayers / 6; if (cubeCount > 0) { this->createView(VK_IMAGE_VIEW_TYPE_CUBE, 6); @@ -163,24 +173,18 @@ namespace dxvk { case VK_IMAGE_VIEW_TYPE_3D: { this->createView(VK_IMAGE_VIEW_TYPE_3D, 1); - if (m_image->info().flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR && info.numLevels == 1) { + if (m_image->info().flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR && m_info.numLevels == 1) { this->createView(VK_IMAGE_VIEW_TYPE_2D, 1); - this->createView(VK_IMAGE_VIEW_TYPE_2D_ARRAY, m_image->mipLevelExtent(info.minLevel).depth); + this->createView(VK_IMAGE_VIEW_TYPE_2D_ARRAY, m_image->mipLevelExtent(m_info.minLevel).depth); } } break; default: - throw DxvkError(str::format("DxvkImageView: Invalid view type: ", info.type)); + throw DxvkError(str::format("DxvkImageView: Invalid view type: ", m_info.type)); } } - DxvkImageView::~DxvkImageView() { - for (uint32_t i = 0; i < ViewCount; i++) - m_vkd->vkDestroyImageView(m_vkd->device(), m_views[i], nullptr); - } - - void DxvkImageView::createView(VkImageViewType type, uint32_t numLayers) { VkImageSubresourceRange subresourceRange; subresourceRange.aspectMask = m_info.aspect; diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index 543c311a..0e3a3224 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -461,6 +461,8 @@ namespace dxvk { DxvkImageViewCreateInfo m_info; VkImageView m_views[ViewCount]; + void createViews(); + void createView(VkImageViewType type, uint32_t numLayers); };