mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
cellGem: split status_flags into calibration flags and runtime flags
This commit is contained in:
parent
cc50049bca
commit
cf0b4d4ed4
3 changed files with 68 additions and 27 deletions
|
@ -189,6 +189,8 @@ public:
|
||||||
|
|
||||||
struct gem_color
|
struct gem_color
|
||||||
{
|
{
|
||||||
|
ENABLE_BITWISE_SERIALIZATION;
|
||||||
|
|
||||||
f32 r, g, b;
|
f32 r, g, b;
|
||||||
|
|
||||||
gem_color() : r(0.0f), g(0.0f), b(0.0f) {}
|
gem_color() : r(0.0f), g(0.0f), b(0.0f) {}
|
||||||
|
@ -238,17 +240,16 @@ public:
|
||||||
|
|
||||||
bool is_calibrating{false}; // Whether or not we are currently calibrating
|
bool is_calibrating{false}; // Whether or not we are currently calibrating
|
||||||
u64 calibration_start_us{0}; // The start timestamp of the calibration in microseconds
|
u64 calibration_start_us{0}; // The start timestamp of the calibration in microseconds
|
||||||
|
u64 calibration_status_flags = 0; // The calibration status flags
|
||||||
|
|
||||||
static constexpr u64 calibration_time_us = 500000; // The calibration supposedly takes 0.5 seconds (500000 microseconds)
|
static constexpr u64 calibration_time_us = 500000; // The calibration supposedly takes 0.5 seconds (500000 microseconds)
|
||||||
|
|
||||||
ENABLE_BITWISE_SERIALIZATION;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CellGemAttribute attribute = {};
|
CellGemAttribute attribute = {};
|
||||||
CellGemVideoConvertAttribute vc_attribute = {};
|
CellGemVideoConvertAttribute vc_attribute = {};
|
||||||
s32 video_data_out_size = -1;
|
s32 video_data_out_size = -1;
|
||||||
std::vector<u8> video_data_in;
|
std::vector<u8> video_data_in;
|
||||||
u64 status_flags = 0;
|
u64 runtime_status_flags = 0; // The runtime status flags
|
||||||
bool enable_pitch_correction = false;
|
bool enable_pitch_correction = false;
|
||||||
u32 inertial_counter = 0;
|
u32 inertial_counter = 0;
|
||||||
|
|
||||||
|
@ -279,11 +280,9 @@ public:
|
||||||
{
|
{
|
||||||
gem.is_calibrating = false;
|
gem.is_calibrating = false;
|
||||||
gem.calibration_start_us = 0;
|
gem.calibration_start_us = 0;
|
||||||
|
gem.calibration_status_flags = CELL_GEM_FLAG_CALIBRATION_SUCCEEDED | CELL_GEM_FLAG_CALIBRATION_OCCURRED;
|
||||||
gem.calibrated_magnetometer = true;
|
gem.calibrated_magnetometer = true;
|
||||||
gem.enabled_tracking = true;
|
gem.enabled_tracking = true;
|
||||||
gem.hue = 1;
|
|
||||||
|
|
||||||
status_flags = CELL_GEM_FLAG_CALIBRATION_SUCCEEDED | CELL_GEM_FLAG_CALIBRATION_OCCURRED;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,18 +392,7 @@ public:
|
||||||
|
|
||||||
gem_config_data()
|
gem_config_data()
|
||||||
{
|
{
|
||||||
if (!g_cfg_gem_real.load())
|
load_configs();
|
||||||
{
|
|
||||||
cellGem.notice("Could not load real gem config. Using defaults.");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!g_cfg_gem_fake.load())
|
|
||||||
{
|
|
||||||
cellGem.notice("Could not load fake gem config. Using defaults.");
|
|
||||||
}
|
|
||||||
|
|
||||||
cellGem.notice("Real gem config=\n", g_cfg_gem_real.to_string());
|
|
||||||
cellGem.notice("Fake gem config=\n", g_cfg_gem_fake.to_string());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
SAVESTATE_INIT_POS(15);
|
SAVESTATE_INIT_POS(15);
|
||||||
|
@ -418,10 +406,36 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[maybe_unused]] const s32 version = GET_OR_USE_SERIALIZATION_VERSION(ar.is_writing(), cellGem);
|
const s32 version = GET_OR_USE_SERIALIZATION_VERSION(ar.is_writing(), cellGem);
|
||||||
|
|
||||||
ar(attribute, vc_attribute, status_flags, enable_pitch_correction, inertial_counter, controllers
|
ar(attribute, vc_attribute, runtime_status_flags, enable_pitch_correction, inertial_counter);
|
||||||
, connected_controllers, updating, camera_frame, memory_ptr, start_timestamp_us);
|
|
||||||
|
for (gem_controller& c : controllers)
|
||||||
|
{
|
||||||
|
ar(c.status, c.ext_status, c.ext_id, c.port, c.enabled_magnetometer, c.calibrated_magnetometer, c.enabled_filtering, c.enabled_tracking, c.enabled_LED, c.hue_set, c.rumble);
|
||||||
|
|
||||||
|
// We need to add padding because we used bitwise serialization in version 1
|
||||||
|
if (version < 2)
|
||||||
|
{
|
||||||
|
ar.add_padding(&gem_controller::rumble, &gem_controller::sphere_rgb);
|
||||||
|
}
|
||||||
|
|
||||||
|
ar(c.sphere_rgb, c.hue, c.distance_mm, c.radius, c.radius_valid, c.is_calibrating);
|
||||||
|
|
||||||
|
if (version < 2)
|
||||||
|
{
|
||||||
|
ar.add_padding(&gem_controller::is_calibrating, &gem_controller::calibration_start_us);
|
||||||
|
}
|
||||||
|
|
||||||
|
ar(c.calibration_start_us);
|
||||||
|
|
||||||
|
if (ar.is_writing() || version >= 2)
|
||||||
|
{
|
||||||
|
ar(c.calibration_status_flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ar(connected_controllers, updating, camera_frame, memory_ptr, start_timestamp_us);
|
||||||
}
|
}
|
||||||
|
|
||||||
gem_config_data(utils::serial& ar)
|
gem_config_data(utils::serial& ar)
|
||||||
|
@ -431,6 +445,11 @@ public:
|
||||||
if (ar.is_writing())
|
if (ar.is_writing())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
load_configs();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void load_configs()
|
||||||
|
{
|
||||||
if (!g_cfg_gem_real.load())
|
if (!g_cfg_gem_real.load())
|
||||||
{
|
{
|
||||||
cellGem.notice("Could not load real gem config. Using defaults.");
|
cellGem.notice("Could not load real gem config. Using defaults.");
|
||||||
|
@ -1605,7 +1624,7 @@ error_code cellGemClearStatusFlags(u32 gem_num, u64 mask)
|
||||||
return CELL_GEM_ERROR_INVALID_PARAMETER;
|
return CELL_GEM_ERROR_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
gem.status_flags &= ~mask;
|
gem.controllers[gem_num].calibration_status_flags &= ~mask;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
@ -2394,7 +2413,7 @@ error_code cellGemGetStatusFlags(u32 gem_num, vm::ptr<u64> flags)
|
||||||
return CELL_GEM_ERROR_INVALID_PARAMETER;
|
return CELL_GEM_ERROR_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
*flags = gem.status_flags;
|
*flags = gem.runtime_status_flags | gem.controllers[gem_num].calibration_status_flags;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
@ -2523,7 +2542,7 @@ error_code cellGemInit(ppu_thread& ppu, vm::cptr<CellGemAttribute> attribute)
|
||||||
|
|
||||||
gem.updating = false;
|
gem.updating = false;
|
||||||
gem.camera_frame = 0;
|
gem.camera_frame = 0;
|
||||||
gem.status_flags = 0;
|
gem.runtime_status_flags = 0;
|
||||||
gem.attribute = *attribute;
|
gem.attribute = *attribute;
|
||||||
|
|
||||||
for (int gem_num = 0; gem_num < CELL_GEM_MAX_NUM; gem_num++)
|
for (int gem_num = 0; gem_num < CELL_GEM_MAX_NUM; gem_num++)
|
||||||
|
@ -2560,8 +2579,7 @@ error_code cellGemInvalidateCalibration(s32 gem_num)
|
||||||
// TODO: does this really stop an ongoing calibration ?
|
// TODO: does this really stop an ongoing calibration ?
|
||||||
gem.controllers[gem_num].is_calibrating = false;
|
gem.controllers[gem_num].is_calibrating = false;
|
||||||
gem.controllers[gem_num].calibration_start_us = 0;
|
gem.controllers[gem_num].calibration_start_us = 0;
|
||||||
|
gem.controllers[gem_num].calibration_status_flags = 0;
|
||||||
// TODO: gem.status_flags (probably not changed)
|
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ SERIALIZATION_VER(sceNp, 11)
|
||||||
SERIALIZATION_VER(cellVdec, 12, 1)
|
SERIALIZATION_VER(cellVdec, 12, 1)
|
||||||
SERIALIZATION_VER(cellAudio, 13, 1)
|
SERIALIZATION_VER(cellAudio, 13, 1)
|
||||||
SERIALIZATION_VER(cellCamera, 14, 1)
|
SERIALIZATION_VER(cellCamera, 14, 1)
|
||||||
SERIALIZATION_VER(cellGem, 15, 1)
|
SERIALIZATION_VER(cellGem, 15, 1, 2/*calibration_status_flags*/)
|
||||||
SERIALIZATION_VER(sceNpTrophy, 16, 1)
|
SERIALIZATION_VER(sceNpTrophy, 16, 1)
|
||||||
SERIALIZATION_VER(cellMusic, 17, 1)
|
SERIALIZATION_VER(cellMusic, 17, 1)
|
||||||
SERIALIZATION_VER(cellVoice, 18, 1)
|
SERIALIZATION_VER(cellVoice, 18, 1)
|
||||||
|
|
|
@ -96,6 +96,29 @@ public:
|
||||||
return m_is_writing;
|
return m_is_writing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void add_padding(usz padding)
|
||||||
|
{
|
||||||
|
if (m_is_writing) return;
|
||||||
|
pos += padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add padding needed between two members
|
||||||
|
template <typename T, typename T2, typename T3>
|
||||||
|
void add_padding(T T2::*const first, T3 T2::*const second)
|
||||||
|
{
|
||||||
|
if (m_is_writing) return;
|
||||||
|
|
||||||
|
const u32 offset1 = ::offset32(first) + sizeof(first);
|
||||||
|
const u32 offset2 = ::offset32(second);
|
||||||
|
|
||||||
|
AUDIT(offset2 >= offset1);
|
||||||
|
|
||||||
|
if (offset2 > offset1)
|
||||||
|
{
|
||||||
|
pos += offset2 - offset1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void set_expect_little_data(bool value)
|
void set_expect_little_data(bool value)
|
||||||
{
|
{
|
||||||
m_expect_little_data = value;
|
m_expect_little_data = value;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue