1
0
Fork 1
forked from suyu/suyu

vk_rasterizer: Address feedback

This commit is contained in:
ReinUsesLisp 2020-01-17 21:40:01 -03:00
parent fe5356d223
commit 09b1d762d7
2 changed files with 32 additions and 25 deletions

View file

@ -203,6 +203,8 @@ public:
return BindStatic<30>(scheduler); return BindStatic<30>(scheduler);
case 31: case 31:
return BindStatic<31>(scheduler); return BindStatic<31>(scheduler);
case 32:
return BindStatic<32>(scheduler);
} }
UNREACHABLE(); UNREACHABLE();
} }
@ -526,7 +528,6 @@ bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config,
VideoCore::Surface::PixelFormatFromGPUPixelFormat(config.pixel_format)}; VideoCore::Surface::PixelFormatFromGPUPixelFormat(config.pixel_format)};
ASSERT_MSG(params.width == config.width, "Framebuffer width is different"); ASSERT_MSG(params.width == config.width, "Framebuffer width is different");
ASSERT_MSG(params.height == config.height, "Framebuffer height is different"); ASSERT_MSG(params.height == config.height, "Framebuffer height is different");
// ASSERT_MSG(params.pixel_format == pixel_format, "Framebuffer pixel_format is different");
screen_info.image = &surface->GetImage(); screen_info.image = &surface->GetImage();
screen_info.width = params.width; screen_info.width = params.width;
@ -536,17 +537,24 @@ bool RasterizerVulkan::AccelerateDisplay(const Tegra::FramebufferConfig& config,
} }
void RasterizerVulkan::FlushWork() { void RasterizerVulkan::FlushWork() {
static constexpr u32 DRAWS_TO_DISPATCH = 4096;
// Only check multiples of 8 draws
static_assert(DRAWS_TO_DISPATCH % 8 == 0);
if ((++draw_counter & 7) != 7) { if ((++draw_counter & 7) != 7) {
return; return;
} }
if (draw_counter < 4096) {
// Flush work to the worker thread every 8 draws if (draw_counter < DRAWS_TO_DISPATCH) {
// Send recorded tasks to the worker thread
scheduler.DispatchWork(); scheduler.DispatchWork();
} else { return;
// Flush work to the GPU (and implicitly the worker thread) every N draws
scheduler.Flush();
draw_counter = 0;
} }
// Otherwise (every certain number of draws) flush execution.
// This submits commands to the Vulkan driver.
scheduler.Flush();
draw_counter = 0;
} }
RasterizerVulkan::Texceptions RasterizerVulkan::UpdateAttachments() { RasterizerVulkan::Texceptions RasterizerVulkan::UpdateAttachments() {
@ -593,18 +601,16 @@ bool RasterizerVulkan::WalkAttachmentOverlaps(const CachedSurfaceView& attachmen
std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers( std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffers(
vk::RenderPass renderpass) { vk::RenderPass renderpass) {
FramebufferCacheKey fbkey; FramebufferCacheKey key{renderpass, std::numeric_limits<u32>::max(),
fbkey.renderpass = renderpass; std::numeric_limits<u32>::max()};
fbkey.width = std::numeric_limits<u32>::max();
fbkey.height = std::numeric_limits<u32>::max();
const auto MarkAsModifiedAndPush = [&](const View& view) { const auto MarkAsModifiedAndPush = [&](const View& view) {
if (view == nullptr) { if (view == nullptr) {
return false; return false;
} }
fbkey.views.push_back(view->GetHandle()); key.views.push_back(view->GetHandle());
fbkey.width = std::min(fbkey.width, view->GetWidth()); key.width = std::min(key.width, view->GetWidth());
fbkey.height = std::min(fbkey.height, view->GetHeight()); key.height = std::min(key.height, view->GetHeight());
return true; return true;
}; };
@ -617,18 +623,18 @@ std::tuple<vk::Framebuffer, vk::Extent2D> RasterizerVulkan::ConfigureFramebuffer
texture_cache.MarkDepthBufferInUse(); texture_cache.MarkDepthBufferInUse();
} }
const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(fbkey); const auto [fbentry, is_cache_miss] = framebuffer_cache.try_emplace(key);
auto& framebuffer = fbentry->second; auto& framebuffer = fbentry->second;
if (is_cache_miss) { if (is_cache_miss) {
const vk::FramebufferCreateInfo framebuffer_ci( const vk::FramebufferCreateInfo framebuffer_ci({}, key.renderpass,
{}, fbkey.renderpass, static_cast<u32>(fbkey.views.size()), fbkey.views.data(), static_cast<u32>(key.views.size()),
fbkey.width, fbkey.height, 1); key.views.data(), key.width, key.height, 1);
const auto dev = device.GetLogical(); const auto dev = device.GetLogical();
const auto& dld = device.GetDispatchLoader(); const auto& dld = device.GetDispatchLoader();
framebuffer = dev.createFramebufferUnique(framebuffer_ci, nullptr, dld); framebuffer = dev.createFramebufferUnique(framebuffer_ci, nullptr, dld);
} }
return {*framebuffer, vk::Extent2D{fbkey.width, fbkey.height}}; return {*framebuffer, vk::Extent2D{key.width, key.height}};
} }
RasterizerVulkan::DrawParameters RasterizerVulkan::SetupGeometry(FixedPipelineState& fixed_state, RasterizerVulkan::DrawParameters RasterizerVulkan::SetupGeometry(FixedPipelineState& fixed_state,
@ -771,8 +777,8 @@ void RasterizerVulkan::SetupIndexBuffer(BufferBindings& buffer_bindings, DrawPar
if (!is_indexed) { if (!is_indexed) {
break; break;
} }
auto [buffer, offset] = const GPUVAddr gpu_addr = regs.index_array.IndexStart();
buffer_cache.UploadMemory(regs.index_array.IndexStart(), CalculateIndexBufferSize()); auto [buffer, offset] = buffer_cache.UploadMemory(gpu_addr, CalculateIndexBufferSize());
auto format = regs.index_array.format; auto format = regs.index_array.format;
const bool is_uint8 = format == Maxwell::IndexFormat::UnsignedByte; const bool is_uint8 = format == Maxwell::IndexFormat::UnsignedByte;
@ -918,7 +924,7 @@ void RasterizerVulkan::SetupGlobalBuffer(const GlobalBufferEntry& entry, GPUVAdd
void RasterizerVulkan::SetupTexelBuffer(const Tegra::Texture::TICEntry& tic, void RasterizerVulkan::SetupTexelBuffer(const Tegra::Texture::TICEntry& tic,
const TexelBufferEntry& entry) { const TexelBufferEntry& entry) {
auto view = texture_cache.GetTextureSurface(tic, entry); const auto view = texture_cache.GetTextureSurface(tic, entry);
ASSERT(view->IsBufferView()); ASSERT(view->IsBufferView());
update_descriptor_queue.AddTexelBuffer(view->GetBufferView()); update_descriptor_queue.AddTexelBuffer(view->GetBufferView());

View file

@ -11,6 +11,7 @@
#include <vector> #include <vector>
#include <boost/container/static_vector.hpp> #include <boost/container/static_vector.hpp>
#include <boost/functional/hash.hpp>
#include "common/common_types.h" #include "common/common_types.h"
#include "video_core/memory_manager.h" #include "video_core/memory_manager.h"
@ -51,10 +52,10 @@ using ImageViewsPack =
boost::container::static_vector<vk::ImageView, Maxwell::NumRenderTargets + 1>; boost::container::static_vector<vk::ImageView, Maxwell::NumRenderTargets + 1>;
struct FramebufferCacheKey { struct FramebufferCacheKey {
vk::RenderPass renderpass; vk::RenderPass renderpass{};
u32 width = 0;
u32 height = 0;
ImageViewsPack views; ImageViewsPack views;
u32 width;
u32 height;
std::size_t Hash() const noexcept { std::size_t Hash() const noexcept {
std::size_t hash = 0; std::size_t hash = 0;