core: Remove outdated MSVC workarounds (#5099)
* core/hw/gpu: Remove outdated MSVC workarounds * core/hle/service/hid: Remove MSVC workaround
This commit is contained in:
parent
4991c0121a
commit
996f1546b2
|
@ -6,9 +6,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#ifndef _MSC_VER
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#endif
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "common/bit_field.h"
|
#include "common/bit_field.h"
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
|
@ -177,10 +175,6 @@ struct GyroscopeCalibrateParam {
|
||||||
} x, y, z;
|
} x, y, z;
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: MSVC does not support using offsetof() on non-static data members even though this
|
|
||||||
// is technically allowed since C++11. This macro should be enabled once MSVC adds
|
|
||||||
// support for that.
|
|
||||||
#ifndef _MSC_VER
|
|
||||||
#define ASSERT_REG_POSITION(field_name, position) \
|
#define ASSERT_REG_POSITION(field_name, position) \
|
||||||
static_assert(offsetof(SharedMem, field_name) == position * 4, \
|
static_assert(offsetof(SharedMem, field_name) == position * 4, \
|
||||||
"Field " #field_name " has invalid position")
|
"Field " #field_name " has invalid position")
|
||||||
|
@ -189,7 +183,6 @@ ASSERT_REG_POSITION(pad.index_reset_ticks, 0x0);
|
||||||
ASSERT_REG_POSITION(touch.index_reset_ticks, 0x2A);
|
ASSERT_REG_POSITION(touch.index_reset_ticks, 0x2A);
|
||||||
|
|
||||||
#undef ASSERT_REG_POSITION
|
#undef ASSERT_REG_POSITION
|
||||||
#endif // !defined(_MSC_VER)
|
|
||||||
|
|
||||||
struct DirectionState {
|
struct DirectionState {
|
||||||
bool up;
|
bool up;
|
||||||
|
|
|
@ -402,8 +402,8 @@ inline void Write(u32 addr, const T data) {
|
||||||
switch (index) {
|
switch (index) {
|
||||||
|
|
||||||
// Memory fills are triggered once the fill value is written.
|
// Memory fills are triggered once the fill value is written.
|
||||||
case GPU_REG_INDEX_WORKAROUND(memory_fill_config[0].trigger, 0x00004 + 0x3):
|
case GPU_REG_INDEX(memory_fill_config[0].trigger):
|
||||||
case GPU_REG_INDEX_WORKAROUND(memory_fill_config[1].trigger, 0x00008 + 0x3): {
|
case GPU_REG_INDEX(memory_fill_config[1].trigger): {
|
||||||
const bool is_second_filler = (index != GPU_REG_INDEX(memory_fill_config[0].trigger));
|
const bool is_second_filler = (index != GPU_REG_INDEX(memory_fill_config[0].trigger));
|
||||||
auto& config = g_regs.memory_fill_config[is_second_filler];
|
auto& config = g_regs.memory_fill_config[is_second_filler];
|
||||||
|
|
||||||
|
|
|
@ -20,41 +20,15 @@ namespace GPU {
|
||||||
constexpr float SCREEN_REFRESH_RATE = 60;
|
constexpr float SCREEN_REFRESH_RATE = 60;
|
||||||
|
|
||||||
// Returns index corresponding to the Regs member labeled by field_name
|
// Returns index corresponding to the Regs member labeled by field_name
|
||||||
// TODO: Due to Visual studio bug 209229, offsetof does not return constant expressions
|
|
||||||
// when used with array elements (e.g. GPU_REG_INDEX(memory_fill_config[0])).
|
|
||||||
// For details cf.
|
|
||||||
// https://connect.microsoft.com/VisualStudio/feedback/details/209229/offsetof-does-not-produce-a-constant-expression-for-array-members
|
|
||||||
// Hopefully, this will be fixed sometime in the future.
|
|
||||||
// For lack of better alternatives, we currently hardcode the offsets when constant
|
|
||||||
// expressions are needed via GPU_REG_INDEX_WORKAROUND (on sane compilers, static_asserts
|
|
||||||
// will then make sure the offsets indeed match the automatically calculated ones).
|
|
||||||
#define GPU_REG_INDEX(field_name) (offsetof(GPU::Regs, field_name) / sizeof(u32))
|
#define GPU_REG_INDEX(field_name) (offsetof(GPU::Regs, field_name) / sizeof(u32))
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define GPU_REG_INDEX_WORKAROUND(field_name, backup_workaround_index) (backup_workaround_index)
|
|
||||||
#else
|
|
||||||
// NOTE: Yeah, hacking in a static_assert here just to workaround the lacking MSVC compiler
|
|
||||||
// really is this annoying. This macro just forwards its first argument to GPU_REG_INDEX
|
|
||||||
// and then performs a (no-op) cast to std::size_t iff the second argument matches the
|
|
||||||
// expected field offset. Otherwise, the compiler will fail to compile this code.
|
|
||||||
#define GPU_REG_INDEX_WORKAROUND(field_name, backup_workaround_index) \
|
|
||||||
((typename std::enable_if<backup_workaround_index == GPU_REG_INDEX(field_name), \
|
|
||||||
std::size_t>::type) GPU_REG_INDEX(field_name))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// MMIO region 0x1EFxxxxx
|
// MMIO region 0x1EFxxxxx
|
||||||
struct Regs {
|
struct Regs {
|
||||||
|
|
||||||
// helper macro to make sure the defined structures are of the expected size.
|
// helper macro to make sure the defined structures are of the expected size.
|
||||||
#if defined(_MSC_VER)
|
|
||||||
// TODO: MSVC does not support using sizeof() on non-static data members even though this
|
|
||||||
// is technically allowed since C++11. This macro should be enabled once MSVC adds
|
|
||||||
// support for that.
|
|
||||||
#define ASSERT_MEMBER_SIZE(name, size_in_bytes)
|
|
||||||
#else
|
|
||||||
#define ASSERT_MEMBER_SIZE(name, size_in_bytes) \
|
#define ASSERT_MEMBER_SIZE(name, size_in_bytes) \
|
||||||
static_assert(sizeof(name) == size_in_bytes, \
|
static_assert(sizeof(name) == size_in_bytes, \
|
||||||
"Structure size and register block length don't match")
|
"Structure size and register block length don't match")
|
||||||
#endif
|
|
||||||
|
|
||||||
// Components are laid out in reverse byte order, most significant bits first.
|
// Components are laid out in reverse byte order, most significant bits first.
|
||||||
enum class PixelFormat : u32 {
|
enum class PixelFormat : u32 {
|
||||||
|
@ -299,10 +273,6 @@ private:
|
||||||
};
|
};
|
||||||
static_assert(std::is_standard_layout<Regs>::value, "Structure does not use standard layout");
|
static_assert(std::is_standard_layout<Regs>::value, "Structure does not use standard layout");
|
||||||
|
|
||||||
// TODO: MSVC does not support using offsetof() on non-static data members even though this
|
|
||||||
// is technically allowed since C++11. This macro should be enabled once MSVC adds
|
|
||||||
// support for that.
|
|
||||||
#ifndef _MSC_VER
|
|
||||||
#define ASSERT_REG_POSITION(field_name, position) \
|
#define ASSERT_REG_POSITION(field_name, position) \
|
||||||
static_assert(offsetof(Regs, field_name) == position * 4, \
|
static_assert(offsetof(Regs, field_name) == position * 4, \
|
||||||
"Field " #field_name " has invalid position")
|
"Field " #field_name " has invalid position")
|
||||||
|
@ -315,7 +285,6 @@ ASSERT_REG_POSITION(display_transfer_config, 0x00300);
|
||||||
ASSERT_REG_POSITION(command_processor_config, 0x00638);
|
ASSERT_REG_POSITION(command_processor_config, 0x00638);
|
||||||
|
|
||||||
#undef ASSERT_REG_POSITION
|
#undef ASSERT_REG_POSITION
|
||||||
#endif // !defined(_MSC_VER)
|
|
||||||
|
|
||||||
// The total number of registers is chosen arbitrarily, but let's make sure it's not some odd value
|
// The total number of registers is chosen arbitrarily, but let's make sure it's not some odd value
|
||||||
// anyway.
|
// anyway.
|
||||||
|
|
Reference in New Issue