[Vulkan] Transient descriptor pool + other cleanup for future drawing
This commit is contained in:
@@ -49,6 +49,12 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
const ui::vulkan::VulkanProvider::DeviceFunctions& dfn = provider.dfn();
|
||||
VkDevice device = provider.device();
|
||||
|
||||
// No specific reason for 32768, just the "too much" amount from Direct3D 12
|
||||
// PIX warnings.
|
||||
transient_descriptor_pool_uniform_buffers_ =
|
||||
std::make_unique<ui::vulkan::TransientDescriptorPool>(
|
||||
provider, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 32768, 32768);
|
||||
|
||||
VkDescriptorSetLayoutCreateInfo descriptor_set_layout_create_info;
|
||||
descriptor_set_layout_create_info.sType =
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||
@@ -77,7 +83,7 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
&descriptor_set_layout_binding_uniform_buffer;
|
||||
if (dfn.vkCreateDescriptorSetLayout(
|
||||
device, &descriptor_set_layout_create_info, nullptr,
|
||||
&descriptor_set_layout_ub_fetch_bool_loop_constants_) != VK_SUCCESS) {
|
||||
&descriptor_set_layout_fetch_bool_loop_constants_) != VK_SUCCESS) {
|
||||
XELOGE(
|
||||
"Failed to create a Vulkan descriptor set layout for the fetch, bool "
|
||||
"and loop constants uniform buffer");
|
||||
@@ -87,7 +93,7 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
shader_stages_guest_vertex;
|
||||
if (dfn.vkCreateDescriptorSetLayout(
|
||||
device, &descriptor_set_layout_create_info, nullptr,
|
||||
&descriptor_set_layout_ub_float_constants_vertex_) != VK_SUCCESS) {
|
||||
&descriptor_set_layout_float_constants_vertex_) != VK_SUCCESS) {
|
||||
XELOGE(
|
||||
"Failed to create a Vulkan descriptor set layout for the vertex shader "
|
||||
"float constants uniform buffer");
|
||||
@@ -97,7 +103,7 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
if (dfn.vkCreateDescriptorSetLayout(
|
||||
device, &descriptor_set_layout_create_info, nullptr,
|
||||
&descriptor_set_layout_ub_float_constants_pixel_) != VK_SUCCESS) {
|
||||
&descriptor_set_layout_float_constants_pixel_) != VK_SUCCESS) {
|
||||
XELOGE(
|
||||
"Failed to create a Vulkan descriptor set layout for the pixel shader "
|
||||
"float constants uniform buffer");
|
||||
@@ -111,7 +117,7 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
}
|
||||
if (dfn.vkCreateDescriptorSetLayout(
|
||||
device, &descriptor_set_layout_create_info, nullptr,
|
||||
&descriptor_set_layout_ub_system_constants_) != VK_SUCCESS) {
|
||||
&descriptor_set_layout_system_constants_) != VK_SUCCESS) {
|
||||
XELOGE(
|
||||
"Failed to create a Vulkan descriptor set layout for the system "
|
||||
"constants uniform buffer");
|
||||
@@ -257,19 +263,21 @@ void VulkanCommandProcessor::ShutdownContext() {
|
||||
descriptor_set_layout_shared_memory_and_edram_);
|
||||
ui::vulkan::util::DestroyAndNullHandle(
|
||||
dfn.vkDestroyDescriptorSetLayout, device,
|
||||
descriptor_set_layout_ub_system_constants_);
|
||||
descriptor_set_layout_system_constants_);
|
||||
ui::vulkan::util::DestroyAndNullHandle(
|
||||
dfn.vkDestroyDescriptorSetLayout, device,
|
||||
descriptor_set_layout_ub_float_constants_pixel_);
|
||||
descriptor_set_layout_float_constants_pixel_);
|
||||
ui::vulkan::util::DestroyAndNullHandle(
|
||||
dfn.vkDestroyDescriptorSetLayout, device,
|
||||
descriptor_set_layout_ub_float_constants_vertex_);
|
||||
descriptor_set_layout_float_constants_vertex_);
|
||||
ui::vulkan::util::DestroyAndNullHandle(
|
||||
dfn.vkDestroyDescriptorSetLayout, device,
|
||||
descriptor_set_layout_ub_fetch_bool_loop_constants_);
|
||||
descriptor_set_layout_fetch_bool_loop_constants_);
|
||||
ui::vulkan::util::DestroyAndNullHandle(dfn.vkDestroyDescriptorSetLayout,
|
||||
device, descriptor_set_layout_empty_);
|
||||
|
||||
transient_descriptor_pool_uniform_buffers_.reset();
|
||||
|
||||
sparse_bind_wait_stage_mask_ = 0;
|
||||
sparse_buffer_binds_.clear();
|
||||
sparse_memory_binds_.clear();
|
||||
@@ -454,15 +462,26 @@ bool VulkanCommandProcessor::GetPipelineLayout(
|
||||
|
||||
VkDescriptorSetLayout
|
||||
descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetCount];
|
||||
// Fill any unused set layouts with empty layouts.
|
||||
// TODO(Triang3l): Remove this.
|
||||
for (size_t i = 0; i < xe::countof(descriptor_set_layouts); ++i) {
|
||||
descriptor_set_layouts[i] = descriptor_set_layout_empty_;
|
||||
}
|
||||
descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetFetchConstants] =
|
||||
descriptor_set_layout_fetch_bool_loop_constants_;
|
||||
descriptor_set_layouts
|
||||
[SpirvShaderTranslator::kDescriptorSetFloatConstantsVertex] =
|
||||
descriptor_set_layout_float_constants_vertex_;
|
||||
descriptor_set_layouts
|
||||
[SpirvShaderTranslator::kDescriptorSetFloatConstantsPixel] =
|
||||
descriptor_set_layout_float_constants_pixel_;
|
||||
descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetTexturesPixel] =
|
||||
descriptor_set_layout_textures_pixel;
|
||||
descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetTexturesVertex] =
|
||||
descriptor_set_layout_textures_vertex;
|
||||
descriptor_set_layouts[SpirvShaderTranslator::kDescriptorSetSystemConstants] =
|
||||
descriptor_set_layout_system_constants_;
|
||||
descriptor_set_layouts
|
||||
[SpirvShaderTranslator::kDescriptorSetBoolLoopConstants] =
|
||||
descriptor_set_layout_fetch_bool_loop_constants_;
|
||||
descriptor_set_layouts
|
||||
[SpirvShaderTranslator::kDescriptorSetSharedMemoryAndEdram] =
|
||||
descriptor_set_layout_shared_memory_and_edram_;
|
||||
|
||||
VkPipelineLayoutCreateInfo pipeline_layout_create_info;
|
||||
pipeline_layout_create_info.sType =
|
||||
@@ -640,6 +659,9 @@ void VulkanCommandProcessor::CheckSubmissionFence(uint64_t await_submission) {
|
||||
command_buffers_submitted_.pop_front();
|
||||
}
|
||||
|
||||
// Reclaim descriptor pools.
|
||||
transient_descriptor_pool_uniform_buffers_->Reclaim(submission_completed_);
|
||||
|
||||
shared_memory_->CompletedSubmissionUpdated();
|
||||
}
|
||||
|
||||
@@ -888,6 +910,9 @@ bool VulkanCommandProcessor::EndSubmission(bool is_swap) {
|
||||
if (cache_clear_requested_ && AwaitAllQueueOperationsCompletion()) {
|
||||
cache_clear_requested_ = false;
|
||||
|
||||
transient_descriptor_pool_uniform_buffers_->ClearCache();
|
||||
|
||||
assert_true(command_buffers_submitted_.empty());
|
||||
for (const CommandBuffer& command_buffer : command_buffers_writable_) {
|
||||
dfn.vkDestroyCommandPool(device, command_buffer.pool, nullptr);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#include <cstdint>
|
||||
#include <deque>
|
||||
#include <memory>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
@@ -22,6 +23,7 @@
|
||||
#include "xenia/gpu/vulkan/vulkan_shared_memory.h"
|
||||
#include "xenia/gpu/xenos.h"
|
||||
#include "xenia/kernel/kernel_state.h"
|
||||
#include "xenia/ui/vulkan/transient_descriptor_pool.h"
|
||||
#include "xenia/ui/vulkan/vulkan_context.h"
|
||||
|
||||
namespace xe {
|
||||
@@ -162,15 +164,18 @@ class VulkanCommandProcessor : public CommandProcessor {
|
||||
std::vector<VkSparseBufferMemoryBindInfo> sparse_buffer_bind_infos_temp_;
|
||||
VkPipelineStageFlags sparse_bind_wait_stage_mask_ = 0;
|
||||
|
||||
std::unique_ptr<ui::vulkan::TransientDescriptorPool>
|
||||
transient_descriptor_pool_uniform_buffers_;
|
||||
|
||||
// Descriptor set layouts used by different shaders.
|
||||
VkDescriptorSetLayout descriptor_set_layout_empty_ = VK_NULL_HANDLE;
|
||||
VkDescriptorSetLayout descriptor_set_layout_ub_fetch_bool_loop_constants_ =
|
||||
VkDescriptorSetLayout descriptor_set_layout_fetch_bool_loop_constants_ =
|
||||
VK_NULL_HANDLE;
|
||||
VkDescriptorSetLayout descriptor_set_layout_ub_float_constants_vertex_ =
|
||||
VkDescriptorSetLayout descriptor_set_layout_float_constants_vertex_ =
|
||||
VK_NULL_HANDLE;
|
||||
VkDescriptorSetLayout descriptor_set_layout_ub_float_constants_pixel_ =
|
||||
VkDescriptorSetLayout descriptor_set_layout_float_constants_pixel_ =
|
||||
VK_NULL_HANDLE;
|
||||
VkDescriptorSetLayout descriptor_set_layout_ub_system_constants_ =
|
||||
VkDescriptorSetLayout descriptor_set_layout_system_constants_ =
|
||||
VK_NULL_HANDLE;
|
||||
VkDescriptorSetLayout descriptor_set_layout_shared_memory_and_edram_ =
|
||||
VK_NULL_HANDLE;
|
||||
|
||||
Reference in New Issue
Block a user