Skip to content

Commit

Permalink
Clean up cached_arraybases. Update VideoSW to new scheme.
Browse files Browse the repository at this point in the history
Move ownership of cached_arraybases from CPMemory to VertexLoaderManager
to better match it usage.
  • Loading branch information
phire committed May 29, 2015
1 parent 6d91676 commit f57517f
Show file tree
Hide file tree
Showing 13 changed files with 48 additions and 35 deletions.
1 change: 0 additions & 1 deletion Source/Core/VideoBackends/Software/CPMemLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ void SWLoadCPReg(u32 sub_cmd, u32 value)
// Pointers to vertex arrays in GC RAM
case 0xA0:
g_main_cp_state.array_bases[sub_cmd & 0xF] = value;
cached_arraybases[sub_cmd & 0xF] = Memory::GetPointer(value);
break;

case 0xB0:
Expand Down
4 changes: 4 additions & 0 deletions Source/Core/VideoBackends/Software/SWVertexLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
#include "VideoBackends/Software/XFMemLoader.h"

#include "VideoCommon/VertexLoaderBase.h"
#include "VideoCommon/VertexLoaderManager.h"
#include "VideoCommon/VertexLoaderUtils.h"


SWVertexLoader::SWVertexLoader() :
m_VertexSize(0)
{
Expand Down Expand Up @@ -176,6 +178,8 @@ void SWVertexLoader::LoadVertex()
// reserve memory for the destination of the vertex loader
m_LoadedVertices.resize(vdec.stride + 4);

VertexLoaderManager::UpdateVertexArrayPointers();

// convert the vertex from the gc format to the videocommon (hardware optimized) format
u8* old = g_video_buffer_read_ptr;
int converted_vertices = m_CurrentLoader->RunVertices(
Expand Down
2 changes: 0 additions & 2 deletions Source/Core/VideoCommon/CPMemory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
#include "VideoCommon/CPMemory.h"

// CP state
u8 *cached_arraybases[16];

CPState g_main_cp_state;

This comment has been minimized.

Copy link
@Tilka

Tilka May 31, 2015

Leaving it here would allow dolphin-emu#2487 to generate smaller s8 displacements.

CPState g_preprocess_cp_state;

Expand Down
2 changes: 0 additions & 2 deletions Source/Core/VideoCommon/CPMemory.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,6 @@ class VertexLoaderBase;
// STATE_TO_SAVE
struct CPState final
{
// Only 12 of these arrays are used.

This comment has been minimized.

Copy link
@Tilka

Tilka May 31, 2015

Drop from the previous commit.

This comment has been minimized.

Copy link
@phire

phire May 31, 2015

Author Owner

Upon further research, the comment wasn't entirely accurate.

Only 12 entries are used by the vertex loader. The other 4 are used by DMAs to xfmem.

u32 array_bases[16];
u32 array_strides[16];
TMatrixIndexA matrix_index_a;
Expand All @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion Source/Core/VideoCommon/VertexLoaderARM64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
// Refer to the license.txt file included.

#include "VideoCommon/VertexLoaderARM64.h"
#include "VideoCommon/VertexLoaderManager.h"

using namespace Arm64Gen;

Expand Down Expand Up @@ -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();
Expand Down
32 changes: 18 additions & 14 deletions Source/Core/VideoCommon/VertexLoaderManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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]);
}
}
5 changes: 4 additions & 1 deletion Source/Core/VideoCommon/VertexLoaderManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
3 changes: 2 additions & 1 deletion Source/Core/VideoCommon/VertexLoaderX64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
13 changes: 7 additions & 6 deletions Source/Core/VideoCommon/VertexLoader_Color.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -100,39 +101,39 @@ 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);
}

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));
}

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));
}

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);
}

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);
}
Expand All @@ -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));
}

Expand Down
3 changes: 2 additions & 1 deletion Source/Core/VideoCommon/VertexLoader_Normal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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);
}
Expand Down
3 changes: 2 additions & 1 deletion Source/Core/VideoCommon/VertexLoader_Position.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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);

Expand Down
3 changes: 2 additions & 1 deletion Source/Core/VideoCommon/VertexLoader_TextCoord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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);
Expand Down
9 changes: 5 additions & 4 deletions Source/UnitTests/VideoCommon/VertexLoaderTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "VideoCommon/DataReader.h"
#include "VideoCommon/OpcodeDecoding.h"
#include "VideoCommon/VertexLoaderBase.h"
#include "VideoCommon/VertexLoaderManager.h"

TEST(VertexLoaderUID, UniqueEnough)
{
Expand Down Expand Up @@ -151,7 +152,7 @@ TEST_P(VertexLoaderParamTest, PositionAll)
Input<u8>(i);
else
Input<u16>(i);
cached_arraybases[ARRAY_POSITION] = m_src.GetPointer();
VertexLoaderManager::cached_arraybases[ARRAY_POSITION] = m_src.GetPointer();
g_main_cp_state.array_strides[ARRAY_POSITION] = elements * elem_size;
}
CreateAndCheckSizes(input_size, elements * sizeof(float));
Expand Down Expand Up @@ -192,7 +193,7 @@ TEST_F(VertexLoaderTest, PositionIndex16FloatXY)
m_vtx_attr.g0.PosFormat = FORMAT_FLOAT;
CreateAndCheckSizes(sizeof(u16), 2 * sizeof(float));
Input<u16>(1); Input<u16>(0);
cached_arraybases[ARRAY_POSITION] = m_src.GetPointer();
VertexLoaderManager::cached_arraybases[ARRAY_POSITION] = m_src.GetPointer();
g_main_cp_state.array_strides[ARRAY_POSITION] = sizeof(float); // ;)
Input(1.f); Input(2.f); Input(3.f);
RunVertices(2);
Expand Down Expand Up @@ -297,9 +298,9 @@ TEST_F(VertexLoaderTest, LargeFloatVertexSpeed)

CreateAndCheckSizes(33, 156);

for (int i = 0; i < 16; i++)
for (int i = 0; i < 12; i++)
{
cached_arraybases[i] = m_src.GetPointer();
VertexLoaderManager::cached_arraybases[i] = m_src.GetPointer();
g_main_cp_state.array_strides[i] = 129;
}

Expand Down

0 comments on commit f57517f

Please sign in to comment.