mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-13 19:29:14 +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 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;
|
||||
|
@ -461,6 +461,8 @@ namespace dxvk {
|
||||
DxvkImageViewCreateInfo m_info;
|
||||
VkImageView m_views[ViewCount];
|
||||
|
||||
void createViews();
|
||||
|
||||
void createView(VkImageViewType type, uint32_t numLayers);
|
||||
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user