[GPU] Change texture load cbuffer to push constants
Simplify the code, eliminating the need for supporting requesting cbuffers for anything other than guest draw command execution.
This commit is contained in:
@@ -229,11 +229,11 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
"constant buffers");
|
||||
return false;
|
||||
}
|
||||
// Transient: uniform buffer for compute shaders.
|
||||
// Transient: storage buffer for compute shaders.
|
||||
VkDescriptorSetLayoutBinding descriptor_set_layout_binding_transient;
|
||||
descriptor_set_layout_binding_transient.binding = 0;
|
||||
descriptor_set_layout_binding_transient.descriptorType =
|
||||
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptor_set_layout_binding_transient.descriptorCount = 1;
|
||||
descriptor_set_layout_binding_transient.stageFlags =
|
||||
VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
@@ -241,21 +241,6 @@ bool VulkanCommandProcessor::SetupContext() {
|
||||
descriptor_set_layout_create_info.bindingCount = 1;
|
||||
descriptor_set_layout_create_info.pBindings =
|
||||
&descriptor_set_layout_binding_transient;
|
||||
if (dfn.vkCreateDescriptorSetLayout(
|
||||
device, &descriptor_set_layout_create_info, nullptr,
|
||||
&descriptor_set_layouts_single_transient_[size_t(
|
||||
SingleTransientDescriptorLayout::kUniformBufferCompute)]) !=
|
||||
VK_SUCCESS) {
|
||||
XELOGE(
|
||||
"Failed to create a Vulkan descriptor set layout for a uniform buffer "
|
||||
"bound to the compute shader");
|
||||
return false;
|
||||
}
|
||||
// Transient: storage buffer for compute shaders.
|
||||
descriptor_set_layout_binding_transient.descriptorType =
|
||||
VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
|
||||
descriptor_set_layout_binding_transient.stageFlags =
|
||||
VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
if (dfn.vkCreateDescriptorSetLayout(
|
||||
device, &descriptor_set_layout_create_info, nullptr,
|
||||
&descriptor_set_layouts_single_transient_[size_t(
|
||||
@@ -4373,56 +4358,6 @@ bool VulkanCommandProcessor::UpdateBindings(const VulkanShader* vertex_shader,
|
||||
return true;
|
||||
}
|
||||
|
||||
uint8_t* VulkanCommandProcessor::WriteTransientUniformBufferBinding(
|
||||
size_t size, SingleTransientDescriptorLayout transient_descriptor_layout,
|
||||
VkDescriptorBufferInfo& descriptor_buffer_info_out,
|
||||
VkWriteDescriptorSet& write_descriptor_set_out) {
|
||||
assert_true(frame_open_);
|
||||
VkDescriptorSet descriptor_set =
|
||||
AllocateSingleTransientDescriptor(transient_descriptor_layout);
|
||||
if (descriptor_set == VK_NULL_HANDLE) {
|
||||
return nullptr;
|
||||
}
|
||||
uint8_t* mapping = uniform_buffer_pool_->Request(
|
||||
frame_current_, size,
|
||||
size_t(GetVulkanDevice()->properties().minUniformBufferOffsetAlignment),
|
||||
descriptor_buffer_info_out.buffer, descriptor_buffer_info_out.offset);
|
||||
if (!mapping) {
|
||||
return nullptr;
|
||||
}
|
||||
descriptor_buffer_info_out.range = VkDeviceSize(size);
|
||||
write_descriptor_set_out.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_out.pNext = nullptr;
|
||||
write_descriptor_set_out.dstSet = descriptor_set;
|
||||
write_descriptor_set_out.dstBinding = 0;
|
||||
write_descriptor_set_out.dstArrayElement = 0;
|
||||
write_descriptor_set_out.descriptorCount = 1;
|
||||
write_descriptor_set_out.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
write_descriptor_set_out.pImageInfo = nullptr;
|
||||
write_descriptor_set_out.pBufferInfo = &descriptor_buffer_info_out;
|
||||
write_descriptor_set_out.pTexelBufferView = nullptr;
|
||||
return mapping;
|
||||
}
|
||||
|
||||
uint8_t* VulkanCommandProcessor::WriteTransientUniformBufferBinding(
|
||||
size_t size, SingleTransientDescriptorLayout transient_descriptor_layout,
|
||||
VkDescriptorSet& descriptor_set_out) {
|
||||
VkDescriptorBufferInfo write_descriptor_buffer_info;
|
||||
VkWriteDescriptorSet write_descriptor_set;
|
||||
uint8_t* mapping = WriteTransientUniformBufferBinding(
|
||||
size, transient_descriptor_layout, write_descriptor_buffer_info,
|
||||
write_descriptor_set);
|
||||
if (!mapping) {
|
||||
return nullptr;
|
||||
}
|
||||
const ui::vulkan::VulkanDevice* const vulkan_device = GetVulkanDevice();
|
||||
const ui::vulkan::VulkanDevice::Functions& dfn = vulkan_device->functions();
|
||||
const VkDevice device = vulkan_device->device();
|
||||
dfn.vkUpdateDescriptorSets(device, 1, &write_descriptor_set, 0, nullptr);
|
||||
descriptor_set_out = write_descriptor_set.dstSet;
|
||||
return mapping;
|
||||
}
|
||||
|
||||
uint32_t VulkanCommandProcessor::WriteTransientTextureBindings(
|
||||
bool is_vertex, uint32_t texture_count, uint32_t sampler_count,
|
||||
VkDescriptorSetLayout descriptor_set_layout,
|
||||
|
||||
@@ -50,7 +50,6 @@ class VulkanCommandProcessor : public CommandProcessor {
|
||||
public:
|
||||
// Single-descriptor layouts for use within a single frame.
|
||||
enum class SingleTransientDescriptorLayout {
|
||||
kUniformBufferCompute,
|
||||
kStorageBufferCompute,
|
||||
kCount,
|
||||
};
|
||||
@@ -217,16 +216,6 @@ class VulkanCommandProcessor : public CommandProcessor {
|
||||
// A frame must be open.
|
||||
VkDescriptorSet AllocateSingleTransientDescriptor(
|
||||
SingleTransientDescriptorLayout transient_descriptor_layout);
|
||||
// Allocates a descriptor, space in the uniform buffer pool, and fills the
|
||||
// VkWriteDescriptorSet structure and VkDescriptorBufferInfo referenced by it.
|
||||
// Returns null in case of failure.
|
||||
uint8_t* WriteTransientUniformBufferBinding(
|
||||
size_t size, SingleTransientDescriptorLayout transient_descriptor_layout,
|
||||
VkDescriptorBufferInfo& descriptor_buffer_info_out,
|
||||
VkWriteDescriptorSet& write_descriptor_set_out);
|
||||
uint8_t* WriteTransientUniformBufferBinding(
|
||||
size_t size, SingleTransientDescriptorLayout transient_descriptor_layout,
|
||||
VkDescriptorSet& descriptor_set_out);
|
||||
|
||||
// The returned reference is valid until a cache clear.
|
||||
VkDescriptorSetLayout GetTextureDescriptorSetLayout(bool is_vertex,
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <utility>
|
||||
|
||||
#include "xenia/base/assert.h"
|
||||
@@ -1433,25 +1434,24 @@ bool VulkanTextureCache::LoadTextureDataFromResidentMemoryImpl(Texture& texture,
|
||||
load_constants.host_pitch = load_shader_info.bytes_per_host_block *
|
||||
level_host_layout.x_pitch_blocks;
|
||||
|
||||
command_buffer.CmdVkPushConstants(load_pipeline_layout_,
|
||||
VK_SHADER_STAGE_COMPUTE_BIT, 0,
|
||||
sizeof(load_constants), &load_constants);
|
||||
|
||||
uint32_t level_array_slice_stride_bytes_scaled =
|
||||
level_guest_layout.array_slice_stride_bytes *
|
||||
(texture_resolution_scale_x * texture_resolution_scale_y);
|
||||
for (uint32_t slice = 0; slice < array_size; ++slice) {
|
||||
VkDescriptorSet descriptor_set_constants;
|
||||
void* constants_mapping =
|
||||
command_processor_.WriteTransientUniformBufferBinding(
|
||||
sizeof(load_constants),
|
||||
VulkanCommandProcessor::SingleTransientDescriptorLayout ::
|
||||
kUniformBufferCompute,
|
||||
descriptor_set_constants);
|
||||
if (!constants_mapping) {
|
||||
return false;
|
||||
if (slice != 0) {
|
||||
command_buffer.CmdVkPushConstants(
|
||||
load_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,
|
||||
offsetof(LoadConstants, guest_offset),
|
||||
sizeof(load_constants.guest_offset), &load_constants.guest_offset);
|
||||
command_buffer.CmdVkPushConstants(
|
||||
load_pipeline_layout_, VK_SHADER_STAGE_COMPUTE_BIT,
|
||||
offsetof(LoadConstants, host_offset),
|
||||
sizeof(load_constants.host_offset), &load_constants.host_offset);
|
||||
}
|
||||
std::memcpy(constants_mapping, &load_constants, sizeof(load_constants));
|
||||
command_buffer.CmdVkBindDescriptorSets(
|
||||
VK_PIPELINE_BIND_POINT_COMPUTE, load_pipeline_layout_,
|
||||
kLoadDescriptorSetIndexConstants, 1, &descriptor_set_constants, 0,
|
||||
nullptr);
|
||||
command_processor_.SubmitBarriers(true);
|
||||
command_buffer.CmdVkDispatch(group_count_x, group_count_y,
|
||||
load_constants.size_blocks[2]);
|
||||
@@ -2102,12 +2102,11 @@ bool VulkanTextureCache::Initialize() {
|
||||
load_descriptor_set_layout_storage_buffer;
|
||||
load_descriptor_set_layouts[kLoadDescriptorSetIndexSource] =
|
||||
load_descriptor_set_layout_storage_buffer;
|
||||
load_descriptor_set_layouts[kLoadDescriptorSetIndexConstants] =
|
||||
command_processor_.GetSingleTransientDescriptorLayout(
|
||||
VulkanCommandProcessor::SingleTransientDescriptorLayout ::
|
||||
kUniformBufferCompute);
|
||||
assert_true(load_descriptor_set_layouts[kLoadDescriptorSetIndexConstants] !=
|
||||
VK_NULL_HANDLE);
|
||||
VkPushConstantRange load_pipeline_layout_push_constant_range;
|
||||
load_pipeline_layout_push_constant_range.stageFlags =
|
||||
VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
load_pipeline_layout_push_constant_range.offset = 0;
|
||||
load_pipeline_layout_push_constant_range.size = sizeof(LoadConstants);
|
||||
VkPipelineLayoutCreateInfo load_pipeline_layout_create_info;
|
||||
load_pipeline_layout_create_info.sType =
|
||||
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
|
||||
@@ -2115,8 +2114,9 @@ bool VulkanTextureCache::Initialize() {
|
||||
load_pipeline_layout_create_info.flags = 0;
|
||||
load_pipeline_layout_create_info.setLayoutCount = kLoadDescriptorSetCount;
|
||||
load_pipeline_layout_create_info.pSetLayouts = load_descriptor_set_layouts;
|
||||
load_pipeline_layout_create_info.pushConstantRangeCount = 0;
|
||||
load_pipeline_layout_create_info.pPushConstantRanges = nullptr;
|
||||
load_pipeline_layout_create_info.pushConstantRangeCount = 1;
|
||||
load_pipeline_layout_create_info.pPushConstantRanges =
|
||||
&load_pipeline_layout_push_constant_range;
|
||||
if (dfn.vkCreatePipelineLayout(device, &load_pipeline_layout_create_info,
|
||||
nullptr, &load_pipeline_layout_)) {
|
||||
XELOGE("VulkanTexture: Failed to create the texture load pipeline layout");
|
||||
|
||||
@@ -141,7 +141,6 @@ class VulkanTextureCache final : public TextureCache {
|
||||
enum LoadDescriptorSetIndex {
|
||||
kLoadDescriptorSetIndexDestination,
|
||||
kLoadDescriptorSetIndexSource,
|
||||
kLoadDescriptorSetIndexConstants,
|
||||
kLoadDescriptorSetCount,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user