From ccc12c695008e6d7c72fc651ac38f7ed70adab6e Mon Sep 17 00:00:00 2001 From: Rodolfo Osvaldo Bogado Date: Sun, 27 Feb 2011 18:06:55 +0000 Subject: [PATCH] a little simplification for the dlist id and a little correction to YieldProcessor in windows. in windows sleep(0) behaves more like what is defined in the yield instruction so use it instead. In my amd 6 core system brings a nice 8% speedup so please test I'm interested in knowing the behavior in different systems. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7261 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/Thread.h | 3 +-- Source/Core/VideoCommon/Src/DLCache.cpp | 15 ++++----------- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/Source/Core/Common/Src/Thread.h b/Source/Core/Common/Src/Thread.h index 0a1aae1de8..6516615932 100644 --- a/Source/Core/Common/Src/Thread.h +++ b/Source/Core/Common/Src/Thread.h @@ -133,14 +133,13 @@ void SetCurrentThreadAffinity(u32 mask); void SleepCurrentThread(int ms); void SwitchCurrentThread(); // On Linux, this is equal to sleep 1ms - // YieldCPU: This function is only effective on HyperThreading CPU // Use this function during a spin-wait to make the current thread // relax while another thread is working. This may be more efficient // than using events because event functions use kernel calls. inline void YieldCPU() { #ifdef _WIN32 - YieldProcessor(); + Sleep(0); #elif defined(_M_IX86) || defined(_M_X64) usleep(1); #endif diff --git a/Source/Core/VideoCommon/Src/DLCache.cpp b/Source/Core/VideoCommon/Src/DLCache.cpp index 06a7753fb1..2a49d37458 100644 --- a/Source/Core/VideoCommon/Src/DLCache.cpp +++ b/Source/Core/VideoCommon/Src/DLCache.cpp @@ -213,27 +213,20 @@ inline u64 CreateMapId(u32 address, u32 size) inline u64 CreateVMapId(u32 VATUSED) { - u64 vmap_id = 0; + u64 vmap_id = 0x9368e53c2f6af274 ^ g_VtxDesc.Hex; for(int i = 0; i < 8 ; i++) { if(VATUSED & (1 << i)) { - if(vmap_id != 0) - { - vmap_id ^= (((u64)g_VtxAttr[i].g0.Hex) | (((u64)g_VtxAttr[i].g1.Hex) << 32)) ^ (((u64)g_VtxAttr[i].g2.Hex) << 16); - } - else - { - vmap_id = (((u64)g_VtxAttr[i].g0.Hex) | (((u64)g_VtxAttr[i].g1.Hex) << 32)) ^ (((u64)g_VtxAttr[i].g2.Hex) << 16); - } + vmap_id ^= (((u64)g_VtxAttr[i].g0.Hex) | (((u64)g_VtxAttr[i].g1.Hex) << 32)) ^ (((u64)g_VtxAttr[i].g2.Hex) << i); } } for(int i = 0; i < 12; i++) { if(VATUSED & (1 << (i + 16))) - vmap_id = vmap_id ^ ((u64)cached_arraybases[i]) ^ (((u64)arraystrides[i]) << 16); + vmap_id ^= (((u64)cached_arraybases[i]) ^ (((u64)arraystrides[i]) << i)); } - return vmap_id ^ g_VtxDesc.Hex; + return vmap_id; } typedef std::map DLMap;