From fdc414dd2cad28c3dcdd1e3acaec3117317b580f Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Fri, 18 Nov 2022 02:45:22 +0100 Subject: [PATCH] early-access version 3124 --- README.md | 2 +- src/video_core/buffer_cache/buffer_cache.h | 33 +++++++++++++++++-- .../renderer_opengl/gl_rasterizer.cpp | 12 ------- .../renderer_opengl/gl_rasterizer.h | 2 -- .../renderer_vulkan/vk_rasterizer.cpp | 15 --------- .../renderer_vulkan/vk_rasterizer.h | 2 -- src/yuzu_cmd/yuzu.cpp | 1 + 7 files changed, 33 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 5d71bffa9..97a65c369 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 3123. +This is the source code for early-access 3124. ## Legal Notice diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 2d80fc54a..c9c7a8e3c 100755 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -992,7 +992,20 @@ void BufferCache

::BindHostIndexBuffer() { TouchBuffer(buffer, index_buffer.buffer_id); const u32 offset = buffer.Offset(index_buffer.cpu_addr); const u32 size = index_buffer.size; - SynchronizeBuffer(buffer, index_buffer.cpu_addr, size); + if (maxwell3d->inline_index_draw_indexes.size()) { + if constexpr (USE_MEMORY_MAPS) { + auto upload_staging = runtime.UploadStagingBuffer(size); + std::array copies{ + {BufferCopy{.src_offset = upload_staging.offset, .dst_offset = 0, .size = size}}}; + std::memcpy(upload_staging.mapped_span.data(), + maxwell3d->inline_index_draw_indexes.data(), size); + runtime.CopyBuffer(buffer, upload_staging.buffer, copies); + } else { + buffer.ImmediateUpload(0, maxwell3d->inline_index_draw_indexes); + } + } else { + SynchronizeBuffer(buffer, index_buffer.cpu_addr, size); + } if constexpr (HAS_FULL_INDEX_AND_PRIMITIVE_SUPPORT) { const u32 new_offset = offset + maxwell3d->regs.index_buffer.first * maxwell3d->regs.index_buffer.FormatSizeInBytes(); @@ -1275,7 +1288,15 @@ void BufferCache

::UpdateIndexBuffer() { } flags[Dirty::IndexBuffer] = false; last_index_count = index_array.count; - + if (maxwell3d->inline_index_draw_indexes.size()) { + auto inline_index_size = static_cast(maxwell3d->inline_index_draw_indexes.size()); + index_buffer = Binding{ + .cpu_addr = 0, + .size = inline_index_size, + .buffer_id = CreateBuffer(0, inline_index_size), + }; + return; + } const GPUVAddr gpu_addr_begin = index_array.StartAddress(); const GPUVAddr gpu_addr_end = index_array.EndAddress(); const std::optional cpu_addr = gpu_memory->GpuToCpuAddress(gpu_addr_begin); @@ -1491,6 +1512,14 @@ typename BufferCache

::OverlapResult BufferCache

::ResolveOverlaps(VAddr cpu VAddr end = cpu_addr + wanted_size; int stream_score = 0; bool has_stream_leap = false; + if (begin == 0) { + return OverlapResult{ + .ids = std::move(overlap_ids), + .begin = begin, + .end = end, + .has_stream_leap = has_stream_leap, + }; + } for (; cpu_addr >> YUZU_PAGEBITS < Common::DivCeil(end, YUZU_PAGESIZE); cpu_addr += YUZU_PAGESIZE) { const BufferId overlap_id = page_table[cpu_addr >> YUZU_PAGEBITS]; diff --git a/src/video_core/renderer_opengl/gl_rasterizer.cpp b/src/video_core/renderer_opengl/gl_rasterizer.cpp index 2d90317a0..82bd0d6c5 100755 --- a/src/video_core/renderer_opengl/gl_rasterizer.cpp +++ b/src/video_core/renderer_opengl/gl_rasterizer.cpp @@ -222,8 +222,6 @@ void RasterizerOpenGL::Draw(bool is_indexed, u32 instance_count) { pipeline->SetEngine(maxwell3d, gpu_memory); pipeline->Configure(is_indexed); - BindInlineIndexBuffer(); - SyncState(); const GLenum primitive_mode = MaxwellToGL::PrimitiveTopology(maxwell3d->regs.draw.topology); @@ -1139,16 +1137,6 @@ void RasterizerOpenGL::ReleaseChannel(s32 channel_id) { query_cache.EraseChannel(channel_id); } -void RasterizerOpenGL::BindInlineIndexBuffer() { - if (maxwell3d->inline_index_draw_indexes.empty()) { - return; - } - const auto data_count = static_cast(maxwell3d->inline_index_draw_indexes.size()); - auto buffer = Buffer(buffer_cache_runtime, *this, 0, data_count); - buffer.ImmediateUpload(0, maxwell3d->inline_index_draw_indexes); - buffer_cache_runtime.BindIndexBuffer(buffer, 0, data_count); -} - AccelerateDMA::AccelerateDMA(BufferCache& buffer_cache_) : buffer_cache{buffer_cache_} {} bool AccelerateDMA::BufferCopy(GPUVAddr src_address, GPUVAddr dest_address, u64 amount) { diff --git a/src/video_core/renderer_opengl/gl_rasterizer.h b/src/video_core/renderer_opengl/gl_rasterizer.h index 5b5579a44..36b96d213 100755 --- a/src/video_core/renderer_opengl/gl_rasterizer.h +++ b/src/video_core/renderer_opengl/gl_rasterizer.h @@ -199,8 +199,6 @@ private: /// End a transform feedback void EndTransformFeedback(); - void BindInlineIndexBuffer(); - Tegra::GPU& gpu; const Device& device; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index a969a3fea..092dbe528 100755 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -191,8 +191,6 @@ void RasterizerVulkan::Draw(bool is_indexed, u32 instance_count) { pipeline->SetEngine(maxwell3d, gpu_memory); pipeline->Configure(is_indexed); - BindInlineIndexBuffer(); - BeginTransformFeedback(); UpdateDynamicStates(); @@ -1028,17 +1026,4 @@ void RasterizerVulkan::ReleaseChannel(s32 channel_id) { query_cache.EraseChannel(channel_id); } -void RasterizerVulkan::BindInlineIndexBuffer() { - if (maxwell3d->inline_index_draw_indexes.empty()) { - return; - } - const auto data_count = static_cast(maxwell3d->inline_index_draw_indexes.size()); - auto buffer = buffer_cache_runtime.UploadStagingBuffer(data_count); - std::memcpy(buffer.mapped_span.data(), maxwell3d->inline_index_draw_indexes.data(), data_count); - buffer_cache_runtime.BindIndexBuffer( - maxwell3d->regs.draw.topology, maxwell3d->regs.index_buffer.format, - maxwell3d->regs.index_buffer.first, maxwell3d->regs.index_buffer.count, buffer.buffer, - static_cast(buffer.offset), data_count); -} - } // namespace Vulkan diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.h b/src/video_core/renderer_vulkan/vk_rasterizer.h index cc3766aae..44b9576e9 100755 --- a/src/video_core/renderer_vulkan/vk_rasterizer.h +++ b/src/video_core/renderer_vulkan/vk_rasterizer.h @@ -141,8 +141,6 @@ private: void UpdateVertexInput(Tegra::Engines::Maxwell3D::Regs& regs); - void BindInlineIndexBuffer(); - Tegra::GPU& gpu; ScreenInfo& screen_info; diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp index b886894ee..9301f5cbc 100755 --- a/src/yuzu_cmd/yuzu.cpp +++ b/src/yuzu_cmd/yuzu.cpp @@ -351,6 +351,7 @@ int main(int argc, char** argv) { "additional help.\n\nError Code: {:04X}-{:04X}\nError Description: {}", loader_id, error_id, static_cast(error_id)); } + break; } system.TelemetrySession().AddField(Common::Telemetry::FieldType::App, "Frontend", "SDL");