early-access version 3578
This commit is contained in:
parent
558c004537
commit
3cd90f3a33
@ -1,7 +1,7 @@
|
|||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 3577.
|
This is the source code for early-access 3578.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
@ -96,12 +96,12 @@ void BufferCache<P>::TickFrame() {
|
|||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
void BufferCache<P>::WriteMemory(VAddr cpu_addr, u64 size) {
|
void BufferCache<P>::WriteMemory(VAddr cpu_addr, u64 size) {
|
||||||
memory_tracker.MarkRegionAsCpuModified(cpu_addr, size);
|
|
||||||
if (memory_tracker.IsRegionGpuModified(cpu_addr, size)) {
|
if (memory_tracker.IsRegionGpuModified(cpu_addr, size)) {
|
||||||
const IntervalType subtract_interval{cpu_addr, cpu_addr + size};
|
const IntervalType subtract_interval{cpu_addr, cpu_addr + size};
|
||||||
ClearDownload(subtract_interval);
|
ClearDownload(subtract_interval);
|
||||||
common_ranges.subtract(subtract_interval);
|
common_ranges.subtract(subtract_interval);
|
||||||
}
|
}
|
||||||
|
memory_tracker.MarkRegionAsCpuModified(cpu_addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
@ -122,9 +122,10 @@ std::optional<VideoCore::RasterizerDownloadArea> BufferCache<P>::GetFlushArea(VA
|
|||||||
area->preemtive = true;
|
area->preemtive = true;
|
||||||
return area;
|
return area;
|
||||||
};
|
};
|
||||||
|
area->preemtive =
|
||||||
|
!IsRegionGpuModified(cpu_addr_start_aligned, cpu_addr_end_aligned - cpu_addr_start_aligned);
|
||||||
memory_tracker.MarkRegionAsPreflushable(cpu_addr_start_aligned,
|
memory_tracker.MarkRegionAsPreflushable(cpu_addr_start_aligned,
|
||||||
cpu_addr_end_aligned - cpu_addr_start_aligned);
|
cpu_addr_end_aligned - cpu_addr_start_aligned);
|
||||||
area->preemtive = !IsRegionGpuModified(cpu_addr, size);
|
|
||||||
return area;
|
return area;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1223,11 +1224,10 @@ void BufferCache<P>::UpdateComputeTextureBuffers() {
|
|||||||
|
|
||||||
template <class P>
|
template <class P>
|
||||||
void BufferCache<P>::MarkWrittenBuffer(BufferId buffer_id, VAddr cpu_addr, u32 size) {
|
void BufferCache<P>::MarkWrittenBuffer(BufferId buffer_id, VAddr cpu_addr, u32 size) {
|
||||||
memory_tracker.MarkRegionAsGpuModified(cpu_addr, size);
|
|
||||||
|
|
||||||
if (memory_tracker.IsRegionCpuModified(cpu_addr, size)) {
|
if (memory_tracker.IsRegionCpuModified(cpu_addr, size)) {
|
||||||
SynchronizeBuffer(slot_buffers[buffer_id], cpu_addr, size);
|
SynchronizeBuffer(slot_buffers[buffer_id], cpu_addr, size);
|
||||||
}
|
}
|
||||||
|
memory_tracker.MarkRegionAsGpuModified(cpu_addr, size);
|
||||||
|
|
||||||
const IntervalType base_interval{cpu_addr, cpu_addr + size};
|
const IntervalType base_interval{cpu_addr, cpu_addr + size};
|
||||||
common_ranges.add(base_interval);
|
common_ranges.add(base_interval);
|
||||||
|
@ -176,7 +176,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline void PushImageDescriptors(TextureCache& texture_cache,
|
inline void PushImageDescriptors(TextureCache& texture_cache,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue,
|
GuestDescriptorQueue& guest_descriptor_queue,
|
||||||
const Shader::Info& info, RescalingPushConstant& rescaling,
|
const Shader::Info& info, RescalingPushConstant& rescaling,
|
||||||
const VkSampler*& samplers,
|
const VkSampler*& samplers,
|
||||||
const VideoCommon::ImageViewInOut*& views) {
|
const VideoCommon::ImageViewInOut*& views) {
|
||||||
@ -190,7 +190,7 @@ inline void PushImageDescriptors(TextureCache& texture_cache,
|
|||||||
const VkSampler sampler{*(samplers++)};
|
const VkSampler sampler{*(samplers++)};
|
||||||
ImageView& image_view{texture_cache.GetImageView(image_view_id)};
|
ImageView& image_view{texture_cache.GetImageView(image_view_id)};
|
||||||
const VkImageView vk_image_view{image_view.Handle(desc.type)};
|
const VkImageView vk_image_view{image_view.Handle(desc.type)};
|
||||||
update_descriptor_queue.AddSampledImage(vk_image_view, sampler);
|
guest_descriptor_queue.AddSampledImage(vk_image_view, sampler);
|
||||||
rescaling.PushTexture(texture_cache.IsRescaling(image_view));
|
rescaling.PushTexture(texture_cache.IsRescaling(image_view));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -201,7 +201,7 @@ inline void PushImageDescriptors(TextureCache& texture_cache,
|
|||||||
texture_cache.MarkModification(image_view.image_id);
|
texture_cache.MarkModification(image_view.image_id);
|
||||||
}
|
}
|
||||||
const VkImageView vk_image_view{image_view.StorageView(desc.type, desc.format)};
|
const VkImageView vk_image_view{image_view.StorageView(desc.type, desc.format)};
|
||||||
update_descriptor_queue.AddImage(vk_image_view);
|
guest_descriptor_queue.AddImage(vk_image_view);
|
||||||
rescaling.PushImage(texture_cache.IsRescaling(image_view));
|
rescaling.PushImage(texture_cache.IsRescaling(image_view));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,12 +298,14 @@ private:
|
|||||||
|
|
||||||
BufferCacheRuntime::BufferCacheRuntime(const Device& device_, MemoryAllocator& memory_allocator_,
|
BufferCacheRuntime::BufferCacheRuntime(const Device& device_, MemoryAllocator& memory_allocator_,
|
||||||
Scheduler& scheduler_, StagingBufferPool& staging_pool_,
|
Scheduler& scheduler_, StagingBufferPool& staging_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_,
|
GuestDescriptorQueue& guest_descriptor_queue_,
|
||||||
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue,
|
||||||
DescriptorPool& descriptor_pool)
|
DescriptorPool& descriptor_pool)
|
||||||
: device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_},
|
: device{device_}, memory_allocator{memory_allocator_}, scheduler{scheduler_},
|
||||||
staging_pool{staging_pool_}, update_descriptor_queue{update_descriptor_queue_},
|
staging_pool{staging_pool_}, guest_descriptor_queue{guest_descriptor_queue_},
|
||||||
uint8_pass(device, scheduler, descriptor_pool, staging_pool, update_descriptor_queue),
|
uint8_pass(device, scheduler, descriptor_pool, staging_pool, compute_pass_descriptor_queue),
|
||||||
quad_index_pass(device, scheduler, descriptor_pool, staging_pool, update_descriptor_queue) {
|
quad_index_pass(device, scheduler, descriptor_pool, staging_pool,
|
||||||
|
compute_pass_descriptor_queue) {
|
||||||
quad_array_index_buffer = std::make_shared<QuadArrayIndexBuffer>(device_, memory_allocator_,
|
quad_array_index_buffer = std::make_shared<QuadArrayIndexBuffer>(device_, memory_allocator_,
|
||||||
scheduler_, staging_pool_);
|
scheduler_, staging_pool_);
|
||||||
quad_strip_index_buffer = std::make_shared<QuadStripIndexBuffer>(device_, memory_allocator_,
|
quad_strip_index_buffer = std::make_shared<QuadStripIndexBuffer>(device_, memory_allocator_,
|
||||||
|
@ -63,7 +63,8 @@ class BufferCacheRuntime {
|
|||||||
public:
|
public:
|
||||||
explicit BufferCacheRuntime(const Device& device_, MemoryAllocator& memory_manager_,
|
explicit BufferCacheRuntime(const Device& device_, MemoryAllocator& memory_manager_,
|
||||||
Scheduler& scheduler_, StagingBufferPool& staging_pool_,
|
Scheduler& scheduler_, StagingBufferPool& staging_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_,
|
GuestDescriptorQueue& guest_descriptor_queue,
|
||||||
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue,
|
||||||
DescriptorPool& descriptor_pool);
|
DescriptorPool& descriptor_pool);
|
||||||
|
|
||||||
void Finish();
|
void Finish();
|
||||||
@ -116,12 +117,12 @@ public:
|
|||||||
|
|
||||||
void BindTextureBuffer(Buffer& buffer, u32 offset, u32 size,
|
void BindTextureBuffer(Buffer& buffer, u32 offset, u32 size,
|
||||||
VideoCore::Surface::PixelFormat format) {
|
VideoCore::Surface::PixelFormat format) {
|
||||||
update_descriptor_queue.AddTexelBuffer(buffer.View(offset, size, format));
|
guest_descriptor_queue.AddTexelBuffer(buffer.View(offset, size, format));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void BindBuffer(VkBuffer buffer, u32 offset, u32 size) {
|
void BindBuffer(VkBuffer buffer, u32 offset, u32 size) {
|
||||||
update_descriptor_queue.AddBuffer(buffer, offset, size);
|
guest_descriptor_queue.AddBuffer(buffer, offset, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReserveNullBuffer();
|
void ReserveNullBuffer();
|
||||||
@ -130,7 +131,7 @@ private:
|
|||||||
MemoryAllocator& memory_allocator;
|
MemoryAllocator& memory_allocator;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
StagingBufferPool& staging_pool;
|
StagingBufferPool& staging_pool;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
GuestDescriptorQueue& guest_descriptor_queue;
|
||||||
|
|
||||||
std::shared_ptr<QuadArrayIndexBuffer> quad_array_index_buffer;
|
std::shared_ptr<QuadArrayIndexBuffer> quad_array_index_buffer;
|
||||||
std::shared_ptr<QuadStripIndexBuffer> quad_strip_index_buffer;
|
std::shared_ptr<QuadStripIndexBuffer> quad_strip_index_buffer;
|
||||||
|
@ -200,12 +200,12 @@ ComputePass::~ComputePass() = default;
|
|||||||
|
|
||||||
Uint8Pass::Uint8Pass(const Device& device_, Scheduler& scheduler_, DescriptorPool& descriptor_pool,
|
Uint8Pass::Uint8Pass(const Device& device_, Scheduler& scheduler_, DescriptorPool& descriptor_pool,
|
||||||
StagingBufferPool& staging_buffer_pool_,
|
StagingBufferPool& staging_buffer_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_)
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue_)
|
||||||
: ComputePass(device_, descriptor_pool, INPUT_OUTPUT_DESCRIPTOR_SET_BINDINGS,
|
: ComputePass(device_, descriptor_pool, INPUT_OUTPUT_DESCRIPTOR_SET_BINDINGS,
|
||||||
INPUT_OUTPUT_DESCRIPTOR_UPDATE_TEMPLATE, INPUT_OUTPUT_BANK_INFO, {},
|
INPUT_OUTPUT_DESCRIPTOR_UPDATE_TEMPLATE, INPUT_OUTPUT_BANK_INFO, {},
|
||||||
VULKAN_UINT8_COMP_SPV),
|
VULKAN_UINT8_COMP_SPV),
|
||||||
scheduler{scheduler_}, staging_buffer_pool{staging_buffer_pool_},
|
scheduler{scheduler_}, staging_buffer_pool{staging_buffer_pool_},
|
||||||
update_descriptor_queue{update_descriptor_queue_} {}
|
compute_pass_descriptor_queue{compute_pass_descriptor_queue_} {}
|
||||||
|
|
||||||
Uint8Pass::~Uint8Pass() = default;
|
Uint8Pass::~Uint8Pass() = default;
|
||||||
|
|
||||||
@ -214,10 +214,10 @@ std::pair<VkBuffer, VkDeviceSize> Uint8Pass::Assemble(u32 num_vertices, VkBuffer
|
|||||||
const u32 staging_size = static_cast<u32>(num_vertices * sizeof(u16));
|
const u32 staging_size = static_cast<u32>(num_vertices * sizeof(u16));
|
||||||
const auto staging = staging_buffer_pool.Request(staging_size, MemoryUsage::DeviceLocal);
|
const auto staging = staging_buffer_pool.Request(staging_size, MemoryUsage::DeviceLocal);
|
||||||
|
|
||||||
update_descriptor_queue.Acquire();
|
compute_pass_descriptor_queue.Acquire();
|
||||||
update_descriptor_queue.AddBuffer(src_buffer, src_offset, num_vertices);
|
compute_pass_descriptor_queue.AddBuffer(src_buffer, src_offset, num_vertices);
|
||||||
update_descriptor_queue.AddBuffer(staging.buffer, staging.offset, staging_size);
|
compute_pass_descriptor_queue.AddBuffer(staging.buffer, staging.offset, staging_size);
|
||||||
const void* const descriptor_data{update_descriptor_queue.UpdateData()};
|
const void* const descriptor_data{compute_pass_descriptor_queue.UpdateData()};
|
||||||
|
|
||||||
scheduler.RequestOutsideRenderPassOperationContext();
|
scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
scheduler.Record([this, descriptor_data, num_vertices](vk::CommandBuffer cmdbuf) {
|
scheduler.Record([this, descriptor_data, num_vertices](vk::CommandBuffer cmdbuf) {
|
||||||
@ -242,12 +242,12 @@ std::pair<VkBuffer, VkDeviceSize> Uint8Pass::Assemble(u32 num_vertices, VkBuffer
|
|||||||
QuadIndexedPass::QuadIndexedPass(const Device& device_, Scheduler& scheduler_,
|
QuadIndexedPass::QuadIndexedPass(const Device& device_, Scheduler& scheduler_,
|
||||||
DescriptorPool& descriptor_pool_,
|
DescriptorPool& descriptor_pool_,
|
||||||
StagingBufferPool& staging_buffer_pool_,
|
StagingBufferPool& staging_buffer_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_)
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue_)
|
||||||
: ComputePass(device_, descriptor_pool_, INPUT_OUTPUT_DESCRIPTOR_SET_BINDINGS,
|
: ComputePass(device_, descriptor_pool_, INPUT_OUTPUT_DESCRIPTOR_SET_BINDINGS,
|
||||||
INPUT_OUTPUT_DESCRIPTOR_UPDATE_TEMPLATE, INPUT_OUTPUT_BANK_INFO,
|
INPUT_OUTPUT_DESCRIPTOR_UPDATE_TEMPLATE, INPUT_OUTPUT_BANK_INFO,
|
||||||
COMPUTE_PUSH_CONSTANT_RANGE<sizeof(u32) * 3>, VULKAN_QUAD_INDEXED_COMP_SPV),
|
COMPUTE_PUSH_CONSTANT_RANGE<sizeof(u32) * 3>, VULKAN_QUAD_INDEXED_COMP_SPV),
|
||||||
scheduler{scheduler_}, staging_buffer_pool{staging_buffer_pool_},
|
scheduler{scheduler_}, staging_buffer_pool{staging_buffer_pool_},
|
||||||
update_descriptor_queue{update_descriptor_queue_} {}
|
compute_pass_descriptor_queue{compute_pass_descriptor_queue_} {}
|
||||||
|
|
||||||
QuadIndexedPass::~QuadIndexedPass() = default;
|
QuadIndexedPass::~QuadIndexedPass() = default;
|
||||||
|
|
||||||
@ -272,10 +272,10 @@ std::pair<VkBuffer, VkDeviceSize> QuadIndexedPass::Assemble(
|
|||||||
const std::size_t staging_size = num_tri_vertices * sizeof(u32);
|
const std::size_t staging_size = num_tri_vertices * sizeof(u32);
|
||||||
const auto staging = staging_buffer_pool.Request(staging_size, MemoryUsage::DeviceLocal);
|
const auto staging = staging_buffer_pool.Request(staging_size, MemoryUsage::DeviceLocal);
|
||||||
|
|
||||||
update_descriptor_queue.Acquire();
|
compute_pass_descriptor_queue.Acquire();
|
||||||
update_descriptor_queue.AddBuffer(src_buffer, src_offset, input_size);
|
compute_pass_descriptor_queue.AddBuffer(src_buffer, src_offset, input_size);
|
||||||
update_descriptor_queue.AddBuffer(staging.buffer, staging.offset, staging_size);
|
compute_pass_descriptor_queue.AddBuffer(staging.buffer, staging.offset, staging_size);
|
||||||
const void* const descriptor_data{update_descriptor_queue.UpdateData()};
|
const void* const descriptor_data{compute_pass_descriptor_queue.UpdateData()};
|
||||||
|
|
||||||
scheduler.RequestOutsideRenderPassOperationContext();
|
scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
scheduler.Record([this, descriptor_data, num_tri_vertices, base_vertex, index_shift,
|
scheduler.Record([this, descriptor_data, num_tri_vertices, base_vertex, index_shift,
|
||||||
@ -304,13 +304,14 @@ std::pair<VkBuffer, VkDeviceSize> QuadIndexedPass::Assemble(
|
|||||||
ASTCDecoderPass::ASTCDecoderPass(const Device& device_, Scheduler& scheduler_,
|
ASTCDecoderPass::ASTCDecoderPass(const Device& device_, Scheduler& scheduler_,
|
||||||
DescriptorPool& descriptor_pool_,
|
DescriptorPool& descriptor_pool_,
|
||||||
StagingBufferPool& staging_buffer_pool_,
|
StagingBufferPool& staging_buffer_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_,
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue_,
|
||||||
MemoryAllocator& memory_allocator_)
|
MemoryAllocator& memory_allocator_)
|
||||||
: ComputePass(device_, descriptor_pool_, ASTC_DESCRIPTOR_SET_BINDINGS,
|
: ComputePass(device_, descriptor_pool_, ASTC_DESCRIPTOR_SET_BINDINGS,
|
||||||
ASTC_PASS_DESCRIPTOR_UPDATE_TEMPLATE_ENTRY, ASTC_BANK_INFO,
|
ASTC_PASS_DESCRIPTOR_UPDATE_TEMPLATE_ENTRY, ASTC_BANK_INFO,
|
||||||
COMPUTE_PUSH_CONSTANT_RANGE<sizeof(AstcPushConstants)>, ASTC_DECODER_COMP_SPV),
|
COMPUTE_PUSH_CONSTANT_RANGE<sizeof(AstcPushConstants)>, ASTC_DECODER_COMP_SPV),
|
||||||
scheduler{scheduler_}, staging_buffer_pool{staging_buffer_pool_},
|
scheduler{scheduler_}, staging_buffer_pool{staging_buffer_pool_},
|
||||||
update_descriptor_queue{update_descriptor_queue_}, memory_allocator{memory_allocator_} {}
|
compute_pass_descriptor_queue{compute_pass_descriptor_queue_}, memory_allocator{
|
||||||
|
memory_allocator_} {}
|
||||||
|
|
||||||
ASTCDecoderPass::~ASTCDecoderPass() = default;
|
ASTCDecoderPass::~ASTCDecoderPass() = default;
|
||||||
|
|
||||||
@ -358,11 +359,11 @@ void ASTCDecoderPass::Assemble(Image& image, const StagingBufferRef& map,
|
|||||||
const u32 num_dispatches_y = Common::DivCeil(swizzle.num_tiles.height, 8U);
|
const u32 num_dispatches_y = Common::DivCeil(swizzle.num_tiles.height, 8U);
|
||||||
const u32 num_dispatches_z = image.info.resources.layers;
|
const u32 num_dispatches_z = image.info.resources.layers;
|
||||||
|
|
||||||
update_descriptor_queue.Acquire();
|
compute_pass_descriptor_queue.Acquire();
|
||||||
update_descriptor_queue.AddBuffer(map.buffer, input_offset,
|
compute_pass_descriptor_queue.AddBuffer(map.buffer, input_offset,
|
||||||
image.guest_size_bytes - swizzle.buffer_offset);
|
image.guest_size_bytes - swizzle.buffer_offset);
|
||||||
update_descriptor_queue.AddImage(image.StorageImageView(swizzle.level));
|
compute_pass_descriptor_queue.AddImage(image.StorageImageView(swizzle.level));
|
||||||
const void* const descriptor_data{update_descriptor_queue.UpdateData()};
|
const void* const descriptor_data{compute_pass_descriptor_queue.UpdateData()};
|
||||||
|
|
||||||
// To unswizzle the ASTC data
|
// To unswizzle the ASTC data
|
||||||
const auto params = MakeBlockLinearSwizzle2DParams(swizzle, image.info);
|
const auto params = MakeBlockLinearSwizzle2DParams(swizzle, image.info);
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "video_core/engines/maxwell_3d.h"
|
#include "video_core/engines/maxwell_3d.h"
|
||||||
#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
|
#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
|
||||||
|
#include "video_core/renderer_vulkan/vk_update_descriptor.h"
|
||||||
#include "video_core/vulkan_common/vulkan_memory_allocator.h"
|
#include "video_core/vulkan_common/vulkan_memory_allocator.h"
|
||||||
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
||||||
|
|
||||||
@ -21,7 +22,6 @@ namespace Vulkan {
|
|||||||
class Device;
|
class Device;
|
||||||
class StagingBufferPool;
|
class StagingBufferPool;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class UpdateDescriptorQueue;
|
|
||||||
class Image;
|
class Image;
|
||||||
struct StagingBufferRef;
|
struct StagingBufferRef;
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ class Uint8Pass final : public ComputePass {
|
|||||||
public:
|
public:
|
||||||
explicit Uint8Pass(const Device& device_, Scheduler& scheduler_,
|
explicit Uint8Pass(const Device& device_, Scheduler& scheduler_,
|
||||||
DescriptorPool& descriptor_pool_, StagingBufferPool& staging_buffer_pool_,
|
DescriptorPool& descriptor_pool_, StagingBufferPool& staging_buffer_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_);
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue_);
|
||||||
~Uint8Pass();
|
~Uint8Pass();
|
||||||
|
|
||||||
/// Assemble uint8 indices into an uint16 index buffer
|
/// Assemble uint8 indices into an uint16 index buffer
|
||||||
@ -61,7 +61,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
StagingBufferPool& staging_buffer_pool;
|
StagingBufferPool& staging_buffer_pool;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
class QuadIndexedPass final : public ComputePass {
|
class QuadIndexedPass final : public ComputePass {
|
||||||
@ -69,7 +69,7 @@ public:
|
|||||||
explicit QuadIndexedPass(const Device& device_, Scheduler& scheduler_,
|
explicit QuadIndexedPass(const Device& device_, Scheduler& scheduler_,
|
||||||
DescriptorPool& descriptor_pool_,
|
DescriptorPool& descriptor_pool_,
|
||||||
StagingBufferPool& staging_buffer_pool_,
|
StagingBufferPool& staging_buffer_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_);
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue_);
|
||||||
~QuadIndexedPass();
|
~QuadIndexedPass();
|
||||||
|
|
||||||
std::pair<VkBuffer, VkDeviceSize> Assemble(
|
std::pair<VkBuffer, VkDeviceSize> Assemble(
|
||||||
@ -79,7 +79,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
StagingBufferPool& staging_buffer_pool;
|
StagingBufferPool& staging_buffer_pool;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ASTCDecoderPass final : public ComputePass {
|
class ASTCDecoderPass final : public ComputePass {
|
||||||
@ -87,7 +87,7 @@ public:
|
|||||||
explicit ASTCDecoderPass(const Device& device_, Scheduler& scheduler_,
|
explicit ASTCDecoderPass(const Device& device_, Scheduler& scheduler_,
|
||||||
DescriptorPool& descriptor_pool_,
|
DescriptorPool& descriptor_pool_,
|
||||||
StagingBufferPool& staging_buffer_pool_,
|
StagingBufferPool& staging_buffer_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_,
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue_,
|
||||||
MemoryAllocator& memory_allocator_);
|
MemoryAllocator& memory_allocator_);
|
||||||
~ASTCDecoderPass();
|
~ASTCDecoderPass();
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
StagingBufferPool& staging_buffer_pool;
|
StagingBufferPool& staging_buffer_pool;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue;
|
||||||
MemoryAllocator& memory_allocator;
|
MemoryAllocator& memory_allocator;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,13 +26,13 @@ using Tegra::Texture::TexturePair;
|
|||||||
|
|
||||||
ComputePipeline::ComputePipeline(const Device& device_, vk::PipelineCache& pipeline_cache_,
|
ComputePipeline::ComputePipeline(const Device& device_, vk::PipelineCache& pipeline_cache_,
|
||||||
DescriptorPool& descriptor_pool,
|
DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_,
|
GuestDescriptorQueue& guest_descriptor_queue_,
|
||||||
Common::ThreadWorker* thread_worker,
|
Common::ThreadWorker* thread_worker,
|
||||||
PipelineStatistics* pipeline_statistics,
|
PipelineStatistics* pipeline_statistics,
|
||||||
VideoCore::ShaderNotify* shader_notify, const Shader::Info& info_,
|
VideoCore::ShaderNotify* shader_notify, const Shader::Info& info_,
|
||||||
vk::ShaderModule spv_module_)
|
vk::ShaderModule spv_module_)
|
||||||
: device{device_}, pipeline_cache(pipeline_cache_),
|
: device{device_},
|
||||||
update_descriptor_queue{update_descriptor_queue_}, info{info_},
|
pipeline_cache(pipeline_cache_), guest_descriptor_queue{guest_descriptor_queue_}, info{info_},
|
||||||
spv_module(std::move(spv_module_)) {
|
spv_module(std::move(spv_module_)) {
|
||||||
if (shader_notify) {
|
if (shader_notify) {
|
||||||
shader_notify->MarkShaderBuilding();
|
shader_notify->MarkShaderBuilding();
|
||||||
@ -99,7 +99,7 @@ ComputePipeline::ComputePipeline(const Device& device_, vk::PipelineCache& pipel
|
|||||||
void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
|
void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
|
||||||
Tegra::MemoryManager& gpu_memory, Scheduler& scheduler,
|
Tegra::MemoryManager& gpu_memory, Scheduler& scheduler,
|
||||||
BufferCache& buffer_cache, TextureCache& texture_cache) {
|
BufferCache& buffer_cache, TextureCache& texture_cache) {
|
||||||
update_descriptor_queue.Acquire();
|
guest_descriptor_queue.Acquire();
|
||||||
|
|
||||||
buffer_cache.SetComputeUniformBufferState(info.constant_buffer_mask, &uniform_buffer_sizes);
|
buffer_cache.SetComputeUniformBufferState(info.constant_buffer_mask, &uniform_buffer_sizes);
|
||||||
buffer_cache.UnbindComputeStorageBuffers();
|
buffer_cache.UnbindComputeStorageBuffers();
|
||||||
@ -194,7 +194,7 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
|
|||||||
RescalingPushConstant rescaling;
|
RescalingPushConstant rescaling;
|
||||||
const VkSampler* samplers_it{samplers.data()};
|
const VkSampler* samplers_it{samplers.data()};
|
||||||
const VideoCommon::ImageViewInOut* views_it{views.data()};
|
const VideoCommon::ImageViewInOut* views_it{views.data()};
|
||||||
PushImageDescriptors(texture_cache, update_descriptor_queue, info, rescaling, samplers_it,
|
PushImageDescriptors(texture_cache, guest_descriptor_queue, info, rescaling, samplers_it,
|
||||||
views_it);
|
views_it);
|
||||||
|
|
||||||
if (!is_built.load(std::memory_order::relaxed)) {
|
if (!is_built.load(std::memory_order::relaxed)) {
|
||||||
@ -204,7 +204,7 @@ void ComputePipeline::Configure(Tegra::Engines::KeplerCompute& kepler_compute,
|
|||||||
build_condvar.wait(lock, [this] { return is_built.load(std::memory_order::relaxed); });
|
build_condvar.wait(lock, [this] { return is_built.load(std::memory_order::relaxed); });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const void* const descriptor_data{update_descriptor_queue.UpdateData()};
|
const void* const descriptor_data{guest_descriptor_queue.UpdateData()};
|
||||||
const bool is_rescaling = !info.texture_descriptors.empty() || !info.image_descriptors.empty();
|
const bool is_rescaling = !info.texture_descriptors.empty() || !info.image_descriptors.empty();
|
||||||
scheduler.Record([this, descriptor_data, is_rescaling,
|
scheduler.Record([this, descriptor_data, is_rescaling,
|
||||||
rescaling_data = rescaling.Data()](vk::CommandBuffer cmdbuf) {
|
rescaling_data = rescaling.Data()](vk::CommandBuffer cmdbuf) {
|
||||||
|
@ -30,7 +30,7 @@ class ComputePipeline {
|
|||||||
public:
|
public:
|
||||||
explicit ComputePipeline(const Device& device, vk::PipelineCache& pipeline_cache,
|
explicit ComputePipeline(const Device& device, vk::PipelineCache& pipeline_cache,
|
||||||
DescriptorPool& descriptor_pool,
|
DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue,
|
GuestDescriptorQueue& guest_descriptor_queue,
|
||||||
Common::ThreadWorker* thread_worker,
|
Common::ThreadWorker* thread_worker,
|
||||||
PipelineStatistics* pipeline_statistics,
|
PipelineStatistics* pipeline_statistics,
|
||||||
VideoCore::ShaderNotify* shader_notify, const Shader::Info& info,
|
VideoCore::ShaderNotify* shader_notify, const Shader::Info& info,
|
||||||
@ -48,7 +48,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
const Device& device;
|
const Device& device;
|
||||||
vk::PipelineCache& pipeline_cache;
|
vk::PipelineCache& pipeline_cache;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
GuestDescriptorQueue& guest_descriptor_queue;
|
||||||
Shader::Info info;
|
Shader::Info info;
|
||||||
|
|
||||||
VideoCommon::ComputeUniformBufferSizes uniform_buffer_sizes{};
|
VideoCommon::ComputeUniformBufferSizes uniform_buffer_sizes{};
|
||||||
|
@ -236,13 +236,13 @@ GraphicsPipeline::GraphicsPipeline(
|
|||||||
Scheduler& scheduler_, BufferCache& buffer_cache_, TextureCache& texture_cache_,
|
Scheduler& scheduler_, BufferCache& buffer_cache_, TextureCache& texture_cache_,
|
||||||
vk::PipelineCache& pipeline_cache_, VideoCore::ShaderNotify* shader_notify,
|
vk::PipelineCache& pipeline_cache_, VideoCore::ShaderNotify* shader_notify,
|
||||||
const Device& device_, DescriptorPool& descriptor_pool,
|
const Device& device_, DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_, Common::ThreadWorker* worker_thread,
|
GuestDescriptorQueue& guest_descriptor_queue_, Common::ThreadWorker* worker_thread,
|
||||||
PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache,
|
PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache,
|
||||||
const GraphicsPipelineCacheKey& key_, std::array<vk::ShaderModule, NUM_STAGES> stages,
|
const GraphicsPipelineCacheKey& key_, std::array<vk::ShaderModule, NUM_STAGES> stages,
|
||||||
const std::array<const Shader::Info*, NUM_STAGES>& infos)
|
const std::array<const Shader::Info*, NUM_STAGES>& infos)
|
||||||
: key{key_}, device{device_}, texture_cache{texture_cache_}, buffer_cache{buffer_cache_},
|
: key{key_}, device{device_}, texture_cache{texture_cache_}, buffer_cache{buffer_cache_},
|
||||||
pipeline_cache(pipeline_cache_), scheduler{scheduler_},
|
pipeline_cache(pipeline_cache_), scheduler{scheduler_},
|
||||||
update_descriptor_queue{update_descriptor_queue_}, spv_modules{std::move(stages)} {
|
guest_descriptor_queue{guest_descriptor_queue_}, spv_modules{std::move(stages)} {
|
||||||
if (shader_notify) {
|
if (shader_notify) {
|
||||||
shader_notify->MarkShaderBuilding();
|
shader_notify->MarkShaderBuilding();
|
||||||
}
|
}
|
||||||
@ -449,7 +449,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
|
|||||||
buffer_cache.UpdateGraphicsBuffers(is_indexed);
|
buffer_cache.UpdateGraphicsBuffers(is_indexed);
|
||||||
buffer_cache.BindHostGeometryBuffers(is_indexed);
|
buffer_cache.BindHostGeometryBuffers(is_indexed);
|
||||||
|
|
||||||
update_descriptor_queue.Acquire();
|
guest_descriptor_queue.Acquire();
|
||||||
|
|
||||||
RescalingPushConstant rescaling;
|
RescalingPushConstant rescaling;
|
||||||
RenderAreaPushConstant render_area;
|
RenderAreaPushConstant render_area;
|
||||||
@ -457,7 +457,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) {
|
|||||||
const VideoCommon::ImageViewInOut* views_it{views.data()};
|
const VideoCommon::ImageViewInOut* views_it{views.data()};
|
||||||
const auto prepare_stage{[&](size_t stage) LAMBDA_FORCEINLINE {
|
const auto prepare_stage{[&](size_t stage) LAMBDA_FORCEINLINE {
|
||||||
buffer_cache.BindHostStageBuffers(stage);
|
buffer_cache.BindHostStageBuffers(stage);
|
||||||
PushImageDescriptors(texture_cache, update_descriptor_queue, stage_infos[stage], rescaling,
|
PushImageDescriptors(texture_cache, guest_descriptor_queue, stage_infos[stage], rescaling,
|
||||||
samplers_it, views_it);
|
samplers_it, views_it);
|
||||||
const auto& info{stage_infos[0]};
|
const auto& info{stage_infos[0]};
|
||||||
if (info.uses_render_area) {
|
if (info.uses_render_area) {
|
||||||
@ -499,7 +499,7 @@ void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling,
|
|||||||
const bool is_rescaling{texture_cache.IsRescaling()};
|
const bool is_rescaling{texture_cache.IsRescaling()};
|
||||||
const bool update_rescaling{scheduler.UpdateRescaling(is_rescaling)};
|
const bool update_rescaling{scheduler.UpdateRescaling(is_rescaling)};
|
||||||
const bool bind_pipeline{scheduler.UpdateGraphicsPipeline(this)};
|
const bool bind_pipeline{scheduler.UpdateGraphicsPipeline(this)};
|
||||||
const void* const descriptor_data{update_descriptor_queue.UpdateData()};
|
const void* const descriptor_data{guest_descriptor_queue.UpdateData()};
|
||||||
scheduler.Record([this, descriptor_data, bind_pipeline, rescaling_data = rescaling.Data(),
|
scheduler.Record([this, descriptor_data, bind_pipeline, rescaling_data = rescaling.Data(),
|
||||||
is_rescaling, update_rescaling,
|
is_rescaling, update_rescaling,
|
||||||
uses_render_area = render_area.uses_render_area,
|
uses_render_area = render_area.uses_render_area,
|
||||||
|
@ -64,7 +64,6 @@ class RenderPassCache;
|
|||||||
class RescalingPushConstant;
|
class RescalingPushConstant;
|
||||||
class RenderAreaPushConstant;
|
class RenderAreaPushConstant;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class UpdateDescriptorQueue;
|
|
||||||
|
|
||||||
class GraphicsPipeline {
|
class GraphicsPipeline {
|
||||||
static constexpr size_t NUM_STAGES = Tegra::Engines::Maxwell3D::Regs::MaxShaderStage;
|
static constexpr size_t NUM_STAGES = Tegra::Engines::Maxwell3D::Regs::MaxShaderStage;
|
||||||
@ -74,7 +73,7 @@ public:
|
|||||||
Scheduler& scheduler, BufferCache& buffer_cache, TextureCache& texture_cache,
|
Scheduler& scheduler, BufferCache& buffer_cache, TextureCache& texture_cache,
|
||||||
vk::PipelineCache& pipeline_cache, VideoCore::ShaderNotify* shader_notify,
|
vk::PipelineCache& pipeline_cache, VideoCore::ShaderNotify* shader_notify,
|
||||||
const Device& device, DescriptorPool& descriptor_pool,
|
const Device& device, DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue, Common::ThreadWorker* worker_thread,
|
GuestDescriptorQueue& guest_descriptor_queue, Common::ThreadWorker* worker_thread,
|
||||||
PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache,
|
PipelineStatistics* pipeline_statistics, RenderPassCache& render_pass_cache,
|
||||||
const GraphicsPipelineCacheKey& key, std::array<vk::ShaderModule, NUM_STAGES> stages,
|
const GraphicsPipelineCacheKey& key, std::array<vk::ShaderModule, NUM_STAGES> stages,
|
||||||
const std::array<const Shader::Info*, NUM_STAGES>& infos);
|
const std::array<const Shader::Info*, NUM_STAGES>& infos);
|
||||||
@ -133,7 +132,7 @@ private:
|
|||||||
BufferCache& buffer_cache;
|
BufferCache& buffer_cache;
|
||||||
vk::PipelineCache& pipeline_cache;
|
vk::PipelineCache& pipeline_cache;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
GuestDescriptorQueue& guest_descriptor_queue;
|
||||||
|
|
||||||
void (*configure_func)(GraphicsPipeline*, bool){};
|
void (*configure_func)(GraphicsPipeline*, bool){};
|
||||||
|
|
||||||
|
@ -277,11 +277,11 @@ bool GraphicsPipelineCacheKey::operator==(const GraphicsPipelineCacheKey& rhs) c
|
|||||||
|
|
||||||
PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device_,
|
PipelineCache::PipelineCache(RasterizerVulkan& rasterizer_, const Device& device_,
|
||||||
Scheduler& scheduler_, DescriptorPool& descriptor_pool_,
|
Scheduler& scheduler_, DescriptorPool& descriptor_pool_,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue_,
|
GuestDescriptorQueue& guest_descriptor_queue_,
|
||||||
RenderPassCache& render_pass_cache_, BufferCache& buffer_cache_,
|
RenderPassCache& render_pass_cache_, BufferCache& buffer_cache_,
|
||||||
TextureCache& texture_cache_, VideoCore::ShaderNotify& shader_notify_)
|
TextureCache& texture_cache_, VideoCore::ShaderNotify& shader_notify_)
|
||||||
: VideoCommon::ShaderCache{rasterizer_}, device{device_}, scheduler{scheduler_},
|
: VideoCommon::ShaderCache{rasterizer_}, device{device_}, scheduler{scheduler_},
|
||||||
descriptor_pool{descriptor_pool_}, update_descriptor_queue{update_descriptor_queue_},
|
descriptor_pool{descriptor_pool_}, guest_descriptor_queue{guest_descriptor_queue_},
|
||||||
render_pass_cache{render_pass_cache_}, buffer_cache{buffer_cache_},
|
render_pass_cache{render_pass_cache_}, buffer_cache{buffer_cache_},
|
||||||
texture_cache{texture_cache_}, shader_notify{shader_notify_},
|
texture_cache{texture_cache_}, shader_notify{shader_notify_},
|
||||||
use_asynchronous_shaders{Settings::values.use_asynchronous_shaders.GetValue()},
|
use_asynchronous_shaders{Settings::values.use_asynchronous_shaders.GetValue()},
|
||||||
@ -643,7 +643,7 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
|
|||||||
Common::ThreadWorker* const thread_worker{build_in_parallel ? &workers : nullptr};
|
Common::ThreadWorker* const thread_worker{build_in_parallel ? &workers : nullptr};
|
||||||
return std::make_unique<GraphicsPipeline>(
|
return std::make_unique<GraphicsPipeline>(
|
||||||
scheduler, buffer_cache, texture_cache, vulkan_pipeline_cache, &shader_notify, device,
|
scheduler, buffer_cache, texture_cache, vulkan_pipeline_cache, &shader_notify, device,
|
||||||
descriptor_pool, update_descriptor_queue, thread_worker, statistics, render_pass_cache, key,
|
descriptor_pool, guest_descriptor_queue, thread_worker, statistics, render_pass_cache, key,
|
||||||
std::move(modules), infos);
|
std::move(modules), infos);
|
||||||
|
|
||||||
} catch (const Shader::Exception& exception) {
|
} catch (const Shader::Exception& exception) {
|
||||||
@ -723,7 +723,7 @@ std::unique_ptr<ComputePipeline> PipelineCache::CreateComputePipeline(
|
|||||||
}
|
}
|
||||||
Common::ThreadWorker* const thread_worker{build_in_parallel ? &workers : nullptr};
|
Common::ThreadWorker* const thread_worker{build_in_parallel ? &workers : nullptr};
|
||||||
return std::make_unique<ComputePipeline>(device, vulkan_pipeline_cache, descriptor_pool,
|
return std::make_unique<ComputePipeline>(device, vulkan_pipeline_cache, descriptor_pool,
|
||||||
update_descriptor_queue, thread_worker, statistics,
|
guest_descriptor_queue, thread_worker, statistics,
|
||||||
&shader_notify, program.info, std::move(spv_module));
|
&shader_notify, program.info, std::move(spv_module));
|
||||||
|
|
||||||
} catch (const Shader::Exception& exception) {
|
} catch (const Shader::Exception& exception) {
|
||||||
|
@ -82,7 +82,6 @@ class PipelineStatistics;
|
|||||||
class RasterizerVulkan;
|
class RasterizerVulkan;
|
||||||
class RenderPassCache;
|
class RenderPassCache;
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
class UpdateDescriptorQueue;
|
|
||||||
|
|
||||||
using VideoCommon::ShaderInfo;
|
using VideoCommon::ShaderInfo;
|
||||||
|
|
||||||
@ -102,7 +101,7 @@ class PipelineCache : public VideoCommon::ShaderCache {
|
|||||||
public:
|
public:
|
||||||
explicit PipelineCache(RasterizerVulkan& rasterizer, const Device& device, Scheduler& scheduler,
|
explicit PipelineCache(RasterizerVulkan& rasterizer, const Device& device, Scheduler& scheduler,
|
||||||
DescriptorPool& descriptor_pool,
|
DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue,
|
GuestDescriptorQueue& guest_descriptor_queue,
|
||||||
RenderPassCache& render_pass_cache, BufferCache& buffer_cache,
|
RenderPassCache& render_pass_cache, BufferCache& buffer_cache,
|
||||||
TextureCache& texture_cache, VideoCore::ShaderNotify& shader_notify_);
|
TextureCache& texture_cache, VideoCore::ShaderNotify& shader_notify_);
|
||||||
~PipelineCache();
|
~PipelineCache();
|
||||||
@ -144,7 +143,7 @@ private:
|
|||||||
const Device& device;
|
const Device& device;
|
||||||
Scheduler& scheduler;
|
Scheduler& scheduler;
|
||||||
DescriptorPool& descriptor_pool;
|
DescriptorPool& descriptor_pool;
|
||||||
UpdateDescriptorQueue& update_descriptor_queue;
|
GuestDescriptorQueue& guest_descriptor_queue;
|
||||||
RenderPassCache& render_pass_cache;
|
RenderPassCache& render_pass_cache;
|
||||||
BufferCache& buffer_cache;
|
BufferCache& buffer_cache;
|
||||||
TextureCache& texture_cache;
|
TextureCache& texture_cache;
|
||||||
|
@ -160,17 +160,16 @@ RasterizerVulkan::RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra
|
|||||||
: RasterizerAccelerated{cpu_memory_}, gpu{gpu_}, screen_info{screen_info_}, device{device_},
|
: RasterizerAccelerated{cpu_memory_}, gpu{gpu_}, screen_info{screen_info_}, device{device_},
|
||||||
memory_allocator{memory_allocator_}, state_tracker{state_tracker_}, scheduler{scheduler_},
|
memory_allocator{memory_allocator_}, state_tracker{state_tracker_}, scheduler{scheduler_},
|
||||||
staging_pool(device, memory_allocator, scheduler), descriptor_pool(device, scheduler),
|
staging_pool(device, memory_allocator, scheduler), descriptor_pool(device, scheduler),
|
||||||
update_descriptor_queue(device, scheduler),
|
guest_descriptor_queue(device, scheduler), compute_pass_descriptor_queue(device, scheduler),
|
||||||
blit_image(device, scheduler, state_tracker, descriptor_pool),
|
blit_image(device, scheduler, state_tracker, descriptor_pool), render_pass_cache(device),
|
||||||
render_pass_cache(device), texture_cache_runtime{device, scheduler,
|
texture_cache_runtime{
|
||||||
memory_allocator, staging_pool,
|
device, scheduler, memory_allocator, staging_pool,
|
||||||
blit_image, render_pass_cache,
|
blit_image, render_pass_cache, descriptor_pool, compute_pass_descriptor_queue},
|
||||||
descriptor_pool, update_descriptor_queue},
|
|
||||||
texture_cache(texture_cache_runtime, *this),
|
texture_cache(texture_cache_runtime, *this),
|
||||||
buffer_cache_runtime(device, memory_allocator, scheduler, staging_pool,
|
buffer_cache_runtime(device, memory_allocator, scheduler, staging_pool,
|
||||||
update_descriptor_queue, descriptor_pool),
|
guest_descriptor_queue, compute_pass_descriptor_queue, descriptor_pool),
|
||||||
buffer_cache(*this, cpu_memory_, buffer_cache_runtime),
|
buffer_cache(*this, cpu_memory_, buffer_cache_runtime),
|
||||||
pipeline_cache(*this, device, scheduler, descriptor_pool, update_descriptor_queue,
|
pipeline_cache(*this, device, scheduler, descriptor_pool, guest_descriptor_queue,
|
||||||
render_pass_cache, buffer_cache, texture_cache, gpu.ShaderNotify()),
|
render_pass_cache, buffer_cache, texture_cache, gpu.ShaderNotify()),
|
||||||
query_cache{*this, cpu_memory_, device, scheduler},
|
query_cache{*this, cpu_memory_, device, scheduler},
|
||||||
accelerate_dma(buffer_cache, texture_cache, scheduler),
|
accelerate_dma(buffer_cache, texture_cache, scheduler),
|
||||||
@ -669,7 +668,8 @@ void RasterizerVulkan::FlushCommands() {
|
|||||||
|
|
||||||
void RasterizerVulkan::TickFrame() {
|
void RasterizerVulkan::TickFrame() {
|
||||||
draw_counter = 0;
|
draw_counter = 0;
|
||||||
update_descriptor_queue.TickFrame();
|
guest_descriptor_queue.TickFrame();
|
||||||
|
compute_pass_descriptor_queue.TickFrame();
|
||||||
fence_manager.TickFrame();
|
fence_manager.TickFrame();
|
||||||
staging_pool.TickFrame();
|
staging_pool.TickFrame();
|
||||||
{
|
{
|
||||||
|
@ -184,7 +184,8 @@ private:
|
|||||||
|
|
||||||
StagingBufferPool staging_pool;
|
StagingBufferPool staging_pool;
|
||||||
DescriptorPool descriptor_pool;
|
DescriptorPool descriptor_pool;
|
||||||
UpdateDescriptorQueue update_descriptor_queue;
|
GuestDescriptorQueue guest_descriptor_queue;
|
||||||
|
ComputePassDescriptorQueue compute_pass_descriptor_queue;
|
||||||
BlitImageHelper blit_image;
|
BlitImageHelper blit_image;
|
||||||
RenderPassCache render_pass_cache;
|
RenderPassCache render_pass_cache;
|
||||||
|
|
||||||
|
@ -798,13 +798,13 @@ TextureCacheRuntime::TextureCacheRuntime(const Device& device_, Scheduler& sched
|
|||||||
BlitImageHelper& blit_image_helper_,
|
BlitImageHelper& blit_image_helper_,
|
||||||
RenderPassCache& render_pass_cache_,
|
RenderPassCache& render_pass_cache_,
|
||||||
DescriptorPool& descriptor_pool,
|
DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue)
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue)
|
||||||
: device{device_}, scheduler{scheduler_}, memory_allocator{memory_allocator_},
|
: device{device_}, scheduler{scheduler_}, memory_allocator{memory_allocator_},
|
||||||
staging_buffer_pool{staging_buffer_pool_}, blit_image_helper{blit_image_helper_},
|
staging_buffer_pool{staging_buffer_pool_}, blit_image_helper{blit_image_helper_},
|
||||||
render_pass_cache{render_pass_cache_}, resolution{Settings::values.resolution_info} {
|
render_pass_cache{render_pass_cache_}, resolution{Settings::values.resolution_info} {
|
||||||
if (Settings::values.accelerate_astc) {
|
if (Settings::values.accelerate_astc) {
|
||||||
astc_decoder_pass.emplace(device, scheduler, descriptor_pool, staging_buffer_pool,
|
astc_decoder_pass.emplace(device, scheduler, descriptor_pool, staging_buffer_pool,
|
||||||
update_descriptor_queue, memory_allocator);
|
compute_pass_descriptor_queue, memory_allocator);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@ class ImageView;
|
|||||||
class Framebuffer;
|
class Framebuffer;
|
||||||
class RenderPassCache;
|
class RenderPassCache;
|
||||||
class StagingBufferPool;
|
class StagingBufferPool;
|
||||||
class UpdateDescriptorQueue;
|
|
||||||
class Scheduler;
|
class Scheduler;
|
||||||
|
|
||||||
class TextureCacheRuntime {
|
class TextureCacheRuntime {
|
||||||
@ -45,7 +44,7 @@ public:
|
|||||||
BlitImageHelper& blit_image_helper_,
|
BlitImageHelper& blit_image_helper_,
|
||||||
RenderPassCache& render_pass_cache_,
|
RenderPassCache& render_pass_cache_,
|
||||||
DescriptorPool& descriptor_pool,
|
DescriptorPool& descriptor_pool,
|
||||||
UpdateDescriptorQueue& update_descriptor_queue);
|
ComputePassDescriptorQueue& compute_pass_descriptor_queue);
|
||||||
|
|
||||||
void Finish();
|
void Finish();
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ class UpdateDescriptorQueue final {
|
|||||||
// This should be plenty for the vast majority of cases. Most desktop platforms only
|
// This should be plenty for the vast majority of cases. Most desktop platforms only
|
||||||
// provide up to 3 swapchain images.
|
// provide up to 3 swapchain images.
|
||||||
static constexpr size_t FRAMES_IN_FLIGHT = 5;
|
static constexpr size_t FRAMES_IN_FLIGHT = 5;
|
||||||
static constexpr size_t FRAME_PAYLOAD_SIZE = 0x10000;
|
static constexpr size_t FRAME_PAYLOAD_SIZE = 0x20000;
|
||||||
static constexpr size_t PAYLOAD_SIZE = FRAME_PAYLOAD_SIZE * FRAMES_IN_FLIGHT;
|
static constexpr size_t PAYLOAD_SIZE = FRAME_PAYLOAD_SIZE * FRAMES_IN_FLIGHT;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -86,4 +86,8 @@ private:
|
|||||||
std::array<DescriptorUpdateEntry, PAYLOAD_SIZE> payload;
|
std::array<DescriptorUpdateEntry, PAYLOAD_SIZE> payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: should these be separate classes instead?
|
||||||
|
using GuestDescriptorQueue = UpdateDescriptorQueue;
|
||||||
|
using ComputePassDescriptorQueue = UpdateDescriptorQueue;
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
Loading…
Reference in New Issue
Block a user