From b29e5146ec63e1b35cee45e01f54c4b69f15938e Mon Sep 17 00:00:00 2001 From: comex Date: Tue, 21 Oct 2014 20:42:55 -0400 Subject: [PATCH] Convert some VideoCommon stuff to BitSet. Now with a minor performance improvement removed for no reason. --- Source/Core/VideoCommon/CPMemory.h | 3 +- .../Core/VideoCommon/VertexLoaderManager.cpp | 18 ++++---- Source/Core/VideoCommon/VertexManagerBase.cpp | 43 +++++++++---------- .../Core/VideoCommon/VertexShaderManager.cpp | 40 +++++------------ 4 files changed, 42 insertions(+), 62 deletions(-) diff --git a/Source/Core/VideoCommon/CPMemory.h b/Source/Core/VideoCommon/CPMemory.h index ae8ff08303..a256fc6849 100644 --- a/Source/Core/VideoCommon/CPMemory.h +++ b/Source/Core/VideoCommon/CPMemory.h @@ -4,6 +4,7 @@ #pragma once +#include "Common/BitSet.h" #include "Common/CommonTypes.h" // Vertex array numbers @@ -252,7 +253,7 @@ struct CPState final VAT vtx_attr[8]; // Attributes that actually belong to VertexLoaderManager: - int attr_dirty; // bitfield + BitSet32 attr_dirty; VertexLoader* vertex_loaders[8]; }; diff --git a/Source/Core/VideoCommon/VertexLoaderManager.cpp b/Source/Core/VideoCommon/VertexLoaderManager.cpp index ca925d0302..b8132fa806 100644 --- a/Source/Core/VideoCommon/VertexLoaderManager.cpp +++ b/Source/Core/VideoCommon/VertexLoaderManager.cpp @@ -100,14 +100,14 @@ void AppendListToString(std::string *dest) void MarkAllDirty() { - g_main_cp_state.attr_dirty = 0xff; - g_preprocess_cp_state.attr_dirty = 0xff; + g_main_cp_state.attr_dirty = BitSet32::AllTrue(8); + g_preprocess_cp_state.attr_dirty = BitSet32::AllTrue(8); } static VertexLoader* RefreshLoader(int vtx_attr_group, CPState* state) { VertexLoader* loader; - if ((state->attr_dirty >> vtx_attr_group) & 1) + if (state->attr_dirty[vtx_attr_group]) { VertexLoaderUID uid(state->vtx_desc, state->vtx_attr[vtx_attr_group]); std::lock_guard lk(s_vertex_loader_map_lock); @@ -123,7 +123,7 @@ static VertexLoader* RefreshLoader(int vtx_attr_group, CPState* state) INCSTAT(stats.numVertexLoaders); } state->vertex_loaders[vtx_attr_group] = loader; - state->attr_dirty &= ~(1 << vtx_attr_group); + state->attr_dirty[vtx_attr_group] = false; } else { loader = state->vertex_loaders[vtx_attr_group]; } @@ -200,31 +200,31 @@ void LoadCPReg(u32 sub_cmd, u32 value, bool is_preprocess) case 0x50: state->vtx_desc.Hex &= ~0x1FFFF; // keep the Upper bits state->vtx_desc.Hex |= value; - state->attr_dirty = 0xFF; + state->attr_dirty = BitSet32::AllTrue(8); break; case 0x60: state->vtx_desc.Hex &= 0x1FFFF; // keep the lower 17Bits state->vtx_desc.Hex |= (u64)value << 17; - state->attr_dirty = 0xFF; + state->attr_dirty = BitSet32::AllTrue(8); break; case 0x70: _assert_((sub_cmd & 0x0F) < 8); state->vtx_attr[sub_cmd & 7].g0.Hex = value; - state->attr_dirty |= 1 << (sub_cmd & 7); + state->attr_dirty[sub_cmd & 7] = true; break; case 0x80: _assert_((sub_cmd & 0x0F) < 8); state->vtx_attr[sub_cmd & 7].g1.Hex = value; - state->attr_dirty |= 1 << (sub_cmd & 7); + state->attr_dirty[sub_cmd & 7] = true; break; case 0x90: _assert_((sub_cmd & 0x0F) < 8); state->vtx_attr[sub_cmd & 7].g2.Hex = value; - state->attr_dirty |= 1 << (sub_cmd & 7); + state->attr_dirty[sub_cmd & 7] = true; break; // Pointers to vertex arrays in GC RAM diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index d637ad9017..7a18ba435b 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -180,39 +180,36 @@ void VertexManager::Flush() (int)bpmem.genMode.numtexgens, (u32)bpmem.dstalpha.enable, (bpmem.alpha_test.hex>>16)&0xff); #endif - u32 usedtextures = 0; + BitSet32 usedtextures; for (u32 i = 0; i < bpmem.genMode.numtevstages + 1u; ++i) if (bpmem.tevorders[i / 2].getEnable(i & 1)) - usedtextures |= 1 << bpmem.tevorders[i/2].getTexMap(i & 1); + usedtextures[bpmem.tevorders[i/2].getTexMap(i & 1)] = true; if (bpmem.genMode.numindstages > 0) for (unsigned int i = 0; i < bpmem.genMode.numtevstages + 1u; ++i) if (bpmem.tevind[i].IsActive() && bpmem.tevind[i].bt < bpmem.genMode.numindstages) - usedtextures |= 1 << bpmem.tevindref.getTexMap(bpmem.tevind[i].bt); + usedtextures[bpmem.tevindref.getTexMap(bpmem.tevind[i].bt)] = true; - for (unsigned int i = 0; i < 8; i++) + for (unsigned int i : usedtextures) { - if (usedtextures & (1 << i)) - { - g_renderer->SetSamplerState(i & 3, i >> 2); - const FourTexUnits &tex = bpmem.tex[i >> 2]; - const TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, - (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, - tex.texImage0[i&3].width + 1, tex.texImage0[i&3].height + 1, - tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, - tex.texTlut[i&3].tlut_format, - ((tex.texMode0[i&3].min_filter & 3) != 0), - (tex.texMode1[i&3].max_lod + 0xf) / 0x10, - (tex.texImage1[i&3].image_type != 0)); + g_renderer->SetSamplerState(i & 3, i >> 2); + const FourTexUnits &tex = bpmem.tex[i >> 2]; + const TextureCache::TCacheEntryBase* tentry = TextureCache::Load(i, + (tex.texImage3[i&3].image_base/* & 0x1FFFFF*/) << 5, + tex.texImage0[i&3].width + 1, tex.texImage0[i&3].height + 1, + tex.texImage0[i&3].format, tex.texTlut[i&3].tmem_offset<<9, + tex.texTlut[i&3].tlut_format, + ((tex.texMode0[i&3].min_filter & 3) != 0), + (tex.texMode1[i&3].max_lod + 0xf) / 0x10, + (tex.texImage1[i&3].image_type != 0)); - if (tentry) - { - // 0s are probably for no manual wrapping needed. - PixelShaderManager::SetTexDims(i, tentry->native_width, tentry->native_height, 0, 0); - } - else - ERROR_LOG(VIDEO, "error loading texture"); + if (tentry) + { + // 0s are probably for no manual wrapping needed. + PixelShaderManager::SetTexDims(i, tentry->native_width, tentry->native_height, 0, 0); } + else + ERROR_LOG(VIDEO, "error loading texture"); } // set global constants diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp index 022bf7683d..93f969b0b5 100644 --- a/Source/Core/VideoCommon/VertexShaderManager.cpp +++ b/Source/Core/VideoCommon/VertexShaderManager.cpp @@ -5,6 +5,7 @@ #include #include +#include "Common/BitSet.h" #include "Common/CommonTypes.h" #include "Common/MathUtil.h" #include "VideoCommon/BPMemory.h" @@ -22,7 +23,7 @@ static float GC_ALIGNED16(g_fProjectionMatrix[16]); // track changes static bool bTexMatricesChanged[2], bPosNormalMatrixChanged, bProjectionChanged, bViewportChanged; -static int nMaterialsChanged; +static BitSet32 nMaterialsChanged; static int nTransformMatricesChanged[2]; // min,max static int nNormalMatricesChanged[2]; // min,max static int nPostTransformMatricesChanged[2]; // min,max @@ -202,7 +203,7 @@ void VertexShaderManager::Dirty() bProjectionChanged = true; - nMaterialsChanged = 15; + nMaterialsChanged = BitSet32::AllTrue(4); dirty = true; } @@ -295,35 +296,16 @@ void VertexShaderManager::SetConstants() nLightsChanged[0] = nLightsChanged[1] = -1; } - if (nMaterialsChanged) + for (int i : nMaterialsChanged) { - for (int i = 0; i < 2; ++i) - { - if (nMaterialsChanged & (1 << i)) - { - u32 data = xfmem.ambColor[i]; - constants.materials[i][0] = (data >> 24) & 0xFF; - constants.materials[i][1] = (data >> 16) & 0xFF; - constants.materials[i][2] = (data >> 8) & 0xFF; - constants.materials[i][3] = data & 0xFF; - } - } - - for (int i = 0; i < 2; ++i) - { - if (nMaterialsChanged & (1 << (i + 2))) - { - u32 data = xfmem.matColor[i]; - constants.materials[i+2][0] = (data >> 24) & 0xFF; - constants.materials[i+2][1] = (data >> 16) & 0xFF; - constants.materials[i+2][2] = (data >> 8) & 0xFF; - constants.materials[i+2][3] = data & 0xFF; - } - } + u32 data = i >= 2 ? xfmem.matColor[i - 2] : xfmem.ambColor[i]; + constants.materials[i][0] = (data >> 24) & 0xFF; + constants.materials[i][1] = (data >> 16) & 0xFF; + constants.materials[i][2] = (data >> 8) & 0xFF; + constants.materials[i][3] = data & 0xFF; dirty = true; - - nMaterialsChanged = 0; } + nMaterialsChanged = BitSet32(0); if (bPosNormalMatrixChanged) { @@ -660,7 +642,7 @@ void VertexShaderManager::SetProjectionChanged() void VertexShaderManager::SetMaterialColorChanged(int index, u32 color) { - nMaterialsChanged |= (1 << index); + nMaterialsChanged[index] = true; } void VertexShaderManager::TranslateView(float x, float y, float z)