diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-01-18 19:48:14 -0600 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-01-18 19:48:14 -0600 |
| commit | 7e64869185d47a835d22016c232cef09a3a53615 (patch) | |
| tree | d8f5d19bf319be9a25ae46917d6341b02a89d18c /Source/Core/VideoCommon/VertexLoaderBase.cpp | |
| parent | 5357b9c95ff2458e3b8c3112e303924a0d460ce6 (diff) | |
| parent | d3f49097c5226dc9ff0dd2fa37dc4896a38d9448 (diff) | |
Merge pull request #1887 from Tilka/vertex_loader_jit
VertexLoader: rewrite x64 JIT
Diffstat (limited to 'Source/Core/VideoCommon/VertexLoaderBase.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/VertexLoaderBase.cpp | 66 |
1 files changed, 50 insertions, 16 deletions
diff --git a/Source/Core/VideoCommon/VertexLoaderBase.cpp b/Source/Core/VideoCommon/VertexLoaderBase.cpp index ed56db0655..815e162689 100644 --- a/Source/Core/VideoCommon/VertexLoaderBase.cpp +++ b/Source/Core/VideoCommon/VertexLoaderBase.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 // Refer to the license.txt file included. +#include <cinttypes> #include <vector> #include "Common/StringUtil.h" @@ -9,11 +10,17 @@ #include "VideoCommon/VertexLoader.h" #include "VideoCommon/VertexLoaderBase.h" +#ifdef _M_X86_64 +#include "VideoCommon/VertexLoaderX64.h" +#endif + VertexLoaderBase::VertexLoaderBase(const TVtxDesc &vtx_desc, const VAT &vtx_attr) { m_numLoadedVertices = 0; m_VertexSize = 0; m_native_vertex_format = nullptr; + m_native_components = 0; + memset(&m_native_vtx_decl, 0, sizeof(m_native_vtx_decl)); SetVAT(vtx_attr); m_VtxDesc = vtx_desc; @@ -131,15 +138,34 @@ class VertexLoaderTester : public VertexLoaderBase { public: VertexLoaderTester(VertexLoaderBase* _a, VertexLoaderBase* _b, const TVtxDesc& vtx_desc, const VAT& vtx_attr) - : VertexLoaderBase(vtx_desc, vtx_attr) + : VertexLoaderBase(vtx_desc, vtx_attr), a(_a), b(_b) { - a = _a; - b = _b; m_initialized = a && b && a->IsInitialized() && b->IsInitialized(); - m_initialized = m_initialized && (a->m_VertexSize == b->m_VertexSize); - m_initialized = m_initialized && (a->m_native_vtx_decl.stride == b->m_native_vtx_decl.stride); + bool can_test = a->m_VertexSize == b->m_VertexSize && + a->m_native_components == b->m_native_components && + a->m_native_vtx_decl.stride == b->m_native_vtx_decl.stride; + + if (m_initialized) + { + if (can_test) + { + m_VertexSize = a->m_VertexSize; + m_native_components = a->m_native_components; + memcpy(&m_native_vtx_decl, &a->m_native_vtx_decl, sizeof(PortableVertexDeclaration)); + } + else + { + ERROR_LOG(VIDEO, "Can't compare vertex loaders that expect different vertex formats!"); + ERROR_LOG(VIDEO, "a: m_VertexSize %d, m_native_components 0x%08x, stride %d\n", + a->m_VertexSize, a->m_native_components, a->m_native_vtx_decl.stride); + ERROR_LOG(VIDEO, "b: m_VertexSize %d, m_native_components 0x%08x, stride %d\n", + b->m_VertexSize, b->m_native_components, b->m_native_vtx_decl.stride); + } + } + + m_initialized &= can_test; } - ~VertexLoaderTester() + ~VertexLoaderTester() override { delete a; delete b; @@ -147,21 +173,22 @@ public: int RunVertices(int primitive, int count, DataReader src, DataReader dst) override { - buffer_a.resize(count * a->m_native_vtx_decl.stride); - buffer_b.resize(count * b->m_native_vtx_decl.stride); + buffer_a.resize(count * a->m_native_vtx_decl.stride + 4); + buffer_b.resize(count * b->m_native_vtx_decl.stride + 4); int count_a = a->RunVertices(primitive, count, src, DataReader(buffer_a.data(), buffer_a.data()+buffer_a.size())); int count_b = b->RunVertices(primitive, count, src, DataReader(buffer_b.data(), buffer_b.data()+buffer_b.size())); if (count_a != count_b) - ERROR_LOG(VIDEO, "Both vertexloaders have loaded a different amount of vertices."); + ERROR_LOG(VIDEO, "The two vertex loaders have loaded a different amount of vertices (a: %d, b: %d).", count_a, count_b); - if (memcmp(buffer_a.data(), buffer_b.data(), std::min(count_a, count_b))) - ERROR_LOG(VIDEO, "Both vertexloaders have loaded different data."); + if (memcmp(buffer_a.data(), buffer_b.data(), std::min(count_a, count_b) * m_native_vtx_decl.stride)) + ERROR_LOG(VIDEO, "The two vertex loaders have loaded different data " + "(guru meditation 0x%016" PRIx64 ", 0x%08x, 0x%08x, 0x%08x).", + m_VtxDesc.Hex, m_vat.g0.Hex, m_vat.g1.Hex, m_vat.g2.Hex); - u8* dstptr; - dst.WritePointer(&dstptr); - memcpy(dstptr, buffer_a.data(), count_a); + memcpy(dst.GetPointer(), buffer_a.data(), count_a * m_native_vtx_decl.stride); + m_numLoadedVertices += count; return count_a; } std::string GetName() const override { return "CompareLoader"; } @@ -177,15 +204,22 @@ VertexLoaderBase* VertexLoaderBase::CreateVertexLoader(const TVtxDesc& vtx_desc, { VertexLoaderBase* loader; -#if 0 +//#define COMPARE_VERTEXLOADERS + +#if defined(COMPARE_VERTEXLOADERS) && defined(_M_X86_64) // first try: Any new VertexLoader vs the old one loader = new VertexLoaderTester( new VertexLoader(vtx_desc, vtx_attr), // the software one - new VertexLoader(vtx_desc, vtx_attr), // the new one to compare + new VertexLoaderX64(vtx_desc, vtx_attr), // the new one to compare vtx_desc, vtx_attr); if (loader->IsInitialized()) return loader; delete loader; +#elif defined(_M_X86_64) + loader = new VertexLoaderX64(vtx_desc, vtx_attr); + if (loader->IsInitialized()) + return loader; + delete loader; #endif // last try: The old VertexLoader |
