2022-04-23 10:59:50 +02:00
|
|
|
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
2020-01-07 01:10:56 +01:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
2020-01-17 02:55:23 +01:00
|
|
|
#include <array>
|
|
|
|
|
|
|
|
#include <boost/container/static_vector.hpp>
|
|
|
|
|
|
|
|
#include "common/common_types.h"
|
2021-11-05 15:52:31 +01:00
|
|
|
#include "video_core/control/channel_state_cache.h"
|
2021-07-12 04:10:42 +02:00
|
|
|
#include "video_core/engines/maxwell_dma.h"
|
2020-01-17 02:55:23 +01:00
|
|
|
#include "video_core/rasterizer_accelerated.h"
|
2020-01-07 01:10:56 +01:00
|
|
|
#include "video_core/rasterizer_interface.h"
|
2020-12-30 06:25:23 +01:00
|
|
|
#include "video_core/renderer_vulkan/blit_image.h"
|
2020-01-17 02:55:23 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_buffer_cache.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_descriptor_pool.h"
|
2020-03-17 01:43:05 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_fence_manager.h"
|
2020-01-17 02:55:23 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_pipeline_cache.h"
|
2020-02-11 22:59:44 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_query_cache.h"
|
2021-03-19 23:28:31 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_render_pass_cache.h"
|
2020-01-17 02:55:23 +01:00
|
|
|
#include "video_core/renderer_vulkan/vk_staging_buffer_pool.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_texture_cache.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_update_descriptor.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-17 02:55:23 +01:00
|
|
|
|
|
|
|
namespace Core {
|
|
|
|
class System;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace Core::Frontend {
|
|
|
|
class EmuWindow;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace Tegra::Engines {
|
|
|
|
class Maxwell3D;
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace Vulkan {
|
|
|
|
|
2022-06-26 06:34:24 +02:00
|
|
|
struct ScreenInfo;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2020-02-21 00:35:53 +01:00
|
|
|
class StateTracker;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2021-07-10 18:19:10 +02:00
|
|
|
class AccelerateDMA : public Tegra::Engines::AccelerateDMAInterface {
|
|
|
|
public:
|
2021-07-12 04:10:42 +02:00
|
|
|
explicit AccelerateDMA(BufferCache& buffer_cache);
|
2021-07-10 18:19:10 +02:00
|
|
|
|
2021-07-12 04:10:42 +02:00
|
|
|
bool BufferCopy(GPUVAddr start_address, GPUVAddr end_address, u64 amount) override;
|
2021-07-10 18:19:10 +02:00
|
|
|
|
2021-07-13 03:33:08 +02:00
|
|
|
bool BufferClear(GPUVAddr src_address, u64 amount, u32 value) override;
|
|
|
|
|
2021-07-12 04:10:42 +02:00
|
|
|
private:
|
|
|
|
BufferCache& buffer_cache;
|
2021-07-10 18:19:10 +02:00
|
|
|
};
|
|
|
|
|
2021-11-05 15:52:31 +01:00
|
|
|
class RasterizerVulkan final : public VideoCore::RasterizerAccelerated,
|
|
|
|
protected VideoCommon::ChannelSetupCaches<VideoCommon::ChannelInfo> {
|
2020-01-17 02:55:23 +01:00
|
|
|
public:
|
2020-12-05 17:40:14 +01:00
|
|
|
explicit RasterizerVulkan(Core::Frontend::EmuWindow& emu_window_, Tegra::GPU& gpu_,
|
2021-11-05 15:52:31 +01:00
|
|
|
Core::Memory::Memory& cpu_memory_, ScreenInfo& screen_info_,
|
|
|
|
const Device& device_, MemoryAllocator& memory_allocator_,
|
|
|
|
StateTracker& state_tracker_, Scheduler& scheduler_);
|
2020-01-17 02:55:23 +01:00
|
|
|
~RasterizerVulkan() override;
|
|
|
|
|
2022-10-21 09:38:50 +02:00
|
|
|
void Draw(bool is_indexed, u32 instance_count) override;
|
2022-02-09 15:39:40 +01:00
|
|
|
void DrawIndirect() override;
|
2022-11-17 04:41:40 +01:00
|
|
|
void Clear(u32 layer_count) override;
|
2021-02-17 00:52:12 +01:00
|
|
|
void DispatchCompute() override;
|
2020-02-11 22:59:44 +01:00
|
|
|
void ResetCounter(VideoCore::QueryType type) override;
|
|
|
|
void Query(GPUVAddr gpu_addr, VideoCore::QueryType type, std::optional<u64> timestamp) override;
|
2021-01-17 00:48:58 +01:00
|
|
|
void BindGraphicsUniformBuffer(size_t stage, u32 index, GPUVAddr gpu_addr, u32 size) override;
|
2021-06-01 19:26:43 +02:00
|
|
|
void DisableGraphicsUniformBuffer(size_t stage, u32 index) override;
|
2020-01-17 02:55:23 +01:00
|
|
|
void FlushAll() override;
|
2020-04-05 18:58:23 +02:00
|
|
|
void FlushRegion(VAddr addr, u64 size) override;
|
2020-02-18 03:29:04 +01:00
|
|
|
bool MustFlushRegion(VAddr addr, u64 size) override;
|
2020-04-05 18:58:23 +02:00
|
|
|
void InvalidateRegion(VAddr addr, u64 size) override;
|
2020-02-16 14:51:37 +01:00
|
|
|
void OnCPUWrite(VAddr addr, u64 size) override;
|
2022-02-06 01:16:11 +01:00
|
|
|
void InvalidateGPUCache() override;
|
2020-12-30 06:25:23 +01:00
|
|
|
void UnmapMemory(VAddr addr, u64 size) override;
|
2022-01-01 22:03:37 +01:00
|
|
|
void ModifyGPUMemory(size_t as_id, GPUVAddr addr, u64 size) override;
|
2022-02-06 01:16:11 +01:00
|
|
|
void SignalFence(std::function<void()>&& func) override;
|
|
|
|
void SyncOperation(std::function<void()>&& func) override;
|
2020-02-19 18:40:37 +01:00
|
|
|
void SignalSyncPoint(u32 value) override;
|
2021-07-06 22:23:10 +02:00
|
|
|
void SignalReference() override;
|
2020-02-18 18:24:38 +01:00
|
|
|
void ReleaseFences() override;
|
2020-04-05 18:58:23 +02:00
|
|
|
void FlushAndInvalidateRegion(VAddr addr, u64 size) override;
|
2020-04-28 07:14:11 +02:00
|
|
|
void WaitForIdle() override;
|
2020-12-30 06:25:23 +01:00
|
|
|
void FragmentBarrier() override;
|
|
|
|
void TiledCacheBarrier() override;
|
2020-01-17 02:55:23 +01:00
|
|
|
void FlushCommands() override;
|
|
|
|
void TickFrame() override;
|
2020-12-30 06:25:23 +01:00
|
|
|
bool AccelerateSurfaceCopy(const Tegra::Engines::Fermi2D::Surface& src,
|
|
|
|
const Tegra::Engines::Fermi2D::Surface& dst,
|
2020-01-17 02:55:23 +01:00
|
|
|
const Tegra::Engines::Fermi2D::Config& copy_config) override;
|
2021-07-10 18:19:10 +02:00
|
|
|
Tegra::Engines::AccelerateDMAInterface& AccessAccelerateDMA() override;
|
2022-01-31 23:41:29 +01:00
|
|
|
void AccelerateInlineToMemory(GPUVAddr address, size_t copy_size,
|
2022-08-14 11:36:36 +02:00
|
|
|
std::span<const u8> memory) override;
|
2020-01-17 02:55:23 +01:00
|
|
|
bool AccelerateDisplay(const Tegra::FramebufferConfig& config, VAddr framebuffer_addr,
|
|
|
|
u32 pixel_stride) override;
|
2021-03-23 01:03:20 +01:00
|
|
|
void LoadDiskResources(u64 title_id, std::stop_token stop_loading,
|
|
|
|
const VideoCore::DiskResourceLoadCallback& callback) override;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2021-11-05 15:52:31 +01:00
|
|
|
void InitializeChannel(Tegra::Control::ChannelState& channel) override;
|
|
|
|
|
|
|
|
void BindChannel(Tegra::Control::ChannelState& channel) override;
|
|
|
|
|
|
|
|
void ReleaseChannel(s32 channel_id) override;
|
|
|
|
|
2020-01-17 02:55:23 +01:00
|
|
|
private:
|
2020-12-30 06:25:23 +01:00
|
|
|
static constexpr size_t MAX_TEXTURES = 192;
|
|
|
|
static constexpr size_t MAX_IMAGES = 48;
|
|
|
|
static constexpr size_t MAX_IMAGE_VIEWS = MAX_TEXTURES + MAX_IMAGES;
|
|
|
|
|
|
|
|
static constexpr VkDeviceSize DEFAULT_BUFFER_SIZE = 4 * sizeof(float);
|
|
|
|
|
2022-02-09 15:00:05 +01:00
|
|
|
template <typename Func>
|
|
|
|
void PrepareDraw(bool is_indexed, Func&&);
|
|
|
|
|
2020-01-17 02:55:23 +01:00
|
|
|
void FlushWork();
|
|
|
|
|
|
|
|
void UpdateDynamicStates();
|
|
|
|
|
2020-03-06 09:11:18 +01:00
|
|
|
void BeginTransformFeedback();
|
|
|
|
|
|
|
|
void EndTransformFeedback();
|
|
|
|
|
2020-02-21 05:21:57 +01:00
|
|
|
void UpdateViewportsState(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateBlendConstants(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateDepthBounds(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateStencilFaces(Tegra::Engines::Maxwell3D::Regs& regs);
|
2021-06-25 10:21:51 +02:00
|
|
|
void UpdateLineWidth(Tegra::Engines::Maxwell3D::Regs& regs);
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2020-06-22 08:03:27 +02:00
|
|
|
void UpdateCullMode(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateDepthBoundsTestEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateDepthTestEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateDepthWriteEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateDepthCompareOp(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateFrontFace(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateStencilOp(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
void UpdateStencilTestEnable(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
|
2021-06-12 10:07:52 +02:00
|
|
|
void UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs);
|
|
|
|
|
2020-06-12 02:24:45 +02:00
|
|
|
Tegra::GPU& gpu;
|
|
|
|
|
2022-06-26 06:34:24 +02:00
|
|
|
ScreenInfo& screen_info;
|
2020-12-26 05:10:53 +01:00
|
|
|
const Device& device;
|
2021-01-03 22:11:01 +01:00
|
|
|
MemoryAllocator& memory_allocator;
|
2020-02-21 00:35:53 +01:00
|
|
|
StateTracker& state_tracker;
|
2022-06-26 06:34:24 +02:00
|
|
|
Scheduler& scheduler;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2020-12-31 02:58:05 +01:00
|
|
|
StagingBufferPool staging_pool;
|
2021-04-25 05:15:32 +02:00
|
|
|
DescriptorPool descriptor_pool;
|
2022-06-26 06:51:37 +02:00
|
|
|
UpdateDescriptorQueue update_descriptor_queue;
|
2020-12-30 06:25:23 +01:00
|
|
|
BlitImageHelper blit_image;
|
2021-03-19 23:28:31 +01:00
|
|
|
RenderPassCache render_pass_cache;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2020-12-30 06:25:23 +01:00
|
|
|
TextureCacheRuntime texture_cache_runtime;
|
|
|
|
TextureCache texture_cache;
|
2021-01-17 00:48:58 +01:00
|
|
|
BufferCacheRuntime buffer_cache_runtime;
|
|
|
|
BufferCache buffer_cache;
|
2021-02-17 00:52:12 +01:00
|
|
|
PipelineCache pipeline_cache;
|
2022-06-26 06:38:44 +02:00
|
|
|
QueryCache query_cache;
|
2021-07-10 18:19:10 +02:00
|
|
|
AccelerateDMA accelerate_dma;
|
2022-06-26 06:32:41 +02:00
|
|
|
FenceManager fence_manager;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
2020-04-28 07:14:11 +02:00
|
|
|
vk::Event wfi_event;
|
2020-04-22 00:20:53 +02:00
|
|
|
|
2020-12-30 06:25:23 +01:00
|
|
|
boost::container::static_vector<u32, MAX_IMAGE_VIEWS> image_view_indices;
|
|
|
|
std::array<VideoCommon::ImageViewId, MAX_IMAGE_VIEWS> image_view_ids;
|
|
|
|
boost::container::static_vector<VkSampler, MAX_TEXTURES> sampler_handles;
|
2020-01-17 02:55:23 +01:00
|
|
|
|
|
|
|
u32 draw_counter = 0;
|
|
|
|
};
|
2020-01-07 01:10:56 +01:00
|
|
|
|
|
|
|
} // namespace Vulkan
|