Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
VertexLoader: remove old JIT
  • Loading branch information
Tilka committed Jan 18, 2015
1 parent bec3006 commit 20ded4c
Show file tree
Hide file tree
Showing 2 changed files with 0 additions and 117 deletions.
97 changes: 0 additions & 97 deletions Source/Core/VideoCommon/VertexLoader.cpp
Expand Up @@ -4,8 +4,6 @@

#include "Common/CommonTypes.h"
#include "Common/MemoryUtil.h"
#include "Common/x64ABI.h"
#include "Common/x64Emitter.h"

#include "Core/Host.h"

Expand All @@ -21,9 +19,6 @@
#include "VideoCommon/VideoCommon.h"
#include "VideoCommon/VideoConfig.h"


#define COMPILED_CODE_SIZE 4096

#ifndef _WIN32
#undef inline
#define inline
Expand All @@ -33,9 +28,6 @@
u8* g_video_buffer_read_ptr;
u8* g_vertex_manager_write_ptr;

using namespace Gen;


void* VertexLoader::operator new (size_t size)
{
return AllocateAlignedMemory(size, 16);
Expand Down Expand Up @@ -106,19 +98,11 @@ static void LOADERDECL SkipVertex(VertexLoader* loader)
VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr)
: VertexLoaderBase(vtx_desc, vtx_attr)
{
m_compiledCode = nullptr;
VertexLoader_Normal::Init();
VertexLoader_Position::Init();
VertexLoader_TextCoord::Init();

#ifdef USE_VERTEX_LOADER_JIT
AllocCodeSpace(COMPILED_CODE_SIZE);
CompileVertexTranslator();
WriteProtect();
#else
m_numPipelineStages = 0;
CompileVertexTranslator();
#endif

// generate frac factors
m_posScale[0] = m_posScale[1] = m_posScale[2] = m_posScale[3] = 1.0f / (1U << m_VtxAttr.PosFrac);
Expand All @@ -129,55 +113,13 @@ VertexLoader::VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr)
m_colElements[i] = m_VtxAttr.color[i].Elements;
}

VertexLoader::~VertexLoader()
{
#ifdef USE_VERTEX_LOADER_JIT
FreeCodeSpace();
#endif
}

void VertexLoader::CompileVertexTranslator()
{
m_VertexSize = 0;
const TVtxAttr &vtx_attr = m_VtxAttr;

#ifdef USE_VERTEX_LOADER_JIT
if (m_compiledCode)
PanicAlert("Trying to recompile a vertex translator");

m_compiledCode = GetCodePtr();
// We only use RAX (caller saved) and RBX (callee saved).
ABI_PushRegistersAndAdjustStack({RBX, RBP}, 8);

// save count
MOV(64, R(RBX), R(ABI_PARAM1));

// save loader
MOV(64, R(RBP), R(ABI_PARAM2));

// Start loop here
const u8 *loop_start = GetCodePtr();

// Reset component counters if present in vertex format only.
if (m_VtxDesc.Tex0Coord || m_VtxDesc.Tex1Coord || m_VtxDesc.Tex2Coord || m_VtxDesc.Tex3Coord ||
m_VtxDesc.Tex4Coord || m_VtxDesc.Tex5Coord || m_VtxDesc.Tex6Coord || m_VtxDesc.Tex7Coord)
{
WriteSetVariable(32, &m_tcIndex, Imm32(0));
}
if (m_VtxDesc.Color0 || m_VtxDesc.Color1)
{
WriteSetVariable(32, &m_colIndex, Imm32(0));
}
if (m_VtxDesc.Tex0MatIdx || m_VtxDesc.Tex1MatIdx || m_VtxDesc.Tex2MatIdx || m_VtxDesc.Tex3MatIdx ||
m_VtxDesc.Tex4MatIdx || m_VtxDesc.Tex5MatIdx || m_VtxDesc.Tex6MatIdx || m_VtxDesc.Tex7MatIdx)
{
WriteSetVariable(32, &m_texmtxwrite, Imm32(0));
WriteSetVariable(32, &m_texmtxread, Imm32(0));
}
#else
// Reset pipeline
m_numPipelineStages = 0;
#endif

// Get the pointer to this vertex's buffer data for the bounding box
if (!g_ActiveConfig.backend_info.bSupportsBBox)
Expand Down Expand Up @@ -412,45 +354,13 @@ void VertexLoader::CompileVertexTranslator()

m_native_components = components;
m_native_vtx_decl.stride = nat_offset;

#ifdef USE_VERTEX_LOADER_JIT
// End loop here
SUB(64, R(RBX), Imm8(1));

J_CC(CC_NZ, loop_start);
ABI_PopRegistersAndAdjustStack({RBX, RBP}, 8);
RET();
#endif
}

