From 8d1d227dac1311c42e614574204a0ab1de815717 Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 1 Jul 2014 07:57:49 +0800 Subject: [PATCH 1/2] Cross-check and validate all NV0406E/4097/3089/3062/308A functions with gcm_method.h --- rpcs3/Emu/GS/RSXThread.cpp | 703 +++++++++++++++++++++++++++++++------ 1 file changed, 592 insertions(+), 111 deletions(-) diff --git a/rpcs3/Emu/GS/RSXThread.cpp b/rpcs3/Emu/GS/RSXThread.cpp index e0b53c4d20..cc93503b06 100644 --- a/rpcs3/Emu/GS/RSXThread.cpp +++ b/rpcs3/Emu/GS/RSXThread.cpp @@ -193,6 +193,60 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 switch(cmd) { + // NV406E + case NV406E_SET_REFERENCE: + { + m_ctrl->ref = ARGS(0); + } + break; + + case NV406E_SET_CONTEXT_DMA_SEMAPHORE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV406E_SET_CONTEXT_DMA_SEMAPHORE: %x", ARGS(0)); + } + break; + + case NV4097_SET_SEMAPHORE_OFFSET: + case NV406E_SEMAPHORE_OFFSET: + { + m_set_semaphore_offset = true; + m_semaphore_offset = ARGS(0); + } + break; + + case NV406E_SEMAPHORE_ACQUIRE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV406E_SEMAPHORE_ACQUIRE: %x", ARGS(0)); + } + break; + + case NV406E_SEMAPHORE_RELEASE: + case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE: + { + if(m_set_semaphore_offset) + { + m_set_semaphore_offset = false; + Memory.Write32(Memory.RSXCMDMem.GetStartAddr() + m_semaphore_offset, ARGS(0)); + } + } + break; + + case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE: + { + if(m_set_semaphore_offset) + { + m_set_semaphore_offset = false; + u32 value = ARGS(0); + value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff); + + Memory.Write32(Memory.RSXCMDMem.GetStartAddr() + m_semaphore_offset, value); + } + } + break; + + // NV4097 case NV4097_SET_FLIP: //if(cmd == 0xfeadffff) { @@ -214,16 +268,31 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case NV4097_NO_OPERATION: { - LOG_WARNING(RSX, "NV4097_NO_OPERATION"); + // Nothing to do here } break; - case NV406E_SET_REFERENCE: + case NV4097_NOTIFY: { - m_ctrl->ref = ARGS(0); + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_NOTIFY: %x", ARGS(0)); } break; - + + case NV4097_WAIT_FOR_IDLE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_WAIT_FOR_IDLE: %x", ARGS(0)); + } + break; + + case NV4097_PM_TRIGGER: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_PM_TRIGGER: %x", ARGS(0)); + } + break; + // Texture case_16(NV4097_SET_TEXTURE_FORMAT, 0x20) : { @@ -431,10 +500,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 m_set_alpha_func = true; m_alpha_func = ARGS(0); - if (count >= 2) + if (count == 2) { m_set_alpha_ref = true; - const u32 a1 = ARGS(1); m_alpha_ref = (float&)a1; } @@ -480,6 +548,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 { if (ARGS(0)) LOG_WARNING(RSX, "NV4097_SET_BLEND_ENABLE_MRT: %x", ARGS(0)); + + // TODO: + // (cmd)[1] = CELL_GCM_ENDIAN_SWAP(((mrt1) << 1) | ((mrt2) << 2) | ((mrt3) << 3)); } break; @@ -489,7 +560,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 m_blend_sfactor_rgb = ARGS(0) & 0xffff; m_blend_sfactor_alpha = ARGS(0) >> 16; - if (count >= 2) + if (count == 2) { m_set_blend_dfactor = true; m_blend_dfactor_rgb = ARGS(1) & 0xffff; @@ -550,7 +621,8 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 m_set_depth_bounds = true; const u32 a0 = ARGS(0); m_depth_bounds_min = (float&)a0; - if (count > 1) + + if (count == 2) { const u32 a1 = ARGS(1); m_depth_bounds_max = (float&)a1; @@ -567,21 +639,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 break; // Viewport - case NV4097_SET_VIEWPORT_VERTICAL: - { - m_set_viewport_vertical = true; - m_viewport_y = ARGS(0) & 0xffff; - m_viewport_h = ARGS(0) >> 16; - } - break; - case NV4097_SET_VIEWPORT_HORIZONTAL: { m_set_viewport_horizontal = true; m_viewport_x = ARGS(0) & 0xffff; m_viewport_w = ARGS(0) >> 16; - if(count == 2) + if (count == 2) { m_set_viewport_vertical = true; m_viewport_y = ARGS(1) & 0xffff; @@ -592,6 +656,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_SET_VIEWPORT_VERTICAL: + { + m_set_viewport_vertical = true; + m_viewport_y = ARGS(0) & 0xffff; + m_viewport_h = ARGS(0) >> 16; + } + break; + case NV4097_SET_VIEWPORT_SCALE: case NV4097_SET_VIEWPORT_OFFSET: { @@ -641,7 +713,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - // Polygon + // Polygon mode/offset case NV4097_SET_FRONT_POLYGON_MODE: { m_set_front_polygon_mode = true; @@ -681,6 +753,12 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 const u32 a0 = ARGS(0); m_poly_offset_scale_factor = (float&)a0; + + if (count == 2) + { + const u32 a1 = ARGS(1); + m_poly_offset_bias = (float&)a1; + } } break; @@ -739,6 +817,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_CLEAR_REPORT_VALUE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_CLEAR_REPORT_VALUE: %x", ARGS(0)); + } + break; + case NV4097_SET_CLEAR_RECT_HORIZONTAL: { if (ARGS(0)) @@ -766,7 +851,11 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 LoadVertexData(first, _count); - if(first < m_draw_array_first) m_draw_array_first = first; + if (first < m_draw_array_first) + { + m_draw_array_first = first; + } + m_draw_array_count += _count; } } @@ -890,19 +979,24 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 m_cur_vertex_prog = &m_vertex_progs[ARGS(0)]; m_cur_vertex_prog->data.clear(); - if(count == 2) + if (count == 2) { const u32 start = ARGS(1); - if(start) + if (start) + { LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_LOAD: start = %d", start); + } } } break; case NV4097_SET_TRANSFORM_PROGRAM_START: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_START: 0x%x", ARGS(0)); + const u32 start = ARGS(0); + if (start) + { + LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_START: start = %d", start); + } } break; @@ -922,6 +1016,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case NV4097_SET_TRANSFORM_TIMEOUT: + // TODO: + // (cmd)[1] = CELL_GCM_ENDIAN_SWAP((count) | ((registerCount) << 16)); \ + if(!m_cur_vertex_prog) { LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_TIMEOUT: m_cur_vertex_prog == NULL"); @@ -964,15 +1061,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case NV4097_INVALIDATE_VERTEX_CACHE_FILE: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_INVALIDATE_VERTEX_CACHE_FILE: %x", ARGS(0)); + // Nothing to do here } break; case NV4097_INVALIDATE_VERTEX_FILE: { - if (ARGS(0)) - LOG_WARNING(RSX, "NV4097_INVALIDATE_VERTEX_FILE: %x", ARGS(0)); + // Nothing to do here } break; @@ -1010,6 +1105,12 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_SET_TWO_SIDED_STENCIL_TEST_ENABLE: + { + m_set_two_sided_stencil_test_enable = ARGS(0) ? true : false; + } + break; + case NV4097_SET_STENCIL_MASK: { m_set_stencil_mask = true; @@ -1021,6 +1122,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 { m_set_stencil_func = true; m_stencil_func = ARGS(0); + if(count >= 2) { m_set_stencil_func_ref = true; @@ -1053,6 +1155,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 { m_set_stencil_fail = true; m_stencil_fail = ARGS(0); + if(count >= 2) { m_set_stencil_zfail = true; @@ -1067,12 +1170,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - case NV4097_SET_TWO_SIDED_STENCIL_TEST_ENABLE: - { - m_set_two_sided_stencil_test_enable = ARGS(0) ? true : false; - } - break; - case NV4097_SET_BACK_STENCIL_MASK: { m_set_back_stencil_mask = true; @@ -1084,6 +1181,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 { m_set_back_stencil_func = true; m_back_stencil_func = ARGS(0); + if(count >= 2) { m_set_back_stencil_func_ref = true; @@ -1116,6 +1214,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 { m_set_stencil_fail = true; m_stencil_fail = ARGS(0); + if(count >= 2) { m_set_back_stencil_zfail = true; @@ -1173,6 +1272,9 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case NV4097_SET_POINT_SPRITE_CONTROL: { m_set_point_sprite_control = ARGS(0) ? true : false; + + // TODO: + //(cmd)[1] = CELL_GCM_ENDIAN_SWAP((enable) | ((rmode) << 1) | (texcoordMask)); } break; @@ -1184,14 +1286,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 break; // Scissor - case NV4097_SET_SCISSOR_VERTICAL: - { - m_set_scissor_vertical = true; - m_scissor_y = ARGS(0) & 0xffff; - m_scissor_h = ARGS(0) >> 16; - } - break; - case NV4097_SET_SCISSOR_HORIZONTAL: { m_set_scissor_horizontal = true; @@ -1207,47 +1301,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - // Semaphore - case NV4097_SET_SEMAPHORE_OFFSET: - case NV406E_SEMAPHORE_OFFSET: + case NV4097_SET_SCISSOR_VERTICAL: { - m_set_semaphore_offset = true; - m_semaphore_offset = ARGS(0); + m_set_scissor_vertical = true; + m_scissor_y = ARGS(0) & 0xffff; + m_scissor_h = ARGS(0) >> 16; } break; - case NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE: - { - if(m_set_semaphore_offset) - { - m_set_semaphore_offset = false; - u32 value = ARGS(0); - value = (value & 0xff00ff00) | ((value & 0xff) << 16) | ((value >> 16) & 0xff); - - Memory.Write32(Memory.RSXCMDMem.GetStartAddr() + m_semaphore_offset, value); - } - } - break; - - case NV406E_SEMAPHORE_RELEASE: - case NV4097_TEXTURE_READ_SEMAPHORE_RELEASE: - { - if(m_set_semaphore_offset) - { - m_set_semaphore_offset = false; - Memory.Write32(Memory.RSXCMDMem.GetStartAddr() + m_semaphore_offset, ARGS(0)); - } - } - break; - - case NV406E_SEMAPHORE_ACQUIRE: - { - if (ARGS(0)) - LOG_WARNING(RSX, "NV406E_SEMAPHORE_ACQUIRE: %x", ARGS(0)); - } - break; - - // Depth/ Color buffer usage case NV4097_SET_SURFACE_FORMAT: { @@ -1420,12 +1481,17 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - case NV4097_SET_SURFACE_CLIP_VERTICAL: + case NV4097_SET_CONTEXT_DMA_SEMAPHORE: { - const u32 a0 = ARGS(0); - m_set_surface_clip_vertical = true; - m_surface_clip_y = a0; - m_surface_clip_h = a0 >> 16; + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_SEMAPHORE: %x", ARGS(0)); + } + break; + + case NV4097_SET_CONTEXT_DMA_NOTIFIES: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); } break; @@ -1437,7 +1503,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 m_surface_clip_x = a0; m_surface_clip_w = a0 >> 16; - if(count >= 2) + if(count == 2) { const u32 a1 = ARGS(1); m_set_surface_clip_vertical = true; @@ -1447,15 +1513,27 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - // Antialiasing + case NV4097_SET_SURFACE_CLIP_VERTICAL: + { + const u32 a0 = ARGS(0); + m_set_surface_clip_vertical = true; + m_surface_clip_y = a0; + m_surface_clip_h = a0 >> 16; + } + break; + + // Anti aliasing case NV4097_SET_ANTI_ALIASING_CONTROL: { + // TODO: + // (cmd)[1] = CELL_GCM_ENDIAN_SWAP((enable) | ((alphaToCoverage) << 4) | ((alphaToOne) << 8) | ((sampleMask) << 16)); \ + if (ARGS(0)) LOG_WARNING(RSX, "NV4097_SET_ANTI_ALIASING_CONTROL: %x", ARGS(0)); } break; - // Line/Polygon Smoothing + // Line/Polygon smoothing case NV4097_SET_LINE_SMOOTH_ENABLE: { m_set_line_smooth = ARGS(0) ? true : false; @@ -1477,7 +1555,7 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - // Line/Polygon Stipple + // Line/Polygon stipple case NV4097_SET_LINE_STIPPLE: { m_set_line_stipple = ARGS(0) ? true : false; @@ -1493,6 +1571,20 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_SET_POLYGON_STIPPLE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_POLYGON_STIPPLE: %x", ARGS(0)); + } + break; + + case NV4097_SET_POLYGON_STIPPLE_PATTERN: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_POLYGON_STIPPLE_PATTERN: %x", ARGS(0)); + } + break; + // Zcull case NV4097_SET_ZCULL_EN: { @@ -1523,6 +1615,20 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_SET_ZCULL_STATS_ENABLE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_ZCULL_STATS_ENABLE: %x", ARGS(0)); + } + break; + + case NV4097_ZCULL_SYNC: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_ZCULL_SYNC: %x", ARGS(0)); + } + break; + // Reporting case NV4097_GET_REPORT: { @@ -1573,6 +1679,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 break; // Fog + case NV4097_SET_FOG_MODE: + { + m_set_fog_mode = true; + m_fog_mode = ARGS(0); + } + break; + case NV4097_SET_FOG_PARAMS: { m_set_fog_params = true; @@ -1583,18 +1696,14 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - case NV4097_SET_FOG_MODE: - { - m_set_fog_mode = true; - m_fog_mode = ARGS(0); - } - break; - // Zmin_max case NV4097_SET_ZMIN_MAX_CONTROL: { if (ARGS(0)) LOG_WARNING(RSX, "NV4097_SET_ZMIN_MAX_CONTROL: %x", ARGS(0)); + + // TODO: + // (cmd)[1] = CELL_GCM_ENDIAN_SWAP((cullNearFarEnable) | ((zclampEnable) << 4) | ((cullIgnoreW)<<8)); } break; @@ -1633,6 +1742,23 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV4097_SET_RENDER_ENABLE: + { + // TODO: + // (cmd)[1] = CELL_GCM_ENDIAN_SWAP((offset) | ((mode) << 24)); \ + + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_RENDER_ENABLE: %x", ARGS(0)); + } + break; + + case NV4097_SET_ZPASS_PIXEL_COUNT_ENABLE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV4097_SET_ZPASS_PIXEL_COUNT_ENABLE: %x", ARGS(0)); + } + break; + case 0x000002c8: case 0x000002d0: case 0x000002d8: @@ -1642,6 +1768,21 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 case 0x000002f8: break; + // NV0039 + case NV0039_SET_OBJECT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_SET_OBJECT: %x", ARGS(0)); + } + break; + + case NV0039_SET_CONTEXT_DMA_NOTIFIES: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); + } + break; + case NV0039_SET_CONTEXT_DMA_BUFFER_IN: // [E : RSXThread]: TODO: unknown/illegal method [0x00002184](0xfeed0000, 0xfeed0000) { const u32 srcContext = ARGS(0); @@ -1657,6 +1798,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV0039_SET_CONTEXT_DMA_BUFFER_OUT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_SET_CONTEXT_DMA_BUFFER_OUT: %x", ARGS(0)); + } + break; + case NV0039_OFFSET_IN: // [E : RSXThread]: TODO: unknown/illegal method [0x0000230c](0x0, 0xb00400, 0x0, 0x0, 0x384000, 0x1, 0x101, 0x0) { const u32 inOffset = ARGS(0); @@ -1696,12 +1844,247 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV0039_PITCH_IN: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_PITCH_IN: %x", ARGS(0)); + } + break; + + case NV0039_PITCH_OUT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_PITCH_OUT: %x", ARGS(0)); + } + break; + + case NV0039_LINE_LENGTH_IN: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_LINE_LENGTH_IN: %x", ARGS(0)); + } + break; + + case NV0039_LINE_COUNT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_LINE_COUNT: %x", ARGS(0)); + } + break; + + case NV0039_FORMAT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_FORMAT: %x", ARGS(0)); + } + break; + + case NV0039_BUFFER_NOTIFY: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV0039_BUFFER_NOTIFY: %x", ARGS(0)); + } + break; + + // NV3062 + case NV3062_SET_OBJECT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3062_SET_OBJECT: %x", ARGS(0)); + } + break; + + case NV3062_SET_CONTEXT_DMA_NOTIFIES: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3062_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); + } + break; + + case NV3062_SET_CONTEXT_DMA_IMAGE_SOURCE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3062_SET_CONTEXT_DMA_IMAGE_SOURCE: %x", ARGS(0)); + } + break; + + case NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN: + { + m_context_dma_img_dst = ARGS(0); + } + break; + + case NV3062_SET_COLOR_FORMAT: + { + m_color_format = ARGS(0); + m_color_format_src_pitch = ARGS(1); + m_color_format_dst_pitch = ARGS(1) >> 16; + } + break; + + case NV3062_SET_PITCH: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3062_SET_PITCH: %x", ARGS(0)); + } + break; + + case NV3062_SET_OFFSET_SOURCE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3062_SET_OFFSET_SOURCE: %x", ARGS(0)); + } + break; + case NV3062_SET_OFFSET_DESTIN: { m_dst_offset = ARGS(0); } break; + // NV309E + case NV309E_SET_OBJECT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV309E_SET_OBJECT: %x", ARGS(0)); + } + break; + + case NV309E_SET_CONTEXT_DMA_NOTIFIES: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV309E_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); + } + break; + + case NV309E_SET_CONTEXT_DMA_IMAGE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV309E_SET_CONTEXT_DMA_IMAGE: %x", ARGS(0)); + } + break; + + case NV309E_SET_FORMAT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV309E_SET_FORMAT: %x", ARGS(0)); + } + break; + + case NV309E_SET_OFFSET: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV309E_SET_OFFSET: %x", ARGS(0)); + } + break; + + // NV308A + case NV308A_SET_OBJECT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_OBJECT: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_DMA_NOTIFIES: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_COLOR_KEY: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_COLOR_KEY: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_CLIP_RECTANGLE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_CLIP_RECTANGLE: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_PATTERN: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_PATTERN: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_ROP: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_ROP: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_BETA1: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_BETA1: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_BETA4: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_CONTEXT_BETA4: %x", ARGS(0)); + } + break; + + case NV308A_SET_CONTEXT_SURFACE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_SURFACE: %x", ARGS(0)); + } + break; + + case NV308A_SET_COLOR_CONVERSION: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_COLOR_CONVERSION: %x", ARGS(0)); + } + break; + + case NV308A_SET_OPERATION: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_OPERATION: %x", ARGS(0)); + } + break; + + case NV308A_SET_COLOR_FORMAT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SET_COLOR_FORMAT: %x", ARGS(0)); + } + break; + + case NV308A_POINT: + { + const u32 a0 = ARGS(0); + m_point_x = a0 & 0xffff; + m_point_y = a0 >> 16; + } + break; + + case NV308A_SIZE_OUT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SIZE_OUT: %x", ARGS(0)); + } + break; + + case NV308A_SIZE_IN: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV308A_SIZE_IN: %x", ARGS(0)); + } + break; + case NV308A_COLOR: { RSXTransformConstant c; @@ -1745,19 +2128,61 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - case NV308A_POINT: + // NV3089 + case NV3089_SET_OBJECT: { - const u32 a0 = ARGS(0); - m_point_x = a0 & 0xffff; - m_point_y = a0 >> 16; + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_OBJECT: %x", ARGS(0)); } break; - case NV3062_SET_COLOR_FORMAT: + case NV3089_SET_CONTEXT_DMA_NOTIFIES: { - m_color_format = ARGS(0); - m_color_format_src_pitch = ARGS(1); - m_color_format_dst_pitch = ARGS(1) >> 16; + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0)); + } + break; + + case NV3089_SET_CONTEXT_DMA_IMAGE: + { + m_context_dma_img_src = ARGS(0); + } + break; + + case NV3089_SET_CONTEXT_PATTERN: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_PATTERN: %x", ARGS(0)); + } + break; + + case NV3089_SET_CONTEXT_ROP: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_ROP: %x", ARGS(0)); + } + break; + + case NV3089_SET_CONTEXT_BETA1: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_BETA1: %x", ARGS(0)); + } + break; + + case NV3089_SET_CONTEXT_BETA4: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_BETA4: %x", ARGS(0)); + } + break; + + case NV3089_SET_CONTEXT_SURFACE: + { + if (ARGS(0) != CELL_GCM_CONTEXT_SURFACE2D) + { + LOG_WARNING(RSX, "NV3089_SET_CONTEXT_SURFACE: Unsupported surface (0x%x)", ARGS(0)); + } } break; @@ -1779,6 +2204,62 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; + case NV3089_SET_COLOR_FORMAT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_COLOR_FORMAT: %x", ARGS(0)); + } + break; + + case NV3089_SET_OPERATION: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_SET_OPERATION: %x", ARGS(0)); + } + break; + + case NV3089_CLIP_POINT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_CLIP_POINT: %x", ARGS(0)); + } + break; + + case NV3089_CLIP_SIZE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_CLIP_SIZE: %x", ARGS(0)); + } + break; + + case NV3089_IMAGE_OUT_POINT: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_IMAGE_OUT_POINT: %x", ARGS(0)); + } + break; + + case NV3089_IMAGE_OUT_SIZE: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_IMAGE_OUT_SIZE: %x", ARGS(0)); + } + break; + + case NV3089_DS_DX: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_DS_DX: %x", ARGS(0)); + } + break; + + case NV3089_DT_DY: + { + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_DT_DY: %x", ARGS(0)); + } + break; + case NV3089_IMAGE_IN_SIZE: { u16 width = ARGS(0); @@ -1808,24 +2289,24 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3 } break; - case NV3089_SET_CONTEXT_DMA_IMAGE: + case NV3089_IMAGE_IN_FORMAT: { - m_context_dma_img_src = ARGS(0); + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_IMAGE_IN_FORMAT: %x", ARGS(0)); } break; - case NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN: + case NV3089_IMAGE_IN_OFFSET: { - m_context_dma_img_dst = ARGS(0); + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_IMAGE_IN_OFFSET: %x", ARGS(0)); } break; - case NV3089_SET_CONTEXT_SURFACE: + case NV3089_IMAGE_IN: { - if (ARGS(0) != CELL_GCM_CONTEXT_SURFACE2D) - { - LOG_WARNING(RSX, "NV3089_SET_CONTEXT_SURFACE: Unsupported surface (0x%x)", ARGS(0)); - } + if (ARGS(0)) + LOG_WARNING(RSX, "NV3089_IMAGE_IN: %x", ARGS(0)); } break; From a7bac1f084e4336ed227849b4a863aad603cb62e Mon Sep 17 00:00:00 2001 From: raven02 Date: Tue, 1 Jul 2014 02:27:45 +0800 Subject: [PATCH 2/2] cellResc : few more stuff init and cleanup --- rpcs3/Emu/GS/GCM.h | 37 ++- rpcs3/Emu/SysCalls/Modules/cellResc.cpp | 359 +++++++++++++++--------- 2 files changed, 251 insertions(+), 145 deletions(-) diff --git a/rpcs3/Emu/GS/GCM.h b/rpcs3/Emu/GS/GCM.h index dfa2c16dac..8a30680a88 100644 --- a/rpcs3/Emu/GS/GCM.h +++ b/rpcs3/Emu/GS/GCM.h @@ -225,19 +225,16 @@ struct CellGcmSurface { u8 type; u8 antialias; - - u8 color_format; - u8 color_target; - u8 color_location[4]; - u32 color_offset[4]; - u32 color_pitch[4]; - - u8 depth_format; - u8 depth_location; - u16 pad; - u32 depth_offset; - u32 depth_pitch; - + u8 colorFormat; + u8 colorTarget; + u8 colorLocation[4]; + u32 colorOffset[4]; + u32 colorPitch[4]; + u8 depthFormat; + u8 depthLocation; + u8 _padding[2]; + u32 depthOffset; + u32 depthPitch; u16 width; u16 height; u16 x; @@ -335,14 +332,14 @@ struct GcmTileInfo enum { -// NV406E + // NV40_CHANNEL_DMA (NV406E) NV406E_SET_REFERENCE = 0x00000050, NV406E_SET_CONTEXT_DMA_SEMAPHORE = 0x00000060, NV406E_SEMAPHORE_OFFSET = 0x00000064, NV406E_SEMAPHORE_ACQUIRE = 0x00000068, NV406E_SEMAPHORE_RELEASE = 0x0000006c, -// NV4097 + // NV40_CURIE_PRIMITIVE (NV4097) NV4097_SET_OBJECT = 0x00000000, NV4097_NO_OPERATION = 0x00000100, NV4097_NOTIFY = 0x00000104, @@ -555,7 +552,7 @@ enum NV4097_SET_TRANSFORM_BRANCH_BITS = 0x00001ff8, NV4097_SET_FLIP = 0x0003fead, -// NV0039 + // NV03_MEMORY_TO_MEMORY_FORMAT (NV0039) NV0039_SET_OBJECT = 0x00002000, NV0039_SET_CONTEXT_DMA_NOTIFIES = 0x00002180, NV0039_SET_CONTEXT_DMA_BUFFER_IN = 0x00002184, @@ -569,7 +566,7 @@ enum NV0039_FORMAT = 0x00002324, NV0039_BUFFER_NOTIFY = 0x00002328, -// NV3062 + // NV30_CONTEXT_SURFACES_2D (NV3062) NV3062_SET_OBJECT = 0x00006000, NV3062_SET_CONTEXT_DMA_NOTIFIES = 0x00006180, NV3062_SET_CONTEXT_DMA_IMAGE_SOURCE = 0x00006184, @@ -579,14 +576,14 @@ enum NV3062_SET_OFFSET_SOURCE = 0x00006308, NV3062_SET_OFFSET_DESTIN = 0x0000630C, -// NV309E + // NV30_CONTEXT_SURFACE_SWIZZLED (NV309E) NV309E_SET_OBJECT = 0x00008000, NV309E_SET_CONTEXT_DMA_NOTIFIES = 0x00008180, NV309E_SET_CONTEXT_DMA_IMAGE = 0x00008184, NV309E_SET_FORMAT = 0x00008300, NV309E_SET_OFFSET = 0x00008304, -// NV308A + // NV30_IMAGE_FROM_CPU (NV308A) NV308A_SET_OBJECT = 0x0000A000, NV308A_SET_CONTEXT_DMA_NOTIFIES = 0x0000A180, NV308A_SET_CONTEXT_COLOR_KEY = 0x0000A184, @@ -604,7 +601,7 @@ enum NV308A_SIZE_IN = 0x0000A30C, NV308A_COLOR = 0x0000A400, -// NV3089 + // NV30_SCALED_IMAGE_FROM_MEMORY (NV3089) NV3089_SET_OBJECT = 0x0000C000, NV3089_SET_CONTEXT_DMA_NOTIFIES = 0x0000C180, NV3089_SET_CONTEXT_DMA_IMAGE = 0x0000C184, diff --git a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp index 135e43ff3d..dc69a23dfa 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp @@ -34,6 +34,7 @@ enum SRC_BUFFER_NUM = 8, MAX_DST_BUFFER_NUM = 6, + RESC_PARAM_NUM }; static const float @@ -70,10 +71,11 @@ struct CCellRescInternal u32 m_bufIdFrontPrevDrop, m_bufIdPalMidPrev, m_bufIdPalMidNow; u32 m_interlaceTableEA; int m_interlaceTableLength; - float m_ratioAdjX, m_ratioAdjY; + float m_ratioAdjX, m_ratioAdjY, m_flexRatio; bool m_bInitialized, m_bNewlyAdjustRatio; - - float m_flexRatio; + bool m_isDummyFlipped; + u8 m_cgParamIndex[RESC_PARAM_NUM]; + u64 m_commandIdxCaF, m_rcvdCmdIdx; CCellRescInternal() : m_bInitialized(false) @@ -87,10 +89,16 @@ CCellRescInternal* s_rescInternalInstance = nullptr; // Extern Functions extern int cellGcmSetFlipMode(u32 mode); extern int cellGcmSetFlipHandler(u32 handler_addr); -extern int32_t cellGcmAddressToOffset(u64 address, mem32_t offset); +extern s32 cellGcmAddressToOffset(u64 address, mem32_t offset); extern int cellGcmSetDisplayBuffer(u32 id, u32 offset, u32 pitch, u32 width, u32 height); extern int cellGcmSetPrepareFlip(mem_ptr_t ctx, u32 id); extern int cellGcmSetSecondVFrequency(u32 freq); +extern u32 cellGcmGetLabelAddress(u8 index); +extern u32 cellGcmSetVBlankHandler(u32 handler); +extern u32 cellGcmSetSecondVHandler(u32 handler); +extern u32 cellGcmGetTiledPitchSize(u32 size); + +// Local Functions int cellRescGetNumColorBuffers(u32 dstMode, u32 palTemporalMode, u32 reserved); // Help Functions @@ -127,13 +135,20 @@ void BuildupVertexBufferNR() mem_ptr_t vv(s_rescInternalInstance->m_vertexArrayEA); - if(s_rescInternalInstance->m_dstMode == CELL_RESC_720x480 || s_rescInternalInstance->m_dstMode == CELL_RESC_720x576){ - switch((u32)s_rescInternalInstance->m_initConfig.ratioMode){ - case CELL_RESC_LETTERBOX: goto NR_LETTERBOX; - case CELL_RESC_PANSCAN: goto NR_PANSCAN; - default: goto NR_FULLSCREEN; + if (s_rescInternalInstance->m_dstMode == CELL_RESC_720x480 || s_rescInternalInstance->m_dstMode == CELL_RESC_720x576) + { + switch((u32)s_rescInternalInstance->m_initConfig.ratioMode) + { + case CELL_RESC_LETTERBOX: + goto NR_LETTERBOX; + case CELL_RESC_PANSCAN: + goto NR_PANSCAN; + default: + goto NR_FULLSCREEN; } - } else { + } + else + { goto NR_FULLSCREEN; } @@ -164,19 +179,26 @@ NR_PANSCAN: void BuildupVertexBufferUN(s32 srcIdx) { - if(s_rescInternalInstance->m_bNewlyAdjustRatio){ + if (s_rescInternalInstance->m_bNewlyAdjustRatio) + { s_rescInternalInstance->m_srcWidthInterlace = s_rescInternalInstance->m_rescSrc[srcIdx].width; s_rescInternalInstance->m_srcHeightInterlace = s_rescInternalInstance->m_rescSrc[srcIdx].height; s_rescInternalInstance->m_bNewlyAdjustRatio = false; - } else { - if(s_rescInternalInstance->m_srcWidthInterlace == s_rescInternalInstance->m_rescSrc[srcIdx].width - && s_rescInternalInstance->m_srcHeightInterlace == s_rescInternalInstance->m_rescSrc[srcIdx].height){ + } + else + { + if (s_rescInternalInstance->m_srcWidthInterlace == s_rescInternalInstance->m_rescSrc[srcIdx].width + && s_rescInternalInstance->m_srcHeightInterlace == s_rescInternalInstance->m_rescSrc[srcIdx].height) + { return; - } else { + } + else + { s_rescInternalInstance->m_srcWidthInterlace = s_rescInternalInstance->m_rescSrc[srcIdx].width; s_rescInternalInstance->m_srcHeightInterlace = s_rescInternalInstance->m_rescSrc[srcIdx].height; } } + const float PX_FS = PICTURE_SIZE; const float PY_FS = PICTURE_SIZE; @@ -203,13 +225,20 @@ void BuildupVertexBufferUN(s32 srcIdx) mem_ptr_t vv(s_rescInternalInstance->m_vertexArrayEA); - if(s_rescInternalInstance->m_dstMode == CELL_RESC_720x480 || s_rescInternalInstance->m_dstMode == CELL_RESC_720x576){ - switch((u32)s_rescInternalInstance->m_initConfig.ratioMode){ - case CELL_RESC_LETTERBOX: goto UN_LETTERBOX; - case CELL_RESC_PANSCAN: goto UN_PANSCAN; - default: goto UN_FULLSCREEN; + if (s_rescInternalInstance->m_dstMode == CELL_RESC_720x480 || s_rescInternalInstance->m_dstMode == CELL_RESC_720x576) + { + switch((u32)s_rescInternalInstance->m_initConfig.ratioMode) + { + case CELL_RESC_LETTERBOX: + goto UN_LETTERBOX; + case CELL_RESC_PANSCAN: + goto UN_PANSCAN; + default: + goto UN_FULLSCREEN; } - } else { + } + else + { goto UN_FULLSCREEN; } @@ -242,9 +271,12 @@ inline int InternalVersion(mem_ptr_t conf) { switch ((u32)conf->size) { - case 20: return 1; - case 24: return 2; - case 28: return 3; + case 20: + return 1; + case 24: + return 2; + case 28: + return 3; default: return -1; } } @@ -252,10 +284,14 @@ inline int InternalVersion(mem_ptr_t conf) inline int InternalVersion() { switch ((u32)s_rescInternalInstance->m_initConfig.size) { - case 20: return 1; - case 24: return 2; - case 28: return 3; - default: return -1; + case 20: + return 1; + case 24: + return 2; + case 28: + return 3; + default: + return -1; } } @@ -263,18 +299,25 @@ u8 RescBufferMode2SysutilResolutionId(u32 bufferMode) { switch (bufferMode) { - case CELL_RESC_720x576: return CELL_VIDEO_OUT_RESOLUTION_576; - case CELL_RESC_1280x720: return CELL_VIDEO_OUT_RESOLUTION_720; - case CELL_RESC_1920x1080: return CELL_VIDEO_OUT_RESOLUTION_1080; - default: return CELL_VIDEO_OUT_RESOLUTION_480; + case CELL_RESC_720x576: + return CELL_VIDEO_OUT_RESOLUTION_576; + case CELL_RESC_1280x720: + return CELL_VIDEO_OUT_RESOLUTION_720; + case CELL_RESC_1920x1080: + return CELL_VIDEO_OUT_RESOLUTION_1080; + default: + return CELL_VIDEO_OUT_RESOLUTION_480; } } u8 RescDstFormat2SysutilFormat(u32 dstFormat) { - switch (dstFormat) { - case CELL_RESC_SURFACE_F_W16Z16Y16X16: return CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_R16G16B16X16_FLOAT; - default: return CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_X8R8G8B8; + switch (dstFormat) + { + case CELL_RESC_SURFACE_F_W16Z16Y16X16: + return CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_R16G16B16X16_FLOAT; + default: + return CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_X8R8G8B8; } } @@ -282,19 +325,32 @@ u8 GcmSurfaceFormat2GcmTextureFormat(u8 surfaceFormat, u8 surfaceType) { u8 result = 0; - switch (surfaceFormat){ - case CELL_GCM_SURFACE_A8R8G8B8: result = CELL_GCM_TEXTURE_A8R8G8B8; break; - case CELL_GCM_SURFACE_F_W16Z16Y16X16: result = CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT; break; - default: return 0xFF; //Error + switch (surfaceFormat) + { + case CELL_GCM_SURFACE_A8R8G8B8: + result = CELL_GCM_TEXTURE_A8R8G8B8; + break; + case CELL_GCM_SURFACE_F_W16Z16Y16X16: + result = CELL_GCM_TEXTURE_W16_Z16_Y16_X16_FLOAT; + break; + default: + return 0xFF; //Error } - switch (surfaceType){ - case CELL_GCM_SURFACE_PITCH: result |= CELL_GCM_TEXTURE_LN; break; - case CELL_GCM_SURFACE_SWIZZLE: result |= CELL_GCM_TEXTURE_SZ; break; - default: return 0xFF; //Error + switch (surfaceType) + { + case CELL_GCM_SURFACE_PITCH: + result |= CELL_GCM_TEXTURE_LN; + break; + case CELL_GCM_SURFACE_SWIZZLE: + result |= CELL_GCM_TEXTURE_SZ; + break; + default: + return 0xFF; //Error } result |= CELL_GCM_TEXTURE_NR; + return result; } @@ -302,22 +358,38 @@ int GetRescDestsIndex(u32 dstMode) { switch(dstMode) { - case CELL_RESC_720x480: return 0; - case CELL_RESC_720x576: return 1; - case CELL_RESC_1280x720: return 2; - case CELL_RESC_1920x1080: return 3; - default: return -1; + case CELL_RESC_720x480: + return 0; + case CELL_RESC_720x576: + return 1; + case CELL_RESC_1280x720: + return 2; + case CELL_RESC_1920x1080: + return 3; + default: + return -1; } } void GetScreenSize(u32 mode, s32 *width, s32 *height) { - switch (mode){ - case CELL_RESC_720x480: *width = 720; *height = 480; break; - case CELL_RESC_720x576: *width = 720; *height = 576; break; - case CELL_RESC_1280x720: *width = 1280; *height = 720; break; - case CELL_RESC_1920x1080: *width = 1920; *height = 1080; break; - default: *width = *height = 0; break; + switch (mode) + { + case CELL_RESC_720x480: + *width = 720; *height = 480; + break; + case CELL_RESC_720x576: + *width = 720; *height = 576; + break; + case CELL_RESC_1280x720: + *width = 1280; *height = 720; + break; + case CELL_RESC_1920x1080: + *width = 1920; *height = 1080; + break; + default: + *width = *height = 0; + break; } } @@ -331,35 +403,43 @@ int CalculateSurfaceByteSize(u32 mode, CellRescDsts *dsts) int CalculateMaxColorBuffersSize() { s32 oneBufSize, bufNum, totalBufSize, maxBufSize; - maxBufSize = 0; - for(u32 bufMode = CELL_RESC_720x480; bufMode <= CELL_RESC_1920x1080; bufMode <<= 1){ - if(s_rescInternalInstance->m_initConfig.supportModes & bufMode) { + + for (u32 bufMode = CELL_RESC_720x480; bufMode <= CELL_RESC_1920x1080; bufMode <<= 1) + { + if (s_rescInternalInstance->m_initConfig.supportModes & bufMode) + { oneBufSize = CalculateSurfaceByteSize(bufMode, &(s_rescInternalInstance->m_rescDsts[GetRescDestsIndex(bufMode)])); bufNum = cellRescGetNumColorBuffers(bufMode, s_rescInternalInstance->m_initConfig.palTemporalMode, 0); totalBufSize = oneBufSize * bufNum; maxBufSize = (maxBufSize > totalBufSize) ? maxBufSize : totalBufSize; } } + return maxBufSize; } bool CheckInitConfig(mem_ptr_t initConfig) { - if( (initConfig->resourcePolicy & ~((u32)0x3)) || - (initConfig->supportModes & 0xF) == 0 || - (initConfig->ratioMode > 2) || - (initConfig->palTemporalMode > 5) ) + if ((initConfig->resourcePolicy & ~((u32)0x3)) || (initConfig->supportModes & 0xF) == 0 || (initConfig->ratioMode > 2) || (initConfig->palTemporalMode > 5)) + { return false; - - if( InternalVersion() >= 2 ){ - if(InternalVersion() == 2 && initConfig->interlaceMode > 1) - return false; } - if( InternalVersion() >= 3 ){ - if(initConfig->interlaceMode > 4) return false; - if(initConfig->flipMode > 1) return false; + if ( InternalVersion() >= 2 ) + { + if (InternalVersion() == 2 && initConfig->interlaceMode > 1) + { + return false; + } + } + + if ( InternalVersion() >= 3 ) + { + if ((initConfig->interlaceMode > 4) || (initConfig->flipMode > 1)) + { + return false; + } } return true; @@ -396,10 +476,10 @@ void InitMembers() s_rescInternalInstance->m_bufIdPalMidPrev = 4; s_rescInternalInstance->m_bufIdPalMidNow = 5; //s_rescInternalInstance->m_cgpTvalue = 0; - //s_rescInternalInstance->m_isDummyFlipped = true; + s_rescInternalInstance->m_isDummyFlipped = true; s_rescInternalInstance->m_flexRatio = 0.f; // interpolate - //s_rescInternalInstance->m_commandIdxCaF = 1; - //s_rescInternalInstance->m_rcvdCmdIdx = 0; + s_rescInternalInstance->m_commandIdxCaF = 1; + s_rescInternalInstance->m_rcvdCmdIdx = 0; //s_rescInternalInstance->m_lastV60.idx = 0; //s_rescInternalInstance->m_lastV60.time = Util::GetSystemTime(); @@ -420,25 +500,23 @@ void InitMembers() s_rescInternalInstance->m_dstOffsets[i] = 0; } - /* for (int i = 0; im_cgParamIndex[i] = 0xFF; } { s_rescInternalInstance->m_rescDsts[0].format = CELL_RESC_SURFACE_A8R8G8B8; - s_rescInternalInstance->m_rescDsts[0].pitch = GcmSysTypePrefix::cellGcmGetTiledPitchSize(720 * 4); + s_rescInternalInstance->m_rescDsts[0].pitch = cellGcmGetTiledPitchSize(720 * 4); s_rescInternalInstance->m_rescDsts[0].heightAlign = 8; s_rescInternalInstance->m_rescDsts[1].format = CELL_RESC_SURFACE_A8R8G8B8; - s_rescInternalInstance->m_rescDsts[1].pitch = GcmSysTypePrefix::cellGcmGetTiledPitchSize(720 * 4); + s_rescInternalInstance->m_rescDsts[1].pitch = cellGcmGetTiledPitchSize(720 * 4); s_rescInternalInstance->m_rescDsts[1].heightAlign = 8; s_rescInternalInstance->m_rescDsts[2].format = CELL_RESC_SURFACE_A8R8G8B8; - s_rescInternalInstance->m_rescDsts[2].pitch = GcmSysTypePrefix::cellGcmGetTiledPitchSize(1280 * 4); + s_rescInternalInstance->m_rescDsts[2].pitch = cellGcmGetTiledPitchSize(1280 * 4); s_rescInternalInstance->m_rescDsts[2].heightAlign = 8; s_rescInternalInstance->m_rescDsts[3].format = CELL_RESC_SURFACE_A8R8G8B8; - s_rescInternalInstance->m_rescDsts[3].pitch = GcmSysTypePrefix::cellGcmGetTiledPitchSize(1920 * 4); + s_rescInternalInstance->m_rescDsts[3].pitch = cellGcmGetTiledPitchSize(1920 * 4); s_rescInternalInstance->m_rescDsts[3].heightAlign = 8; } - */ } void SetupRsxRenderingStates(mem_ptr_t& cntxt) @@ -481,7 +559,8 @@ void SetupRsxRenderingStates(mem_ptr_t& cntxt) r.m_surface_depth_format = 2; r.m_surface_colour_target = 1; - if (IsPalInterpolate()) { + if (IsPalInterpolate()) + { //MRT //GcmCmdTypePrefix::cellGcmSetColorMaskMrt(con, CELL_GCM_COLOR_MASK_MRT1_A | CELL_GCM_COLOR_MASK_MRT1_R | CELL_GCM_COLOR_MASK_MRT1_G | CELL_GCM_COLOR_MASK_MRT1_B); } @@ -500,12 +579,14 @@ void SetupSurfaces(mem_ptr_t& cntxt) bool isMrt; u32 dstOffset0, dstOffset1; - if (IsNotPalInterpolate()) { + if (IsNotPalInterpolate()) + { isMrt = false; dstOffset0 = s_rescInternalInstance->m_dstOffsets[s_rescInternalInstance->m_bufIdFront]; dstOffset1 = 0; } - else { + else + { isMrt = true; dstOffset0 = s_rescInternalInstance->m_dstOffsets[s_rescInternalInstance->m_bufIdFront]; dstOffset1 = s_rescInternalInstance->m_dstOffsets[s_rescInternalInstance->m_bufIdPalMidNow]; @@ -536,8 +617,8 @@ void SetupSurfaces(mem_ptr_t& cntxt) r.m_surface_pitch_z = 64; r.m_surface_width = s_rescInternalInstance->m_dstWidth; r.m_surface_height = s_rescInternalInstance->m_dstHeight; - //surface.x = 0; - //surface.y = 0; + r.m_surface_clip_x = 0; + r.m_surface_clip_y = 0; } // Module Functions @@ -550,6 +631,7 @@ int cellRescInit(mem_ptr_t initConfig) cellResc->Error("cellRescInit : CELL_RESC_ERROR_REINITIALIZED"); return CELL_RESC_ERROR_REINITIALIZED; } + if (!initConfig.IsGood() || InternalVersion(initConfig.GetAddr()) == -1 || !CheckInitConfig(initConfig)) { cellResc->Error("cellRescInit : CELL_RESC_ERROR_BAD_ARGUMENT"); @@ -567,7 +649,7 @@ void cellRescExit() { cellResc->Warning("cellRescExit()"); - if(!s_rescInternalInstance->m_bInitialized) + if (!s_rescInternalInstance->m_bInitialized) { cellResc->Error("cellRescExit()"); return; @@ -590,10 +672,18 @@ int cellRescVideoOutResolutionId2RescBufferMode(u32 resolutionId, mem32_t buffer switch (resolutionId) { - case CELL_VIDEO_OUT_RESOLUTION_1080: bufferMode = CELL_RESC_1920x1080; break; - case CELL_VIDEO_OUT_RESOLUTION_720: bufferMode = CELL_RESC_1280x720; break; - case CELL_VIDEO_OUT_RESOLUTION_480: bufferMode = CELL_RESC_720x480; break; - case CELL_VIDEO_OUT_RESOLUTION_576: bufferMode = CELL_RESC_720x576; break; + case CELL_VIDEO_OUT_RESOLUTION_1080: + bufferMode = CELL_RESC_1920x1080; + break; + case CELL_VIDEO_OUT_RESOLUTION_720: + bufferMode = CELL_RESC_1280x720; + break; + case CELL_VIDEO_OUT_RESOLUTION_480: + bufferMode = CELL_RESC_720x480; + break; + case CELL_VIDEO_OUT_RESOLUTION_576: + bufferMode = CELL_RESC_720x576; + break; default: cellResc->Error("cellRescVideoOutResolutionId2RescBufferMod : CELL_RESC_ERROR_BAD_ARGUMENT"); return CELL_RESC_ERROR_BAD_ARGUMENT; @@ -618,8 +708,7 @@ int cellRescSetDsts(u32 dstsMode, mem_ptr_t dsts) return CELL_RESC_ERROR_BAD_ARGUMENT; } - if ((dstsMode != CELL_RESC_720x480) && (dstsMode != CELL_RESC_720x576) && - (dstsMode != CELL_RESC_1280x720) && (dstsMode != CELL_RESC_1920x1080)) + if ((dstsMode != CELL_RESC_720x480) && (dstsMode != CELL_RESC_720x576) && (dstsMode != CELL_RESC_1280x720) && (dstsMode != CELL_RESC_1920x1080)) { cellResc->Error("cellRescSetDsts : CELL_RESC_ERROR_BAD_ARGUMENT"); return CELL_RESC_ERROR_BAD_ARGUMENT; @@ -661,7 +750,7 @@ int cellRescSetDisplayMode(u32 displayMode) return CELL_RESC_ERROR_BAD_COMBINATION; } - if(IsPal60Hsync() && s_rescInternalInstance->m_initConfig.flipMode==CELL_RESC_DISPLAY_VSYNC) + if (IsPal60Hsync() && s_rescInternalInstance->m_initConfig.flipMode==CELL_RESC_DISPLAY_VSYNC) { cellResc->Error("cellRescSetDisplayMode : CELL_RESC_ERROR_BAD_COMBINATIONT"); return CELL_RESC_ERROR_BAD_COMBINATION; @@ -695,8 +784,8 @@ int cellRescSetDisplayMode(u32 displayMode) //if (ret) return ret; //InitLabels(); cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ); - //cellGcmSetVBlankHandler(CCellRescInternal::IntrHandler50); - //cellGcmSetSecondVHandler(CCellRescInternal::IntrHandler60); + //cellGcmSetVBlankHandler(IntrHandler50); + //cellGcmSetSecondVHandler(IntrHandler60); cellGcmSetFlipHandler(0); } else if (IsPalDrop()) @@ -704,7 +793,7 @@ int cellRescSetDisplayMode(u32 displayMode) //InitLabels(); cellGcmSetSecondVFrequency(CELL_GCM_DISPLAY_FREQUENCY_59_94HZ); //cellGcmSetVBlankHandler(NULL); - //cellGcmSetSecondVHandler(CCellRescInternal::IntrHandler60Drop); + //cellGcmSetSecondVHandler(IntrHandler60Drop); cellGcmSetFlipHandler(0); } else if (IsPal60Hsync()) @@ -715,8 +804,8 @@ int cellRescSetDisplayMode(u32 displayMode) //if(s_applicationVBlankHandler) SetVBlankHandler(s_applicationVBlankHandler); //if(s_applicationFlipHandler) SetFlipHandler(s_applicationFlipHandler); - cellGcmSetFlipMode((s_rescInternalInstance->m_initConfig.flipMode == CELL_RESC_DISPLAY_VSYNC) - ? CELL_GCM_DISPLAY_VSYNC : CELL_GCM_DISPLAY_HSYNC); + cellGcmSetFlipMode((s_rescInternalInstance->m_initConfig.flipMode == CELL_RESC_DISPLAY_VSYNC) ? CELL_GCM_DISPLAY_VSYNC : CELL_GCM_DISPLAY_HSYNC); + return CELL_OK; } @@ -724,13 +813,13 @@ int cellRescAdjustAspectRatio(float horizontal, float vertical) { cellResc->Warning("cellRescAdjustAspectRatio(horizontal=%f, vertical=%f)", horizontal, vertical); - if(!s_rescInternalInstance->m_bInitialized) + if (!s_rescInternalInstance->m_bInitialized) { cellResc->Error("cellRescAdjustAspectRatio : CELL_RESC_ERROR_NOT_INITIALIZED"); return CELL_RESC_ERROR_NOT_INITIALIZED; } - if((horizontal < 0.5f || 2.f < horizontal) || (vertical < 0.5f || 2.f < vertical)) + if ((horizontal < 0.5f || 2.f < horizontal) || (vertical < 0.5f || 2.f < vertical)) { cellResc->Error("cellRescAdjustAspectRatio : CELL_RESC_ERROR_BAD_ARGUMENT"); return CELL_RESC_ERROR_BAD_ARGUMENT; @@ -739,12 +828,16 @@ int cellRescAdjustAspectRatio(float horizontal, float vertical) s_rescInternalInstance->m_ratioAdjX = horizontal; s_rescInternalInstance->m_ratioAdjY = vertical; - if(s_rescInternalInstance->m_vertexArrayEA) + if (s_rescInternalInstance->m_vertexArrayEA) { - if(IsTextureNR()) + if (IsTextureNR()) + { BuildupVertexBufferNR(); + } else + { s_rescInternalInstance->m_bNewlyAdjustRatio = true; + } } return CELL_OK; @@ -754,13 +847,13 @@ int cellRescSetPalInterpolateDropFlexRatio(float ratio) { cellResc->Warning("cellRescSetPalInterpolateDropFlexRatio(ratio=%f)", ratio); - if(!s_rescInternalInstance->m_bInitialized) + if (!s_rescInternalInstance->m_bInitialized) { cellResc->Error("cellRescSetPalInterpolateDropFlexRatio : CELL_RESC_ERROR_NOT_INITIALIZED"); return CELL_RESC_ERROR_NOT_INITIALIZED; } - if(ratio < 0.f || 1.f < ratio) + if (ratio < 0.f || 1.f < ratio) { cellResc->Error("cellRescSetPalInterpolateDropFlexRatio : CELL_RESC_ERROR_BAD_ARGUMENT"); return CELL_RESC_ERROR_BAD_ARGUMENT; @@ -796,9 +889,20 @@ int cellRescGetBufferSize(mem32_t colorBuffers, mem32_t vertexArray, mem32_t fra fragmentUcodeSize = 0x300; } - if(colorBuffers.IsGood()) colorBuffers = colorBuffersSize; - if(vertexArray.IsGood()) vertexArray = vertexArraySize; - if(fragmentShader.IsGood()) fragmentShader = fragmentUcodeSize; + if (colorBuffers.IsGood()) + { + colorBuffers = colorBuffersSize; + } + + if (vertexArray.IsGood()) + { + vertexArray = vertexArraySize; + } + + if (fragmentShader.IsGood()) + { + fragmentShader = fragmentUcodeSize; + } return CELL_OK; } @@ -828,28 +932,35 @@ int cellRescGcmSurface2RescSrc(mem_ptr_t gcmSurface, mem_ptr_tLog("cellRescGcmSurface2RescSrc(gcmSurface_addr=0x%x, rescSrc_addr=0x%x)", gcmSurface.GetAddr(), rescSrc.GetAddr()); - if(!gcmSurface.IsGood() || !rescSrc.IsGood()) + if (!gcmSurface.IsGood() || !rescSrc.IsGood()) { cellResc->Error("cellRescGcmSurface2RescSrc : CELL_RESC_ERROR_BAD_ARGUMENT"); return CELL_RESC_ERROR_BAD_ARGUMENT; } - u8 textureFormat = GcmSurfaceFormat2GcmTextureFormat(gcmSurface->color_format, gcmSurface->type); - + u8 textureFormat = GcmSurfaceFormat2GcmTextureFormat(gcmSurface->colorFormat, gcmSurface->type); s32 xW = 1, xH = 1; + switch(gcmSurface->antialias) { - case CELL_GCM_SURFACE_SQUARE_ROTATED_4: xW=xH=2; break; - case CELL_GCM_SURFACE_SQUARE_CENTERED_4: xW=xH=2; break; - case CELL_GCM_SURFACE_DIAGONAL_CENTERED_2: xW=2; break; - default: break; + case CELL_GCM_SURFACE_SQUARE_ROTATED_4: + xW=xH=2; + break; + case CELL_GCM_SURFACE_SQUARE_CENTERED_4: + xW=xH=2; + break; + case CELL_GCM_SURFACE_DIAGONAL_CENTERED_2: + xW=2; + break; + default: + break; } rescSrc->format = textureFormat; - rescSrc->pitch = re(gcmSurface->color_pitch[0]); + rescSrc->pitch = re(gcmSurface->colorPitch[0]); rescSrc->width = re(gcmSurface->width) * xW; rescSrc->height = re(gcmSurface->height) * xH; - rescSrc->offset = re(gcmSurface->color_offset[0]); + rescSrc->offset = re(gcmSurface->colorOffset[0]); return CELL_OK; } @@ -876,14 +987,11 @@ int cellRescSetSrc(s32 idx, mem_ptr_t src) return CELL_RESC_ERROR_BAD_ARGUMENT; } - cellResc->Log(" *** format=0x%x", src->format.ToLE()); cellResc->Log(" *** pitch=%d", src->pitch.ToLE()); cellResc->Log(" *** width=%d", src->width.ToLE()); cellResc->Log(" *** height=%d", src->height.ToLE()); cellResc->Log(" *** offset=0x%x", src->offset.ToLE()); - //Emu.GetGSManager().GetRender().SetData(src.offset, 800, 600); - //Emu.GetGSManager().GetRender().Draw(); s_rescInternalInstance->m_rescSrc[idx] = *src; @@ -909,8 +1017,10 @@ int cellRescSetConvertAndFlip(mem_ptr_t cntxt, s32 idx) } - if(!IsTextureNR()) + if (!IsTextureNR()) + { BuildupVertexBufferUN(idx); + } // Setup GPU internal status SetupRsxRenderingStates(cntxt); @@ -952,9 +1062,7 @@ int cellRescSetBufferAddress(mem32_t colorBuffers, mem32_t vertexArray, mem32_t return CELL_RESC_ERROR_BAD_ARGUMENT; } - if(colorBuffers.GetAddr() % COLOR_BUFFER_ALIGNMENT || - vertexArray.GetAddr() % VERTEX_BUFFER_ALIGNMENT || - fragmentShader.GetAddr() % FRAGMENT_SHADER_ALIGNMENT) + if(colorBuffers.GetAddr() % COLOR_BUFFER_ALIGNMENT || vertexArray.GetAddr() % VERTEX_BUFFER_ALIGNMENT || fragmentShader.GetAddr() % FRAGMENT_SHADER_ALIGNMENT) { cellResc->Error("cellRescSetBufferAddress : CELL_RESC_ERROR_BAD_ARGUMENT"); return CELL_RESC_ERROR_BAD_ARGUMENT; @@ -967,19 +1075,21 @@ int cellRescSetBufferAddress(mem32_t colorBuffers, mem32_t vertexArray, mem32_t MemoryAllocator> dstOffset; cellGcmAddressToOffset(s_rescInternalInstance->m_colorBuffersEA, dstOffset.GetAddr()); - for(int i=0; im_dstOffsets[i] = dstOffset->ToLE() + i * s_rescInternalInstance->m_dstBufInterval; } - for(int i=0; im_dstOffsets[i], s_rescInternalInstance->m_dstPitch, s_rescInternalInstance->m_dstWidth, s_rescInternalInstance->m_dstHeight); if (ret) return ret; } - if(IsTextureNR()) + if (IsTextureNR()) + { BuildupVertexBufferNR(); + } //TODO: ? @@ -1048,7 +1158,7 @@ u16 FloatToHalf(float val) { return 0; } - int32_t e = ((bits & 0x7f800000) >> 23) - 127 + 15; + s32 e = ((bits & 0x7f800000) >> 23) - 127 + 15; if (e < 0) { return 0; @@ -1199,6 +1309,5 @@ void cellResc_load() void cellResc_unload() { - // s_rescInternalInstance->m_bInitialized = false; delete s_rescInternalInstance; }