From 1669d0fdbdfe5ae7ff060b0b45aa3657f34a99b1 Mon Sep 17 00:00:00 2001 From: Oil Date: Tue, 7 Feb 2017 23:59:59 +0300 Subject: [PATCH] Minor changes (#2352) * More initial values for rsx method registers * Implemented spu decrementer event * Remove u32 cast --- rpcs3/Emu/Cell/SPUThread.cpp | 6 ++++++ rpcs3/Emu/Cell/SPUThread.h | 2 +- rpcs3/Emu/RSX/gcm_enums.h | 6 ++++++ rpcs3/Emu/RSX/rsx_methods.cpp | 17 +++++++++++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 7d951bb479..ccdf201ce4 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -511,6 +511,12 @@ u32 SPUThread::get_events(bool waiting) last_raddr = 0; } + // SPU Decrementer Event + if ((ch_dec_value - (get_timebased_time() - ch_dec_start_timestamp)) >> 31) + { + ch_event_stat |= SPU_EVENT_TM; + } + // initialize waiting if (waiting) { diff --git a/rpcs3/Emu/Cell/SPUThread.h b/rpcs3/Emu/Cell/SPUThread.h index 38c954c2e2..5be1fd6114 100644 --- a/rpcs3/Emu/Cell/SPUThread.h +++ b/rpcs3/Emu/Cell/SPUThread.h @@ -63,7 +63,7 @@ enum : u32 SPU_EVENT_SN = 0x2, // MFC List Command stall-and-notify event SPU_EVENT_TG = 0x1, // MFC Tag Group status update event - SPU_EVENT_IMPLEMENTED = SPU_EVENT_LR, // Mask of implemented events + SPU_EVENT_IMPLEMENTED = SPU_EVENT_LR | SPU_EVENT_TM, // Mask of implemented events SPU_EVENT_WAITING = 0x80000000, // Originally unused, set when SPU thread starts waiting on ch_event_stat //SPU_EVENT_AVAILABLE = 0x40000000, // Originally unused, channel count of the SPU_RdEventStat channel diff --git a/rpcs3/Emu/RSX/gcm_enums.h b/rpcs3/Emu/RSX/gcm_enums.h index 6de5f63004..27a43de158 100644 --- a/rpcs3/Emu/RSX/gcm_enums.h +++ b/rpcs3/Emu/RSX/gcm_enums.h @@ -690,6 +690,12 @@ enum CELL_GCM_CONTEXT_DMA_TO_MEMORY_GET_REPORT = 0x66626660, CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN = 0xBAD68000, CELL_GCM_CONTEXT_DMA_NOTIFY_MAIN_0 = 0x6660420F, + + CELL_GCM_CONTEXT_DMA_TO_MEMORY_GET_NOTIFY0 = 0x66604200, + CELL_GCM_CONTEXT_DMA_SEMAPHORE_RW = 0x66606660, + CELL_GCM_CONTEXT_DMA_SEMAPHORE_R = 0x66616661, + CELL_GCM_CONTEXT_DMA_DEVICE_RW = 0x56616660, + CELL_GCM_CONTEXT_DMA_DEVICE_R = 0x56616661 }; enum diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index 8e6adb572f..4c19a15a7c 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -859,8 +859,6 @@ namespace rsx registers[NV4097_SET_CULL_FACE] = CELL_GCM_BACK; registers[NV4097_SET_FRONT_FACE] = CELL_GCM_CCW; registers[NV4097_SET_RESTART_INDEX] = -1; - registers[NV4097_SET_CONTEXT_DMA_REPORT] = CELL_GCM_CONTEXT_DMA_TO_MEMORY_GET_REPORT; - registers[NV4097_SET_CLEAR_RECT_HORIZONTAL] = (4096 << 16) | 0; registers[NV4097_SET_CLEAR_RECT_VERTICAL] = (4096 << 16) | 0; @@ -870,6 +868,21 @@ namespace rsx // CELL_GCM_SURFACE_A8R8G8B8, CELL_GCM_SURFACE_Z24S8 and CELL_GCM_SURFACE_CENTER_1 registers[NV4097_SET_SURFACE_FORMAT] = (8 << 0) | (2 << 5) | (0 << 12) | (1 << 16) | (1 << 24); + // rsx dma initial values + registers[NV4097_SET_CONTEXT_DMA_REPORT] = CELL_GCM_CONTEXT_DMA_TO_MEMORY_GET_REPORT; + registers[NV406E_SET_CONTEXT_DMA_SEMAPHORE] = CELL_GCM_CONTEXT_DMA_SEMAPHORE_RW; + registers[NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV309E_SET_CONTEXT_DMA_IMAGE] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV0039_SET_CONTEXT_DMA_BUFFER_IN] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV0039_SET_CONTEXT_DMA_BUFFER_OUT] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV4097_SET_CONTEXT_DMA_COLOR_A] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV4097_SET_CONTEXT_DMA_COLOR_B] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV4097_SET_CONTEXT_DMA_COLOR_C] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV4097_SET_CONTEXT_DMA_COLOR_D] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + registers[NV4097_SET_CONTEXT_DMA_ZETA] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; + + registers[NV3089_SET_CONTEXT_SURFACE] = 0x313371C3; // CELL_GCM_CONTEXT_SURFACE2D + for (auto& tex : fragment_textures) tex.init(); for (auto& tex : vertex_textures) tex.init(); for (auto& vtx : vertex_arrays_info) vtx.reset();