void VertexLoader::WriteCall(TPipelineFunction func)
{
#ifdef USE_VERTEX_LOADER_JIT
MOV(64, R(ABI_PARAM1), R(RBP));
ABI_CallFunction((const void*)func);
#else
m_PipelineStages[m_numPipelineStages++] = func;
#endif
}
// ARMTODO: This should be done in a better way
#ifndef _M_GENERIC
void VertexLoader::WriteGetVariable(int bits, OpArg dest, void *address)
{
#ifdef USE_VERTEX_LOADER_JIT
MOV(64, R(RAX), Imm64((u64)address));
MOV(bits, dest, MatR(RAX));
#endif
}

void VertexLoader::WriteSetVariable(int bits, void *address, OpArg value)
{
#ifdef USE_VERTEX_LOADER_JIT
MOV(64, R(RAX), Imm64((u64)address));
MOV(bits, MatR(RAX), value);
#endif
}
#endif

int VertexLoader::RunVertices(int primitive, int count, DataReader src, DataReader dst)
{
g_vertex_manager_write_ptr = dst.GetPointer();
Expand All @@ -463,12 +373,6 @@ int VertexLoader::RunVertices(int primitive, int count, DataReader src, DataRead
if (!g_ActiveConfig.backend_info.bSupportsBBox)
BoundingBox::Prepare(m_vat, primitive, m_VtxDesc, m_native_vtx_decl);

#ifdef USE_VERTEX_LOADER_JIT
if (count > 0)
{
((void (*)(int, VertexLoader* loader))(void*)m_compiledCode)(count, this);
}
#else
for (int s = 0; s < count; s++)
{
m_tcIndex = 0;
Expand All @@ -478,7 +382,6 @@ int VertexLoader::RunVertices(int primitive, int count, DataReader src, DataRead
m_PipelineStages[i](this);
PRIM_LOG("\n");
}
#endif

return count - m_skippedVertices;
}
20 changes: 0 additions & 20 deletions Source/Core/VideoCommon/VertexLoader.h
Expand Up @@ -11,7 +11,6 @@
#include <string>

#include "Common/CommonTypes.h"
#include "Common/x64Emitter.h"

#include "VideoCommon/CPMemory.h"
#include "VideoCommon/DataReader.h"
Expand All @@ -26,10 +25,6 @@
#include <tmmintrin.h>
#endif

#ifdef _M_X86
#define USE_VERTEX_LOADER_JIT
#endif

#ifdef WIN32
#define LOADERDECL __cdecl
#else
Expand All @@ -39,12 +34,7 @@
class VertexLoader;
typedef void (LOADERDECL *TPipelineFunction)(VertexLoader* loader);

// ARMTODO: This should be done in a better way
#ifndef _M_GENERIC
class VertexLoader : public Gen::X64CodeBlock, public VertexLoaderBase
#else
class VertexLoader : public VertexLoaderBase
#endif
{
public:
// This class need a 16 byte alignment. As this is broken on
Expand All @@ -53,7 +43,6 @@ class VertexLoader : public VertexLoaderBase
void operator delete (void *p);

VertexLoader(const TVtxDesc &vtx_desc, const VAT &vtx_attr);
~VertexLoader();

int RunVertices(int primitive, int count, DataReader src, DataReader dst) override;
std::string GetName() const override { return "OldLoader"; }
Expand All @@ -77,22 +66,13 @@ class VertexLoader : public VertexLoaderBase
int m_skippedVertices;

private:
#ifndef USE_VERTEX_LOADER_JIT
// Pipeline.
TPipelineFunction m_PipelineStages[64]; // TODO - figure out real max. it's lower.
int m_numPipelineStages;
#endif

void CompileVertexTranslator();

void WriteCall(TPipelineFunction);

#ifndef _M_GENERIC
void WriteGetVariable(int bits, Gen::OpArg dest, void *address);
void WriteSetVariable(int bits, void *address, Gen::OpArg dest);
#endif

const u8 *m_compiledCode;
};

#if _M_SSE >= 0x301
Expand Down

0 comments on commit 20ded4c

Please sign in to comment.