Refactor gcm enums

This commit is contained in:
kd-11 2023-01-03 18:26:19 +03:00 committed by kd-11
parent 73cda2324a
commit 0b019401bd
3 changed files with 1449 additions and 1684 deletions

View file

@ -0,0 +1,40 @@
#pragma once
#include <util/types.hpp>
#include <concepts>
namespace rsx
{
template <typename E>
concept ErrorType = requires (E& e)
{
{ e.empty() } -> bool;
};
template <typename T, ErrorType E = std::string>
class expected
{
T value;
E error{};
public:
expected(const T& value_)
: value(value_)
{}
expected(const E& error_)
: error(error_)
{}
operator T() const
{
ensure(!error);
return value;
}
std::enable_if<!std::is_same_v<T, bool>>
operator bool() const
{
return !error;
}
};
}

View file

@ -5,154 +5,6 @@
using namespace rsx;
struct convertible_to_invalid
{
convertible_to_invalid() noexcept = default;
template <typename T> requires (std::is_enum_v<T>)
constexpr operator T() const
{
return T::invalid;
}
};
template <usz Size, typename... Args>
convertible_to_invalid throw_exception_if_emulating(const char(&fmt)[Size], Args&&... args)
{
if (thread_ctrl::get_current())
{
fmt::throw_exception(fmt, std::forward<Args>(args)...);
}
return {};
}
vertex_base_type rsx::to_vertex_base_type(u8 in)
{
switch (in)
{
case 0: return vertex_base_type::ub256;
case 1: return vertex_base_type::s1;
case 2: return vertex_base_type::f;
case 3: return vertex_base_type::sf;
case 4: return vertex_base_type::ub;
case 5: return vertex_base_type::s32k;
case 6: return vertex_base_type::cmp;
case 7: return vertex_base_type::ub256;
}
return throw_exception_if_emulating("Unknown vertex base type %d", in);
}
primitive_type rsx::to_primitive_type(u8 in)
{
switch (in)
{
case CELL_GCM_PRIMITIVE_POINTS: return primitive_type::points;
case CELL_GCM_PRIMITIVE_LINES: return primitive_type::lines;
case CELL_GCM_PRIMITIVE_LINE_LOOP: return primitive_type::line_loop;
case CELL_GCM_PRIMITIVE_LINE_STRIP: return primitive_type::line_strip;
case CELL_GCM_PRIMITIVE_TRIANGLES: return primitive_type::triangles;
case CELL_GCM_PRIMITIVE_TRIANGLE_STRIP: return primitive_type::triangle_strip;
case CELL_GCM_PRIMITIVE_TRIANGLE_FAN: return primitive_type::triangle_fan;
case CELL_GCM_PRIMITIVE_QUADS: return primitive_type::quads;
case CELL_GCM_PRIMITIVE_QUAD_STRIP: return primitive_type::quad_strip;
case CELL_GCM_PRIMITIVE_POLYGON: return primitive_type::polygon;
default: return primitive_type::invalid;
}
}
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,
};
window_origin rsx::to_window_origin(u8 in)
{
switch (in)
{
case CELL_GCM_WINDOW_ORIGIN_TOP: return window_origin::top;
case CELL_GCM_WINDOW_ORIGIN_BOTTOM: return window_origin::bottom;
}
return throw_exception_if_emulating("Unknown window origin modifier 0x%x", in);
}
window_pixel_center rsx::to_window_pixel_center(u8 in)
{
switch (in)
{
case CELL_GCM_WINDOW_PIXEL_CENTER_HALF: return window_pixel_center::half;
case CELL_GCM_WINDOW_PIXEL_CENTER_INTEGER: return window_pixel_center::integer;
}
return throw_exception_if_emulating("Unknown window pixel center 0x%x", in);
}
comparison_function rsx::to_comparison_function(u16 in)
{
switch (in)
{
case CELL_GCM_TEXTURE_ZFUNC_NEVER & CELL_GCM_SCULL_SFUNC_NEVER:
case CELL_GCM_NEVER:
return comparison_function::never;
case CELL_GCM_TEXTURE_ZFUNC_LESS & CELL_GCM_SCULL_SFUNC_LESS:
case CELL_GCM_LESS:
return comparison_function::less;
case CELL_GCM_TEXTURE_ZFUNC_EQUAL & CELL_GCM_SCULL_SFUNC_EQUAL:
case CELL_GCM_EQUAL:
return comparison_function::equal;
case CELL_GCM_TEXTURE_ZFUNC_LEQUAL & CELL_GCM_SCULL_SFUNC_LEQUAL:
case CELL_GCM_LEQUAL:
return comparison_function::less_or_equal;
case CELL_GCM_TEXTURE_ZFUNC_GREATER & CELL_GCM_SCULL_SFUNC_GREATER:
case CELL_GCM_GREATER:
return comparison_function::greater;
case CELL_GCM_TEXTURE_ZFUNC_NOTEQUAL & CELL_GCM_SCULL_SFUNC_NOTEQUAL:
case CELL_GCM_NOTEQUAL:
return comparison_function::not_equal;
case CELL_GCM_TEXTURE_ZFUNC_GEQUAL & CELL_GCM_SCULL_SFUNC_GEQUAL:
case CELL_GCM_GEQUAL:
return comparison_function::greater_or_equal;
case CELL_GCM_TEXTURE_ZFUNC_ALWAYS & CELL_GCM_SCULL_SFUNC_ALWAYS:
case CELL_GCM_ALWAYS:
return comparison_function::always;
}
return throw_exception_if_emulating("Unknown comparison function 0x%x", in);
}
fog_mode rsx::to_fog_mode(u32 in)
{
switch (in)
{
case CELL_GCM_FOG_MODE_LINEAR: return fog_mode::linear;
case CELL_GCM_FOG_MODE_EXP: return fog_mode::exponential;
case CELL_GCM_FOG_MODE_EXP2: return fog_mode::exponential2;
case CELL_GCM_FOG_MODE_EXP_ABS: return fog_mode::exponential_abs;
case CELL_GCM_FOG_MODE_EXP2_ABS: return fog_mode::exponential2_abs;
case CELL_GCM_FOG_MODE_LINEAR_ABS: return fog_mode::linear_abs;
}
return throw_exception_if_emulating("Unknown fog mode 0x%x", in);
}
texture_dimension rsx::to_texture_dimension(u8 in)
{
switch (in)
{
case 1: return texture_dimension::dimension1d;
case 2: return texture_dimension::dimension2d;
case 3: return texture_dimension::dimension3d;
}
return throw_exception_if_emulating("Unknown texture dimension %d", in);
}
template <>
void fmt_class_string<CellGcmLocation>::format(std::string& out, u64 arg)
{
@ -252,7 +104,6 @@ void fmt_class_string<comparison_function>::format(std::string& out, u64 arg)
case comparison_function::not_equal: return "Not_equal";
case comparison_function::greater_or_equal: return "Greater_equal";
case comparison_function::always: return "Always";
case comparison_function::invalid: return "Invalid";
}
return unknown;
@ -274,7 +125,6 @@ void fmt_class_string<stencil_op>::format(std::string& out, u64 arg)
case stencil_op::incr_wrap: return "Incr_wrap";
case stencil_op::decr_wrap: return "Decr_wrap";
case stencil_op::invert: return "Invert";
case stencil_op::invalid: return "Invalid";
}
return unknown;
@ -294,7 +144,6 @@ void fmt_class_string<fog_mode>::format(std::string& out, u64 arg)
case fog_mode::exponential_abs: return "exponential(abs)";
case fog_mode::linear: return "linear";
case fog_mode::linear_abs: return "linear(abs)";
case fog_mode::invalid: return "Invalid";
}
return unknown;
@ -324,7 +173,6 @@ void fmt_class_string<logic_op>::format(std::string& out, u64 arg)
case logic_op::logic_copy_inverted: return "Copy_inverted";
case logic_op::logic_or_inverted: return "Or_inverted";
case logic_op::logic_nand: return "Nand";
case logic_op::invalid: return "Invalid";
}
return unknown;
@ -340,7 +188,6 @@ void fmt_class_string<front_face>::format(std::string& out, u64 arg)
{
case front_face::ccw: return "counter clock wise";
case front_face::cw: return "clock wise";
case front_face::invalid: return "Invalid";
}
return unknown;
@ -357,7 +204,6 @@ void fmt_class_string<cull_face>::format(std::string& out, u64 arg)
case cull_face::back: return "back";
case cull_face::front: return "front";
case cull_face::front_and_back: return "front and back";
case cull_face::invalid: return "Invalid";
}
return unknown;
@ -377,7 +223,6 @@ void fmt_class_string<surface_target>::format(std::string& out, u64 arg)
case surface_target::surfaces_a_b: return "surfaces A and B";
case surface_target::surfaces_a_b_c: return "surfaces A, B and C";
case surface_target::surfaces_a_b_c_d: return "surfaces A,B, C and D";
case surface_target::invalid: return "Invalid";
}
return unknown;
@ -391,7 +236,6 @@ void fmt_class_string<primitive_type>::format(std::string& out, u64 arg)
{
switch (value)
{
case primitive_type::invalid: return "";
case primitive_type::points: return "Points";
case primitive_type::lines: return "Lines";
case primitive_type::line_loop: return "Line_loop";
@ -421,7 +265,6 @@ void fmt_class_string<blit_engine::transfer_operation>::format(std::string& out,
case blit_engine::transfer_operation::srccopy: return "srccopy";
case blit_engine::transfer_operation::srccopy_and: return "srccopy_and";
case blit_engine::transfer_operation::srccopy_premult: return "srccopy_premult";
case blit_engine::transfer_operation::invalid: return "Invalid";
default: return unknown;
}
});
@ -447,7 +290,6 @@ void fmt_class_string<blit_engine::transfer_source_format>::format(std::string&
case blit_engine::transfer_source_format::x8r8g8b8: return "x8r8g8b8";
case blit_engine::transfer_source_format::y8: return "y8";
case blit_engine::transfer_source_format::yb8cr8ya8cb8: return "yb8cr8ya8cb8";
case blit_engine::transfer_source_format::invalid: return "Invalid";
default: return unknown;
}
});
@ -462,7 +304,6 @@ void fmt_class_string<blit_engine::context_surface>::format(std::string& out, u6
{
case blit_engine::context_surface::surface2d: return "surface 2d";
case blit_engine::context_surface::swizzle2d: return "swizzle 2d";
case blit_engine::context_surface::invalid: return "Invalid";
}
return unknown;
@ -479,7 +320,6 @@ void fmt_class_string<blit_engine::transfer_destination_format>::format(std::str
case blit_engine::transfer_destination_format::a8r8g8b8: return "a8r8g8b8";
case blit_engine::transfer_destination_format::r5g6b5: return "r5g6b5";
case blit_engine::transfer_destination_format::y32: return "y32";
case blit_engine::transfer_destination_format::invalid: return "Invalid";
default: return unknown;
}
});
@ -494,7 +334,6 @@ void fmt_class_string<index_array_type>::format(std::string& out, u64 arg)
{
case index_array_type::u16: return "u16";
case index_array_type::u32: return "u32";
case index_array_type::invalid: return "Invalid";
}
return unknown;
@ -511,7 +350,6 @@ void fmt_class_string<polygon_mode>::format(std::string& out, u64 arg)
case polygon_mode::fill: return "fill";
case polygon_mode::line: return "line";
case polygon_mode::point: return "point";
case polygon_mode::invalid: return "Invalid";
}
return unknown;
@ -539,7 +377,6 @@ void fmt_class_string<surface_color_format>::format(std::string& out, u64 arg)
case surface_color_format::x8b8g8r8_z8b8g8r8: return "X8B8G8R8_Z8B8G8R8";
case surface_color_format::x8b8g8r8_o8b8g8r8: return "X8B8G8R8_O8B8G8R8";
case surface_color_format::a8b8g8r8: return "A8B8G8R8";
case surface_color_format::invalid: return "Invalid";
}
return unknown;
@ -557,7 +394,6 @@ void fmt_class_string<surface_antialiasing>::format(std::string& out, u64 arg)
case surface_antialiasing::diagonal_centered_2_samples: return "2 samples diagonal centered";
case surface_antialiasing::square_centered_4_samples: return "4 samples square centered";
case surface_antialiasing::square_rotated_4_samples: return "4 samples diagonal rotated";
case surface_antialiasing::invalid: return "Invalid";
}
return unknown;
@ -579,7 +415,6 @@ void fmt_class_string<blend_equation>::format(std::string& out, u64 arg)
case blend_equation::add_signed: return "Add_signed";
case blend_equation::reverse_add_signed: return "Reverse_add_signed";
case blend_equation::reverse_subtract_signed: return "Reverse_subtract_signed";
case blend_equation::invalid: return "Invalid";
}
return unknown;
@ -608,7 +443,6 @@ void fmt_class_string<blend_factor>::format(std::string& out, u64 arg)
case blend_factor::one_minus_constant_color: return "(1 - const.rgb)";
case blend_factor::constant_alpha: return "const.a";
case blend_factor::one_minus_constant_alpha: return "(1 - const.a)";
case blend_factor::invalid: return "Invalid";
}
return unknown;
@ -624,7 +458,6 @@ void fmt_class_string<window_origin>::format(std::string& out, u64 arg)
{
case window_origin::bottom: return "bottom";
case window_origin::top: return "top";
case window_origin::invalid: return "Invalid";
}
return unknown;
@ -640,7 +473,6 @@ void fmt_class_string<window_pixel_center>::format(std::string& out, u64 arg)
{
case window_pixel_center::half: return "half";
case window_pixel_center::integer: return "integer";
case window_pixel_center::invalid: return "Invalid";
}
return unknown;
@ -657,7 +489,6 @@ void fmt_class_string<user_clip_plane_op>::format(std::string& out, u64 arg)
case user_clip_plane_op::disable: return "disabled";
case user_clip_plane_op::greater_or_equal: return "greater or equal";
case user_clip_plane_op::less_than: return "less than";
case user_clip_plane_op::invalid: return "Invalid";
}
return unknown;
@ -674,7 +505,6 @@ void fmt_class_string<blit_engine::context_dma>::format(std::string& out, u64 ar
case blit_engine::context_dma::report_location_main: return "report location main";
case blit_engine::context_dma::to_memory_get_report: return "to memory get report";
case blit_engine::context_dma::memory_host_buffer: return "memory host buffer";
case blit_engine::context_dma::invalid: return "Invalid";
}
return unknown;
@ -690,7 +520,6 @@ void fmt_class_string<blit_engine::transfer_origin>::format(std::string& out, u6
{
case blit_engine::transfer_origin::center: return "center";
case blit_engine::transfer_origin::corner: return "corner";
case blit_engine::transfer_origin::invalid: return "Invalid";
}
return unknown;
@ -706,7 +535,6 @@ void fmt_class_string<shading_mode>::format(std::string& out, u64 arg)
{
case shading_mode::flat: return "flat";
case shading_mode::smooth: return "smooth";
case shading_mode::invalid: return "Invalid";
}
return unknown;
@ -722,7 +550,6 @@ void fmt_class_string<surface_depth_format>::format(std::string& out, u64 arg)
{
case surface_depth_format::z16: return "Z16";
case surface_depth_format::z24s8: return "Z24S8";
case surface_depth_format::invalid: return "Invalid";
}
return unknown;
@ -739,7 +566,6 @@ void fmt_class_string<blit_engine::transfer_interpolator>::format(std::string& o
{
case blit_engine::transfer_interpolator::foh: return "foh";
case blit_engine::transfer_interpolator::zoh: return "zoh";
case blit_engine::transfer_interpolator::invalid: return "Invalid";
}
return unknown;
@ -757,7 +583,6 @@ void fmt_class_string<texture_dimension>::format(std::string& out, u64 arg)
case texture_dimension::dimension1d: return "1D";
case texture_dimension::dimension2d: return "2D";
case texture_dimension::dimension3d: return "3D";
case texture_dimension::invalid: return "Invalid";
}
return unknown;
@ -779,7 +604,6 @@ void fmt_class_string<texture_max_anisotropy>::format(std::string& out, u64 arg)
case texture_max_anisotropy::x10: return "10";
case texture_max_anisotropy::x12: return "12";
case texture_max_anisotropy::x16: return "16";
case texture_max_anisotropy::invalid: return "Invalid";
}
return unknown;
@ -793,485 +617,3 @@ namespace rsx
return b ? "enabled" : "disabled";
}
} // end namespace rsx
enum
{
// Surface Target
CELL_GCM_SURFACE_TARGET_NONE = 0,
CELL_GCM_SURFACE_TARGET_0 = 1,
CELL_GCM_SURFACE_TARGET_1 = 2,
CELL_GCM_SURFACE_TARGET_MRT1 = 0x13,
CELL_GCM_SURFACE_TARGET_MRT2 = 0x17,
CELL_GCM_SURFACE_TARGET_MRT3 = 0x1f,
// Surface Depth
CELL_GCM_SURFACE_Z16 = 1,
CELL_GCM_SURFACE_Z24S8 = 2,
// Surface Antialias
CELL_GCM_SURFACE_CENTER_1 = 0,
CELL_GCM_SURFACE_DIAGONAL_CENTERED_2 = 3,
CELL_GCM_SURFACE_SQUARE_CENTERED_4 = 4,
CELL_GCM_SURFACE_SQUARE_ROTATED_4 = 5,
// Surface format
CELL_GCM_SURFACE_X1R5G5B5_Z1R5G5B5 = 1,
CELL_GCM_SURFACE_X1R5G5B5_O1R5G5B5 = 2,
CELL_GCM_SURFACE_R5G6B5 = 3,
CELL_GCM_SURFACE_X8R8G8B8_Z8R8G8B8 = 4,
CELL_GCM_SURFACE_X8R8G8B8_O8R8G8B8 = 5,
CELL_GCM_SURFACE_A8R8G8B8 = 8,
CELL_GCM_SURFACE_B8 = 9,
CELL_GCM_SURFACE_G8B8 = 10,
CELL_GCM_SURFACE_F_W16Z16Y16X16 = 11,
CELL_GCM_SURFACE_F_W32Z32Y32X32 = 12,
CELL_GCM_SURFACE_F_X32 = 13,
CELL_GCM_SURFACE_X8B8G8R8_Z8B8G8R8 = 14,
CELL_GCM_SURFACE_X8B8G8R8_O8B8G8R8 = 15,
CELL_GCM_SURFACE_A8B8G8R8 = 16,
// Wrap
CELL_GCM_TEXTURE_WRAP = 1,
CELL_GCM_TEXTURE_MIRROR = 2,
CELL_GCM_TEXTURE_CLAMP_TO_EDGE = 3,
CELL_GCM_TEXTURE_BORDER = 4,
CELL_GCM_TEXTURE_CLAMP = 5,
CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP_TO_EDGE = 6,
CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER = 7,
CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP = 8,
// Max Anisotropy
CELL_GCM_TEXTURE_MAX_ANISO_1 = 0,
CELL_GCM_TEXTURE_MAX_ANISO_2 = 1,
CELL_GCM_TEXTURE_MAX_ANISO_4 = 2,
CELL_GCM_TEXTURE_MAX_ANISO_6 = 3,
CELL_GCM_TEXTURE_MAX_ANISO_8 = 4,
CELL_GCM_TEXTURE_MAX_ANISO_10 = 5,
CELL_GCM_TEXTURE_MAX_ANISO_12 = 6,
CELL_GCM_TEXTURE_MAX_ANISO_16 = 7,
// Texture Filter
CELL_GCM_TEXTURE_NEAREST = 1,
CELL_GCM_TEXTURE_LINEAR = 2,
CELL_GCM_TEXTURE_NEAREST_NEAREST = 3,
CELL_GCM_TEXTURE_LINEAR_NEAREST = 4,
CELL_GCM_TEXTURE_NEAREST_LINEAR = 5,
CELL_GCM_TEXTURE_LINEAR_LINEAR = 6,
CELL_GCM_TEXTURE_CONVOLUTION_MIN = 7,
CELL_GCM_TEXTURE_CONVOLUTION_MAG = 4,
};
texture_wrap_mode rsx::to_texture_wrap_mode(u8 in)
{
switch (in)
{
case CELL_GCM_TEXTURE_WRAP: return texture_wrap_mode::wrap;
case CELL_GCM_TEXTURE_MIRROR: return texture_wrap_mode::mirror;
case CELL_GCM_TEXTURE_CLAMP_TO_EDGE: return texture_wrap_mode::clamp_to_edge;
case CELL_GCM_TEXTURE_BORDER: return texture_wrap_mode::border;
case CELL_GCM_TEXTURE_CLAMP: return texture_wrap_mode::clamp;
case CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP_TO_EDGE: return texture_wrap_mode::mirror_once_clamp_to_edge;
case CELL_GCM_TEXTURE_MIRROR_ONCE_BORDER: return texture_wrap_mode::mirror_once_border;
case CELL_GCM_TEXTURE_MIRROR_ONCE_CLAMP: return texture_wrap_mode::mirror_once_clamp;
}
return throw_exception_if_emulating("Unknown wrap mode 0x%x", in);
}
texture_max_anisotropy rsx::to_texture_max_anisotropy(u8 in)
{
switch (in)
{
case CELL_GCM_TEXTURE_MAX_ANISO_1: return texture_max_anisotropy::x1;
case CELL_GCM_TEXTURE_MAX_ANISO_2: return texture_max_anisotropy::x2;
case CELL_GCM_TEXTURE_MAX_ANISO_4: return texture_max_anisotropy::x4;
case CELL_GCM_TEXTURE_MAX_ANISO_6: return texture_max_anisotropy::x6;
case CELL_GCM_TEXTURE_MAX_ANISO_8: return texture_max_anisotropy::x8;
case CELL_GCM_TEXTURE_MAX_ANISO_10: return texture_max_anisotropy::x10;
case CELL_GCM_TEXTURE_MAX_ANISO_12: return texture_max_anisotropy::x12;
case CELL_GCM_TEXTURE_MAX_ANISO_16: return texture_max_anisotropy::x16;
}
return throw_exception_if_emulating("Unknown anisotropy max mode 0x%x", in);
}
texture_minify_filter rsx::to_texture_minify_filter(u8 in)
{
switch (in)
{
case CELL_GCM_TEXTURE_NEAREST: return texture_minify_filter::nearest;
case CELL_GCM_TEXTURE_LINEAR: return texture_minify_filter::linear;
case CELL_GCM_TEXTURE_NEAREST_NEAREST: return texture_minify_filter::nearest_nearest;
case CELL_GCM_TEXTURE_LINEAR_NEAREST: return texture_minify_filter::linear_nearest;
case CELL_GCM_TEXTURE_NEAREST_LINEAR: return texture_minify_filter::nearest_linear;
case CELL_GCM_TEXTURE_LINEAR_LINEAR: return texture_minify_filter::linear_linear;
case CELL_GCM_TEXTURE_CONVOLUTION_MIN: return texture_minify_filter::linear_linear;
}
return throw_exception_if_emulating("Unknown minify filter 0x%x", in);
}
texture_magnify_filter rsx::to_texture_magnify_filter(u8 in)
{
switch (in)
{
case CELL_GCM_TEXTURE_NEAREST: return texture_magnify_filter::nearest;
case CELL_GCM_TEXTURE_LINEAR: return texture_magnify_filter::linear;
case CELL_GCM_TEXTURE_CONVOLUTION_MAG: return texture_magnify_filter::convolution_mag;
}
return throw_exception_if_emulating("Unknown magnify filter 0x%x", in);
}
surface_target rsx::to_surface_target(u8 in)
{
switch (in)
{
case CELL_GCM_SURFACE_TARGET_NONE: return surface_target::none;
case CELL_GCM_SURFACE_TARGET_0: return surface_target::surface_a;
case CELL_GCM_SURFACE_TARGET_1: return surface_target::surface_b;
case CELL_GCM_SURFACE_TARGET_MRT1: return surface_target::surfaces_a_b;
case CELL_GCM_SURFACE_TARGET_MRT2: return surface_target::surfaces_a_b_c;
case CELL_GCM_SURFACE_TARGET_MRT3: return surface_target::surfaces_a_b_c_d;
}
return throw_exception_if_emulating("Unknown surface target 0x%x", in);
}
surface_depth_format rsx::to_surface_depth_format(u8 in)
{
switch (in)
{
case CELL_GCM_SURFACE_Z16: return surface_depth_format::z16;
case CELL_GCM_SURFACE_Z24S8: return surface_depth_format::z24s8;
}
return throw_exception_if_emulating("Unknown surface depth format 0x%x", in);
}
surface_antialiasing rsx::to_surface_antialiasing(u8 in)
{
switch (in)
{
case CELL_GCM_SURFACE_CENTER_1: return surface_antialiasing::center_1_sample;
case CELL_GCM_SURFACE_DIAGONAL_CENTERED_2: return surface_antialiasing::diagonal_centered_2_samples;
case CELL_GCM_SURFACE_SQUARE_CENTERED_4: return surface_antialiasing::square_centered_4_samples;
case CELL_GCM_SURFACE_SQUARE_ROTATED_4: return surface_antialiasing::square_rotated_4_samples;
}
return throw_exception_if_emulating("Unknown surface antialiasing format 0x%x", in);
}
surface_color_format rsx::to_surface_color_format(u8 in)
{
switch (in)
{
case CELL_GCM_SURFACE_X1R5G5B5_Z1R5G5B5: return surface_color_format::x1r5g5b5_z1r5g5b5;
case CELL_GCM_SURFACE_X1R5G5B5_O1R5G5B5: return surface_color_format::x1r5g5b5_o1r5g5b5;
case CELL_GCM_SURFACE_R5G6B5: return surface_color_format::r5g6b5;
case CELL_GCM_SURFACE_X8R8G8B8_Z8R8G8B8: return surface_color_format::x8r8g8b8_z8r8g8b8;
case CELL_GCM_SURFACE_X8R8G8B8_O8R8G8B8: return surface_color_format::x8r8g8b8_o8r8g8b8;
case CELL_GCM_SURFACE_A8R8G8B8: return surface_color_format::a8r8g8b8;
case CELL_GCM_SURFACE_B8: return surface_color_format::b8;
case CELL_GCM_SURFACE_G8B8: return surface_color_format::g8b8;
case CELL_GCM_SURFACE_F_W16Z16Y16X16: return surface_color_format::w16z16y16x16;
case CELL_GCM_SURFACE_F_W32Z32Y32X32: return surface_color_format::w32z32y32x32;
case CELL_GCM_SURFACE_F_X32: return surface_color_format::x32;
case CELL_GCM_SURFACE_X8B8G8R8_Z8B8G8R8: return surface_color_format::x8b8g8r8_z8b8g8r8;
case CELL_GCM_SURFACE_X8B8G8R8_O8B8G8R8: return surface_color_format::x8b8g8r8_o8b8g8r8;
case CELL_GCM_SURFACE_A8B8G8R8: return surface_color_format::a8b8g8r8;
}
return throw_exception_if_emulating("Unknown surface color format 0x%x", in);
}
stencil_op rsx::to_stencil_op(u16 in)
{
switch (in)
{
case CELL_GCM_INVERT: return stencil_op::invert;
case CELL_GCM_KEEP: return stencil_op::keep;
case CELL_GCM_REPLACE: return stencil_op::replace;
case CELL_GCM_INCR: return stencil_op::incr;
case CELL_GCM_DECR: return stencil_op::decr;
case CELL_GCM_INCR_WRAP: return stencil_op::incr_wrap;
case CELL_GCM_DECR_WRAP: return stencil_op::decr_wrap;
case CELL_GCM_ZERO: return stencil_op::zero;
}
return throw_exception_if_emulating("Unknown stencil op 0x%x", in);
}
blend_equation rsx::to_blend_equation(u16 in)
{
switch (in)
{
case CELL_GCM_FUNC_ADD: return blend_equation::add;
case CELL_GCM_MIN: return blend_equation::min;
case CELL_GCM_MAX: return blend_equation::max;
case CELL_GCM_FUNC_SUBTRACT: return blend_equation::subtract;
case CELL_GCM_FUNC_REVERSE_SUBTRACT: return blend_equation::reverse_subtract;
case CELL_GCM_FUNC_REVERSE_SUBTRACT_SIGNED: return blend_equation::reverse_subtract_signed;
case CELL_GCM_FUNC_ADD_SIGNED: return blend_equation::add_signed;
case CELL_GCM_FUNC_REVERSE_ADD_SIGNED: return blend_equation::reverse_add_signed;
}
return throw_exception_if_emulating("Unknown blend eq 0x%x", in);
}
blend_factor rsx::to_blend_factor(u16 in)
{
switch (in)
{
case CELL_GCM_ZERO: return blend_factor::zero;
case CELL_GCM_ONE: return blend_factor::one;
case CELL_GCM_SRC_COLOR: return blend_factor::src_color;
case CELL_GCM_ONE_MINUS_SRC_COLOR: return blend_factor::one_minus_src_color;
case CELL_GCM_SRC_ALPHA: return blend_factor::src_alpha;
case CELL_GCM_ONE_MINUS_SRC_ALPHA: return blend_factor::one_minus_src_alpha;
case CELL_GCM_DST_ALPHA: return blend_factor::dst_alpha;
case CELL_GCM_ONE_MINUS_DST_ALPHA: return blend_factor::one_minus_dst_alpha;
case CELL_GCM_DST_COLOR: return blend_factor::dst_color;
case CELL_GCM_ONE_MINUS_DST_COLOR: return blend_factor::one_minus_dst_color;
case CELL_GCM_SRC_ALPHA_SATURATE: return blend_factor::src_alpha_saturate;
case CELL_GCM_CONSTANT_COLOR: return blend_factor::constant_color;
case CELL_GCM_ONE_MINUS_CONSTANT_COLOR: return blend_factor::one_minus_constant_color;
case CELL_GCM_CONSTANT_ALPHA: return blend_factor::constant_alpha;
case CELL_GCM_ONE_MINUS_CONSTANT_ALPHA: return blend_factor::one_minus_constant_alpha;
}
return throw_exception_if_emulating("Unknown blend factor 0x%x", in);
}
enum
{
CELL_GCM_CLEAR = 0x1500,
CELL_GCM_AND = 0x1501,
CELL_GCM_AND_REVERSE = 0x1502,
CELL_GCM_COPY = 0x1503,
CELL_GCM_AND_INVERTED = 0x1504,
CELL_GCM_NOOP = 0x1505,
CELL_GCM_XOR = 0x1506,
CELL_GCM_OR = 0x1507,
CELL_GCM_NOR = 0x1508,
CELL_GCM_EQUIV = 0x1509,
CELL_GCM_OR_REVERSE = 0x150B,
CELL_GCM_COPY_INVERTED = 0x150C,
CELL_GCM_OR_INVERTED = 0x150D,
CELL_GCM_NAND = 0x150E,
CELL_GCM_SET = 0x150F,
};
logic_op rsx::to_logic_op(u16 in)
{
switch (in)
{
case CELL_GCM_CLEAR: return logic_op::logic_clear;
case CELL_GCM_AND: return logic_op::logic_and;
case CELL_GCM_AND_REVERSE: return logic_op::logic_and_reverse;
case CELL_GCM_COPY: return logic_op::logic_copy;
case CELL_GCM_AND_INVERTED: return logic_op::logic_and_inverted;
case CELL_GCM_NOOP: return logic_op::logic_noop;
case CELL_GCM_XOR: return logic_op::logic_xor;
case CELL_GCM_OR: return logic_op::logic_or;
case CELL_GCM_NOR: return logic_op::logic_nor;
case CELL_GCM_EQUIV: return logic_op::logic_equiv;
case CELL_GCM_INVERT: return logic_op::logic_invert;
case CELL_GCM_OR_REVERSE: return logic_op::logic_or_reverse;
case CELL_GCM_COPY_INVERTED: return logic_op::logic_copy_inverted;
case CELL_GCM_OR_INVERTED: return logic_op::logic_or_inverted;
case CELL_GCM_NAND: return logic_op::logic_nand;
case CELL_GCM_SET: return logic_op::logic_set;
}
return throw_exception_if_emulating("Unknown logic op 0x%x", in);
}
front_face rsx::to_front_face(u16 in)
{
switch (in)
{
default: // Disgaea 3 pass some garbage value at startup, this is needed to survive.
case CELL_GCM_CW: return front_face::cw;
case CELL_GCM_CCW: return front_face::ccw;
}
return throw_exception_if_emulating("Unknown front face 0x%x", in);
}
enum
{
CELL_GCM_TRANSFER_ORIGIN_CENTER = 1,
CELL_GCM_TRANSFER_ORIGIN_CORNER = 2,
CELL_GCM_TRANSFER_INTERPOLATOR_ZOH = 0,
CELL_GCM_TRANSFER_INTERPOLATOR_FOH = 1,
};
blit_engine::transfer_origin blit_engine::to_transfer_origin(u8 in)
{
switch (in)
{
case CELL_GCM_TRANSFER_ORIGIN_CENTER: return blit_engine::transfer_origin::center;
case CELL_GCM_TRANSFER_ORIGIN_CORNER: return blit_engine::transfer_origin::corner;
}
return throw_exception_if_emulating("Unknown transfer origin 0x%x", in);
}
blit_engine::transfer_interpolator blit_engine::to_transfer_interpolator(u8 in)
{
switch (in)
{
case CELL_GCM_TRANSFER_INTERPOLATOR_ZOH: return blit_engine::transfer_interpolator::zoh;
case CELL_GCM_TRANSFER_INTERPOLATOR_FOH: return blit_engine::transfer_interpolator::foh;
}
return throw_exception_if_emulating("Unknown transfer interpolator 0x%x", in);
}
enum
{
CELL_GCM_TRANSFER_OPERATION_SRCCOPY_AND = 0,
CELL_GCM_TRANSFER_OPERATION_ROP_AND = 1,
CELL_GCM_TRANSFER_OPERATION_BLEND_AND = 2,
CELL_GCM_TRANSFER_OPERATION_SRCCOPY = 3,
CELL_GCM_TRANSFER_OPERATION_SRCCOPY_PREMULT = 4,
CELL_GCM_TRANSFER_OPERATION_BLEND_PREMULT = 5,
};
blit_engine::transfer_operation blit_engine::to_transfer_operation(u8 in)
{
switch (in)
{
case CELL_GCM_TRANSFER_OPERATION_SRCCOPY_AND: return blit_engine::transfer_operation::srccopy_and;
case CELL_GCM_TRANSFER_OPERATION_ROP_AND: return blit_engine::transfer_operation::rop_and;
case CELL_GCM_TRANSFER_OPERATION_BLEND_AND: return blit_engine::transfer_operation::blend_and;
case CELL_GCM_TRANSFER_OPERATION_SRCCOPY: return blit_engine::transfer_operation::srccopy;
case CELL_GCM_TRANSFER_OPERATION_SRCCOPY_PREMULT: return blit_engine::transfer_operation::srccopy_premult;
case CELL_GCM_TRANSFER_OPERATION_BLEND_PREMULT: return blit_engine::transfer_operation::blend_premult;
default: return blit_engine::transfer_operation::invalid;
}
}
enum
{
CELL_GCM_TRANSFER_SCALE_FORMAT_A1R5G5B5 = 1,
CELL_GCM_TRANSFER_SCALE_FORMAT_X1R5G5B5 = 2,
CELL_GCM_TRANSFER_SCALE_FORMAT_A8R8G8B8 = 3,
CELL_GCM_TRANSFER_SCALE_FORMAT_X8R8G8B8 = 4,
CELL_GCM_TRANSFER_SCALE_FORMAT_CR8YB8CB8YA8 = 5,
CELL_GCM_TRANSFER_SCALE_FORMAT_YB8CR8YA8CB8 = 6,
CELL_GCM_TRANSFER_SCALE_FORMAT_R5G6B5 = 7,
CELL_GCM_TRANSFER_SCALE_FORMAT_Y8 = 8,
CELL_GCM_TRANSFER_SCALE_FORMAT_AY8 = 9,
CELL_GCM_TRANSFER_SCALE_FORMAT_EYB8ECR8EYA8ECB8 = 10,
CELL_GCM_TRANSFER_SCALE_FORMAT_ECR8EYB8ECB8EYA8 = 11,
CELL_GCM_TRANSFER_SCALE_FORMAT_A8B8G8R8 = 12,
CELL_GCM_TRANSFER_SCALE_FORMAT_X8B8G8R8 = 13,
};
blit_engine::transfer_source_format blit_engine::to_transfer_source_format(u8 in)
{
switch (in)
{
case CELL_GCM_TRANSFER_SCALE_FORMAT_A1R5G5B5: return blit_engine::transfer_source_format::a1r5g5b5;
case CELL_GCM_TRANSFER_SCALE_FORMAT_X1R5G5B5: return blit_engine::transfer_source_format::x1r5g5b5;
case CELL_GCM_TRANSFER_SCALE_FORMAT_A8R8G8B8: return blit_engine::transfer_source_format::a8r8g8b8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_X8R8G8B8: return blit_engine::transfer_source_format::x8r8g8b8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_CR8YB8CB8YA8: return blit_engine::transfer_source_format::cr8yb8cb8ya8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_YB8CR8YA8CB8: return blit_engine::transfer_source_format::yb8cr8ya8cb8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_R5G6B5: return blit_engine::transfer_source_format::r5g6b5;
case CELL_GCM_TRANSFER_SCALE_FORMAT_Y8: return blit_engine::transfer_source_format::y8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_AY8: return blit_engine::transfer_source_format::ay8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_EYB8ECR8EYA8ECB8: return blit_engine::transfer_source_format::eyb8ecr8eya8ecb8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_ECR8EYB8ECB8EYA8: return blit_engine::transfer_source_format::ecr8eyb8ecb8eya8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_A8B8G8R8: return blit_engine::transfer_source_format::a8b8g8r8;
case CELL_GCM_TRANSFER_SCALE_FORMAT_X8B8G8R8: return blit_engine::transfer_source_format::x8b8g8r8;
default: return blit_engine::transfer_source_format::invalid;
}
}
enum
{
// Destination Format conversions
CELL_GCM_TRANSFER_SURFACE_FORMAT_R5G6B5 = 4,
CELL_GCM_TRANSFER_SURFACE_FORMAT_A8R8G8B8 = 10,
CELL_GCM_TRANSFER_SURFACE_FORMAT_Y32 = 11,
};
blit_engine::transfer_destination_format blit_engine::to_transfer_destination_format(u8 in)
{
switch (in)
{
case CELL_GCM_TRANSFER_SURFACE_FORMAT_R5G6B5: return blit_engine::transfer_destination_format::r5g6b5;
case CELL_GCM_TRANSFER_SURFACE_FORMAT_A8R8G8B8: return blit_engine::transfer_destination_format::a8r8g8b8;
case CELL_GCM_TRANSFER_SURFACE_FORMAT_Y32: return blit_engine::transfer_destination_format::y32;
default: return blit_engine::transfer_destination_format::invalid;
}
}
enum
{
CELL_GCM_CONTEXT_SURFACE2D = 0x313371C3,
CELL_GCM_CONTEXT_SWIZZLE2D = 0x31337A73,
};
blit_engine::context_surface blit_engine::to_context_surface(u32 in)
{
switch (in)
{
case CELL_GCM_CONTEXT_SURFACE2D: return blit_engine::context_surface::surface2d;
case CELL_GCM_CONTEXT_SWIZZLE2D: return blit_engine::context_surface::swizzle2d;
}
return throw_exception_if_emulating("Unknown context surface 0x%x", in);
}
blit_engine::context_dma blit_engine::to_context_dma(u32 in)
{
switch (in)
{
case CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_LOCAL: return blit_engine::context_dma::to_memory_get_report;
case CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN: return blit_engine::context_dma::report_location_main;
case CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER: return blit_engine::context_dma::memory_host_buffer;
}
return throw_exception_if_emulating("Unknown context dma 0x%x", in);
}
enum
{
CELL_GCM_USER_CLIP_PLANE_DISABLE = 0,
CELL_GCM_USER_CLIP_PLANE_ENABLE_LT = 1,
CELL_GCM_USER_CLIP_PLANE_ENABLE_GE = 2,
};
user_clip_plane_op rsx::to_user_clip_plane_op(u8 in)
{
switch (in)
{
case CELL_GCM_USER_CLIP_PLANE_DISABLE: return user_clip_plane_op::disable;
case CELL_GCM_USER_CLIP_PLANE_ENABLE_LT: return user_clip_plane_op::less_than;
case CELL_GCM_USER_CLIP_PLANE_ENABLE_GE: return user_clip_plane_op::greater_or_equal;
}
return throw_exception_if_emulating("Unknown user clip plane 0x%x", in);
}
enum
{
CELL_GCM_FLAT = 0x1D00,
CELL_GCM_SMOOTH = 0x1D01,
};
shading_mode rsx::to_shading_mode(u32 in)
{
switch (in)
{
case CELL_GCM_FLAT: return shading_mode::flat;
case CELL_GCM_SMOOTH: return shading_mode::smooth;
}
return throw_exception_if_emulating("Unknown shading mode 0x%x", in);
}
enum
{
CELL_GCM_POLYGON_MODE_POINT = 0x1B00,
CELL_GCM_POLYGON_MODE_LINE = 0x1B01,
CELL_GCM_POLYGON_MODE_FILL = 0x1B02,
};
polygon_mode rsx::to_polygon_mode(u32 in)
{
switch (in)
{
case CELL_GCM_POLYGON_MODE_POINT: return polygon_mode::point;
case CELL_GCM_POLYGON_MODE_LINE: return polygon_mode::line;
case CELL_GCM_POLYGON_MODE_FILL: return polygon_mode::fill;
}
return throw_exception_if_emulating("Unknown polygon mode 0x%x", in);
}

File diff suppressed because it is too large Load diff