From f67660cbfe0cd94a891a7da2801e7f42b03d502f Mon Sep 17 00:00:00 2001 From: hrydgard Date: Sun, 14 Jun 2009 10:59:06 +0000 Subject: [PATCH] Remove the last use of MappedFile and kill the code. (less code is good!) (we've found that file mapping in the context of Dolphin only causes problems and give no speed gain - Dolphin gobbles address space ferociously on its own without mapping in huge disk images). Add some math util functions. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3441 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Common.vcproj | 1674 ++++++++++++------------- Source/Core/Common/Src/MappedFile.cpp | 233 ---- Source/Core/Common/Src/MappedFile.h | 49 - Source/Core/Common/Src/MathUtil.h | 73 +- Source/Core/Common/Src/SConscript | 1 - Source/Core/Core/Src/Boot/Boot.cpp | 25 +- 6 files changed, 908 insertions(+), 1147 deletions(-) delete mode 100644 Source/Core/Common/Src/MappedFile.cpp delete mode 100644 Source/Core/Common/Src/MappedFile.h diff --git a/Source/Core/Common/Common.vcproj b/Source/Core/Common/Common.vcproj index 8a9cbae20d..542fb97b34 100644 --- a/Source/Core/Common/Common.vcproj +++ b/Source/Core/Common/Common.vcproj @@ -1,844 +1,834 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + ProjectType="Visual C++" + Version="9.00" + Name="Common" + ProjectGUID="{C573CAF7-EE6A-458E-8049-16C0BF34C2E9}" + RootNamespace="Common" + Keyword="Win32Proj" + TargetFrameworkVersion="131072" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Core/Common/Src/MappedFile.cpp b/Source/Core/Common/Src/MappedFile.cpp deleted file mode 100644 index 6c3e9832b9..0000000000 --- a/Source/Core/Common/Src/MappedFile.cpp +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#ifdef _WIN32 -#include -#else -#include -#include -#include -#include -#endif - -#include "Common.h" -#include "MappedFile.h" - -namespace Common -{ -class CMappedFile - : public IMappedFile -{ - public: - - CMappedFile(void); - ~CMappedFile(void); - bool Open(const char* _szFilename); - bool IsOpen(void); - void Close(void); - u64 GetSize(void); - u8* Lock(u64 _offset, u64 _size); - void Unlock(u8* ptr); - - - private: - - u64 size; - - typedef std::mapLockmap; - Lockmap lockMap; -#ifdef _WIN32 - HANDLE hFile; - HANDLE hFileMapping; -#elif POSIX - int fd; - typedef std::mapSizemap; - Sizemap sizeMap; -#endif - - int granularity; -}; - - -CMappedFile::CMappedFile() -{ -#ifdef _WIN32 - hFile = INVALID_HANDLE_VALUE; - SYSTEM_INFO info; - GetSystemInfo(&info); - granularity = (int)info.dwAllocationGranularity; -#elif POSIX - fd = -1; - granularity = getpagesize(); //sysconf(_SC_PAGE_SIZE); -#endif -} - - -CMappedFile::~CMappedFile() -{ - Close(); -} - - -bool CMappedFile::Open(const char* filename) -{ - Close(); -#ifdef _WIN32 - hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (hFile == INVALID_HANDLE_VALUE) - { - return(false); - } - - hFileMapping = CreateFileMapping(hFile, 0, PAGE_READONLY, 0, 0, NULL); - - if (hFileMapping == NULL) - { - CloseHandle(hFile); - hFile = 0; - return(false); - } - - u32 high = 0; - u32 low = GetFileSize(hFile, (LPDWORD)&high); - size = (u64)low | ((u64)high << 32); -#elif POSIX - fd = open(filename, O_RDONLY); - size = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); -#endif - - return(true); -} - - -bool CMappedFile::IsOpen() -{ -#ifdef _WIN32 - return(hFile != INVALID_HANDLE_VALUE); - -#elif POSIX - return(fd != -1); -#endif - -} - - -u64 CMappedFile::GetSize() -{ - return(size); -} - - -void CMappedFile::Close() -{ -#ifdef _WIN32 - if (hFile != INVALID_HANDLE_VALUE) - { - CloseHandle(hFileMapping); - CloseHandle(hFile); - lockMap.clear(); - hFile = INVALID_HANDLE_VALUE; - } - -#elif POSIX - if (fd != -1) - { - lockMap.clear(); - sizeMap.clear(); - close(fd); - } - - fd = -1; -#endif -} - - -u8* CMappedFile::Lock(u64 offset, u64 _size) -{ -#ifdef _WIN32 - if (hFile != INVALID_HANDLE_VALUE) -#elif POSIX - if (fd != -1) -#endif - { - u64 realOffset = offset & ~(granularity - 1); - s64 difference = offset - realOffset; - u64 fake_size = (difference + _size + granularity - 1) & ~(granularity - 1); -#ifdef _WIN32 - u8* realPtr = (u8*)MapViewOfFile(hFileMapping, FILE_MAP_READ, (DWORD)(realOffset >> 32), (DWORD)realOffset, (SIZE_T)(_size)); - - if (realPtr == NULL) - { - return(NULL); - } - -#elif POSIX - // TODO - u8* realPtr = (u8*)mmap(0, fake_size, PROT_READ, MAP_PRIVATE, fd, (off_t)realOffset); - - if (!realPtr) - { - PanicAlert("Map Failed"); - exit(0); - } -#endif - - u8* fakePtr = realPtr + difference; - //add to map - lockMap[fakePtr] = realPtr; -#ifndef _WIN32 - sizeMap[fakePtr] = _size + difference; -#endif - return(fakePtr); - } - else - { - return(0); - } -} - - -void CMappedFile::Unlock(u8* ptr) -{ - if (ptr != 0) - { - Lockmap::iterator iter = lockMap.find(ptr); - - if (iter != lockMap.end()) - { -#ifdef _WIN32 - UnmapViewOfFile((*iter).second); -#else - munmap((*iter).second, sizeMap[ptr]); -#endif - lockMap.erase(iter); - } - else - { - PanicAlert("CMappedFile : Unlock failed"); - } - } -} - - -IMappedFile* IMappedFile::CreateMappedFileDEPRECATED(void) -{ - return(new CMappedFile); -} -} // namespace Common diff --git a/Source/Core/Common/Src/MappedFile.h b/Source/Core/Common/Src/MappedFile.h deleted file mode 100644 index fe4ceeeaa5..0000000000 --- a/Source/Core/Common/Src/MappedFile.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, version 2.0. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -// ------------------------------------------------------ -// Handles giant memory mapped files -// Through some trickery, allows lock on byte boundaries -// instead of allocation granularity boundaries -// for ease of use -// ------------------------------------------------------ - -#ifndef _MAPPED_FILE_H_ -#define _MAPPED_FILE_H_ - -#include - -namespace Common -{ -class IMappedFile -{ -public: - virtual ~IMappedFile() {} - - virtual bool Open(const char* _szFilename) = 0; - virtual bool IsOpen(void) = 0; - virtual void Close(void) = 0; - virtual u64 GetSize(void) = 0; - virtual u8* Lock(u64 _offset, u64 _size) = 0; - virtual void Unlock(u8* ptr) = 0; - - static IMappedFile* CreateMappedFileDEPRECATED(); -}; - -} // namespace - -#endif // _MAPPED_FILE_H_ diff --git a/Source/Core/Common/Src/MathUtil.h b/Source/Core/Common/Src/MathUtil.h index 72c0eca29a..1399ee1f76 100644 --- a/Source/Core/Common/Src/MathUtil.h +++ b/Source/Core/Common/Src/MathUtil.h @@ -20,6 +20,76 @@ #include +#include "Common.h" + +namespace MathUtil +{ + +static const u64 DOUBLE_SIGN = 0x8000000000000000ULL, + DOUBLE_EXP = 0x7FF0000000000000ULL, + DOUBLE_FRAC = 0x000FFFFFFFFFFFFFULL, + DOUBLE_ZERO = 0x0000000000000000ULL, + + FLOAT_SIGN = 0x80000000, + FLOAT_EXP = 0x7F800000, + FLOAT_FRAC = 0x007FFFFF, + FLOAT_ZERO = 0x00000000ULL; + +union IntDouble { + double d; + u64 i; +}; +union IntFloat { + float f; + u32 i; +}; + +inline bool IsNAN(double d) +{ + IntDouble x; x.d = d; + return ( ((x.i & DOUBLE_EXP) == DOUBLE_EXP) && + ((x.i & DOUBLE_FRAC) != DOUBLE_ZERO) ); +} + +inline bool IsQNAN(double d) +{ + IntDouble x; x.d = d; + return ( ((x.i & DOUBLE_EXP) == DOUBLE_EXP) && + ((x.i & 0x0007fffffffffffULL) == 0x000000000000000ULL) && + ((x.i & 0x000800000000000ULL) == 0x000800000000000ULL) ); +} + +inline bool IsSNAN(double d) +{ + IntDouble x; x.d = d; + return( ((x.i & DOUBLE_EXP) == DOUBLE_EXP) && + ((x.i & DOUBLE_FRAC) != DOUBLE_ZERO) && + ((x.i & 0x0008000000000000ULL) == DOUBLE_ZERO) ); +} + +inline float FlushToZero(float f) +{ + IntFloat x; x.f = f; + if ((x.i & FLOAT_EXP) == 0) + x.i &= FLOAT_SIGN; // turn into signed zero + return x.f; +} + +inline double FlushToZeroAsFloat(double d) +{ + IntDouble x; x.d = d; + if ((x.i & DOUBLE_EXP) < 0x3800000000000000ULL) + x.i &= DOUBLE_SIGN; // turn into signed zero + return x.d; +} + +} // namespace MathUtil + + +inline float pow2f(float x) {return x * x;} +inline double pow2(double x) {return x * x;} + + /* There are two different flavors of float to int conversion: _mm_cvtps_epi32() and _mm_cvttps_epi32(). The first rounds @@ -27,9 +97,6 @@ uses round towards zero. */ -inline float pow2f(float x) {return x * x;} -inline double pow2(double x) {return x * x;} - void SaveSSEState(); void LoadSSEState(); void LoadDefaultSSEState(); diff --git a/Source/Core/Common/Src/SConscript b/Source/Core/Common/Src/SConscript index f385d24caf..3b87e2b2d8 100644 --- a/Source/Core/Common/Src/SConscript +++ b/Source/Core/Common/Src/SConscript @@ -17,7 +17,6 @@ files = [ "Hash.cpp", "IniFile.cpp", "LogManager.cpp", - "MappedFile.cpp", "MathUtil.cpp", "MemArena.cpp", "MemoryUtil.cpp", diff --git a/Source/Core/Core/Src/Boot/Boot.cpp b/Source/Core/Core/Src/Boot/Boot.cpp index 437ca77f74..1ed10d9d42 100644 --- a/Source/Core/Core/Src/Boot/Boot.cpp +++ b/Source/Core/Core/Src/Boot/Boot.cpp @@ -19,7 +19,6 @@ #include "Common.h" // Common #include "StringUtil.h" #include "FileUtil.h" -#include "MappedFile.h" #include "../HLE/HLE.h" // Core #include "../PowerPC/PowerPC.h" @@ -145,25 +144,13 @@ bool CBoot::LoadMapFromFilename(const std::string &_rFilename, const char *_game bool CBoot::Load_BIOS(const std::string& _rBiosFilename) { bool bResult = false; - Common::IMappedFile* pFile = Common::IMappedFile::CreateMappedFileDEPRECATED(); - if (pFile->Open(_rBiosFilename.c_str())) - { - if (pFile->GetSize() >= 1024*1024*2) - { - // Write it to memory - u32 CopySize = (u32)pFile->GetSize() - 0x820; - u8* pData = pFile->Lock(0x820, CopySize); - Memory::WriteBigEData(pData, 0x81300000, CopySize); - pFile->Unlock(pData); - pFile->Close(); + std::string data; + if (!File::ReadFileToString(false, _rBiosFilename.c_str(), data)) + return false; - PC = 0x81300000; - - bResult = true; - } - } - delete pFile; - return bResult; + Memory::WriteBigEData((const u8*)data.data(), 0x81300000, data.size()); + PC = 0x81300000; + return true; } /////////////////////////////////