Use u64 for system_time_t, as s64 doesn't make much sense in a microsecond context.

This commit is contained in:
Megamouse 2023-02-22 22:14:40 +01:00
parent ccb7528a59
commit 6b30cdac09
9 changed files with 38 additions and 28 deletions

View File

@ -147,7 +147,7 @@ void camera_context::save(utils::serial& ar)
GET_OR_USE_SERIALIZATION_VERSION(ar.is_writing(), cellCamera);
ar(notify_data_map, start_timestamp, read_mode, is_streaming, is_attached, is_open, info, attr, frame_num);
ar(notify_data_map, start_timestamp_us, read_mode, is_streaming, is_attached, is_open, info, attr, frame_num);
}
static bool check_dev_num(s32 dev_num)
@ -1268,7 +1268,7 @@ error_code cellCameraStart(s32 dev_num)
// TODO: Yet another CELL_CAMERA_ERROR_TIMEOUT
g_camera.start_timestamp = get_guest_system_time();
g_camera.start_timestamp_us = get_guest_system_time();
g_camera.is_streaming = true;
return CELL_OK;
@ -1385,18 +1385,18 @@ error_code cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read)
if (has_new_frame)
{
g_camera.frame_timestamp = ::narrow<u32>(get_guest_system_time() - g_camera.start_timestamp);
g_camera.frame_timestamp_us = get_guest_system_time() - g_camera.start_timestamp_us;
}
if (read) // NULL returns CELL_OK
{
read->timestamp = g_camera.frame_timestamp;
read->timestamp = g_camera.frame_timestamp_us;
read->frame = g_camera.frame_num;
read->bytesread = g_camera.bytes_read;
auto& shared_data = g_fxo->get<gem_camera_shared>();
shared_data.frame_timestamp.store(read->timestamp);
shared_data.frame_timestamp_us.store(read->timestamp);
}
return CELL_OK;
@ -1672,7 +1672,7 @@ void camera_context::operator()()
const u64 camera_id = 0;
data2 = image_data_size << 32 | buffer_number << 16 | camera_id;
data3 = get_guest_system_time() - start_timestamp; // timestamp
data3 = get_guest_system_time() - start_timestamp_us; // timestamp
}
else // CELL_CAMERA_READ_FUNCCALL, also default
{
@ -1801,7 +1801,7 @@ void camera_context::reset_state()
pbuf_locked[0] = false;
pbuf_locked[1] = false;
has_new_frame = false;
frame_timestamp = 0;
frame_timestamp_us = 0;
bytes_read = 0;
if (info.buffer)

View File

@ -384,7 +384,7 @@ struct CellCameraReadEx
be_t<s32> version;
be_t<u32> frame;
be_t<u32> bytesread;
be_t<s64> timestamp;
be_t<u64> timestamp; // system_time_t (microseconds)
vm::bptr<u8> pbuf;
};
@ -422,7 +422,7 @@ public:
shared_mutex mutex;
shared_mutex mutex_notify_data_map;
u64 start_timestamp = 0;
u64 start_timestamp_us = 0;
atomic_t<u8> read_mode{CELL_CAMERA_READ_FUNCCALL};
atomic_t<bool> is_streaming{false};
@ -444,7 +444,7 @@ public:
attr_t attr[500]{};
atomic_t<bool> has_new_frame = false;
atomic_t<u32> frame_num = 0;
atomic_t<u32> frame_timestamp = 0;
atomic_t<u64> frame_timestamp_us = 0;
atomic_t<u32> bytes_read = 0;
atomic_t<u8> init = 0;
@ -471,7 +471,7 @@ using camera_thread = named_thread<camera_context>;
/// Shared data between cellGem and cellCamera
struct gem_camera_shared
{
atomic_t<s64> frame_timestamp{}; // latest read timestamp from cellCamera (cellCameraRead(Ex))
atomic_t<u64> frame_timestamp_us{}; // latest read timestamp from cellCamera (cellCameraRead(Ex))
atomic_t<s32> width{640};
atomic_t<s32> height{480};
atomic_t<s32> size{0};

View File

@ -215,7 +215,7 @@ public:
shared_mutex mtx;
u64 start_timestamp = 0;
u64 start_timestamp_us = 0;
// helper functions
bool is_controller_ready(u32 gem_num) const
@ -299,10 +299,20 @@ public:
return;
}
GET_OR_USE_SERIALIZATION_VERSION(ar.is_writing(), cellGem);
[[maybe_unused]] const s32 version = GET_OR_USE_SERIALIZATION_VERSION(ar.is_writing(), cellGem);
ar(attribute, vc_attribute, status_flags, enable_pitch_correction, inertial_counter, controllers
, connected_controllers, update_started, camera_frame, memory_ptr, start_timestamp);
, connected_controllers, update_started, camera_frame, memory_ptr);
if (version == 1 && !ar.is_writing())
{
u32 ts = ar;
start_timestamp_us = ts;
}
else
{
ar(start_timestamp_us);
}
}
gem_config_data(utils::serial& ar)
@ -1328,7 +1338,7 @@ error_code cellGemGetImageState(u32 gem_num, vm::ptr<CellGemImageState> gem_imag
if (g_cfg.io.move != move_handler::null)
{
auto& shared_data = g_fxo->get<gem_camera_shared>();
gem_image_state->frame_timestamp = shared_data.frame_timestamp.load();
gem_image_state->frame_timestamp = shared_data.frame_timestamp_us.load();
gem_image_state->timestamp = gem_image_state->frame_timestamp + 10;
gem_image_state->r = gem.controllers[gem_num].radius; // Radius in camera pixels
gem_image_state->distance = gem.controllers[gem_num].distance; // 1.5 meters away from camera
@ -1385,7 +1395,7 @@ error_code cellGemGetInertialState(u32 gem_num, u32 state_flag, u64 timestamp, v
{
ds3_input_to_ext(gem_num, gem.controllers[gem_num], inertial_state->ext);
inertial_state->timestamp = (get_guest_system_time() - gem.start_timestamp);
inertial_state->timestamp = (get_guest_system_time() - gem.start_timestamp_us);
inertial_state->counter = gem.inertial_counter++;
inertial_state->accelerometer[0] = 10; // Current gravity in m/s²
@ -1561,7 +1571,7 @@ error_code cellGemGetState(u32 gem_num, u32 flag, u64 time_parameter, vm::ptr<Ce
tracking_flags |= CELL_GEM_TRACKING_FLAG_POSITION_TRACKED;
gem_state->tracking_flags = tracking_flags;
gem_state->timestamp = (get_guest_system_time() - gem.start_timestamp);
gem_state->timestamp = (get_guest_system_time() - gem.start_timestamp_us);
gem_state->camera_pitch_angle = 0.f;
gem_state->quat[3] = 1.f;
@ -1763,7 +1773,7 @@ error_code cellGemInit(ppu_thread& ppu, vm::cptr<CellGemAttribute> attribute)
}
// TODO: is this correct?
gem.start_timestamp = get_guest_system_time();
gem.start_timestamp_us = get_guest_system_time();
return CELL_OK;
}
@ -1939,7 +1949,7 @@ error_code cellGemReset(u32 gem_num)
gem.reset_controller(gem_num);
// TODO: is this correct?
gem.start_timestamp = get_guest_system_time();
gem.start_timestamp_us = get_guest_system_time();
return CELL_OK;
}

View File

@ -200,8 +200,8 @@ struct CellGemExtPortData
struct CellGemImageState
{
be_t<u64> frame_timestamp; // time the frame was captured by libCamera (usecs)
be_t<u64> timestamp; // time processing of the frame was finished (usecs)
be_t<u64> frame_timestamp; // time the frame was captured by libCamera. system_time_t (usecs)
be_t<u64> timestamp; // time processing of the frame was finished. system_time_t (usecs)
be_t<f32> u; // horizontal screen position in pixels
be_t<f32> v; // vertical screen position in pixels
be_t<f32> r; // size of sphere on screen in pixels
@ -226,7 +226,7 @@ struct CellGemInertialState
be_t<f32> gyro_bias[4]; // gyro bias (radians/s)
CellGemPadData pad;
CellGemExtPortData ext;
be_t<u64> timestamp;
be_t<u64> timestamp; // system_time_t (microseconds)
be_t<s32> counter;
be_t<f32> temperature;
};
@ -256,7 +256,7 @@ struct CellGemState
be_t<f32> handle_accel[4]; // acceleration of controller handle (mm/s²)
CellGemPadData pad;
CellGemExtPortData ext;
be_t<u64> timestamp;
be_t<u64> timestamp; // system_time_t (microseconds)
be_t<f32> temperature;
be_t<f32> camera_pitch_angle;
be_t<u32> tracking_flags;

View File

@ -1351,7 +1351,7 @@ error_code cellRtcSetCurrentTick(vm::cptr<CellRtcTick> pTick)
// TODO syscall not implemented
/*
u32 tmp2 = sys_time_get_system_time(tmp / cellRtcGetTickResolution(), (tmp % cellRtcGetTickResolution()) * 1000);
u64 tmp2 = sys_time_get_system_time(tmp / cellRtcGetTickResolution(), (tmp % cellRtcGetTickResolution()) * 1000);
return (tmp2 & (tmp2 | tmp2 - 1) >> 0x1f);
*/

View File

@ -20,7 +20,7 @@ struct np_in_addr
using sys_memory_container_t = u32;
using system_time_t = s64;
using system_time_t = u64; // s64 in documentation. But since this is in microseconds, it doesn't seem to make much sense.
using second_t = u32;
using usecond_t = u64;

View File

@ -16,7 +16,7 @@ vm::gvar<vm::ptr<void()>> g_ppu_atexitspawn;
vm::gvar<vm::ptr<void()>> g_ppu_at_Exitspawn;
extern vm::gvar<u32> g_ppu_exit_mutex;
s64 sys_time_get_system_time()
u64 sys_time_get_system_time()
{
sysPrxForUser.trace("sys_time_get_system_time()");

View File

@ -15,7 +15,7 @@ enum : u32
struct sys_timer_information_t
{
be_t<s64> next_expire;
be_t<u64> next_expire; // system_time_t
be_t<u64> period;
be_t<u32> timer_state;
be_t<u32> pad;

View File

@ -65,7 +65,7 @@ SERIALIZATION_VER(sceNp, 11)
SERIALIZATION_VER(cellVdec, 12, 1)
SERIALIZATION_VER(cellAudio, 13, 1)
SERIALIZATION_VER(cellCamera, 14, 1)
SERIALIZATION_VER(cellGem, 15, 1)
SERIALIZATION_VER(cellGem, 15, 1, 2/*frame_timestamp u32->u64*/)
SERIALIZATION_VER(sceNpTrophy, 16, 1)
SERIALIZATION_VER(cellMusic, 17, 1)
SERIALIZATION_VER(cellVoice, 18, 1)