mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-22 18:53:28 +01:00
vk: Generate valid image+image_view combinations for placeholder texture descriptors
This commit is contained in:
parent
06c42bba5d
commit
22f5e7a9be
@ -66,9 +66,8 @@ namespace vk
|
|||||||
const context* g_current_vulkan_ctx = nullptr;
|
const context* g_current_vulkan_ctx = nullptr;
|
||||||
const render_device* g_current_renderer;
|
const render_device* g_current_renderer;
|
||||||
|
|
||||||
std::unique_ptr<image> g_null_texture;
|
|
||||||
std::unique_ptr<buffer> g_scratch_buffer;
|
std::unique_ptr<buffer> g_scratch_buffer;
|
||||||
std::unordered_map<VkImageViewType, std::unique_ptr<image_view>> g_null_image_views;
|
std::unordered_map<VkImageViewType, std::unique_ptr<viewable_image>> g_null_image_views;
|
||||||
std::unordered_map<u32, std::unique_ptr<image>> g_typeless_textures;
|
std::unordered_map<u32, std::unique_ptr<image>> g_typeless_textures;
|
||||||
std::unordered_map<u32, std::unique_ptr<vk::compute_task>> g_compute_tasks;
|
std::unordered_map<u32, std::unique_ptr<vk::compute_task>> g_compute_tasks;
|
||||||
std::unordered_map<u32, std::unique_ptr<vk::overlay_pass>> g_overlay_passes;
|
std::unordered_map<u32, std::unique_ptr<vk::overlay_pass>> g_overlay_passes;
|
||||||
@ -292,27 +291,57 @@ namespace vk
|
|||||||
if (auto found = g_null_image_views.find(type);
|
if (auto found = g_null_image_views.find(type);
|
||||||
found != g_null_image_views.end())
|
found != g_null_image_views.end())
|
||||||
{
|
{
|
||||||
return found->second.get();
|
return found->second->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_null_texture)
|
VkImageType image_type;
|
||||||
|
u32 num_layers = 1;
|
||||||
|
u32 flags = 0;
|
||||||
|
u16 size = 4;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
{
|
{
|
||||||
g_null_texture = std::make_unique<image>(*g_current_renderer, g_current_renderer->get_memory_mapping().device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
|
case VK_IMAGE_VIEW_TYPE_1D:
|
||||||
VK_IMAGE_TYPE_2D, VK_FORMAT_B8G8R8A8_UNORM, 4, 4, 1, 1, 1, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
|
image_type = VK_IMAGE_TYPE_1D;
|
||||||
VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, 0);
|
size = 1;
|
||||||
|
break;
|
||||||
|
case VK_IMAGE_VIEW_TYPE_2D:
|
||||||
|
image_type = VK_IMAGE_TYPE_2D;
|
||||||
|
break;
|
||||||
|
case VK_IMAGE_VIEW_TYPE_3D:
|
||||||
|
image_type = VK_IMAGE_TYPE_3D;
|
||||||
|
break;
|
||||||
|
case VK_IMAGE_VIEW_TYPE_CUBE:
|
||||||
|
image_type = VK_IMAGE_TYPE_2D;
|
||||||
|
flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
|
||||||
|
num_layers = 6;
|
||||||
|
break;
|
||||||
|
case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
|
||||||
|
image_type = VK_IMAGE_TYPE_2D;
|
||||||
|
num_layers = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rsx_log.fatal("Unexpected image view type 0x%x", static_cast<u32>(type));
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& tex = g_null_image_views[type];
|
||||||
|
tex = std::make_unique<viewable_image>(*g_current_renderer, g_current_renderer->get_memory_mapping().device_local, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
|
||||||
|
image_type, VK_FORMAT_B8G8R8A8_UNORM, size, size, 1, 1, num_layers, VK_SAMPLE_COUNT_1_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
|
||||||
|
VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, flags);
|
||||||
|
|
||||||
// Initialize memory to transparent black
|
// Initialize memory to transparent black
|
||||||
|
tex->change_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||||
|
|
||||||
VkClearColorValue clear_color = {};
|
VkClearColorValue clear_color = {};
|
||||||
VkImageSubresourceRange range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
|
VkImageSubresourceRange range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
|
||||||
change_image_layout(cmd, g_null_texture.get(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, range);
|
vkCmdClearColorImage(cmd, tex->value, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &range);
|
||||||
vkCmdClearColorImage(cmd, g_null_texture->value, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &range);
|
|
||||||
|
|
||||||
// Prep for shader access
|
// Prep for shader access
|
||||||
change_image_layout(cmd, g_null_texture.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, range);
|
tex->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
}
|
|
||||||
|
|
||||||
auto& ret = g_null_image_views[type] = std::make_unique<image_view>(*g_current_renderer, g_null_texture.get(), type);
|
// Return view
|
||||||
return ret.get();
|
return tex->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector);
|
||||||
}
|
}
|
||||||
|
|
||||||
vk::image* get_typeless_helper(VkFormat format, u32 requested_width, u32 requested_height)
|
vk::image* get_typeless_helper(VkFormat format, u32 requested_width, u32 requested_height)
|
||||||
@ -409,7 +438,6 @@ namespace vk
|
|||||||
vk::vmm_reset();
|
vk::vmm_reset();
|
||||||
vk::get_resource_manager()->destroy();
|
vk::get_resource_manager()->destroy();
|
||||||
|
|
||||||
g_null_texture.reset();
|
|
||||||
g_null_image_views.clear();
|
g_null_image_views.clear();
|
||||||
g_scratch_buffer.reset();
|
g_scratch_buffer.reset();
|
||||||
g_upload_heap.destroy();
|
g_upload_heap.destroy();
|
||||||
@ -791,7 +819,7 @@ namespace vk
|
|||||||
{
|
{
|
||||||
if (image->current_layout == new_layout) return;
|
if (image->current_layout == new_layout) return;
|
||||||
|
|
||||||
change_image_layout(cmd, image->value, image->current_layout, new_layout, { image->aspect(), 0, 1, 0, 1 });
|
change_image_layout(cmd, image->value, image->current_layout, new_layout, { image->aspect(), 0, image->mipmaps(), 0, image->layers() });
|
||||||
image->current_layout = new_layout;
|
image->current_layout = new_layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user