mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-05-14 08:12:16 +00:00
vulkan: Use view of null buffer for texel buffers if nullDescriptor not supported. (#1231)
This commit is contained in:
parent
2a7d56dbf2
commit
60092ce849
4 changed files with 22 additions and 2 deletions
|
@ -36,6 +36,17 @@ BufferCache::BufferCache(const Vulkan::Instance& instance_, Vulkan::Scheduler& s
|
||||||
ASSERT(null_id.index == 0);
|
ASSERT(null_id.index == 0);
|
||||||
const vk::Buffer& null_buffer = slot_buffers[null_id].buffer;
|
const vk::Buffer& null_buffer = slot_buffers[null_id].buffer;
|
||||||
Vulkan::SetObjectName(instance.GetDevice(), null_buffer, "Null Buffer");
|
Vulkan::SetObjectName(instance.GetDevice(), null_buffer, "Null Buffer");
|
||||||
|
|
||||||
|
const vk::BufferViewCreateInfo null_view_ci = {
|
||||||
|
.buffer = null_buffer,
|
||||||
|
.format = vk::Format::eR8Unorm,
|
||||||
|
.offset = 0,
|
||||||
|
.range = VK_WHOLE_SIZE,
|
||||||
|
};
|
||||||
|
const auto [null_view_result, null_view] = instance.GetDevice().createBufferView(null_view_ci);
|
||||||
|
ASSERT_MSG(null_view_result == vk::Result::eSuccess, "Failed to create null buffer view.");
|
||||||
|
null_buffer_view = null_view;
|
||||||
|
Vulkan::SetObjectName(instance.GetDevice(), null_buffer_view, "Null Buffer View");
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferCache::~BufferCache() = default;
|
BufferCache::~BufferCache() = default;
|
||||||
|
|
|
@ -67,6 +67,10 @@ public:
|
||||||
return slot_buffers[id];
|
return slot_buffers[id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] vk::BufferView& NullBufferView() {
|
||||||
|
return null_buffer_view;
|
||||||
|
}
|
||||||
|
|
||||||
/// Invalidates any buffer in the logical page range.
|
/// Invalidates any buffer in the logical page range.
|
||||||
void InvalidateMemory(VAddr device_addr, u64 size);
|
void InvalidateMemory(VAddr device_addr, u64 size);
|
||||||
|
|
||||||
|
@ -146,6 +150,7 @@ private:
|
||||||
Buffer gds_buffer;
|
Buffer gds_buffer;
|
||||||
std::mutex mutex;
|
std::mutex mutex;
|
||||||
Common::SlotVector<Buffer> slot_buffers;
|
Common::SlotVector<Buffer> slot_buffers;
|
||||||
|
vk::BufferView null_buffer_view;
|
||||||
MemoryTracker memory_tracker;
|
MemoryTracker memory_tracker;
|
||||||
PageTable page_table;
|
PageTable page_table;
|
||||||
};
|
};
|
||||||
|
|
|
@ -170,9 +170,11 @@ bool ComputePipeline::BindResources(VideoCore::BufferCache& buffer_cache,
|
||||||
++binding.buffer;
|
++binding.buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto null_buffer_view =
|
||||||
|
instance.IsNullDescriptorSupported() ? VK_NULL_HANDLE : buffer_cache.NullBufferView();
|
||||||
for (const auto& desc : info->texture_buffers) {
|
for (const auto& desc : info->texture_buffers) {
|
||||||
const auto vsharp = desc.GetSharp(*info);
|
const auto vsharp = desc.GetSharp(*info);
|
||||||
vk::BufferView& buffer_view = buffer_views.emplace_back(VK_NULL_HANDLE);
|
vk::BufferView& buffer_view = buffer_views.emplace_back(null_buffer_view);
|
||||||
const u32 size = vsharp.GetSize();
|
const u32 size = vsharp.GetSize();
|
||||||
if (vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && size != 0) {
|
if (vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && size != 0) {
|
||||||
const VAddr address = vsharp.base_address;
|
const VAddr address = vsharp.base_address;
|
||||||
|
|
|
@ -438,9 +438,11 @@ void GraphicsPipeline::BindResources(const Liverpool::Regs& regs,
|
||||||
++binding.buffer;
|
++binding.buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto null_buffer_view =
|
||||||
|
instance.IsNullDescriptorSupported() ? VK_NULL_HANDLE : buffer_cache.NullBufferView();
|
||||||
for (const auto& desc : stage->texture_buffers) {
|
for (const auto& desc : stage->texture_buffers) {
|
||||||
const auto vsharp = desc.GetSharp(*stage);
|
const auto vsharp = desc.GetSharp(*stage);
|
||||||
vk::BufferView& buffer_view = buffer_views.emplace_back(VK_NULL_HANDLE);
|
vk::BufferView& buffer_view = buffer_views.emplace_back(null_buffer_view);
|
||||||
const u32 size = vsharp.GetSize();
|
const u32 size = vsharp.GetSize();
|
||||||
if (vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && size != 0) {
|
if (vsharp.GetDataFmt() != AmdGpu::DataFormat::FormatInvalid && size != 0) {
|
||||||
const VAddr address = vsharp.base_address;
|
const VAddr address = vsharp.base_address;
|
||||||
|
|
Loading…
Add table
Reference in a new issue