mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +01:00
[dxvk] Factor out image view creation
This commit is contained in:
parent
e4215252df
commit
70e52aa6f2
@ -130,15 +130,25 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& image,
|
const Rc<DxvkImage>& image,
|
||||||
const DxvkImageViewCreateInfo& info)
|
const DxvkImageViewCreateInfo& info)
|
||||||
: m_vkd(vkd), m_image(image), m_info(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++)
|
for (uint32_t i = 0; i < ViewCount; i++)
|
||||||
m_views[i] = VK_NULL_HANDLE;
|
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:
|
||||||
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: {
|
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: {
|
||||||
this->createView(VK_IMAGE_VIEW_TYPE_1D, 1);
|
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;
|
} break;
|
||||||
|
|
||||||
case VK_IMAGE_VIEW_TYPE_2D:
|
case VK_IMAGE_VIEW_TYPE_2D:
|
||||||
@ -148,10 +158,10 @@ namespace dxvk {
|
|||||||
|
|
||||||
case VK_IMAGE_VIEW_TYPE_CUBE:
|
case VK_IMAGE_VIEW_TYPE_CUBE:
|
||||||
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: {
|
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) {
|
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) {
|
if (cubeCount > 0) {
|
||||||
this->createView(VK_IMAGE_VIEW_TYPE_CUBE, 6);
|
this->createView(VK_IMAGE_VIEW_TYPE_CUBE, 6);
|
||||||
@ -163,24 +173,18 @@ namespace dxvk {
|
|||||||
case VK_IMAGE_VIEW_TYPE_3D: {
|
case VK_IMAGE_VIEW_TYPE_3D: {
|
||||||
this->createView(VK_IMAGE_VIEW_TYPE_3D, 1);
|
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, 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;
|
} break;
|
||||||
|
|
||||||
default:
|
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) {
|
void DxvkImageView::createView(VkImageViewType type, uint32_t numLayers) {
|
||||||
VkImageSubresourceRange subresourceRange;
|
VkImageSubresourceRange subresourceRange;
|
||||||
subresourceRange.aspectMask = m_info.aspect;
|
subresourceRange.aspectMask = m_info.aspect;
|
||||||
|
@ -461,6 +461,8 @@ namespace dxvk {
|
|||||||
DxvkImageViewCreateInfo m_info;
|
DxvkImageViewCreateInfo m_info;
|
||||||
VkImageView m_views[ViewCount];
|
VkImageView m_views[ViewCount];
|
||||||
|
|
||||||
|
void createViews();
|
||||||
|
|
||||||
void createView(VkImageViewType type, uint32_t numLayers);
|
void createView(VkImageViewType type, uint32_t numLayers);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user