mirror of
https://github.com/RPCS3/rpcs3
synced 2024-07-01 07:04:22 +00:00
Compare commits
3 Commits
0ca8649b50
...
992d95c6fd
Author | SHA1 | Date | |
---|---|---|---|
|
992d95c6fd | ||
|
71524271e9 | ||
|
d5923ef808 |
|
@ -557,29 +557,6 @@ void cpu_thread::operator()()
|
|||
// Register thread in g_cpu_array
|
||||
s_cpu_counter++;
|
||||
|
||||
atomic_wait_engine::set_notify_callback(g_use_rtm || get_class() != thread_class::ppu ? nullptr : +[](const void*, u64 progress)
|
||||
{
|
||||
static thread_local bool wait_set = false;
|
||||
|
||||
cpu_thread* _cpu = get_current_cpu_thread();
|
||||
|
||||
// Wait flag isn't set asynchronously so this should be thread-safe
|
||||
if (progress == 0 && _cpu->state.none_of(cpu_flag::wait + cpu_flag::temp))
|
||||
{
|
||||
// Operation just started and syscall is imminent
|
||||
_cpu->state += cpu_flag::wait + cpu_flag::temp;
|
||||
wait_set = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (progress == umax && std::exchange(wait_set, false))
|
||||
{
|
||||
// Operation finished: need to clean wait flag
|
||||
ensure(!_cpu->check_state());
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
static thread_local struct thread_cleanup_t
|
||||
{
|
||||
cpu_thread* _this = nullptr;
|
||||
|
@ -598,8 +575,6 @@ void cpu_thread::operator()()
|
|||
ptr->compare_and_swap(_this, nullptr);
|
||||
}
|
||||
|
||||
atomic_wait_engine::set_notify_callback(nullptr);
|
||||
|
||||
g_tls_log_control = [](const char*, u64){};
|
||||
|
||||
if (s_tls_thread_slot != umax)
|
||||
|
|
|
@ -27,4 +27,16 @@ vec3 compute2x2DownsampleWeights(const in float coord, const in float uv_step, c
|
|||
return vec3(1.0 - (computed_weights.x + computed_weights.y), computed_weights.xy);
|
||||
}
|
||||
|
||||
vec2 texture2DMSCoord(const in vec2 coords, const in uint flags)
|
||||
{
|
||||
if (0u == (flags & (WRAP_S_MASK | WRAP_T_MASK)))
|
||||
{
|
||||
return coords;
|
||||
}
|
||||
|
||||
const vec2 wrapped_coords = mod(coords, vec2(1.0));
|
||||
const bvec2 wrap_control_mask = bvec2(uvec2(flags) & uvec2(WRAP_S_MASK, WRAP_T_MASK));
|
||||
return _select(coords, wrapped_coords, wrap_control_mask);
|
||||
}
|
||||
|
||||
)"
|
||||
|
|
|
@ -1,16 +1,4 @@
|
|||
R"(
|
||||
vec2 texture2DMSCoord(const in vec2 coords, const in uint flags)
|
||||
{
|
||||
if (0u == (flags & (WRAP_S_MASK | WRAP_T_MASK)))
|
||||
{
|
||||
return coords;
|
||||
}
|
||||
|
||||
const vec2 wrapped_coords = mod(coords, vec2(1.0));
|
||||
const bvec2 wrap_control_mask = bvec2(uvec2(flags) & uvec2(WRAP_S_MASK, WRAP_T_MASK));
|
||||
return _select(coords, wrapped_coords, wrap_control_mask);
|
||||
}
|
||||
|
||||
vec4 texelFetch2DMS(in _MSAA_SAMPLER_TYPE_ tex, const in vec2 sample_count, const in ivec2 icoords, const in int index, const in ivec2 offset)
|
||||
{
|
||||
const vec2 resolve_coords = vec2(icoords + offset);
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
LOG_CHANNEL(ds3_log, "DS3");
|
||||
|
||||
using namespace reports;
|
||||
|
||||
constexpr std::array<u8, 6> battery_capacity = {0, 1, 25, 50, 75, 100};
|
||||
|
||||
constexpr id_pair SONY_DS3_ID_0 = {0x054C, 0x0268};
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include <unordered_map>
|
||||
|
||||
namespace
|
||||
namespace reports
|
||||
{
|
||||
struct ds3_rumble
|
||||
{
|
||||
|
@ -67,7 +67,7 @@ public:
|
|||
#ifdef _WIN32
|
||||
u8 report_id = 0;
|
||||
#endif
|
||||
ds3_input_report report{};
|
||||
reports::ds3_input_report report{};
|
||||
};
|
||||
|
||||
class ds3_pad_handler final : public hid_pad_handler<ds3_device>
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
LOG_CHANNEL(ds4_log, "DS4");
|
||||
|
||||
using namespace reports;
|
||||
|
||||
constexpr id_pair SONY_DS4_ID_0 = {0x054C, 0x0BA0}; // Dongle
|
||||
constexpr id_pair SONY_DS4_ID_1 = {0x054C, 0x05C4}; // CUH-ZCT1x
|
||||
constexpr id_pair SONY_DS4_ID_2 = {0x054C, 0x09CC}; // CUH-ZCT2x
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include <unordered_map>
|
||||
|
||||
namespace
|
||||
namespace reports
|
||||
{
|
||||
constexpr u32 DS4_ACC_RES_PER_G = 8192;
|
||||
constexpr u32 DS4_GYRO_RES_PER_DEG_S = 86; // technically this could be 1024, but keeping it at 86 keeps us within 16 bits of precision
|
||||
|
@ -119,8 +119,8 @@ public:
|
|||
bool bt_controller{false};
|
||||
bool has_calib_data{false};
|
||||
std::array<CalibData, CalibIndex::COUNT> calib_data{};
|
||||
ds4_input_report_usb report_usb{};
|
||||
ds4_input_report_bt report_bt{};
|
||||
reports::ds4_input_report_usb report_usb{};
|
||||
reports::ds4_input_report_bt report_bt{};
|
||||
};
|
||||
|
||||
class ds4_pad_handler final : public hid_pad_handler<DS4Device>
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
LOG_CHANNEL(dualsense_log, "DualSense");
|
||||
|
||||
using namespace reports;
|
||||
|
||||
template <>
|
||||
void fmt_class_string<DualSenseDevice::DualSenseDataMode>::format(std::string& out, u64 arg)
|
||||
{
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#include <unordered_map>
|
||||
|
||||
namespace
|
||||
namespace reports
|
||||
{
|
||||
constexpr u32 DUALSENSE_ACC_RES_PER_G = 8192;
|
||||
constexpr u32 DUALSENSE_GYRO_RES_PER_DEG_S = 86; // technically this could be 1024, but keeping it at 86 keeps us within 16 bits of precision
|
||||
|
@ -172,7 +172,7 @@ public:
|
|||
u8 bt_sequence{0};
|
||||
bool has_calib_data{false};
|
||||
std::array<CalibData, CalibIndex::COUNT> calib_data{};
|
||||
dualsense_input_report_common report{}; // No need to have separate reports for usb and bluetooth
|
||||
reports::dualsense_input_report_common report{}; // No need to have separate reports for usb and bluetooth
|
||||
DualSenseDataMode data_mode{DualSenseDataMode::Simple};
|
||||
DualSenseFeatureSet feature_set{DualSenseFeatureSet::Normal};
|
||||
bool init_lightbar{true};
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
LOG_CHANNEL(skateboard_log, "Skateboard");
|
||||
|
||||
using namespace reports;
|
||||
|
||||
namespace
|
||||
{
|
||||
constexpr id_pair SKATEBOARD_ID_0 = {0x12BA, 0x0400}; // Tony Hawk RIDE Skateboard
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
#include <array>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace
|
||||
namespace reports
|
||||
{
|
||||
// Descriptor
|
||||
// 0x09, 0x05, // Usage (0x05)
|
||||
|
@ -143,7 +143,7 @@ class skateboard_device : public HidDevice
|
|||
{
|
||||
public:
|
||||
bool skateboard_is_on = false;
|
||||
skateboard_input_report report{};
|
||||
reports::skateboard_input_report report{};
|
||||
};
|
||||
|
||||
class skateboard_pad_handler final : public hid_pad_handler<skateboard_device>
|
||||
|
|
|
@ -81,7 +81,7 @@ struct gui_listener : logs::listener
|
|||
|
||||
_new->msg += text;
|
||||
|
||||
queue.push(std::move(p));
|
||||
queue.push<false>(std::move(p));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -67,9 +67,6 @@ static thread_local bool(*s_tls_wait_cb)(const void* data, u64 attempts, u64 sta
|
|||
// Callback for wait() function for a second custon condition, commonly passed with timeout
|
||||
static thread_local bool(*s_tls_one_time_wait_cb)(u64 attempts) = nullptr;
|
||||
|
||||
// Callback for notification functions for optimizations
|
||||
static thread_local void(*s_tls_notify_cb)(const void* data, u64 progress) = nullptr;
|
||||
|
||||
// Compare data in memory with old value, and return true if they are equal
|
||||
static NEVER_INLINE bool ptr_cmp(const void* data, u32 old, atomic_wait::info* ext = nullptr)
|
||||
{
|
||||
|
@ -1247,22 +1244,12 @@ void atomic_wait_engine::set_one_time_use_wait_callback(bool(*cb)(u64 progress))
|
|||
s_tls_one_time_wait_cb = cb;
|
||||
}
|
||||
|
||||
void atomic_wait_engine::set_notify_callback(void(*cb)(const void*, u64))
|
||||
{
|
||||
s_tls_notify_cb = cb;
|
||||
}
|
||||
|
||||
void atomic_wait_engine::notify_one(const void* data)
|
||||
{
|
||||
if (s_tls_notify_cb)
|
||||
s_tls_notify_cb(data, 0);
|
||||
|
||||
#ifdef __linux__
|
||||
if (has_waitv())
|
||||
{
|
||||
futex(const_cast<void*>(data), FUTEX_WAKE_PRIVATE, 1);
|
||||
if (s_tls_notify_cb)
|
||||
s_tls_notify_cb(data, -1);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
@ -1277,23 +1264,15 @@ void atomic_wait_engine::notify_one(const void* data)
|
|||
|
||||
return false;
|
||||
});
|
||||
|
||||
if (s_tls_notify_cb)
|
||||
s_tls_notify_cb(data, -1);
|
||||
}
|
||||
|
||||
SAFE_BUFFERS(void)
|
||||
atomic_wait_engine::notify_all(const void* data)
|
||||
{
|
||||
if (s_tls_notify_cb)
|
||||
s_tls_notify_cb(data, 0);
|
||||
|
||||
#ifdef __linux__
|
||||
if (has_waitv())
|
||||
{
|
||||
futex(const_cast<void*>(data), FUTEX_WAKE_PRIVATE, INT_MAX);
|
||||
if (s_tls_notify_cb)
|
||||
s_tls_notify_cb(data, -1);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
@ -1369,9 +1348,6 @@ atomic_wait_engine::notify_all(const void* data)
|
|||
{
|
||||
cond_free(~*(std::end(cond_ids) - i - 1));
|
||||
}
|
||||
|
||||
if (s_tls_notify_cb)
|
||||
s_tls_notify_cb(data, -1);
|
||||
}
|
||||
|
||||
namespace atomic_wait
|
||||
|
|
|
@ -257,7 +257,6 @@ public:
|
|||
static void notify_all(const void* data);
|
||||
|
||||
static void set_wait_callback(bool(*cb)(const void* data, u64 attempts, u64 stamp0));
|
||||
static void set_notify_callback(void(*cb)(const void* data, u64 progress));
|
||||
static void set_one_time_use_wait_callback(bool (*cb)(u64 progress));
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user