mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-07 06:18:23 +00:00
[vulkan] 2D-Array (StorageView) mistmatch handling
This commit is contained in:
@@ -2292,7 +2292,7 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type,
|
|||||||
if (uses_widened_astc_format) {
|
if (uses_widened_astc_format) {
|
||||||
info.format = VK_FORMAT_R32G32B32A32_SFLOAT;
|
info.format = VK_FORMAT_R32G32B32A32_SFLOAT;
|
||||||
}
|
}
|
||||||
typeless_storage_view = MakeView(info.format, VK_IMAGE_ASPECT_COLOR_BIT);
|
typeless_storage_view = MakeView(info.format, VK_IMAGE_ASPECT_COLOR_BIT, texture_type);
|
||||||
}
|
}
|
||||||
return *typeless_storage_view;
|
return *typeless_storage_view;
|
||||||
}
|
}
|
||||||
@@ -2303,7 +2303,7 @@ VkImageView ImageView::StorageView(Shader::TextureType texture_type,
|
|||||||
auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds};
|
auto& views{is_signed ? storage_views->signeds : storage_views->unsigneds};
|
||||||
auto& view{views[size_t(texture_type)]};
|
auto& view{views[size_t(texture_type)]};
|
||||||
if (!view)
|
if (!view)
|
||||||
view = MakeView(Format(image_format), VK_IMAGE_ASPECT_COLOR_BIT);
|
view = MakeView(Format(image_format), VK_IMAGE_ASPECT_COLOR_BIT, texture_type);
|
||||||
return *view;
|
return *view;
|
||||||
}
|
}
|
||||||
return VK_NULL_HANDLE;
|
return VK_NULL_HANDLE;
|
||||||
@@ -2313,13 +2313,28 @@ bool ImageView::IsRescaled() const noexcept {
|
|||||||
return (*slot_images)[image_id].IsRescaled();
|
return (*slot_images)[image_id].IsRescaled();
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask) {
|
vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask,
|
||||||
|
std::optional<Shader::TextureType> texture_type) {
|
||||||
|
VkImageViewType view_type = ImageViewType(type);
|
||||||
|
VkImageSubresourceRange subresource_range = MakeSubresourceRange(aspect_mask, range);
|
||||||
|
if (texture_type) {
|
||||||
|
view_type = ImageViewType(*texture_type);
|
||||||
|
switch (view_type) {
|
||||||
|
case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
|
||||||
|
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
|
||||||
|
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
subresource_range.layerCount = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return device->GetLogical().CreateImageView({
|
return device->GetLogical().CreateImageView({
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.image = image_handle,
|
.image = image_handle,
|
||||||
.viewType = ImageViewType(type),
|
.viewType = view_type,
|
||||||
.format = vk_format,
|
.format = vk_format,
|
||||||
.components{
|
.components{
|
||||||
.r = VK_COMPONENT_SWIZZLE_IDENTITY,
|
.r = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||||
@@ -2327,7 +2342,7 @@ vk::ImageView ImageView::MakeView(VkFormat vk_format, VkImageAspectFlags aspect_
|
|||||||
.b = VK_COMPONENT_SWIZZLE_IDENTITY,
|
.b = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||||
.a = VK_COMPONENT_SWIZZLE_IDENTITY,
|
.a = VK_COMPONENT_SWIZZLE_IDENTITY,
|
||||||
},
|
},
|
||||||
.subresourceRange = MakeSubresourceRange(aspect_mask, range),
|
.subresourceRange = subresource_range,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -370,7 +370,8 @@ private:
|
|||||||
std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> unsigneds;
|
std::array<vk::ImageView, Shader::NUM_TEXTURE_TYPES> unsigneds;
|
||||||
};
|
};
|
||||||
|
|
||||||
[[nodiscard]] vk::ImageView MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask);
|
[[nodiscard]] vk::ImageView MakeView(VkFormat vk_format, VkImageAspectFlags aspect_mask,
|
||||||
|
std::optional<Shader::TextureType> texture_type = std::nullopt);
|
||||||
|
|
||||||
const Device* device = nullptr;
|
const Device* device = nullptr;
|
||||||
const SlotVector<Image>* slot_images = nullptr;
|
const SlotVector<Image>* slot_images = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user