GPU: Fix buffer cache issue, engine upload not inlining memory in multiline and pessismistic invalidation.
This commit is contained in:
		@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user