diff --git a/rpcs3/Emu/RSX/GCM.cpp b/rpcs3/Emu/RSX/GCM.cpp index 4bef41219c..e463a3208f 100644 --- a/rpcs3/Emu/RSX/GCM.cpp +++ b/rpcs3/Emu/RSX/GCM.cpp @@ -762,6 +762,34 @@ rsx::primitive_type rsx::to_primitive_type(u8 in) throw new EXCEPTION("Unknow primitive type %d", in); } +enum +{ + CELL_GCM_WINDOW_ORIGIN_TOP = 0, + CELL_GCM_WINDOW_ORIGIN_BOTTOM = 1, + CELL_GCM_WINDOW_PIXEL_CENTER_HALF = 0, + CELL_GCM_WINDOW_PIXEL_CENTER_INTEGER = 1, +}; + +rsx::window_origin rsx::to_window_origin(u8 in) +{ + switch (in) + { + case CELL_GCM_WINDOW_ORIGIN_TOP: return rsx::window_origin::top; + case CELL_GCM_WINDOW_ORIGIN_BOTTOM: return rsx::window_origin::bottom; + } + throw EXCEPTION("Unknow window origin modifier %x", in); +} + +rsx::window_pixel_center rsx::to_window_pixel_center(u8 in) +{ + switch (in) + { + case CELL_GCM_WINDOW_PIXEL_CENTER_HALF: return rsx::window_pixel_center::half; + case CELL_GCM_WINDOW_PIXEL_CENTER_INTEGER: return rsx::window_pixel_center::integer; + } + throw EXCEPTION("Unknow window pixel center %x", in); +} + enum { @@ -1378,6 +1406,31 @@ namespace return result; } + std::string origin_mode(u32 origin) + { + switch (rsx::to_window_origin(origin)) + { + case rsx::window_origin::bottom: return "bottom"; + case rsx::window_origin::top: return "top"; + } + throw EXCEPTION("Wrong origin mode"); + } + + std::string pixel_center_mode(u32 in) + { + switch (rsx::to_window_pixel_center(in)) + { + case rsx::window_pixel_center::half: return "half"; + case rsx::window_pixel_center::integer: return "integer"; + } + throw EXCEPTION("Wrong origin mode"); + } + + std::string shader_window(u32 arg) + { + return "Viewport: height = " + std::to_string(arg & 0xFFF) + " origin = " + origin_mode((arg >> 12) & 0xF) + " pixel center = " + pixel_center_mode((arg >> 16) & 0xF); + } + #define OPCODE_RANGE_1(opcode, increment, index, printing_function) \ { (opcode) + (index) * (increment), [](u32 arg) -> std::string { return (printing_function)((index), arg); } }, @@ -1476,6 +1529,7 @@ namespace { NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK, vertex_output_mask }, { NV4097_SET_SHADER_CONTROL, shader_control }, { NV4097_SET_ANTI_ALIASING_CONTROL, anti_aliasing_control }, + { NV4097_SET_SHADER_WINDOW, shader_window }, { NV4097_SET_VERTEX_DATA_ARRAY_FORMAT, [](u32 arg) -> std::string { return "Vertex array 0: " + unpack_vertex_format(arg); } }, { NV4097_SET_VERTEX_DATA_ARRAY_FORMAT + 1, [](u32 arg) -> std::string { return "Vertex array 1: " + unpack_vertex_format(arg); } }, { NV4097_SET_VERTEX_DATA_ARRAY_FORMAT + 2, [](u32 arg) -> std::string { return "Vertex array 2: " + unpack_vertex_format(arg); } }, diff --git a/rpcs3/Emu/RSX/GCM.h b/rpcs3/Emu/RSX/GCM.h index a11dc54ae1..f9a2b0f80e 100644 --- a/rpcs3/Emu/RSX/GCM.h +++ b/rpcs3/Emu/RSX/GCM.h @@ -111,6 +111,22 @@ namespace rsx }; surface_color_format to_surface_color_format(u8 in); + + enum class window_origin : u8 + { + top, + bottom + }; + + window_origin to_window_origin(u8 in); + + enum class window_pixel_center : u8 + { + half, + integer + }; + + window_pixel_center to_window_pixel_center(u8 in); } enum @@ -481,12 +497,6 @@ enum CELL_GCM_TRUE = 1, CELL_GCM_FALSE = 0, - CELL_GCM_WINDOW_ORIGIN_TOP = 0, - CELL_GCM_WINDOW_ORIGIN_BOTTOM = 1, - - CELL_GCM_WINDOW_PIXEL_CENTER_HALF = 0, - CELL_GCM_WINDOW_PIXEL_CENTER_INTEGER = 1, - CELL_GCM_USER_CLIP_PLANE_DISABLE = 0, CELL_GCM_USER_CLIP_PLANE_ENABLE_LT = 1, CELL_GCM_USER_CLIP_PLANE_ENABLE_GE = 2, diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index 77066df146..6dddb5e455 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -567,10 +567,10 @@ void GLGSRender::set_viewport() u32 shader_window = rsx::method_registers[NV4097_SET_SHADER_WINDOW]; - u8 shader_window_origin = (shader_window >> 12) & 0xf; + rsx::window_origin shader_window_origin = rsx::to_window_origin((shader_window >> 12) & 0xf); //TODO - if (true || shader_window_origin == CELL_GCM_WINDOW_ORIGIN_BOTTOM) + if (true || shader_window_origin == rsx::window_origin::bottom) { __glcheck glViewport(viewport_x, viewport_y, viewport_w, viewport_h); __glcheck glScissor(scissor_x, scissor_y, scissor_w, scissor_h);