Browse Source
Merge pull request #9312 from FernandoS27/pokemomma
GPU: Fix buffer cache issue, engine upload not inlining memory in multiple lines, etc
pull/15/merge
Morph
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
9 additions and
15 deletions
-
src/video_core/buffer_cache/buffer_cache.h
-
src/video_core/engines/engine_upload.cpp
-
src/video_core/engines/maxwell_3d.cpp
-
src/video_core/engines/puller.cpp
|
|
|
@ -1742,12 +1742,12 @@ bool BufferCache<P>::InlineMemory(VAddr dest_address, size_t copy_size, |
|
|
|
SynchronizeBuffer(buffer, dest_address, static_cast<u32>(copy_size)); |
|
|
|
|
|
|
|
if constexpr (USE_MEMORY_MAPS) { |
|
|
|
auto upload_staging = runtime.UploadStagingBuffer(copy_size); |
|
|
|
std::array copies{BufferCopy{ |
|
|
|
.src_offset = 0, |
|
|
|
.src_offset = upload_staging.offset, |
|
|
|
.dst_offset = buffer.Offset(dest_address), |
|
|
|
.size = copy_size, |
|
|
|
}}; |
|
|
|
auto upload_staging = runtime.UploadStagingBuffer(copy_size); |
|
|
|
u8* const src_pointer = upload_staging.mapped_span.data(); |
|
|
|
std::memcpy(src_pointer, inlined_buffer.data(), copy_size); |
|
|
|
runtime.CopyBuffer(buffer, upload_staging.buffer, copies); |
|
|
|
|
|
|
|
@ -51,11 +51,11 @@ void State::ProcessData(std::span<const u8> read_buffer) { |
|
|
|
} else { |
|
|
|
for (u32 line = 0; line < regs.line_count; ++line) { |
|
|
|
const GPUVAddr dest_line = address + static_cast<size_t>(line) * regs.dest.pitch; |
|
|
|
memory_manager.WriteBlockUnsafe( |
|
|
|
dest_line, read_buffer.data() + static_cast<size_t>(line) * regs.line_length_in, |
|
|
|
regs.line_length_in); |
|
|
|
std::span<const u8> buffer(read_buffer.data() + |
|
|
|
static_cast<size_t>(line) * regs.line_length_in, |
|
|
|
regs.line_length_in); |
|
|
|
rasterizer->AccelerateInlineToMemory(dest_line, regs.line_length_in, buffer); |
|
|
|
} |
|
|
|
memory_manager.InvalidateRegion(address, regs.dest.pitch * regs.line_count); |
|
|
|
} |
|
|
|
} else { |
|
|
|
u32 width = regs.dest.width; |
|
|
|
|
|
|
|
@ -249,9 +249,6 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume |
|
|
|
return; |
|
|
|
case MAXWELL3D_REG_INDEX(fragment_barrier): |
|
|
|
return rasterizer->FragmentBarrier(); |
|
|
|
case MAXWELL3D_REG_INDEX(invalidate_texture_data_cache): |
|
|
|
rasterizer->InvalidateGPUCache(); |
|
|
|
return rasterizer->WaitForIdle(); |
|
|
|
case MAXWELL3D_REG_INDEX(tiled_cache_barrier): |
|
|
|
return rasterizer->TiledCacheBarrier(); |
|
|
|
} |
|
|
|
@ -511,10 +508,7 @@ void Maxwell3D::ProcessCounterReset() { |
|
|
|
|
|
|
|
void Maxwell3D::ProcessSyncPoint() { |
|
|
|
const u32 sync_point = regs.sync_info.sync_point.Value(); |
|
|
|
const u32 cache_flush = regs.sync_info.clean_l2.Value(); |
|
|
|
if (cache_flush != 0) { |
|
|
|
rasterizer->InvalidateGPUCache(); |
|
|
|
} |
|
|
|
[[maybe_unused]] const u32 cache_flush = regs.sync_info.clean_l2.Value(); |
|
|
|
rasterizer->SignalSyncPoint(sync_point); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -118,7 +118,7 @@ void Puller::ProcessSemaphoreRelease() { |
|
|
|
std::function<void()> operation([this, sequence_address, payload] { |
|
|
|
memory_manager.Write<u32>(sequence_address, payload); |
|
|
|
}); |
|
|
|
rasterizer->SyncOperation(std::move(operation)); |
|
|
|
rasterizer->SignalFence(std::move(operation)); |
|
|
|
} |
|
|
|
|
|
|
|
void Puller::ProcessSemaphoreAcquire() { |
|
|
|
@ -151,8 +151,8 @@ void Puller::CallPullerMethod(const MethodCall& method_call) { |
|
|
|
case BufferMethods::SemaphoreAddressLow: |
|
|
|
case BufferMethods::SemaphoreSequencePayload: |
|
|
|
case BufferMethods::SyncpointPayload: |
|
|
|
break; |
|
|
|
case BufferMethods::WrcacheFlush: |
|
|
|
break; |
|
|
|
case BufferMethods::RefCnt: |
|
|
|
rasterizer->SignalReference(); |
|
|
|
break; |
|
|
|
|