mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-04-27 20:09:01 +02:00
[vk] BufferCache NullBuffer handling [POSSIBLE REVERT]
This commit is contained in:
parent
6bb2cdcf06
commit
ce48db0c7b
2 changed files with 36 additions and 8 deletions
|
|
@ -665,22 +665,41 @@ void BufferCacheRuntime::ReserveNullBuffer() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VkBufferUsageFlags BufferCacheRuntime::NullBufferUsageFlags() const {
|
||||||
|
VkBufferUsageFlags usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
|
||||||
|
VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
|
||||||
|
VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
|
||||||
|
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
|
||||||
|
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
|
||||||
|
VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
|
||||||
|
if (device.IsExtTransformFeedbackSupported()) {
|
||||||
|
usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
|
||||||
|
}
|
||||||
|
return usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BufferCacheRuntime::RefreshNullBuffer() {
|
||||||
|
if (!null_buffer) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
scheduler.Finish();
|
||||||
|
null_buffer.reset();
|
||||||
|
null_buffer = CreateNullBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
vk::Buffer BufferCacheRuntime::CreateNullBuffer() {
|
vk::Buffer BufferCacheRuntime::CreateNullBuffer() {
|
||||||
VkBufferCreateInfo create_info{
|
VkBufferCreateInfo create_info{
|
||||||
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.size = 4,
|
.size = 4,
|
||||||
.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
|
.usage = NullBufferUsageFlags(),
|
||||||
VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT,
|
|
||||||
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
.sharingMode = VK_SHARING_MODE_EXCLUSIVE,
|
||||||
.queueFamilyIndexCount = 0,
|
.queueFamilyIndexCount = 0,
|
||||||
.pQueueFamilyIndices = nullptr,
|
.pQueueFamilyIndices = nullptr,
|
||||||
};
|
};
|
||||||
if (device.IsExtTransformFeedbackSupported()) {
|
|
||||||
create_info.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
|
|
||||||
}
|
|
||||||
vk::Buffer ret = memory_allocator.CreateBuffer(create_info, MemoryUsage::DeviceLocal);
|
vk::Buffer ret = memory_allocator.CreateBuffer(create_info, MemoryUsage::DeviceLocal);
|
||||||
|
null_buffer_usage_flags = create_info.usage;
|
||||||
if (device.HasDebuggingToolAttached()) {
|
if (device.HasDebuggingToolAttached()) {
|
||||||
ret.SetObjectNameEXT("Null buffer");
|
ret.SetObjectNameEXT("Null buffer");
|
||||||
}
|
}
|
||||||
|
|
@ -691,6 +710,10 @@ vk::Buffer BufferCacheRuntime::CreateNullBuffer() {
|
||||||
});
|
});
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
const VkBufferUsageFlags expected_usage = NullBufferUsageFlags();
|
||||||
|
if (null_buffer && null_buffer_usage_flags != expected_usage) {
|
||||||
} // namespace Vulkan
|
RefreshNullBuffer();
|
||||||
|
}
|
||||||
|
if (!null_buffer) {
|
||||||
|
null_buffer = CreateNullBuffer();
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,9 @@ public:
|
||||||
|
|
||||||
void BindTransformFeedbackBuffers(VideoCommon::HostBindings<Buffer>& bindings);
|
void BindTransformFeedbackBuffers(VideoCommon::HostBindings<Buffer>& bindings);
|
||||||
|
|
||||||
|
/// Forces destruction and recreation of the shared null buffer so new usage flags take effect.
|
||||||
|
void RefreshNullBuffer();
|
||||||
|
|
||||||
std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage,
|
std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage,
|
||||||
[[maybe_unused]] u32 binding_index,
|
[[maybe_unused]] u32 binding_index,
|
||||||
u32 size) {
|
u32 size) {
|
||||||
|
|
@ -168,6 +171,7 @@ private:
|
||||||
|
|
||||||
void ReserveNullBuffer();
|
void ReserveNullBuffer();
|
||||||
vk::Buffer CreateNullBuffer();
|
vk::Buffer CreateNullBuffer();
|
||||||
|
VkBufferUsageFlags NullBufferUsageFlags() const;
|
||||||
|
|
||||||
const Device& device;
|
const Device& device;
|
||||||
MemoryAllocator& memory_allocator;
|
MemoryAllocator& memory_allocator;
|
||||||
|
|
@ -179,6 +183,7 @@ private:
|
||||||
std::shared_ptr<QuadStripIndexBuffer> quad_strip_index_buffer;
|
std::shared_ptr<QuadStripIndexBuffer> quad_strip_index_buffer;
|
||||||
|
|
||||||
vk::Buffer null_buffer;
|
vk::Buffer null_buffer;
|
||||||
|
VkBufferUsageFlags null_buffer_usage_flags = 0;
|
||||||
|
|
||||||
std::unique_ptr<Uint8Pass> uint8_pass;
|
std::unique_ptr<Uint8Pass> uint8_pass;
|
||||||
QuadIndexedPass quad_index_pass;
|
QuadIndexedPass quad_index_pass;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue