Merge pull request #4638 from leoetlino/ios-device-type

IOS HLE: Replace is_hardware with a proper device type
This commit is contained in:
Matthew Parlane 2017-01-10 09:12:55 +13:00 committed by GitHub
commit 8227994f6c
5 changed files with 33 additions and 28 deletions

View File

@ -112,6 +112,7 @@ template <typename T>
std::shared_ptr<T> AddDevice(const char* device_name) std::shared_ptr<T> AddDevice(const char* device_name)
{ {
auto device = std::make_shared<T>(num_devices, device_name); auto device = std::make_shared<T>(num_devices, device_name);
_assert_(device->GetDeviceType() == IWII_IPC_HLE_Device::DeviceType::Static);
s_device_map[num_devices] = device; s_device_map[num_devices] = device;
num_devices++; num_devices++;
return device; return device;
@ -172,7 +173,7 @@ void Reset(bool hard)
for (auto& dev : s_fdmap) for (auto& dev : s_fdmap)
{ {
if (dev && !dev->IsHardware()) if (dev && dev->GetDeviceType() != IWII_IPC_HLE_Device::DeviceType::Static)
{ {
// close all files and delete their resources // close all files and delete their resources
dev->Close(0, true); dev->Close(0, true);
@ -285,12 +286,7 @@ void DoState(PointerWrap& p)
} }
for (const auto& entry : s_device_map) for (const auto& entry : s_device_map)
{ entry.second->DoState(p);
if (entry.second->IsHardware())
{
entry.second->DoState(p);
}
}
if (p.GetMode() == PointerWrap::MODE_READ) if (p.GetMode() == PointerWrap::MODE_READ)
{ {
@ -300,18 +296,21 @@ void DoState(PointerWrap& p)
p.Do(exists); p.Do(exists);
if (exists) if (exists)
{ {
u32 isHw = 0; auto device_type = IWII_IPC_HLE_Device::DeviceType::Static;
p.Do(isHw); p.Do(device_type);
if (isHw) switch (device_type)
{ {
u32 hwId = 0; case IWII_IPC_HLE_Device::DeviceType::Static:
p.Do(hwId); {
s_fdmap[i] = AccessDeviceByID(hwId); u32 device_id = 0;
p.Do(device_id);
s_fdmap[i] = AccessDeviceByID(device_id);
break;
} }
else case IWII_IPC_HLE_Device::DeviceType::FileIO:
{
s_fdmap[i] = std::make_shared<CWII_IPC_HLE_Device_FileIO>(i, ""); s_fdmap[i] = std::make_shared<CWII_IPC_HLE_Device_FileIO>(i, "");
s_fdmap[i]->DoState(p); s_fdmap[i]->DoState(p);
break;
} }
} }
} }
@ -331,9 +330,9 @@ void DoState(PointerWrap& p)
p.Do(exists); p.Do(exists);
if (exists) if (exists)
{ {
u32 isHw = descriptor->IsHardware() ? 1 : 0; auto device_type = descriptor->GetDeviceType();
p.Do(isHw); p.Do(device_type);
if (isHw) if (device_type == IWII_IPC_HLE_Device::DeviceType::Static)
{ {
u32 hwId = descriptor->GetDeviceID(); u32 hwId = descriptor->GetDeviceID();
p.Do(hwId); p.Do(hwId);

View File

@ -47,8 +47,8 @@ SIOCtlVBuffer::SIOCtlVBuffer(const u32 address) : m_Address(address)
} }
IWII_IPC_HLE_Device::IWII_IPC_HLE_Device(const u32 device_id, const std::string& device_name, IWII_IPC_HLE_Device::IWII_IPC_HLE_Device(const u32 device_id, const std::string& device_name,
const bool hardware) const DeviceType type)
: m_name(device_name), m_device_id(device_id), m_is_hardware(hardware) : m_name(device_name), m_device_id(device_id), m_device_type(type)
{ {
} }
@ -62,7 +62,7 @@ void IWII_IPC_HLE_Device::DoStateShared(PointerWrap& p)
{ {
p.Do(m_name); p.Do(m_name);
p.Do(m_device_id); p.Do(m_device_id);
p.Do(m_is_hardware); p.Do(m_device_type);
p.Do(m_is_active); p.Do(m_is_active);
} }

View File

@ -62,7 +62,14 @@ struct SIOCtlVBuffer
class IWII_IPC_HLE_Device class IWII_IPC_HLE_Device
{ {
public: public:
IWII_IPC_HLE_Device(u32 device_id, const std::string& device_name, bool hardware = true); enum class DeviceType : u32
{
Static, // Devices which appear in s_device_map.
FileIO, // FileIO devices which are created dynamically.
};
IWII_IPC_HLE_Device(u32 device_id, const std::string& device_name,
DeviceType type = DeviceType::Static);
virtual ~IWII_IPC_HLE_Device() = default; virtual ~IWII_IPC_HLE_Device() = default;
// Release any resources which might interfere with savestating. // Release any resources which might interfere with savestating.
@ -81,17 +88,16 @@ public:
virtual IPCCommandResult IOCtlV(u32 command_address); virtual IPCCommandResult IOCtlV(u32 command_address);
virtual u32 Update() { return 0; } virtual u32 Update() { return 0; }
virtual bool IsHardware() const { return m_is_hardware; } virtual DeviceType GetDeviceType() const { return m_device_type; }
virtual bool IsOpened() const { return m_is_active; } virtual bool IsOpened() const { return m_is_active; }
static IPCCommandResult GetDefaultReply(); static IPCCommandResult GetDefaultReply();
static IPCCommandResult GetNoReply(); static IPCCommandResult GetNoReply();
std::string m_name;
protected: protected:
std::string m_name;
// STATE_TO_SAVE // STATE_TO_SAVE
u32 m_device_id; u32 m_device_id;
bool m_is_hardware; DeviceType m_device_type;
bool m_is_active = false; bool m_is_active = false;
// Write out the IPC struct from command_address to number_of_commands numbers // Write out the IPC struct from command_address to number_of_commands numbers

View File

@ -66,7 +66,7 @@ void HLE_IPC_CreateVirtualFATFilesystem()
CWII_IPC_HLE_Device_FileIO::CWII_IPC_HLE_Device_FileIO(u32 device_id, CWII_IPC_HLE_Device_FileIO::CWII_IPC_HLE_Device_FileIO(u32 device_id,
const std::string& device_name) const std::string& device_name)
: IWII_IPC_HLE_Device(device_id, device_name, false) // not a real hardware : IWII_IPC_HLE_Device(device_id, device_name, DeviceType::FileIO)
{ {
} }

View File

@ -71,7 +71,7 @@ static Common::Event g_compressAndDumpStateSyncEvent;
static std::thread g_save_thread; static std::thread g_save_thread;
// Don't forget to increase this after doing changes on the savestate system // Don't forget to increase this after doing changes on the savestate system
static const u32 STATE_VERSION = 67; // Last changed in PR 4634 static const u32 STATE_VERSION = 68; // Last changed in PR 4638
// Maps savestate versions to Dolphin versions. // Maps savestate versions to Dolphin versions.
// Versions after 42 don't need to be added to this list, // Versions after 42 don't need to be added to this list,