From 488dcefec551cb83eb393bba474c5fe6aa75e937 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 1 Oct 2026 02:49:53 -0400 Subject: [PATCH] Port UMA part 4 --- src/video_core/buffer_cache/buffer_cache.h | 34 ++++++++++++---------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 00d632744b..9efac6a5bf 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -804,16 +804,18 @@ void BufferCache

::BindHostIndexBuffer() { const auto& draw_state = maxwell3d->draw_manager.draw_state; if (draw_state.inline_index_draw_indexes.empty()) { SynchronizeBuffer(buffer, channel_state->index_buffer.device_addr, size); + } else if constexpr (USE_MEMORY_MAPS_FOR_UPLOADS) { + const auto upload_staging = runtime.UploadStagingBuffer(size); + std::memcpy(upload_staging.mapped_span.data(), + draw_state.inline_index_draw_indexes.data(), size); + runtime.BindIndexBuffer(draw_state.topology, draw_state.index_buffer.format, + draw_state.index_buffer.first, draw_state.index_buffer.count, + upload_staging.buffer, static_cast(upload_staging.offset), + size); + return; } else { buffer.MarkContentModified(); - if constexpr (USE_MEMORY_MAPS_FOR_UPLOADS) { - 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(), draw_state.inline_index_draw_indexes.data(), size); - runtime.CopyBuffer(buffer, upload_staging.buffer, copies, true); - } else { - buffer.ImmediateUpload(0, draw_state.inline_index_draw_indexes); - } + buffer.ImmediateUpload(0, draw_state.inline_index_draw_indexes); } if constexpr (HAS_FULL_INDEX_AND_PRIMITIVE_SUPPORT) { const u32 new_offset = offset + draw_state.index_buffer.first * u32(draw_state.index_buffer.FormatSizeInBytes()); @@ -1370,13 +1372,15 @@ void BufferCache

::UpdateIndexBuffer() { flags[Dirty::IndexBuffer] = false; if (!draw_state.inline_index_draw_indexes.empty()) [[unlikely]] { auto inline_index_size = static_cast(draw_state.inline_index_draw_indexes.size()); - u32 buffer_size = Common::AlignUp(inline_index_size, CACHING_PAGESIZE); - if (inline_buffer_id == NULL_BUFFER_ID) [[unlikely]] { - inline_buffer_id = CreateBuffer(0, buffer_size, false); - } - if (slot_buffers[inline_buffer_id].SizeBytes() < buffer_size) [[unlikely]] { - DeleteBuffer(inline_buffer_id, true); - inline_buffer_id = CreateBuffer(0, buffer_size, false); + if constexpr (!USE_MEMORY_MAPS_FOR_UPLOADS) { + const u32 buffer_size = Common::AlignUp(inline_index_size, CACHING_PAGESIZE); + if (inline_buffer_id == NULL_BUFFER_ID) [[unlikely]] { + inline_buffer_id = CreateBuffer(0, buffer_size, false); + } + if (slot_buffers[inline_buffer_id].SizeBytes() < buffer_size) [[unlikely]] { + DeleteBuffer(inline_buffer_id, true); + inline_buffer_id = CreateBuffer(0, buffer_size, false); + } } channel_state->index_buffer = Binding{ .device_addr = 0,