2019-02-28 04:49:28 +01:00
|
|
|
// Copyright 2019 yuzu Emulator Project
|
|
|
|
// Licensed under GPLv2 or any later version
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
|
|
|
#pragma once
|
2020-01-06 21:59:20 +01:00
|
|
|
|
|
|
|
#include "video_core/buffer_cache/buffer_cache.h"
|
2021-01-17 00:48:58 +01:00
|
|
|
#include "video_core/engines/maxwell_3d.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_compute_pass.h"
|
2020-01-06 21:59:20 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_staging_buffer_pool.h"
|
2021-01-19 01:35:47 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_update_descriptor.h"
|
2021-04-07 01:14:55 +02:00
|
|
|
#include "video_core/surface.h"
|
2021-01-03 22:17:57 +01:00
|
|
|
#include "video_core/vulkan_common/vulkan_memory_allocator.h"
|
2020-12-25 01:30:11 +01:00
|
|
|
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
2020-01-06 21:59:20 +01:00
|
|
|
|
|
|
|
namespace Vulkan {
|
|
|
|
|
2020-12-26 05:10:53 +01:00
|
|
|
class Device;
|
2021-04-25 05:15:32 +02:00
|
|
|
class DescriptorPool;
|
2020-01-06 21:59:20 +01:00
|
|
|
class VKScheduler;
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
class BufferCacheRuntime;
|
2020-06-20 01:47:48 +02:00
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
class Buffer : public VideoCommon::BufferBase<VideoCore::RasterizerInterface> {
|
|
|
|
public:
|
|
|
|
explicit Buffer(BufferCacheRuntime&, VideoCommon::NullBufferParams null_params);
|
|
|
|
explicit Buffer(BufferCacheRuntime& runtime, VideoCore::RasterizerInterface& rasterizer_,
|
|
|
|
VAddr cpu_addr_, u64 size_bytes_);
|
2020-06-20 01:47:48 +02:00
|
|
|
|
2021-04-07 01:14:55 +02:00
|
|
|
[[nodiscard]] VkBufferView View(u32 offset, u32 size, VideoCore::Surface::PixelFormat format);
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
[[nodiscard]] VkBuffer Handle() const noexcept {
|
2020-12-31 02:58:05 +01:00
|
|
|
return *buffer;
|
2020-01-06 21:59:20 +01:00
|
|
|
}
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
operator VkBuffer() const noexcept {
|
|
|
|
return *buffer;
|
2020-05-11 21:35:04 +02:00
|
|
|
}
|
|
|
|
|
2020-01-06 21:59:20 +01:00
|
|
|
private:
|
2021-04-07 01:14:55 +02:00
|
|
|
struct BufferView {
|
|
|
|
u32 offset;
|
|
|
|
u32 size;
|
|
|
|
VideoCore::Surface::PixelFormat format;
|
|
|
|
vk::BufferView handle;
|
|
|
|
};
|
|
|
|
|
|
|
|
const Device* device{};
|
2020-12-31 02:58:05 +01:00
|
|
|
vk::Buffer buffer;
|
|
|
|
MemoryCommit commit;
|
2021-04-07 01:14:55 +02:00
|
|
|
std::vector<BufferView> views;
|
2020-01-06 21:59:20 +01:00
|
|
|
};
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
class BufferCacheRuntime {
|
|
|
|
friend Buffer;
|
|
|
|
|
|
|
|
using PrimitiveTopology = Tegra::Engines::Maxwell3D::Regs::PrimitiveTopology;
|
|
|
|
using IndexFormat = Tegra::Engines::Maxwell3D::Regs::IndexFormat;
|
|
|
|
|
2020-01-06 21:59:20 +01:00
|
|
|
public:
|
2021-01-17 00:48:58 +01:00
|
|
|
explicit BufferCacheRuntime(const Device& device_, MemoryAllocator& memory_manager_,
|
|
|
|
VKScheduler& scheduler_, StagingBufferPool& staging_pool_,
|
|
|
|
VKUpdateDescriptorQueue& update_descriptor_queue_,
|
2021-04-25 05:15:32 +02:00
|
|
|
DescriptorPool& descriptor_pool);
|
2021-01-17 00:48:58 +01:00
|
|
|
|
|
|
|
void Finish();
|
|
|
|
|
|
|
|
[[nodiscard]] StagingBufferRef UploadStagingBuffer(size_t size);
|
|
|
|
|
|
|
|
[[nodiscard]] StagingBufferRef DownloadStagingBuffer(size_t size);
|
2020-01-06 21:59:20 +01:00
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
void CopyBuffer(VkBuffer src_buffer, VkBuffer dst_buffer,
|
|
|
|
std::span<const VideoCommon::BufferCopy> copies);
|
2020-01-06 21:59:20 +01:00
|
|
|
|
2021-07-13 03:33:08 +02:00
|
|
|
void ClearBuffer(VkBuffer dest_buffer, u32 offset, size_t size, u32 value);
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
void BindIndexBuffer(PrimitiveTopology topology, IndexFormat index_format, u32 num_indices,
|
|
|
|
u32 base_vertex, VkBuffer buffer, u32 offset, u32 size);
|
|
|
|
|
|
|
|
void BindQuadArrayIndexBuffer(u32 first, u32 count);
|
|
|
|
|
|
|
|
void BindVertexBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size, u32 stride);
|
|
|
|
|
|
|
|
void BindTransformFeedbackBuffer(u32 index, VkBuffer buffer, u32 offset, u32 size);
|
|
|
|
|
2021-01-17 07:16:15 +01:00
|
|
|
std::span<u8> BindMappedUniformBuffer([[maybe_unused]] size_t stage,
|
|
|
|
[[maybe_unused]] u32 binding_index, u32 size) {
|
|
|
|
const StagingBufferRef ref = staging_pool.Request(size, MemoryUsage::Upload);
|
|
|
|
BindBuffer(ref.buffer, static_cast<u32>(ref.offset), size);
|
|
|
|
return ref.mapped_span;
|
|
|
|
}
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
void BindUniformBuffer(VkBuffer buffer, u32 offset, u32 size) {
|
|
|
|
BindBuffer(buffer, offset, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BindStorageBuffer(VkBuffer buffer, u32 offset, u32 size,
|
|
|
|
[[maybe_unused]] bool is_written) {
|
|
|
|
BindBuffer(buffer, offset, size);
|
|
|
|
}
|
2020-01-06 21:59:20 +01:00
|
|
|
|
2021-04-07 01:14:55 +02:00
|
|
|
void BindTextureBuffer(Buffer& buffer, u32 offset, u32 size,
|
|
|
|
VideoCore::Surface::PixelFormat format) {
|
|
|
|
update_descriptor_queue.AddTexelBuffer(buffer.View(offset, size, format));
|
|
|
|
}
|
|
|
|
|
2020-01-06 21:59:20 +01:00
|
|
|
private:
|
2021-01-19 01:35:47 +01:00
|
|
|
void BindBuffer(VkBuffer buffer, u32 offset, u32 size) {
|
|
|
|
update_descriptor_queue.AddBuffer(buffer, offset, size);
|
|
|
|
}
|
2021-01-17 00:48:58 +01:00
|
|
|
|
|
|
|
void ReserveQuadArrayLUT(u32 num_indices, bool wait_for_idle);
|
|
|
|
|
2021-07-09 06:27:47 +02:00
|
|
|
void ReserveNullBuffer();
|
2021-01-23 21:15:42 +01:00
|
|
|
|
2020-12-26 05:10:53 +01:00
|
|
|
const Device& device;
|
2021-01-03 22:11:01 +01:00
|
|
|
MemoryAllocator& memory_allocator;
|
2020-01-06 21:59:20 +01:00
|
|
|
VKScheduler& scheduler;
|
2020-12-31 02:58:05 +01:00
|
|
|
StagingBufferPool& staging_pool;
|
2021-01-17 00:48:58 +01:00
|
|
|
VKUpdateDescriptorQueue& update_descriptor_queue;
|
|
|
|
|
|
|
|
vk::Buffer quad_array_lut;
|
|
|
|
MemoryCommit quad_array_lut_commit;
|
|
|
|
VkIndexType quad_array_lut_index_type{};
|
|
|
|
u32 current_num_indices = 0;
|
|
|
|
|
2021-07-09 06:27:47 +02:00
|
|
|
vk::Buffer null_buffer;
|
|
|
|
MemoryCommit null_buffer_commit;
|
2021-01-23 21:15:42 +01:00
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
Uint8Pass uint8_pass;
|
|
|
|
QuadIndexedPass quad_index_pass;
|
2020-01-06 21:59:20 +01:00
|
|
|
};
|
|
|
|
|
2021-01-17 00:48:58 +01:00
|
|
|
struct BufferCacheParams {
|
|
|
|
using Runtime = Vulkan::BufferCacheRuntime;
|
|
|
|
using Buffer = Vulkan::Buffer;
|
|
|
|
|
|
|
|
static constexpr bool IS_OPENGL = false;
|
|
|
|
static constexpr bool HAS_PERSISTENT_UNIFORM_BUFFER_BINDINGS = false;
|
|
|
|
static constexpr bool HAS_FULL_INDEX_AND_PRIMITIVE_SUPPORT = false;
|
|
|
|
static constexpr bool NEEDS_BIND_UNIFORM_INDEX = false;
|
|
|
|
static constexpr bool NEEDS_BIND_STORAGE_INDEX = false;
|
|
|
|
static constexpr bool USE_MEMORY_MAPS = true;
|
2021-05-23 09:28:34 +02:00
|
|
|
static constexpr bool SEPARATE_IMAGE_BUFFER_BINDINGS = false;
|
2021-01-17 00:48:58 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
using BufferCache = VideoCommon::BufferCache<BufferCacheParams>;
|
|
|
|
|
2020-01-06 21:59:20 +01:00
|
|
|
} // namespace Vulkan
|