summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorScott Mansell <phiren@gmail.com>2015-05-30 00:42:45 +1200
committerScott Mansell <phiren@gmail.com>2015-05-30 04:09:27 +1200
commitf57517f1a05db1790f853bf43d6093c19478b4ce (patch)
tree4874138fabc5e0c892013d6151e6d19dd2b2c1ba /Source/Core/VideoCommon
parent6d916762fb52a85aa086ef0cb6516cc63fbe775b (diff)
Clean up cached_arraybases. Update VideoSW to new scheme.
Move ownership of cached_arraybases from CPMemory to VertexLoaderManager to better match it usage.
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/CPMemory.cpp2
-rw-r--r--Source/Core/VideoCommon/CPMemory.h2
-rw-r--r--Source/Core/VideoCommon/VertexLoaderARM64.cpp3
-rw-r--r--Source/Core/VideoCommon/VertexLoaderManager.cpp32
-rw-r--r--Source/Core/VideoCommon/VertexLoaderManager.h5
-rw-r--r--Source/Core/VideoCommon/VertexLoaderX64.cpp3
-rw-r--r--Source/Core/VideoCommon/VertexLoader_Color.cpp13
-rw-r--r--Source/Core/VideoCommon/VertexLoader_Normal.cpp3
-rw-r--r--Source/Core/VideoCommon/VertexLoader_Position.cpp3
-rw-r--r--Source/Core/VideoCommon/VertexLoader_TextCoord.cpp3
10 files changed, 39 insertions, 30 deletions
diff --git a/Source/Core/VideoCommon/CPMemory.cpp b/Source/Core/VideoCommon/CPMemory.cpp
index ca710ae738..55904f5684 100644
--- a/Source/Core/VideoCommon/CPMemory.cpp
+++ b/Source/Core/VideoCommon/CPMemory.cpp
@@ -7,8 +7,6 @@
#include "VideoCommon/CPMemory.h"
// CP state
-u8 *cached_arraybases[16];
-
CPState g_main_cp_state;
CPState g_preprocess_cp_state;
diff --git a/Source/Core/VideoCommon/CPMemory.h b/Source/Core/VideoCommon/CPMemory.h
index 89f790b9a1..47b1e169ab 100644
--- a/Source/Core/VideoCommon/CPMemory.h
+++ b/Source/Core/VideoCommon/CPMemory.h
@@ -245,7 +245,6 @@ class VertexLoaderBase;
// STATE_TO_SAVE
struct CPState final
{
- // Only 12 of these arrays are used.
u32 array_bases[16];
u32 array_strides[16];
TMatrixIndexA matrix_index_a;
@@ -268,7 +267,6 @@ extern void CopyPreprocessCPStateFromMain();
extern CPState g_main_cp_state;
extern CPState g_preprocess_cp_state;
-extern u8 *cached_arraybases[16];
// Might move this into its own file later.
void LoadCPReg(u32 SubCmd, u32 Value, bool is_preprocess = false);
diff --git a/Source/Core/VideoCommon/VertexLoaderARM64.cpp b/Source/Core/VideoCommon/VertexLoaderARM64.cpp
index 038a576e74..36b6aae0f5 100644
--- a/Source/Core/VideoCommon/VertexLoaderARM64.cpp
+++ b/Source/Core/VideoCommon/VertexLoaderARM64.cpp
@@ -3,6 +3,7 @@
// Refer to the license.txt file included.
#include "VideoCommon/VertexLoaderARM64.h"
+#include "VideoCommon/VertexLoaderManager.h"
using namespace Arm64Gen;
@@ -331,7 +332,7 @@ void VertexLoaderARM64::GenerateVertexLoader()
MOV(saved_count, count_reg);
MOVI2R(stride_reg, (u64)&g_main_cp_state.array_strides);
- MOVI2R(arraybase_reg, (u64)&cached_arraybases);
+ MOVI2R(arraybase_reg, (u64)&VertexLoaderManager::cached_arraybases);
MOVI2R(scale_reg, (u64)&scale_factors);
const u8* loop_start = GetCodePtr();
diff --git a/Source/Core/VideoCommon/VertexLoaderManager.cpp b/Source/Core/VideoCommon/VertexLoaderManager.cpp
index 8d2acecc66..4ebb07788b 100644
--- a/Source/Core/VideoCommon/VertexLoaderManager.cpp
+++ b/Source/Core/VideoCommon/VertexLoaderManager.cpp
@@ -35,6 +35,8 @@ static std::mutex s_vertex_loader_map_lock;
static VertexLoaderMap s_vertex_loader_map;
// TODO - change into array of pointers. Keep a map of all seen so far.
+u8 *cached_arraybases[12];
+
void Init()
{
MarkAllDirty();
@@ -52,6 +54,21 @@ void Shutdown()
s_native_vertex_map.clear();
}
+void UpdateVertexArrayPointers()
+{
+ // Some games such as Burnout 2 can put invalid addresses into
+ // the array base registers. (see issue 8591)
+ // But the vertex arrays with invalid addresses aren't actually enabled.
+ // Note: Only array bases 0 through 11 are used by the Vertex loaders.
+ // 12 through 15 are used for loading data into xfmem.
+ for (int i = 0; i < 12; i++)
+ {
+ // Only update the array base if the vertex description states we are going to use it.
+ if (g_main_cp_state.vtx_desc.GetVertexArrayStatus(i) >= 0x2)
+ cached_arraybases[i] = Memory::GetPointer(g_main_cp_state.array_bases[i]);
+ }
+}
+
namespace
{
struct entry
@@ -138,7 +155,7 @@ static VertexLoaderBase* RefreshLoader(int vtx_attr_group, bool preprocess = fal
// Lookup pointers for any vertex arrays.
if (!preprocess)
- ComputeCachedArrayBases();
+ UpdateVertexArrayPointers();
return loader;
}
@@ -264,16 +281,3 @@ void FillCPMemoryArray(u32 *memory)
memory[0xB0 + i] = g_main_cp_state.array_strides[i];
}
}
-
-void ComputeCachedArrayBases()
-{
- // Some games such as Burnout 2 can put invalid addresses into
- // the array base registers. (see issue 8591)
- // But the vertex arrays with invalid addresses aren't actually enabled.
- for (int i = 0; i < 12; i++)
- {
- // Only update the array base if the vertex description states we are going to use it.
- if (g_main_cp_state.vtx_desc.GetVertexArrayStatus(i) >= 0x2)
- cached_arraybases[i] = Memory::GetPointer(g_main_cp_state.array_bases[i]);
- }
-}
diff --git a/Source/Core/VideoCommon/VertexLoaderManager.h b/Source/Core/VideoCommon/VertexLoaderManager.h
index f745ec26a7..99336fc333 100644
--- a/Source/Core/VideoCommon/VertexLoaderManager.h
+++ b/Source/Core/VideoCommon/VertexLoaderManager.h
@@ -24,6 +24,9 @@ namespace VertexLoaderManager
void AppendListToString(std::string *dest);
NativeVertexFormat* GetCurrentVertexFormat();
+
+ // Resolved pointers to array bases. Used by vertex loaders.
+ extern u8 *cached_arraybases[12];
+ void UpdateVertexArrayPointers();
}
-void ComputeCachedArrayBases();
diff --git a/Source/Core/VideoCommon/VertexLoaderX64.cpp b/Source/Core/VideoCommon/VertexLoaderX64.cpp
index 476566ab49..65d43b9688 100644
--- a/Source/Core/VideoCommon/VertexLoaderX64.cpp
+++ b/Source/Core/VideoCommon/VertexLoaderX64.cpp
@@ -7,6 +7,7 @@
#include "Common/Intrinsics.h"
#include "Common/JitRegister.h"
#include "Common/x64ABI.h"
+#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexLoaderX64.h"
using namespace Gen;
@@ -58,7 +59,7 @@ OpArg VertexLoaderX64::GetVertexAddr(int array, u64 attribute)
}
// TODO: Move cached_arraybases into CPState and use MDisp() relative to a constant register loaded with &g_main_cp_state.
IMUL(32, scratch1, M(&g_main_cp_state.array_strides[array]));
- MOV(64, R(scratch2), M(&cached_arraybases[array]));
+ MOV(64, R(scratch2), M(&VertexLoaderManager::cached_arraybases[array]));
return MRegSum(scratch1, scratch2);
}
else
diff --git a/Source/Core/VideoCommon/VertexLoader_Color.cpp b/Source/Core/VideoCommon/VertexLoader_Color.cpp
index 65f34c7ba8..cf9ca88280 100644
--- a/Source/Core/VideoCommon/VertexLoader_Color.cpp
+++ b/Source/Core/VideoCommon/VertexLoader_Color.cpp
@@ -6,6 +6,7 @@
#include "VideoCommon/VertexLoader.h"
#include "VideoCommon/VertexLoader_Color.h"
+#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexManagerBase.h"
#include "VideoCommon/VideoCommon.h"
@@ -100,7 +101,7 @@ template <typename I>
void Color_ReadIndex_16b_565(VertexLoader* loader)
{
auto const Index = DataRead<I>();
- u16 val = Common::swap16(*(const u16 *)(cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex])));
+ u16 val = Common::swap16(*(const u16 *)(VertexLoaderManager::cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex])));
_SetCol565(loader, val);
}
@@ -108,7 +109,7 @@ template <typename I>
void Color_ReadIndex_24b_888(VertexLoader* loader)
{
auto const Index = DataRead<I>();
- const u8 *iAddress = cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]);
+ const u8 *iAddress = VertexLoaderManager::cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]);
_SetCol(loader, _Read24(iAddress));
}
@@ -116,7 +117,7 @@ template <typename I>
void Color_ReadIndex_32b_888x(VertexLoader* loader)
{
auto const Index = DataRead<I>();
- const u8 *iAddress = cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]);
+ const u8 *iAddress = VertexLoaderManager::cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]);
_SetCol(loader, _Read24(iAddress));
}
@@ -124,7 +125,7 @@ template <typename I>
void Color_ReadIndex_16b_4444(VertexLoader* loader)
{
auto const Index = DataRead<I>();
- u16 val = *(const u16 *)(cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]));
+ u16 val = *(const u16 *)(VertexLoaderManager::cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]));
_SetCol4444(loader, val);
}
@@ -132,7 +133,7 @@ template <typename I>
void Color_ReadIndex_24b_6666(VertexLoader* loader)
{
auto const Index = DataRead<I>();
- const u8* pData = cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]) - 1;
+ const u8* pData = VertexLoaderManager::cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]) - 1;
u32 val = Common::swap32(pData);
_SetCol6666(loader, val);
}
@@ -141,7 +142,7 @@ template <typename I>
void Color_ReadIndex_32b_8888(VertexLoader* loader)
{
auto const Index = DataRead<I>();
- const u8 *iAddress = cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]);
+ const u8 *iAddress = VertexLoaderManager::cached_arraybases[ARRAY_COLOR + loader->m_colIndex] + (Index * g_main_cp_state.array_strides[ARRAY_COLOR + loader->m_colIndex]);
_SetCol(loader, _Read32(iAddress));
}
diff --git a/Source/Core/VideoCommon/VertexLoader_Normal.cpp b/Source/Core/VideoCommon/VertexLoader_Normal.cpp
index 68f98dac4a..939b902a9d 100644
--- a/Source/Core/VideoCommon/VertexLoader_Normal.cpp
+++ b/Source/Core/VideoCommon/VertexLoader_Normal.cpp
@@ -8,6 +8,7 @@
#include "Common/CommonTypes.h"
#include "VideoCommon/VertexLoader.h"
#include "VideoCommon/VertexLoader_Normal.h"
+#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexManagerBase.h"
#include "VideoCommon/VideoCommon.h"
@@ -71,7 +72,7 @@ __forceinline void Normal_Index_Offset()
static_assert(std::is_unsigned<I>::value, "Only unsigned I is sane!");
auto const index = DataRead<I>();
- auto const data = reinterpret_cast<const T*>(cached_arraybases[ARRAY_NORMAL]
+ auto const data = reinterpret_cast<const T*>(VertexLoaderManager::cached_arraybases[ARRAY_NORMAL]
+ (index * g_main_cp_state.array_strides[ARRAY_NORMAL]) + sizeof(T) * 3 * Offset);
ReadIndirect<T, N * 3>(data);
}
diff --git a/Source/Core/VideoCommon/VertexLoader_Position.cpp b/Source/Core/VideoCommon/VertexLoader_Position.cpp
index f7cc43c7a4..ed6b4587b3 100644
--- a/Source/Core/VideoCommon/VertexLoader_Position.cpp
+++ b/Source/Core/VideoCommon/VertexLoader_Position.cpp
@@ -7,6 +7,7 @@
#include "Common/CommonTypes.h"
#include "VideoCommon/VertexLoader.h"
#include "VideoCommon/VertexLoader_Position.h"
+#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexManagerBase.h"
#include "VideoCommon/VideoCommon.h"
@@ -46,7 +47,7 @@ void LOADERDECL Pos_ReadIndex(VertexLoader* loader)
auto const index = DataRead<I>();
loader->m_vertexSkip = index == std::numeric_limits<I>::max();
- auto const data = reinterpret_cast<const T*>(cached_arraybases[ARRAY_POSITION] + (index * g_main_cp_state.array_strides[ARRAY_POSITION]));
+ auto const data = reinterpret_cast<const T*>(VertexLoaderManager::cached_arraybases[ARRAY_POSITION] + (index * g_main_cp_state.array_strides[ARRAY_POSITION]));
auto const scale = loader->m_posScale;
DataReader dst(g_vertex_manager_write_ptr, nullptr);
diff --git a/Source/Core/VideoCommon/VertexLoader_TextCoord.cpp b/Source/Core/VideoCommon/VertexLoader_TextCoord.cpp
index 441ec81dd8..7904a5ce88 100644
--- a/Source/Core/VideoCommon/VertexLoader_TextCoord.cpp
+++ b/Source/Core/VideoCommon/VertexLoader_TextCoord.cpp
@@ -7,6 +7,7 @@
#include "Common/CommonTypes.h"
#include "VideoCommon/VertexLoader.h"
#include "VideoCommon/VertexLoader_TextCoord.h"
+#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexManagerBase.h"
#include "VideoCommon/VideoCommon.h"
@@ -67,7 +68,7 @@ void LOADERDECL TexCoord_ReadIndex(VertexLoader* loader)
static_assert(std::is_unsigned<I>::value, "Only unsigned I is sane!");
auto const index = DataRead<I>();
- auto const data = reinterpret_cast<const T*>(cached_arraybases[ARRAY_TEXCOORD0 + loader->m_tcIndex]
+ auto const data = reinterpret_cast<const T*>(VertexLoaderManager::cached_arraybases[ARRAY_TEXCOORD0 + loader->m_tcIndex]
+ (index * g_main_cp_state.array_strides[ARRAY_TEXCOORD0 + loader->m_tcIndex]));
auto const scale = loader->m_tcScale[loader->m_tcIndex];
DataReader dst(g_vertex_manager_write_ptr, nullptr);