Fixed conflicts

This commit is contained in:
Nekotekina 2014-07-01 17:29:47 +04:00
commit f3b61f58ef
3 changed files with 843 additions and 256 deletions

View File

@ -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,

View File

@ -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)
{
@ -215,13 +269,28 @@ 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;
@ -432,10 +501,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;
}
@ -481,6 +549,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;
@ -490,7 +561,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;
@ -551,7 +622,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;
@ -568,21 +640,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;
@ -593,6 +657,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:
{
@ -642,7 +714,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;
@ -682,6 +754,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;
@ -740,6 +818,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))
@ -767,7 +852,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;
}
}
@ -891,19 +980,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;
@ -923,6 +1017,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");
@ -965,15 +1062,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;
@ -1011,6 +1106,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;
@ -1022,6 +1123,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;
@ -1054,6 +1156,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;
@ -1068,12 +1171,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;
@ -1085,6 +1182,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;
@ -1117,6 +1215,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;
@ -1174,6 +1273,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;
@ -1185,14 +1287,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;
@ -1208,47 +1302,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:
{
@ -1421,12 +1482,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;
@ -1438,7 +1504,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;
@ -1448,15 +1514,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;
@ -1478,7 +1556,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;
@ -1494,6 +1572,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:
{
@ -1524,6 +1616,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:
{
@ -1574,6 +1680,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;
@ -1584,18 +1697,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;
@ -1634,6 +1743,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:
@ -1643,6 +1769,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);
@ -1658,6 +1799,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);
@ -1697,12 +1845,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;
@ -1746,19 +2129,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;
@ -1780,6 +2205,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);
@ -1809,24 +2290,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;

View File

@ -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 void cellGcmSetFlipHandler(u32 handler_addr);
extern int32_t cellGcmAddressToOffset(u64 address, mem32_t offset);
extern int 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<CellGcmContextData> ctx, u32 id);
extern int cellGcmSetSecondVFrequency(u32 freq);
extern u32 cellGcmGetLabelAddress(u8 index);
extern void 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<RescVertex_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<RescVertex_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<CellRescInitConfig> 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<CellRescInitConfig> 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<CellRescInitConfig> initConfig)
{
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)
if ((initConfig->resourcePolicy & ~((u32)0x3)) || (initConfig->supportModes & 0xF) == 0 || (initConfig->ratioMode > 2) || (initConfig->palTemporalMode > 5))
{
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; i<RESC_PARAM_NUM; i++) {
s_rescInternalInstance->m_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<CellGcmContextData>& cntxt)
@ -481,7 +559,8 @@ void SetupRsxRenderingStates(mem_ptr_t<CellGcmContextData>& 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<CellGcmContextData>& 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<CellGcmContextData>& 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<CellRescInitConfig> 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<CellRescDsts> 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,13 +828,17 @@ 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<CellGcmSurface> gcmSurface, mem_ptr_t<C
{
cellResc->Log("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<CellRescSrc> 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<CellGcmContextData> 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<be_t<u32>> dstOffset;
cellGcmAddressToOffset(s_rescInternalInstance->m_colorBuffersEA, dstOffset.GetAddr());
for(int i=0; i<GetNumColorBuffers(); i++)
for (int i=0; i<GetNumColorBuffers(); i++)
{
s_rescInternalInstance->m_dstOffsets[i] = dstOffset->ToLE() + i * s_rescInternalInstance->m_dstBufInterval;
}
for(int i=0; i<GetNumColorBuffers(); i++)
for (int i=0; i<GetNumColorBuffers(); i++)
{
int ret = cellGcmSetDisplayBuffer(i, s_rescInternalInstance->m_dstOffsets[i], s_rescInternalInstance->m_dstPitch, s_rescInternalInstance->m_dstWidth, s_rescInternalInstance->m_dstHeight);
if (ret) return ret;
}
if(IsTextureNR())
if (IsTextureNR())
{
BuildupVertexBufferNR();
}
//TODO: ?
@ -1052,7 +1162,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;
@ -1203,6 +1313,5 @@ void cellResc_load()
void cellResc_unload()
{
// s_rescInternalInstance->m_bInitialized = false;
delete s_rescInternalInstance;
}