Cross-check and validate all NV0406E/4097/3089/3062/308A functions with gcm_method.h

This commit is contained in:
raven02 2014-07-01 07:57:49 +08:00
parent 0a4cffd759
commit 8d1d227dac

View file

@ -193,6 +193,60 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
switch(cmd) 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: case NV4097_SET_FLIP:
//if(cmd == 0xfeadffff) //if(cmd == 0xfeadffff)
{ {
@ -214,13 +268,28 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
case NV4097_NO_OPERATION: case NV4097_NO_OPERATION:
{ {
LOG_WARNING(RSX, "NV4097_NO_OPERATION"); // Nothing to do here
} }
break; 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; break;
@ -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_set_alpha_func = true;
m_alpha_func = ARGS(0); m_alpha_func = ARGS(0);
if (count >= 2) if (count == 2)
{ {
m_set_alpha_ref = true; m_set_alpha_ref = true;
const u32 a1 = ARGS(1); const u32 a1 = ARGS(1);
m_alpha_ref = (float&)a1; 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)) if (ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_BLEND_ENABLE_MRT: %x", 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; 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_rgb = ARGS(0) & 0xffff;
m_blend_sfactor_alpha = ARGS(0) >> 16; m_blend_sfactor_alpha = ARGS(0) >> 16;
if (count >= 2) if (count == 2)
{ {
m_set_blend_dfactor = true; m_set_blend_dfactor = true;
m_blend_dfactor_rgb = ARGS(1) & 0xffff; 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; m_set_depth_bounds = true;
const u32 a0 = ARGS(0); const u32 a0 = ARGS(0);
m_depth_bounds_min = (float&)a0; m_depth_bounds_min = (float&)a0;
if (count > 1)
if (count == 2)
{ {
const u32 a1 = ARGS(1); const u32 a1 = ARGS(1);
m_depth_bounds_max = (float&)a1; 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; break;
// Viewport // 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: case NV4097_SET_VIEWPORT_HORIZONTAL:
{ {
m_set_viewport_horizontal = true; m_set_viewport_horizontal = true;
m_viewport_x = ARGS(0) & 0xffff; m_viewport_x = ARGS(0) & 0xffff;
m_viewport_w = ARGS(0) >> 16; m_viewport_w = ARGS(0) >> 16;
if(count == 2) if (count == 2)
{ {
m_set_viewport_vertical = true; m_set_viewport_vertical = true;
m_viewport_y = ARGS(1) & 0xffff; 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; 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_SCALE:
case NV4097_SET_VIEWPORT_OFFSET: 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; break;
// Polygon // Polygon mode/offset
case NV4097_SET_FRONT_POLYGON_MODE: case NV4097_SET_FRONT_POLYGON_MODE:
{ {
m_set_front_polygon_mode = true; 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); const u32 a0 = ARGS(0);
m_poly_offset_scale_factor = (float&)a0; m_poly_offset_scale_factor = (float&)a0;
if (count == 2)
{
const u32 a1 = ARGS(1);
m_poly_offset_bias = (float&)a1;
}
} }
break; break;
@ -739,6 +817,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
} }
break; 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: case NV4097_SET_CLEAR_RECT_HORIZONTAL:
{ {
if (ARGS(0)) 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); 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; 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 = &m_vertex_progs[ARGS(0)];
m_cur_vertex_prog->data.clear(); m_cur_vertex_prog->data.clear();
if(count == 2) if (count == 2)
{ {
const u32 start = ARGS(1); const u32 start = ARGS(1);
if(start) if (start)
{
LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_LOAD: start = %d", start); LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_LOAD: start = %d", start);
}
} }
} }
break; break;
case NV4097_SET_TRANSFORM_PROGRAM_START: case NV4097_SET_TRANSFORM_PROGRAM_START:
{ {
if (ARGS(0)) const u32 start = ARGS(0);
LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_START: 0x%x", ARGS(0)); if (start)
{
LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_PROGRAM_START: start = %d", start);
}
} }
break; 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: case NV4097_SET_TRANSFORM_TIMEOUT:
// TODO:
// (cmd)[1] = CELL_GCM_ENDIAN_SWAP((count) | ((registerCount) << 16)); \
if(!m_cur_vertex_prog) if(!m_cur_vertex_prog)
{ {
LOG_WARNING(RSX, "NV4097_SET_TRANSFORM_TIMEOUT: m_cur_vertex_prog == NULL"); 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: case NV4097_INVALIDATE_VERTEX_CACHE_FILE:
{ {
if (ARGS(0)) // Nothing to do here
LOG_WARNING(RSX, "NV4097_INVALIDATE_VERTEX_CACHE_FILE: %x", ARGS(0));
} }
break; break;
case NV4097_INVALIDATE_VERTEX_FILE: case NV4097_INVALIDATE_VERTEX_FILE:
{ {
if (ARGS(0)) // Nothing to do here
LOG_WARNING(RSX, "NV4097_INVALIDATE_VERTEX_FILE: %x", ARGS(0));
} }
break; break;
@ -1010,6 +1105,12 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
} }
break; 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: case NV4097_SET_STENCIL_MASK:
{ {
m_set_stencil_mask = true; 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_set_stencil_func = true;
m_stencil_func = ARGS(0); m_stencil_func = ARGS(0);
if(count >= 2) if(count >= 2)
{ {
m_set_stencil_func_ref = true; 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_set_stencil_fail = true;
m_stencil_fail = ARGS(0); m_stencil_fail = ARGS(0);
if(count >= 2) if(count >= 2)
{ {
m_set_stencil_zfail = true; 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; 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: case NV4097_SET_BACK_STENCIL_MASK:
{ {
m_set_back_stencil_mask = true; 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_set_back_stencil_func = true;
m_back_stencil_func = ARGS(0); m_back_stencil_func = ARGS(0);
if(count >= 2) if(count >= 2)
{ {
m_set_back_stencil_func_ref = true; 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_set_stencil_fail = true;
m_stencil_fail = ARGS(0); m_stencil_fail = ARGS(0);
if(count >= 2) if(count >= 2)
{ {
m_set_back_stencil_zfail = true; 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: case NV4097_SET_POINT_SPRITE_CONTROL:
{ {
m_set_point_sprite_control = ARGS(0) ? true : false; m_set_point_sprite_control = ARGS(0) ? true : false;
// TODO:
//(cmd)[1] = CELL_GCM_ENDIAN_SWAP((enable) | ((rmode) << 1) | (texcoordMask));
} }
break; break;
@ -1184,14 +1286,6 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
break; break;
// Scissor // 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: case NV4097_SET_SCISSOR_HORIZONTAL:
{ {
m_set_scissor_horizontal = true; 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; break;
// Semaphore case NV4097_SET_SCISSOR_VERTICAL:
case NV4097_SET_SEMAPHORE_OFFSET:
case NV406E_SEMAPHORE_OFFSET:
{ {
m_set_semaphore_offset = true; m_set_scissor_vertical = true;
m_semaphore_offset = ARGS(0); m_scissor_y = ARGS(0) & 0xffff;
m_scissor_h = ARGS(0) >> 16;
} }
break; 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 // Depth/ Color buffer usage
case NV4097_SET_SURFACE_FORMAT: 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; break;
case NV4097_SET_SURFACE_CLIP_VERTICAL: case NV4097_SET_CONTEXT_DMA_SEMAPHORE:
{ {
const u32 a0 = ARGS(0); if (ARGS(0))
m_set_surface_clip_vertical = true; LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_SEMAPHORE: %x", ARGS(0));
m_surface_clip_y = a0; }
m_surface_clip_h = a0 >> 16; break;
case NV4097_SET_CONTEXT_DMA_NOTIFIES:
{
if (ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0));
} }
break; 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_x = a0;
m_surface_clip_w = a0 >> 16; m_surface_clip_w = a0 >> 16;
if(count >= 2) if(count == 2)
{ {
const u32 a1 = ARGS(1); const u32 a1 = ARGS(1);
m_set_surface_clip_vertical = true; 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; 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: case NV4097_SET_ANTI_ALIASING_CONTROL:
{ {
// TODO:
// (cmd)[1] = CELL_GCM_ENDIAN_SWAP((enable) | ((alphaToCoverage) << 4) | ((alphaToOne) << 8) | ((sampleMask) << 16)); \
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_ANTI_ALIASING_CONTROL: %x", ARGS(0)); LOG_WARNING(RSX, "NV4097_SET_ANTI_ALIASING_CONTROL: %x", ARGS(0));
} }
break; break;
// Line/Polygon Smoothing // Line/Polygon smoothing
case NV4097_SET_LINE_SMOOTH_ENABLE: case NV4097_SET_LINE_SMOOTH_ENABLE:
{ {
m_set_line_smooth = ARGS(0) ? true : false; 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; break;
// Line/Polygon Stipple // Line/Polygon stipple
case NV4097_SET_LINE_STIPPLE: case NV4097_SET_LINE_STIPPLE:
{ {
m_set_line_stipple = ARGS(0) ? true : false; 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; 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 // Zcull
case NV4097_SET_ZCULL_EN: 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; 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 // Reporting
case NV4097_GET_REPORT: case NV4097_GET_REPORT:
{ {
@ -1573,6 +1679,13 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
break; break;
// Fog // Fog
case NV4097_SET_FOG_MODE:
{
m_set_fog_mode = true;
m_fog_mode = ARGS(0);
}
break;
case NV4097_SET_FOG_PARAMS: case NV4097_SET_FOG_PARAMS:
{ {
m_set_fog_params = true; 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; break;
case NV4097_SET_FOG_MODE:
{
m_set_fog_mode = true;
m_fog_mode = ARGS(0);
}
break;
// Zmin_max // Zmin_max
case NV4097_SET_ZMIN_MAX_CONTROL: case NV4097_SET_ZMIN_MAX_CONTROL:
{ {
if (ARGS(0)) if (ARGS(0))
LOG_WARNING(RSX, "NV4097_SET_ZMIN_MAX_CONTROL: %x", 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; break;
@ -1633,6 +1742,23 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
} }
break; 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 0x000002c8:
case 0x000002d0: case 0x000002d0:
case 0x000002d8: case 0x000002d8:
@ -1642,6 +1768,21 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
case 0x000002f8: case 0x000002f8:
break; 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) case NV0039_SET_CONTEXT_DMA_BUFFER_IN: // [E : RSXThread]: TODO: unknown/illegal method [0x00002184](0xfeed0000, 0xfeed0000)
{ {
const u32 srcContext = ARGS(0); 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; 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) case NV0039_OFFSET_IN: // [E : RSXThread]: TODO: unknown/illegal method [0x0000230c](0x0, 0xb00400, 0x0, 0x0, 0x384000, 0x1, 0x101, 0x0)
{ {
const u32 inOffset = ARGS(0); 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; 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: case NV3062_SET_OFFSET_DESTIN:
{ {
m_dst_offset = ARGS(0); m_dst_offset = ARGS(0);
} }
break; 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: case NV308A_COLOR:
{ {
RSXTransformConstant c; RSXTransformConstant c;
@ -1745,19 +2128,61 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
} }
break; break;
case NV308A_POINT: // NV3089
case NV3089_SET_OBJECT:
{ {
const u32 a0 = ARGS(0); if (ARGS(0))
m_point_x = a0 & 0xffff; LOG_WARNING(RSX, "NV3089_SET_OBJECT: %x", ARGS(0));
m_point_y = a0 >> 16;
} }
break; break;
case NV3062_SET_COLOR_FORMAT: case NV3089_SET_CONTEXT_DMA_NOTIFIES:
{ {
m_color_format = ARGS(0); if (ARGS(0))
m_color_format_src_pitch = ARGS(1); LOG_WARNING(RSX, "NV3089_SET_CONTEXT_DMA_NOTIFIES: %x", ARGS(0));
m_color_format_dst_pitch = ARGS(1) >> 16; }
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; break;
@ -1779,6 +2204,62 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
} }
break; 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: case NV3089_IMAGE_IN_SIZE:
{ {
u16 width = ARGS(0); u16 width = ARGS(0);
@ -1808,24 +2289,24 @@ void RSXThread::DoCmd(const u32 fcmd, const u32 cmd, mem32_ptr_t& args, const u3
} }
break; 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; 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; break;
case NV3089_SET_CONTEXT_SURFACE: case NV3089_IMAGE_IN:
{ {
if (ARGS(0) != CELL_GCM_CONTEXT_SURFACE2D) if (ARGS(0))
{ LOG_WARNING(RSX, "NV3089_IMAGE_IN: %x", ARGS(0));
LOG_WARNING(RSX, "NV3089_SET_CONTEXT_SURFACE: Unsupported surface (0x%x)", ARGS(0));
}
} }
break; break;