mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-04 23:28:45 +00:00
regression fixes
This commit is contained in:
parent
9a5ada4138
commit
d0e6ce6918
5 changed files with 24 additions and 19 deletions
|
@ -613,12 +613,13 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, VAddr device_addr,
|
||||||
});
|
});
|
||||||
total_size += mip_size * num_layers;
|
total_size += mip_size * num_layers;
|
||||||
}
|
}
|
||||||
ASSERT(!copies.empty()); // If triggered, need to find which layers fit
|
if (!copies.empty()) {
|
||||||
scheduler.EndRendering();
|
scheduler.EndRendering();
|
||||||
image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {});
|
image.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {});
|
||||||
const auto cmdbuf = scheduler.CommandBuffer();
|
const auto cmdbuf = scheduler.CommandBuffer();
|
||||||
cmdbuf.copyImageToBuffer(image.image, vk::ImageLayout::eTransferSrcOptimal, buffer.buffer,
|
cmdbuf.copyImageToBuffer(image.image, vk::ImageLayout::eTransferSrcOptimal, buffer.buffer,
|
||||||
copies);
|
copies);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -109,12 +109,13 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache,
|
||||||
// Bind resource buffers and textures.
|
// Bind resource buffers and textures.
|
||||||
boost::container::static_vector<vk::BufferView, 8> buffer_views;
|
boost::container::static_vector<vk::BufferView, 8> buffer_views;
|
||||||
boost::container::static_vector<vk::DescriptorBufferInfo, 32> buffer_infos;
|
boost::container::static_vector<vk::DescriptorBufferInfo, 32> buffer_infos;
|
||||||
boost::container::static_vector<vk::DescriptorImageInfo, 32> image_infos;
|
|
||||||
boost::container::small_vector<vk::WriteDescriptorSet, 16> set_writes;
|
boost::container::small_vector<vk::WriteDescriptorSet, 16> set_writes;
|
||||||
boost::container::small_vector<vk::BufferMemoryBarrier2, 16> buffer_barriers;
|
boost::container::small_vector<vk::BufferMemoryBarrier2, 16> buffer_barriers;
|
||||||
Shader::PushData push_data{};
|
Shader::PushData push_data{};
|
||||||
u32 binding{};
|
u32 binding{};
|
||||||
|
|
||||||
|
image_infos.clear();
|
||||||
|
|
||||||
for (const auto& desc : info->buffers) {
|
for (const auto& desc : info->buffers) {
|
||||||
bool is_storage = true;
|
bool is_storage = true;
|
||||||
if (desc.is_gds_buffer) {
|
if (desc.is_gds_buffer) {
|
||||||
|
|
|
@ -41,8 +41,8 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
|
||||||
};
|
};
|
||||||
pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
|
pipeline_layout = instance.GetDevice().createPipelineLayoutUnique(layout_info);
|
||||||
|
|
||||||
boost::container::static_vector<vk::VertexInputBindingDescription, 32> bindings;
|
boost::container::static_vector<vk::VertexInputBindingDescription, 32> vertex_bindings;
|
||||||
boost::container::static_vector<vk::VertexInputAttributeDescription, 32> attributes;
|
boost::container::static_vector<vk::VertexInputAttributeDescription, 32> vertex_attributes;
|
||||||
const auto& vs_info = stages[u32(Shader::Stage::Vertex)];
|
const auto& vs_info = stages[u32(Shader::Stage::Vertex)];
|
||||||
for (const auto& input : vs_info->vs_inputs) {
|
for (const auto& input : vs_info->vs_inputs) {
|
||||||
if (input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate0 ||
|
if (input.instance_step_rate == Shader::Info::VsInput::InstanceIdType::OverStepRate0 ||
|
||||||
|
@ -52,13 +52,13 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto buffer = vs_info->ReadUd<AmdGpu::Buffer>(input.sgpr_base, input.dword_offset);
|
const auto buffer = vs_info->ReadUd<AmdGpu::Buffer>(input.sgpr_base, input.dword_offset);
|
||||||
attributes.push_back({
|
vertex_attributes.push_back({
|
||||||
.location = input.binding,
|
.location = input.binding,
|
||||||
.binding = input.binding,
|
.binding = input.binding,
|
||||||
.format = LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()),
|
.format = LiverpoolToVK::SurfaceFormat(buffer.GetDataFmt(), buffer.GetNumberFmt()),
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
});
|
});
|
||||||
bindings.push_back({
|
vertex_bindings.push_back({
|
||||||
.binding = input.binding,
|
.binding = input.binding,
|
||||||
.stride = buffer.GetStride(),
|
.stride = buffer.GetStride(),
|
||||||
.inputRate = input.instance_step_rate == Shader::Info::VsInput::None
|
.inputRate = input.instance_step_rate == Shader::Info::VsInput::None
|
||||||
|
@ -68,10 +68,10 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
|
||||||
}
|
}
|
||||||
|
|
||||||
const vk::PipelineVertexInputStateCreateInfo vertex_input_info = {
|
const vk::PipelineVertexInputStateCreateInfo vertex_input_info = {
|
||||||
.vertexBindingDescriptionCount = static_cast<u32>(bindings.size()),
|
.vertexBindingDescriptionCount = static_cast<u32>(vertex_bindings.size()),
|
||||||
.pVertexBindingDescriptions = bindings.data(),
|
.pVertexBindingDescriptions = vertex_bindings.data(),
|
||||||
.vertexAttributeDescriptionCount = static_cast<u32>(attributes.size()),
|
.vertexAttributeDescriptionCount = static_cast<u32>(vertex_attributes.size()),
|
||||||
.pVertexAttributeDescriptions = attributes.data(),
|
.pVertexAttributeDescriptions = vertex_attributes.data(),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (key.prim_type == Liverpool::PrimitiveType::RectList && !IsEmbeddedVs()) {
|
if (key.prim_type == Liverpool::PrimitiveType::RectList && !IsEmbeddedVs()) {
|
||||||
|
@ -291,8 +291,9 @@ GraphicsPipeline::GraphicsPipeline(const Instance& instance_, Scheduler& schedul
|
||||||
GraphicsPipeline::~GraphicsPipeline() = default;
|
GraphicsPipeline::~GraphicsPipeline() = default;
|
||||||
|
|
||||||
void GraphicsPipeline::BuildDescSetLayout() {
|
void GraphicsPipeline::BuildDescSetLayout() {
|
||||||
u32 binding{};
|
|
||||||
boost::container::small_vector<vk::DescriptorSetLayoutBinding, 32> bindings;
|
boost::container::small_vector<vk::DescriptorSetLayoutBinding, 32> bindings;
|
||||||
|
u32 binding{};
|
||||||
|
|
||||||
for (const auto* stage : stages) {
|
for (const auto* stage : stages) {
|
||||||
if (!stage) {
|
if (!stage) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -352,12 +353,13 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
|
||||||
// Bind resource buffers and textures.
|
// Bind resource buffers and textures.
|
||||||
boost::container::static_vector<vk::BufferView, 8> buffer_views;
|
boost::container::static_vector<vk::BufferView, 8> buffer_views;
|
||||||
boost::container::static_vector<vk::DescriptorBufferInfo, 32> buffer_infos;
|
boost::container::static_vector<vk::DescriptorBufferInfo, 32> buffer_infos;
|
||||||
boost::container::static_vector<vk::DescriptorImageInfo, 32> image_infos;
|
|
||||||
boost::container::small_vector<vk::WriteDescriptorSet, 16> set_writes;
|
boost::container::small_vector<vk::WriteDescriptorSet, 16> set_writes;
|
||||||
boost::container::small_vector<vk::BufferMemoryBarrier2, 16> buffer_barriers;
|
boost::container::small_vector<vk::BufferMemoryBarrier2, 16> buffer_barriers;
|
||||||
Shader::PushData push_data{};
|
Shader::PushData push_data{};
|
||||||
u32 binding{};
|
u32 binding{};
|
||||||
|
|
||||||
|
image_infos.clear();
|
||||||
|
|
||||||
for (const auto* stage : stages) {
|
for (const auto* stage : stages) {
|
||||||
if (!stage) {
|
if (!stage) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
|
||||||
|
boost::container::static_vector<vk::DescriptorImageInfo, 32> Pipeline::image_infos;
|
||||||
|
|
||||||
Pipeline::Pipeline(const Instance& instance_, Scheduler& scheduler_, DescriptorHeap& desc_heap_,
|
Pipeline::Pipeline(const Instance& instance_, Scheduler& scheduler_, DescriptorHeap& desc_heap_,
|
||||||
vk::PipelineCache pipeline_cache)
|
vk::PipelineCache pipeline_cache)
|
||||||
: instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_} {}
|
: instance{instance_}, scheduler{scheduler_}, desc_heap{desc_heap_} {}
|
||||||
|
@ -18,8 +20,6 @@ Pipeline::~Pipeline() = default;
|
||||||
|
|
||||||
void Pipeline::BindTextures(VideoCore::TextureCache& texture_cache, const Shader::Info& stage,
|
void Pipeline::BindTextures(VideoCore::TextureCache& texture_cache, const Shader::Info& stage,
|
||||||
u32& binding, DescriptorWrites& set_writes) const {
|
u32& binding, DescriptorWrites& set_writes) const {
|
||||||
static boost::container::static_vector<vk::DescriptorImageInfo, 32> image_infos;
|
|
||||||
image_infos.clear();
|
|
||||||
|
|
||||||
using ImageBindingInfo = std::tuple<VideoCore::ImageId, AmdGpu::Image, bool>;
|
using ImageBindingInfo = std::tuple<VideoCore::ImageId, AmdGpu::Image, bool>;
|
||||||
boost::container::static_vector<ImageBindingInfo, 32> image_bindings;
|
boost::container::static_vector<ImageBindingInfo, 32> image_bindings;
|
||||||
|
|
|
@ -42,6 +42,7 @@ protected:
|
||||||
vk::UniquePipeline pipeline;
|
vk::UniquePipeline pipeline;
|
||||||
vk::UniquePipelineLayout pipeline_layout;
|
vk::UniquePipelineLayout pipeline_layout;
|
||||||
vk::UniqueDescriptorSetLayout desc_layout;
|
vk::UniqueDescriptorSetLayout desc_layout;
|
||||||
|
static boost::container::static_vector<vk::DescriptorImageInfo, 32> image_infos;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue