mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	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
					
				
					 3 changed files with 2 additions and 40 deletions
				
			
		|  | @ -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.
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue