mirror of https://github.com/PCSX2/pcsx2.git
GS/SW: Remove redundant code generator classes
Makes space for ARM64.
This commit is contained in:
parent
e48c68d80f
commit
8d9c89a871
|
@ -450,11 +450,9 @@ set(pcsx2GSSourcesUnshared
|
||||||
GS/Renderers/Common/GSVertexTraceFMM.cpp
|
GS/Renderers/Common/GSVertexTraceFMM.cpp
|
||||||
GS/Renderers/HW/GSRendererHWMultiISA.cpp
|
GS/Renderers/HW/GSRendererHWMultiISA.cpp
|
||||||
GS/Renderers/SW/GSDrawScanline.cpp
|
GS/Renderers/SW/GSDrawScanline.cpp
|
||||||
GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp
|
|
||||||
GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp
|
GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.cpp
|
||||||
GS/Renderers/SW/GSRasterizer.cpp
|
GS/Renderers/SW/GSRasterizer.cpp
|
||||||
GS/Renderers/SW/GSRendererSW.cpp
|
GS/Renderers/SW/GSRendererSW.cpp
|
||||||
GS/Renderers/SW/GSSetupPrimCodeGenerator.cpp
|
|
||||||
GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp
|
GS/Renderers/SW/GSSetupPrimCodeGenerator.all.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -532,14 +530,12 @@ set(pcsx2GSHeaders
|
||||||
GS/Renderers/HW/GSTextureCache.h
|
GS/Renderers/HW/GSTextureCache.h
|
||||||
GS/Renderers/HW/GSTextureReplacements.h
|
GS/Renderers/HW/GSTextureReplacements.h
|
||||||
GS/Renderers/HW/GSVertexHW.h
|
GS/Renderers/HW/GSVertexHW.h
|
||||||
GS/Renderers/SW/GSDrawScanlineCodeGenerator.h
|
|
||||||
GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h
|
GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h
|
||||||
GS/Renderers/SW/GSDrawScanline.h
|
GS/Renderers/SW/GSDrawScanline.h
|
||||||
GS/Renderers/SW/GSNewCodeGenerator.h
|
GS/Renderers/SW/GSNewCodeGenerator.h
|
||||||
GS/Renderers/SW/GSRasterizer.h
|
GS/Renderers/SW/GSRasterizer.h
|
||||||
GS/Renderers/SW/GSRendererSW.h
|
GS/Renderers/SW/GSRendererSW.h
|
||||||
GS/Renderers/SW/GSScanlineEnvironment.h
|
GS/Renderers/SW/GSScanlineEnvironment.h
|
||||||
GS/Renderers/SW/GSSetupPrimCodeGenerator.h
|
|
||||||
GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h
|
GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h
|
||||||
GS/Renderers/SW/GSTextureCacheSW.h
|
GS/Renderers/SW/GSTextureCacheSW.h
|
||||||
GS/Renderers/SW/GSVertexSW.h
|
GS/Renderers/SW/GSVertexSW.h
|
||||||
|
|
|
@ -180,9 +180,12 @@ public:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
HostSys::BeginCodeWrite();
|
||||||
|
|
||||||
u8* code_ptr = GSCodeReserve::ReserveMemory(MAX_SIZE);
|
u8* code_ptr = GSCodeReserve::ReserveMemory(MAX_SIZE);
|
||||||
CG cg(key, code_ptr, MAX_SIZE);
|
CG cg(key, code_ptr, MAX_SIZE);
|
||||||
pxAssert(cg.getSize() < MAX_SIZE);
|
cg.Generate();
|
||||||
|
pxAssert(cg.GetSize() < MAX_SIZE);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
fprintf(stderr, "%s Location:%p Size:%zu Key:%llx\n", m_name.c_str(), code_ptr, cg.getSize(), (u64)key);
|
fprintf(stderr, "%s Location:%p Size:%zu Key:%llx\n", m_name.c_str(), code_ptr, cg.getSize(), (u64)key);
|
||||||
|
@ -190,9 +193,13 @@ public:
|
||||||
sel.Print();
|
sel.Print();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GSCodeReserve::CommitMemory(cg.getSize());
|
const u32 size = static_cast<u32>(cg.GetSize());
|
||||||
|
GSCodeReserve::CommitMemory(size);
|
||||||
|
|
||||||
ret = (VALUE)cg.getCode();
|
HostSys::EndCodeWrite();
|
||||||
|
HostSys::FlushInstructionCache(code_ptr, static_cast<u32>(size));
|
||||||
|
|
||||||
|
ret = (VALUE)cg.GetCode();
|
||||||
|
|
||||||
m_cgmap[key] = ret;
|
m_cgmap[key] = ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
|
|
||||||
#include "common/Console.h"
|
#include "common/Console.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
// Comment to disable all dynamic code generation.
|
// Comment to disable all dynamic code generation.
|
||||||
#define ENABLE_JIT_RASTERIZER
|
#define ENABLE_JIT_RASTERIZER
|
||||||
|
|
||||||
|
@ -36,6 +38,64 @@ GSDrawScanline::~GSDrawScanline()
|
||||||
DevCon.WriteLn("SW JIT generated %zu bytes of code", used);
|
DevCon.WriteLn("SW JIT generated %zu bytes of code", used);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GSDrawScanline::ShouldUseCDrawScanline(u64 key)
|
||||||
|
{
|
||||||
|
static std::map<u64, bool> s_use_c_draw_scanline;
|
||||||
|
static std::mutex s_use_c_draw_scanline_mutex;
|
||||||
|
|
||||||
|
static const char* const fname = getenv("USE_C_DRAW_SCANLINE");
|
||||||
|
if (!fname)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::lock_guard<std::mutex> l(s_use_c_draw_scanline_mutex);
|
||||||
|
|
||||||
|
if (s_use_c_draw_scanline.empty())
|
||||||
|
{
|
||||||
|
std::ifstream file(fname);
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
for (std::string str; std::getline(file, str);)
|
||||||
|
{
|
||||||
|
u64 key;
|
||||||
|
char yn;
|
||||||
|
if (sscanf(str.c_str(), "%" PRIx64 " %c", &key, &yn) == 2)
|
||||||
|
{
|
||||||
|
if (yn != 'Y' && yn != 'N' && yn != 'y' && yn != 'n')
|
||||||
|
Console.Warning("Failed to parse %s: Not y/n", str.c_str());
|
||||||
|
s_use_c_draw_scanline[key] = (yn == 'Y' || yn == 'y') ? true : false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Warning("Failed to process line %s", str.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto idx = s_use_c_draw_scanline.find(key);
|
||||||
|
if (idx == s_use_c_draw_scanline.end())
|
||||||
|
{
|
||||||
|
s_use_c_draw_scanline[key] = false;
|
||||||
|
// Rewrite file
|
||||||
|
FILE* file = fopen(fname, "w");
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
for (const auto& pair : s_use_c_draw_scanline)
|
||||||
|
{
|
||||||
|
fprintf(file, "%016" PRIX64 " %c %s\n", pair.first, pair.second ? 'Y' : 'N', GSScanlineSelector(pair.first).to_string().c_str());
|
||||||
|
}
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.Warning("Failed to write C draw scanline usage config: %s", strerror(errno));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return idx->second;
|
||||||
|
}
|
||||||
|
|
||||||
void GSDrawScanline::BeginDraw(const GSRasterizerData& data, GSScanlineLocalData& local)
|
void GSDrawScanline::BeginDraw(const GSRasterizerData& data, GSScanlineLocalData& local)
|
||||||
{
|
{
|
||||||
const GSScanlineGlobalData& global = data.global;
|
const GSScanlineGlobalData& global = data.global;
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "GS/GSState.h"
|
#include "GS/GSState.h"
|
||||||
#include "GS/Renderers/SW/GSSetupPrimCodeGenerator.h"
|
#include "GS/Renderers/SW/GSSetupPrimCodeGenerator.all.h"
|
||||||
#include "GS/Renderers/SW/GSDrawScanlineCodeGenerator.h"
|
#include "GS/Renderers/SW/GSDrawScanlineCodeGenerator.all.h"
|
||||||
|
|
||||||
struct GSScanlineLocalData;
|
struct GSScanlineLocalData;
|
||||||
|
|
||||||
|
@ -13,9 +13,6 @@ MULTI_ISA_UNSHARED_START
|
||||||
|
|
||||||
class GSRasterizerData;
|
class GSRasterizerData;
|
||||||
|
|
||||||
class GSSetupPrimCodeGenerator;
|
|
||||||
class GSDrawScanlineCodeGenerator;
|
|
||||||
|
|
||||||
class GSDrawScanline : public GSVirtualAlignedClass<32>
|
class GSDrawScanline : public GSVirtualAlignedClass<32>
|
||||||
{
|
{
|
||||||
friend GSSetupPrimCodeGenerator;
|
friend GSSetupPrimCodeGenerator;
|
||||||
|
@ -25,6 +22,9 @@ public:
|
||||||
GSDrawScanline();
|
GSDrawScanline();
|
||||||
~GSDrawScanline() override;
|
~GSDrawScanline() override;
|
||||||
|
|
||||||
|
/// Debug override for disabling scanline JIT on a key basis.
|
||||||
|
static bool ShouldUseCDrawScanline(u64 key);
|
||||||
|
|
||||||
/// Function pointer types which we call back into.
|
/// Function pointer types which we call back into.
|
||||||
using SetupPrimPtr = void(*)(const GSVertexSW* vertex, const u16* index, const GSVertexSW& dscan, GSScanlineLocalData& local);
|
using SetupPrimPtr = void(*)(const GSVertexSW* vertex, const u16* index, const GSVertexSW& dscan, GSScanlineLocalData& local);
|
||||||
using DrawScanlinePtr = void(*)(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local);
|
using DrawScanlinePtr = void(*)(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local);
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
// SPDX-License-Identifier: LGPL-3.0+
|
||||||
|
|
||||||
#include "GSDrawScanlineCodeGenerator.all.h"
|
#include "GSDrawScanlineCodeGenerator.all.h"
|
||||||
#include "GS/Renderers/Common/GSFunctionMap.h"
|
#include "GS/Renderers/Common/GSFunctionMap.h"
|
||||||
|
#include "GS/Renderers/SW/GSDrawScanline.h"
|
||||||
#include "GSVertexSW.h"
|
#include "GSVertexSW.h"
|
||||||
#include "common/Perf.h"
|
#include "common/Perf.h"
|
||||||
|
|
||||||
|
@ -67,8 +68,8 @@ using namespace Xbyak;
|
||||||
#define _rip_local_d_p(x) _rip_local_d(x)
|
#define _rip_local_d_p(x) _rip_local_d(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, u64 key)
|
GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(u64 key, void* code, size_t maxsize)
|
||||||
: _parent(base, cpu)
|
: GSNewCodeGenerator(code, maxsize)
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
, a0(rcx), a1(rdx)
|
, a0(rcx), a1(rdx)
|
||||||
, a2(r8) , a3(r9)
|
, a2(r8) , a3(r9)
|
||||||
|
@ -98,7 +99,7 @@ GSDrawScanlineCodeGenerator2::GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator*
|
||||||
|
|
||||||
// MARK: - Helpers
|
// MARK: - Helpers
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::broadcastf128(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::broadcastf128(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vbroadcastf128(reg, mem);
|
vbroadcastf128(reg, mem);
|
||||||
|
@ -107,7 +108,7 @@ void GSDrawScanlineCodeGenerator2::broadcastf128(const XYm& reg, const Address&
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::broadcasti128(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::broadcasti128(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vbroadcasti128(reg, mem);
|
vbroadcasti128(reg, mem);
|
||||||
|
@ -116,7 +117,7 @@ void GSDrawScanlineCodeGenerator2::broadcasti128(const XYm& reg, const Address&
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::broadcastssLocal(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::broadcastssLocal(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vbroadcastss(reg, mem);
|
vbroadcastss(reg, mem);
|
||||||
|
@ -125,7 +126,7 @@ void GSDrawScanlineCodeGenerator2::broadcastssLocal(const XYm& reg, const Addres
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::pbroadcastqLocal(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::pbroadcastqLocal(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vpbroadcastq(reg, mem);
|
vpbroadcastq(reg, mem);
|
||||||
|
@ -134,7 +135,7 @@ void GSDrawScanlineCodeGenerator2::pbroadcastqLocal(const XYm& reg, const Addres
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::pbroadcastdLocal(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::pbroadcastdLocal(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vpbroadcastd(reg, mem);
|
vpbroadcastd(reg, mem);
|
||||||
|
@ -143,7 +144,7 @@ void GSDrawScanlineCodeGenerator2::pbroadcastdLocal(const XYm& reg, const Addres
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::pbroadcastwLocal(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::pbroadcastwLocal(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vpbroadcastw(reg, mem);
|
vpbroadcastw(reg, mem);
|
||||||
|
@ -152,7 +153,7 @@ void GSDrawScanlineCodeGenerator2::pbroadcastwLocal(const XYm& reg, const Addres
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::broadcastsd(const XYm& reg, const Address& mem)
|
void GSDrawScanlineCodeGenerator::broadcastsd(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
vbroadcastsd(reg, mem);
|
vbroadcastsd(reg, mem);
|
||||||
|
@ -161,7 +162,7 @@ void GSDrawScanlineCodeGenerator2::broadcastsd(const XYm& reg, const Address& me
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::broadcastGPRToVec(const XYm& vec, const Xbyak::Reg32& gpr)
|
void GSDrawScanlineCodeGenerator::broadcastGPRToVec(const XYm& vec, const Xbyak::Reg32& gpr)
|
||||||
{
|
{
|
||||||
movd(Xmm(vec.getIdx()), gpr);
|
movd(Xmm(vec.getIdx()), gpr);
|
||||||
#if USING_YMM
|
#if USING_YMM
|
||||||
|
@ -171,7 +172,7 @@ void GSDrawScanlineCodeGenerator2::broadcastGPRToVec(const XYm& vec, const Xbyak
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::modulate16(const XYm& a, const Operand& f, u8 shift)
|
void GSDrawScanlineCodeGenerator::modulate16(const XYm& a, const Operand& f, u8 shift)
|
||||||
{
|
{
|
||||||
if (shift == 0)
|
if (shift == 0)
|
||||||
{
|
{
|
||||||
|
@ -184,14 +185,14 @@ void GSDrawScanlineCodeGenerator2::modulate16(const XYm& a, const Operand& f, u8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::lerp16(const XYm& a, const XYm& b, const XYm& f, u8 shift)
|
void GSDrawScanlineCodeGenerator::lerp16(const XYm& a, const XYm& b, const XYm& f, u8 shift)
|
||||||
{
|
{
|
||||||
psubw(a, b);
|
psubw(a, b);
|
||||||
modulate16(a, f, shift);
|
modulate16(a, f, shift);
|
||||||
paddw(a, b);
|
paddw(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::lerp16_4(const XYm& a, const XYm& b, const XYm& f)
|
void GSDrawScanlineCodeGenerator::lerp16_4(const XYm& a, const XYm& b, const XYm& f)
|
||||||
{
|
{
|
||||||
psubw(a, b);
|
psubw(a, b);
|
||||||
pmullw(a, f);
|
pmullw(a, f);
|
||||||
|
@ -199,12 +200,12 @@ void GSDrawScanlineCodeGenerator2::lerp16_4(const XYm& a, const XYm& b, const XY
|
||||||
paddw(a, b);
|
paddw(a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::mix16(const XYm& a, const XYm& b, const XYm& temp)
|
void GSDrawScanlineCodeGenerator::mix16(const XYm& a, const XYm& b, const XYm& temp)
|
||||||
{
|
{
|
||||||
pblendw(a, b, 0xaa);
|
pblendw(a, b, 0xaa);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::clamp16(const XYm& a, const XYm& temp)
|
void GSDrawScanlineCodeGenerator::clamp16(const XYm& a, const XYm& temp)
|
||||||
{
|
{
|
||||||
if (isXmm)
|
if (isXmm)
|
||||||
{
|
{
|
||||||
|
@ -219,7 +220,7 @@ void GSDrawScanlineCodeGenerator2::clamp16(const XYm& a, const XYm& temp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::alltrue(const XYm& test)
|
void GSDrawScanlineCodeGenerator::alltrue(const XYm& test)
|
||||||
{
|
{
|
||||||
u32 mask = test.isYMM() ? 0xffffffff : 0xffff;
|
u32 mask = test.isYMM() ? 0xffffffff : 0xffff;
|
||||||
pmovmskb(eax, test);
|
pmovmskb(eax, test);
|
||||||
|
@ -227,7 +228,7 @@ void GSDrawScanlineCodeGenerator2::alltrue(const XYm& test)
|
||||||
je("step", Xbyak::CodeGenerator::T_NEAR);
|
je("step", Xbyak::CodeGenerator::T_NEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::blend(const XYm& a, const XYm& b, const XYm& mask)
|
void GSDrawScanlineCodeGenerator::blend(const XYm& a, const XYm& b, const XYm& mask)
|
||||||
{
|
{
|
||||||
pand(b, mask);
|
pand(b, mask);
|
||||||
pandn(mask, a);
|
pandn(mask, a);
|
||||||
|
@ -242,19 +243,19 @@ void GSDrawScanlineCodeGenerator2::blend(const XYm& a, const XYm& b, const XYm&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::blendr(const XYm& b, const XYm& a, const XYm& mask)
|
void GSDrawScanlineCodeGenerator::blendr(const XYm& b, const XYm& a, const XYm& mask)
|
||||||
{
|
{
|
||||||
pand(b, mask);
|
pand(b, mask);
|
||||||
pandn(mask, a);
|
pandn(mask, a);
|
||||||
por(b, mask);
|
por(b, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::blend8(const XYm& a, const XYm& b)
|
void GSDrawScanlineCodeGenerator::blend8(const XYm& a, const XYm& b)
|
||||||
{
|
{
|
||||||
pblendvb(a, b /*, xym0 */);
|
pblendvb(a, b /*, xym0 */);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::blend8r(const XYm& b, const XYm& a)
|
void GSDrawScanlineCodeGenerator::blend8r(const XYm& b, const XYm& a)
|
||||||
{
|
{
|
||||||
if (hasAVX)
|
if (hasAVX)
|
||||||
{
|
{
|
||||||
|
@ -267,7 +268,7 @@ void GSDrawScanlineCodeGenerator2::blend8r(const XYm& b, const XYm& a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::split16_2x8(const XYm& l, const XYm& h, const XYm& src)
|
void GSDrawScanlineCodeGenerator::split16_2x8(const XYm& l, const XYm& h, const XYm& src)
|
||||||
{
|
{
|
||||||
// l = src & 0xFF; (1 left shift + 1 right shift)
|
// l = src & 0xFF; (1 left shift + 1 right shift)
|
||||||
// h = (src >> 8) & 0xFF; (1 right shift)
|
// h = (src >> 8) & 0xFF; (1 right shift)
|
||||||
|
@ -314,8 +315,18 @@ void GSDrawScanlineCodeGenerator2::split16_2x8(const XYm& l, const XYm& h, const
|
||||||
|
|
||||||
// MARK: - Main Implementation
|
// MARK: - Main Implementation
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::Generate()
|
void GSDrawScanlineCodeGenerator::Generate()
|
||||||
{
|
{
|
||||||
|
if (m_sel.breakpoint)
|
||||||
|
db(0xCC);
|
||||||
|
|
||||||
|
if (GSDrawScanline::ShouldUseCDrawScanline(m_sel.key))
|
||||||
|
{
|
||||||
|
jmp(reinterpret_cast<const void*>(static_cast<void (*)(int, int, int, const GSVertexSW&, GSScanlineLocalData&)>(
|
||||||
|
&GSDrawScanline::CDrawScanline)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const bool need_tex = m_sel.fb && m_sel.tfx != TFX_NONE;
|
const bool need_tex = m_sel.fb && m_sel.tfx != TFX_NONE;
|
||||||
const bool need_clut = need_tex && m_sel.tlu;
|
const bool need_clut = need_tex && m_sel.tlu;
|
||||||
|
|
||||||
|
@ -591,7 +602,7 @@ L("exit");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inputs: a0=pixels, a1=left, a2[x64]=top, a3[x64]=v
|
/// Inputs: a0=pixels, a1=left, a2[x64]=top, a3[x64]=v
|
||||||
void GSDrawScanlineCodeGenerator2::Init()
|
void GSDrawScanlineCodeGenerator::Init()
|
||||||
{
|
{
|
||||||
if (!m_sel.notest)
|
if (!m_sel.notest)
|
||||||
{
|
{
|
||||||
|
@ -872,7 +883,7 @@ void GSDrawScanlineCodeGenerator2::Init()
|
||||||
/// Outputs[x86]: xym0=z xym2=s, xym3=t, xym4=q, xym5=rb, xym6=ga, xym7=test
|
/// Outputs[x86]: xym0=z xym2=s, xym3=t, xym4=q, xym5=rb, xym6=ga, xym7=test
|
||||||
/// Destroys[x86]: all
|
/// Destroys[x86]: all
|
||||||
/// Destroys[x64]: xym0, xym1, xym2, xym3
|
/// Destroys[x64]: xym0, xym1, xym2, xym3
|
||||||
void GSDrawScanlineCodeGenerator2::Step()
|
void GSDrawScanlineCodeGenerator::Step()
|
||||||
{
|
{
|
||||||
// steps -= 4;
|
// steps -= 4;
|
||||||
|
|
||||||
|
@ -1019,7 +1030,7 @@ void GSDrawScanlineCodeGenerator2::Step()
|
||||||
/// Inputs: xym0[x86]=z, xym7[x64]=z0, t1=fza_base, t0=fza_offset, _test
|
/// Inputs: xym0[x86]=z, xym7[x64]=z0, t1=fza_base, t0=fza_offset, _test
|
||||||
/// Outputs: t2=za
|
/// Outputs: t2=za
|
||||||
/// Destroys: rax, xym0, temp1, temp2
|
/// Destroys: rax, xym0, temp1, temp2
|
||||||
void GSDrawScanlineCodeGenerator2::TestZ(const XYm& temp1, const XYm& temp2)
|
void GSDrawScanlineCodeGenerator::TestZ(const XYm& temp1, const XYm& temp2)
|
||||||
{
|
{
|
||||||
if (!m_sel.zb)
|
if (!m_sel.zb)
|
||||||
{
|
{
|
||||||
|
@ -1151,7 +1162,7 @@ void GSDrawScanlineCodeGenerator2::TestZ(const XYm& temp1, const XYm& temp2)
|
||||||
/// Input[x86]: xym4=q, xym2=s, xym3=t
|
/// Input[x86]: xym4=q, xym2=s, xym3=t
|
||||||
/// Output: _rb, _ga
|
/// Output: _rb, _ga
|
||||||
/// Destroys everything except xym7[x86]
|
/// Destroys everything except xym7[x86]
|
||||||
void GSDrawScanlineCodeGenerator2::SampleTexture()
|
void GSDrawScanlineCodeGenerator::SampleTexture()
|
||||||
{
|
{
|
||||||
if (!m_sel.fb || m_sel.tfx == TFX_NONE)
|
if (!m_sel.fb || m_sel.tfx == TFX_NONE)
|
||||||
{
|
{
|
||||||
|
@ -1256,7 +1267,7 @@ void GSDrawScanlineCodeGenerator2::SampleTexture()
|
||||||
/// Input[x64]: xym2=uv0, xym3=uv1 (ltf), xym4=uf, xym7=vf (!needsMoreRegs)
|
/// Input[x64]: xym2=uv0, xym3=uv1 (ltf), xym4=uf, xym7=vf (!needsMoreRegs)
|
||||||
/// Output: _rb, _ga
|
/// Output: _rb, _ga
|
||||||
/// Destroys all registers except outputs, xmm4 and xmm7
|
/// Destroys all registers except outputs, xmm4 and xmm7
|
||||||
void GSDrawScanlineCodeGenerator2::SampleTexture_TexelReadHelper(int mip_offset)
|
void GSDrawScanlineCodeGenerator::SampleTexture_TexelReadHelper(int mip_offset)
|
||||||
{
|
{
|
||||||
const bool needsMoreRegs = isYmm;
|
const bool needsMoreRegs = isYmm;
|
||||||
|
|
||||||
|
@ -1421,7 +1432,7 @@ void GSDrawScanlineCodeGenerator2::SampleTexture_TexelReadHelper(int mip_offset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::Wrap(const XYm& uv)
|
void GSDrawScanlineCodeGenerator::Wrap(const XYm& uv)
|
||||||
{
|
{
|
||||||
// Registers free from SampleTexture
|
// Registers free from SampleTexture
|
||||||
const XYm& mask = xym0;
|
const XYm& mask = xym0;
|
||||||
|
@ -1480,7 +1491,7 @@ void GSDrawScanlineCodeGenerator2::Wrap(const XYm& uv)
|
||||||
|
|
||||||
/// Destroys[x86]: xym0, xym1, xym2, xym3, xym4[!sse41]
|
/// Destroys[x86]: xym0, xym1, xym2, xym3, xym4[!sse41]
|
||||||
/// Destroys[x64]: xym0, xym1, xym5, xym6, xym7[!sse41]
|
/// Destroys[x64]: xym0, xym1, xym5, xym6, xym7[!sse41]
|
||||||
void GSDrawScanlineCodeGenerator2::Wrap(const XYm& uv0, const XYm& uv1)
|
void GSDrawScanlineCodeGenerator::Wrap(const XYm& uv0, const XYm& uv1)
|
||||||
{
|
{
|
||||||
// Registers free from SampleTexture
|
// Registers free from SampleTexture
|
||||||
const XYm& mask = xym0;
|
const XYm& mask = xym0;
|
||||||
|
@ -1552,7 +1563,7 @@ void GSDrawScanlineCodeGenerator2::Wrap(const XYm& uv0, const XYm& uv1)
|
||||||
/// Input[x86]: xym4=q, xym2=s, xym3=t
|
/// Input[x86]: xym4=q, xym2=s, xym3=t
|
||||||
/// Output: _rb, _ga
|
/// Output: _rb, _ga
|
||||||
/// Destroys everything except xym7[x86]
|
/// Destroys everything except xym7[x86]
|
||||||
void GSDrawScanlineCodeGenerator2::SampleTextureLOD()
|
void GSDrawScanlineCodeGenerator::SampleTextureLOD()
|
||||||
{
|
{
|
||||||
if (!m_sel.fb || m_sel.tfx == TFX_NONE)
|
if (!m_sel.fb || m_sel.tfx == TFX_NONE)
|
||||||
{
|
{
|
||||||
|
@ -1946,7 +1957,7 @@ void GSDrawScanlineCodeGenerator2::SampleTextureLOD()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::WrapLOD(const XYm& uv)
|
void GSDrawScanlineCodeGenerator::WrapLOD(const XYm& uv)
|
||||||
{
|
{
|
||||||
// Registers free from SampleTexture
|
// Registers free from SampleTexture
|
||||||
const XYm& mask = xym0;
|
const XYm& mask = xym0;
|
||||||
|
@ -2001,7 +2012,7 @@ void GSDrawScanlineCodeGenerator2::WrapLOD(const XYm& uv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::WrapLOD(const XYm& uv0, const XYm& uv1)
|
void GSDrawScanlineCodeGenerator::WrapLOD(const XYm& uv0, const XYm& uv1)
|
||||||
{
|
{
|
||||||
// Registers free from SampleTexture
|
// Registers free from SampleTexture
|
||||||
const XYm& mask = xym0;
|
const XYm& mask = xym0;
|
||||||
|
@ -2067,7 +2078,7 @@ void GSDrawScanlineCodeGenerator2::WrapLOD(const XYm& uv0, const XYm& uv1)
|
||||||
/// Input: _ga
|
/// Input: _ga
|
||||||
/// Output: xym2[x86]=gaf (TFX_HIGHLIGHT || TFX_HIGHLIGHT2 && !tcc)
|
/// Output: xym2[x86]=gaf (TFX_HIGHLIGHT || TFX_HIGHLIGHT2 && !tcc)
|
||||||
/// Destroys: xym0, xym1, xym3[x86], xym4[x86]
|
/// Destroys: xym0, xym1, xym3[x86], xym4[x86]
|
||||||
void GSDrawScanlineCodeGenerator2::AlphaTFX()
|
void GSDrawScanlineCodeGenerator::AlphaTFX()
|
||||||
{
|
{
|
||||||
if (!m_sel.fb)
|
if (!m_sel.fb)
|
||||||
{
|
{
|
||||||
|
@ -2207,7 +2218,7 @@ void GSDrawScanlineCodeGenerator2::AlphaTFX()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Output: _fm, _zm
|
/// Output: _fm, _zm
|
||||||
void GSDrawScanlineCodeGenerator2::ReadMask()
|
void GSDrawScanlineCodeGenerator::ReadMask()
|
||||||
{
|
{
|
||||||
if (m_sel.fwrite)
|
if (m_sel.fwrite)
|
||||||
{
|
{
|
||||||
|
@ -2222,7 +2233,7 @@ void GSDrawScanlineCodeGenerator2::ReadMask()
|
||||||
|
|
||||||
/// Input: _ga, _fm, _zm
|
/// Input: _ga, _fm, _zm
|
||||||
/// Destroys: xym0, xym1
|
/// Destroys: xym0, xym1
|
||||||
void GSDrawScanlineCodeGenerator2::TestAlpha()
|
void GSDrawScanlineCodeGenerator::TestAlpha()
|
||||||
{
|
{
|
||||||
switch (m_sel.atst)
|
switch (m_sel.atst)
|
||||||
{
|
{
|
||||||
|
@ -2295,7 +2306,7 @@ void GSDrawScanlineCodeGenerator2::TestAlpha()
|
||||||
|
|
||||||
/// Input: xym2[x86]=gaf, _rb, _ga
|
/// Input: xym2[x86]=gaf, _rb, _ga
|
||||||
/// Destroys: xym0, xym1, xym2
|
/// Destroys: xym0, xym1, xym2
|
||||||
void GSDrawScanlineCodeGenerator2::ColorTFX()
|
void GSDrawScanlineCodeGenerator::ColorTFX()
|
||||||
{
|
{
|
||||||
if (!m_sel.fwrite)
|
if (!m_sel.fwrite)
|
||||||
{
|
{
|
||||||
|
@ -2372,7 +2383,7 @@ void GSDrawScanlineCodeGenerator2::ColorTFX()
|
||||||
|
|
||||||
/// Input: _rb, _ga
|
/// Input: _rb, _ga
|
||||||
/// Destroys: xym0, xym1, xym2[x86]
|
/// Destroys: xym0, xym1, xym2[x86]
|
||||||
void GSDrawScanlineCodeGenerator2::Fog()
|
void GSDrawScanlineCodeGenerator::Fog()
|
||||||
{
|
{
|
||||||
if (!m_sel.fwrite || !m_sel.fge)
|
if (!m_sel.fwrite || !m_sel.fge)
|
||||||
{
|
{
|
||||||
|
@ -2397,7 +2408,7 @@ void GSDrawScanlineCodeGenerator2::Fog()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Outputs: _fd, rbx=fa
|
/// Outputs: _fd, rbx=fa
|
||||||
void GSDrawScanlineCodeGenerator2::ReadFrame()
|
void GSDrawScanlineCodeGenerator::ReadFrame()
|
||||||
{
|
{
|
||||||
if (!m_sel.fb)
|
if (!m_sel.fb)
|
||||||
{
|
{
|
||||||
|
@ -2418,7 +2429,7 @@ void GSDrawScanlineCodeGenerator2::ReadFrame()
|
||||||
|
|
||||||
/// Input: _fd, _test
|
/// Input: _fd, _test
|
||||||
/// Destroys: xym0, xym1
|
/// Destroys: xym0, xym1
|
||||||
void GSDrawScanlineCodeGenerator2::TestDestAlpha()
|
void GSDrawScanlineCodeGenerator::TestDestAlpha()
|
||||||
{
|
{
|
||||||
if (!m_sel.date || (m_sel.fpsm != 0 && m_sel.fpsm != 2))
|
if (!m_sel.date || (m_sel.fpsm != 0 && m_sel.fpsm != 2))
|
||||||
{
|
{
|
||||||
|
@ -2465,7 +2476,7 @@ void GSDrawScanlineCodeGenerator2::TestDestAlpha()
|
||||||
/// Input: _fm, _zm, _test
|
/// Input: _fm, _zm, _test
|
||||||
/// Output: edx=fzm
|
/// Output: edx=fzm
|
||||||
/// Destroys: xym0, xym1
|
/// Destroys: xym0, xym1
|
||||||
void GSDrawScanlineCodeGenerator2::WriteMask()
|
void GSDrawScanlineCodeGenerator::WriteMask()
|
||||||
{
|
{
|
||||||
if (m_sel.notest)
|
if (m_sel.notest)
|
||||||
{
|
{
|
||||||
|
@ -2513,7 +2524,7 @@ void GSDrawScanlineCodeGenerator2::WriteMask()
|
||||||
|
|
||||||
/// Inputs: t2=za, edx=fzm, _zm
|
/// Inputs: t2=za, edx=fzm, _zm
|
||||||
/// Destroys: xym0, xym1, xym7
|
/// Destroys: xym0, xym1, xym7
|
||||||
void GSDrawScanlineCodeGenerator2::WriteZBuf()
|
void GSDrawScanlineCodeGenerator::WriteZBuf()
|
||||||
{
|
{
|
||||||
if (!m_sel.zwrite)
|
if (!m_sel.zwrite)
|
||||||
{
|
{
|
||||||
|
@ -2552,7 +2563,7 @@ void GSDrawScanlineCodeGenerator2::WriteZBuf()
|
||||||
|
|
||||||
/// Input: _fd, _rb, _ga
|
/// Input: _fd, _rb, _ga
|
||||||
/// Destroys: xym0, xym1, xym4, xym7[x86], xym15[x64]
|
/// Destroys: xym0, xym1, xym4, xym7[x86], xym15[x64]
|
||||||
void GSDrawScanlineCodeGenerator2::AlphaBlend()
|
void GSDrawScanlineCodeGenerator::AlphaBlend()
|
||||||
{
|
{
|
||||||
if (!m_sel.fwrite)
|
if (!m_sel.fwrite)
|
||||||
{
|
{
|
||||||
|
@ -2820,7 +2831,7 @@ void GSDrawScanlineCodeGenerator2::AlphaBlend()
|
||||||
|
|
||||||
/// Input: rbx=fa, rdx=fzm, _fd, _fm
|
/// Input: rbx=fa, rdx=fzm, _fd, _fm
|
||||||
/// Destroys: rax, xym0, xym1, xym5, xym6, xym7[x86], xmm15[x64]
|
/// Destroys: rax, xym0, xym1, xym5, xym6, xym7[x86], xmm15[x64]
|
||||||
void GSDrawScanlineCodeGenerator2::WriteFrame()
|
void GSDrawScanlineCodeGenerator::WriteFrame()
|
||||||
{
|
{
|
||||||
if (!m_sel.fwrite)
|
if (!m_sel.fwrite)
|
||||||
{
|
{
|
||||||
|
@ -2920,7 +2931,7 @@ void GSDrawScanlineCodeGenerator2::WriteFrame()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Destroys: tmp[isYmm]
|
/// Destroys: tmp[isYmm]
|
||||||
void GSDrawScanlineCodeGenerator2::ReadPixel(const XYm& dst, const XYm& tmp, const AddressReg& addr)
|
void GSDrawScanlineCodeGenerator::ReadPixel(const XYm& dst, const XYm& tmp, const AddressReg& addr)
|
||||||
{
|
{
|
||||||
RegExp base = _m_local__gd__vm + addr * 2;
|
RegExp base = _m_local__gd__vm + addr * 2;
|
||||||
#if USING_XMM
|
#if USING_XMM
|
||||||
|
@ -2938,9 +2949,9 @@ void GSDrawScanlineCodeGenerator2::ReadPixel(const XYm& dst, const XYm& tmp, con
|
||||||
}
|
}
|
||||||
|
|
||||||
#if USING_XMM
|
#if USING_XMM
|
||||||
void GSDrawScanlineCodeGenerator2::WritePixel(const XYm& src_, const AddressReg& addr, const Reg8& mask, bool fast, int psm, int fz)
|
void GSDrawScanlineCodeGenerator::WritePixel(const XYm& src_, const AddressReg& addr, const Reg8& mask, bool fast, int psm, int fz)
|
||||||
#else
|
#else
|
||||||
void GSDrawScanlineCodeGenerator2::WritePixel(const XYm& src_, const AddressReg& addr, const Reg32& mask, bool fast, int psm, int fz)
|
void GSDrawScanlineCodeGenerator::WritePixel(const XYm& src_, const AddressReg& addr, const Reg32& mask, bool fast, int psm, int fz)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#if USING_XMM
|
#if USING_XMM
|
||||||
|
@ -3065,7 +3076,7 @@ void GSDrawScanlineCodeGenerator2::WritePixel(const XYm& src_, const AddressReg&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::WritePixel(const Xmm& src, const AddressReg& addr, u8 i, u8 j, int psm)
|
void GSDrawScanlineCodeGenerator::WritePixel(const Xmm& src, const AddressReg& addr, u8 i, u8 j, int psm)
|
||||||
{
|
{
|
||||||
constexpr int s_offsets[8] = {0, 2, 8, 10, 16, 18, 24, 26};
|
constexpr int s_offsets[8] = {0, 2, 8, 10, 16, 18, 24, 26};
|
||||||
|
|
||||||
|
@ -3104,7 +3115,7 @@ void GSDrawScanlineCodeGenerator2::WritePixel(const Xmm& src, const AddressReg&
|
||||||
/// rdx = m_local.clut (x86 && m_sel.tlu)
|
/// rdx = m_local.clut (x86 && m_sel.tlu)
|
||||||
/// Destroys: rax, src, tmp1, tmp2
|
/// Destroys: rax, src, tmp1, tmp2
|
||||||
/// Destroys rbx (!use_lod)
|
/// Destroys rbx (!use_lod)
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexel1(const XYm& dst, const XYm& src, const XYm& tmp1, const XYm& tmp2, int mip_offset)
|
void GSDrawScanlineCodeGenerator::ReadTexel1(const XYm& dst, const XYm& src, const XYm& tmp1, const XYm& tmp2, int mip_offset)
|
||||||
{
|
{
|
||||||
const XYm no(-1); // Hopefully this will assert if we accidentally use it
|
const XYm no(-1); // Hopefully this will assert if we accidentally use it
|
||||||
ReadTexelImpl(dst, tmp1, src, no, no, no, tmp2, no, 1, mip_offset);
|
ReadTexelImpl(dst, tmp1, src, no, no, no, tmp2, no, 1, mip_offset);
|
||||||
|
@ -3120,7 +3131,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexel1(const XYm& dst, const XYm& src, co
|
||||||
/// rdx = m_local.clut (x86 && m_sel.tlu)
|
/// rdx = m_local.clut (x86 && m_sel.tlu)
|
||||||
/// Destroys: rax
|
/// Destroys: rax
|
||||||
/// Destroys rbx (!use_lod)
|
/// Destroys rbx (!use_lod)
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexel4(
|
void GSDrawScanlineCodeGenerator::ReadTexel4(
|
||||||
const XYm& d0, const XYm& d1,
|
const XYm& d0, const XYm& d1,
|
||||||
const XYm& d2s0, const XYm& d3s1,
|
const XYm& d2s0, const XYm& d3s1,
|
||||||
const XYm& s2, const XYm& s3,
|
const XYm& s2, const XYm& s3,
|
||||||
|
@ -3130,7 +3141,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexel4(
|
||||||
ReadTexelImpl(d0, d1, d2s0, d3s1, s2, s3, tmp1, tmp2, 4, mip_offset);
|
ReadTexelImpl(d0, d1, d2s0, d3s1, s2, s3, tmp1, tmp2, 4, mip_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexelImpl(
|
void GSDrawScanlineCodeGenerator::ReadTexelImpl(
|
||||||
const XYm& d0, const XYm& d1,
|
const XYm& d0, const XYm& d1,
|
||||||
const XYm& d2s0, const XYm& d3s1,
|
const XYm& d2s0, const XYm& d3s1,
|
||||||
const XYm& s2, const XYm& s3,
|
const XYm& s2, const XYm& s3,
|
||||||
|
@ -3145,7 +3156,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexelImpl(
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexelImplLoadTexLOD(int lod, int mip_offset)
|
void GSDrawScanlineCodeGenerator::ReadTexelImplLoadTexLOD(int lod, int mip_offset)
|
||||||
{
|
{
|
||||||
AddressReg texIn = _m_local__gd__tex;
|
AddressReg texIn = _m_local__gd__tex;
|
||||||
Address lod_addr = m_sel.lcm ? _rip_global_offset(lod.i.U32[0], sizeof(u32) * lod) : _rip_local_offset(temp.lod.i.U32[0], sizeof(u32) * lod);
|
Address lod_addr = m_sel.lcm ? _rip_global_offset(lod.i.U32[0], sizeof(u32) * lod) : _rip_local_offset(temp.lod.i.U32[0], sizeof(u32) * lod);
|
||||||
|
@ -3153,7 +3164,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexelImplLoadTexLOD(int lod, int mip_offs
|
||||||
mov(rbx, ptr[texIn + rbx * wordsize + mip_offset]);
|
mov(rbx, ptr[texIn + rbx * wordsize + mip_offset]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexelImplYmm(
|
void GSDrawScanlineCodeGenerator::ReadTexelImplYmm(
|
||||||
const Ymm& d0, const Ymm& d1,
|
const Ymm& d0, const Ymm& d1,
|
||||||
const Ymm& d2s0, const Ymm& d3s1,
|
const Ymm& d2s0, const Ymm& d3s1,
|
||||||
const Ymm& s2, const Ymm& s3,
|
const Ymm& s2, const Ymm& s3,
|
||||||
|
@ -3231,7 +3242,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexelImplYmm(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexelImplSSE4(
|
void GSDrawScanlineCodeGenerator::ReadTexelImplSSE4(
|
||||||
const Xmm& d0, const Xmm& d1,
|
const Xmm& d0, const Xmm& d1,
|
||||||
const Xmm& d2s0, const Xmm& d3s1,
|
const Xmm& d2s0, const Xmm& d3s1,
|
||||||
const Xmm& s2, const Xmm& s3,
|
const Xmm& s2, const Xmm& s3,
|
||||||
|
@ -3275,7 +3286,7 @@ void GSDrawScanlineCodeGenerator2::ReadTexelImplSSE4(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSDrawScanlineCodeGenerator2::ReadTexelImpl(const Xmm& dst, const Xmm& addr, u8 i, bool texInRBX, bool preserveDst)
|
void GSDrawScanlineCodeGenerator::ReadTexelImpl(const Xmm& dst, const Xmm& addr, u8 i, bool texInRBX, bool preserveDst)
|
||||||
{
|
{
|
||||||
pxAssert(i < 4);
|
pxAssert(i < 4);
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,8 @@
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_START
|
MULTI_ISA_UNSHARED_START
|
||||||
|
|
||||||
class GSDrawScanlineCodeGenerator2 : public GSNewCodeGenerator
|
class GSDrawScanlineCodeGenerator : public GSNewCodeGenerator
|
||||||
{
|
{
|
||||||
using _parent = GSNewCodeGenerator;
|
|
||||||
using XYm = DRAW_SCANLINE_VECTOR_REGISTER;
|
using XYm = DRAW_SCANLINE_VECTOR_REGISTER;
|
||||||
|
|
||||||
constexpr static bool isXmm = std::is_same<XYm, Xbyak::Xmm>::value;
|
constexpr static bool isXmm = std::is_same<XYm, Xbyak::Xmm>::value;
|
||||||
|
@ -72,7 +71,7 @@ class GSDrawScanlineCodeGenerator2 : public GSNewCodeGenerator
|
||||||
const XYm _z, _f, _s, _t, _q, _f_rb, _f_ga;
|
const XYm _z, _f, _s, _t, _q, _f_rb, _f_ga;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GSDrawScanlineCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, u64 key);
|
GSDrawScanlineCodeGenerator(u64 key, void* code, size_t maxsize);
|
||||||
void Generate();
|
void Generate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
|
||||||
|
|
||||||
#include "GSDrawScanlineCodeGenerator.h"
|
|
||||||
#include "GSDrawScanlineCodeGenerator.all.h"
|
|
||||||
#include "GSDrawScanline.h"
|
|
||||||
|
|
||||||
#include "common/Console.h"
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <map>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_IMPL;
|
|
||||||
|
|
||||||
static bool shouldUseCDrawScanline(u64 key)
|
|
||||||
{
|
|
||||||
static std::map<u64, bool> s_use_c_draw_scanline;
|
|
||||||
static std::mutex s_use_c_draw_scanline_mutex;
|
|
||||||
|
|
||||||
static const char* const fname = getenv("USE_C_DRAW_SCANLINE");
|
|
||||||
if (!fname)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
std::lock_guard<std::mutex> l(s_use_c_draw_scanline_mutex);
|
|
||||||
|
|
||||||
if (s_use_c_draw_scanline.empty())
|
|
||||||
{
|
|
||||||
std::ifstream file(fname);
|
|
||||||
if (file)
|
|
||||||
{
|
|
||||||
for (std::string str; std::getline(file, str);)
|
|
||||||
{
|
|
||||||
u64 key;
|
|
||||||
char yn;
|
|
||||||
if (sscanf(str.c_str(), "%" PRIx64 " %c", &key, &yn) == 2)
|
|
||||||
{
|
|
||||||
if (yn != 'Y' && yn != 'N' && yn != 'y' && yn != 'n')
|
|
||||||
Console.Warning("Failed to parse %s: Not y/n", str.c_str());
|
|
||||||
s_use_c_draw_scanline[key] = (yn == 'Y' || yn == 'y') ? true : false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.Warning("Failed to process line %s", str.c_str());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
auto idx = s_use_c_draw_scanline.find(key);
|
|
||||||
if (idx == s_use_c_draw_scanline.end())
|
|
||||||
{
|
|
||||||
s_use_c_draw_scanline[key] = false;
|
|
||||||
// Rewrite file
|
|
||||||
FILE* file = fopen(fname, "w");
|
|
||||||
if (file)
|
|
||||||
{
|
|
||||||
for (const auto& pair : s_use_c_draw_scanline)
|
|
||||||
{
|
|
||||||
fprintf(file, "%016" PRIX64 " %c %s\n", pair.first, pair.second ? 'Y' : 'N', GSScanlineSelector(pair.first).to_string().c_str());
|
|
||||||
}
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.Warning("Failed to write C draw scanline usage config: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return idx->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(u64 key, void* code, size_t maxsize)
|
|
||||||
: Xbyak::CodeGenerator(maxsize, code)
|
|
||||||
{
|
|
||||||
m_sel.key = key;
|
|
||||||
|
|
||||||
if (m_sel.breakpoint)
|
|
||||||
db(0xCC);
|
|
||||||
|
|
||||||
if (shouldUseCDrawScanline(key))
|
|
||||||
{
|
|
||||||
jmp(reinterpret_cast<const void*>(static_cast<void (*)(int, int, int, const GSVertexSW&, GSScanlineLocalData&)>(
|
|
||||||
&GSDrawScanline::CDrawScanline)));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GSDrawScanlineCodeGenerator2(this, g_cpu, m_sel.key).Generate();
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "GS/Renderers/SW/GSScanlineEnvironment.h"
|
|
||||||
#include "GS/Renderers/SW/GSNewCodeGenerator.h"
|
|
||||||
#include "GS/GSUtil.h"
|
|
||||||
#include "GS/MultiISA.h"
|
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_START
|
|
||||||
|
|
||||||
class GSDrawScanlineCodeGenerator : public Xbyak::CodeGenerator
|
|
||||||
{
|
|
||||||
GSDrawScanlineCodeGenerator(const GSDrawScanlineCodeGenerator&) = delete;
|
|
||||||
void operator=(const GSDrawScanlineCodeGenerator&) = delete;
|
|
||||||
|
|
||||||
GSScanlineSelector m_sel;
|
|
||||||
|
|
||||||
public:
|
|
||||||
GSDrawScanlineCodeGenerator(u64 key, void* code, size_t maxsize);
|
|
||||||
};
|
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_END
|
|
|
@ -3,6 +3,9 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "GS/MultiISA.h"
|
||||||
|
#include "common/Assertions.h"
|
||||||
|
|
||||||
// Xbyak pulls in windows.h, and breaks everything.
|
// Xbyak pulls in windows.h, and breaks everything.
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "common/RedtapeWindows.h"
|
#include "common/RedtapeWindows.h"
|
||||||
|
@ -13,8 +16,6 @@
|
||||||
|
|
||||||
#include "xbyak/xbyak.h"
|
#include "xbyak/xbyak.h"
|
||||||
#include "xbyak/xbyak_util.h"
|
#include "xbyak/xbyak_util.h"
|
||||||
#include "GS/MultiISA.h"
|
|
||||||
#include "common/Assertions.h"
|
|
||||||
|
|
||||||
/// Code generator that automatically selects between SSE and AVX, x86 and x64 so you don't have to
|
/// Code generator that automatically selects between SSE and AVX, x86 and x64 so you don't have to
|
||||||
/// Should make combined SSE and AVX codegen much easier
|
/// Should make combined SSE and AVX codegen much easier
|
||||||
|
@ -41,7 +42,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Xbyak::CodeGenerator& actual;
|
Xbyak::CodeGenerator actual;
|
||||||
|
|
||||||
using AddressReg = Xbyak::Reg64;
|
using AddressReg = Xbyak::Reg64;
|
||||||
using RipType = Xbyak::RegRip;
|
using RipType = Xbyak::RegRip;
|
||||||
|
@ -58,14 +59,17 @@ public:
|
||||||
const RipType rip{};
|
const RipType rip{};
|
||||||
const Xbyak::AddressFrame ptr{0}, byte{8}, word{16}, dword{32}, qword{64}, xword{128}, yword{256}, zword{512};
|
const Xbyak::AddressFrame ptr{0}, byte{8}, word{16}, dword{32}, qword{64}, xword{128}, yword{256}, zword{512};
|
||||||
|
|
||||||
GSNewCodeGenerator(Xbyak::CodeGenerator* actual, const ProcessorFeatures& cpu)
|
GSNewCodeGenerator(void* code, size_t maxsize)
|
||||||
: actual(*actual)
|
: actual(maxsize, code)
|
||||||
, hasAVX(cpu.vectorISA >= ProcessorFeatures::VectorISA::AVX)
|
, hasAVX(g_cpu.vectorISA >= ProcessorFeatures::VectorISA::AVX)
|
||||||
, hasAVX2(cpu.vectorISA >= ProcessorFeatures::VectorISA::AVX2)
|
, hasAVX2(g_cpu.vectorISA >= ProcessorFeatures::VectorISA::AVX2)
|
||||||
, hasFMA(cpu.hasFMA)
|
, hasFMA(g_cpu.hasFMA)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t GetSize() const { return actual.getSize(); }
|
||||||
|
const u8* GetCode() const { return actual.getCode(); }
|
||||||
|
|
||||||
|
|
||||||
// ------------ Forwarding instructions ------------
|
// ------------ Forwarding instructions ------------
|
||||||
// Note: Only instructions used by codegen were added here, so if you're modifying codegen, you may need to add instructions here
|
// Note: Only instructions used by codegen were added here, so if you're modifying codegen, you may need to add instructions here
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "GS/Renderers/SW/GSRendererSW.h"
|
#include "GS/Renderers/SW/GSRendererSW.h"
|
||||||
#include "GS/GSGL.h"
|
#include "GS/GSGL.h"
|
||||||
#include "GS/GSPng.h"
|
#include "GS/GSPng.h"
|
||||||
|
#include "GS/GSUtil.h"
|
||||||
|
|
||||||
#include "common/StringUtil.h"
|
#include "common/StringUtil.h"
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
// SPDX-License-Identifier: LGPL-3.0+
|
||||||
|
|
||||||
#include "GSSetupPrimCodeGenerator.all.h"
|
#include "GSSetupPrimCodeGenerator.all.h"
|
||||||
|
@ -37,8 +37,8 @@ using namespace Xbyak;
|
||||||
#define _rip_local_d_p(x) _rip_local_d(x)
|
#define _rip_local_d_p(x) _rip_local_d(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GSSetupPrimCodeGenerator2::GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, u64 key)
|
GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(u64 key, void* code, size_t maxsize)
|
||||||
: _parent(base, cpu)
|
: GSNewCodeGenerator(code, maxsize)
|
||||||
, many_regs(false)
|
, many_regs(false)
|
||||||
// On x86 arg registers are very temporary but on x64 they aren't, so on x86 some registers overlap
|
// On x86 arg registers are very temporary but on x64 they aren't, so on x86 some registers overlap
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -61,7 +61,7 @@ GSSetupPrimCodeGenerator2::GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base,
|
||||||
m_en.c = m_sel.fb && !(m_sel.tfx == TFX_DECAL && m_sel.tcc) ? 1 : 0;
|
m_en.c = m_sel.fb && !(m_sel.tfx == TFX_DECAL && m_sel.tcc) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::broadcastf128(const XYm& reg, const Address& mem)
|
void GSSetupPrimCodeGenerator::broadcastf128(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
#if SETUP_PRIM_USING_YMM
|
#if SETUP_PRIM_USING_YMM
|
||||||
vbroadcastf128(reg, mem);
|
vbroadcastf128(reg, mem);
|
||||||
|
@ -70,7 +70,7 @@ void GSSetupPrimCodeGenerator2::broadcastf128(const XYm& reg, const Address& mem
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::broadcastss(const XYm& reg, const Address& mem)
|
void GSSetupPrimCodeGenerator::broadcastss(const XYm& reg, const Address& mem)
|
||||||
{
|
{
|
||||||
if (hasAVX)
|
if (hasAVX)
|
||||||
{
|
{
|
||||||
|
@ -83,7 +83,7 @@ void GSSetupPrimCodeGenerator2::broadcastss(const XYm& reg, const Address& mem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::Generate()
|
void GSSetupPrimCodeGenerator::Generate()
|
||||||
{
|
{
|
||||||
bool needs_shift = ((m_en.z || m_en.f) && m_sel.prim != GS_SPRITE_CLASS) || m_en.t || (m_en.c && m_sel.iip);
|
bool needs_shift = ((m_en.z || m_en.f) && m_sel.prim != GS_SPRITE_CLASS) || m_en.t || (m_en.c && m_sel.iip);
|
||||||
many_regs = isYmm && !m_sel.notest && needs_shift;
|
many_regs = isYmm && !m_sel.notest && needs_shift;
|
||||||
|
@ -140,7 +140,7 @@ void GSSetupPrimCodeGenerator2::Generate()
|
||||||
Perf::any.RegisterKey(actual.getCode(), actual.getSize(), "GSSetupPrim_", m_sel.key);
|
Perf::any.RegisterKey(actual.getCode(), actual.getSize(), "GSSetupPrim_", m_sel.key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::Depth_XMM()
|
void GSSetupPrimCodeGenerator::Depth_XMM()
|
||||||
{
|
{
|
||||||
if (!m_en.z && !m_en.f)
|
if (!m_en.z && !m_en.f)
|
||||||
{
|
{
|
||||||
|
@ -227,7 +227,7 @@ void GSSetupPrimCodeGenerator2::Depth_XMM()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::Depth_YMM()
|
void GSSetupPrimCodeGenerator::Depth_YMM()
|
||||||
{
|
{
|
||||||
if (!m_en.z && !m_en.f)
|
if (!m_en.z && !m_en.f)
|
||||||
{
|
{
|
||||||
|
@ -313,7 +313,7 @@ void GSSetupPrimCodeGenerator2::Depth_YMM()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::Texture()
|
void GSSetupPrimCodeGenerator::Texture()
|
||||||
{
|
{
|
||||||
if (!m_en.t)
|
if (!m_en.t)
|
||||||
{
|
{
|
||||||
|
@ -385,7 +385,7 @@ void GSSetupPrimCodeGenerator2::Texture()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSSetupPrimCodeGenerator2::Color()
|
void GSSetupPrimCodeGenerator::Color()
|
||||||
{
|
{
|
||||||
if (!m_en.c)
|
if (!m_en.c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
// SPDX-FileCopyrightText: 2002-2024 PCSX2 Dev Team
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
// SPDX-License-Identifier: LGPL-3.0+
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@ -19,9 +19,8 @@
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_START
|
MULTI_ISA_UNSHARED_START
|
||||||
|
|
||||||
class GSSetupPrimCodeGenerator2 : public GSNewCodeGenerator
|
class GSSetupPrimCodeGenerator : public GSNewCodeGenerator
|
||||||
{
|
{
|
||||||
using _parent = GSNewCodeGenerator;
|
|
||||||
using XYm = SETUP_PRIM_VECTOR_REGISTER;
|
using XYm = SETUP_PRIM_VECTOR_REGISTER;
|
||||||
|
|
||||||
using Xmm = Xbyak::Xmm;
|
using Xmm = Xbyak::Xmm;
|
||||||
|
@ -42,7 +41,7 @@ class GSSetupPrimCodeGenerator2 : public GSNewCodeGenerator
|
||||||
const AddressReg _64_vertex, _index, _dscan, _m_local, t1;
|
const AddressReg _64_vertex, _index, _dscan, _m_local, t1;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GSSetupPrimCodeGenerator2(Xbyak::CodeGenerator* base, const ProcessorFeatures& cpu, u64 key);
|
GSSetupPrimCodeGenerator(u64 key, void* code, size_t maxsize);
|
||||||
void Generate();
|
void Generate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
|
||||||
|
|
||||||
#include "GSSetupPrimCodeGenerator.h"
|
|
||||||
#include "GSSetupPrimCodeGenerator.all.h"
|
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_IMPL;
|
|
||||||
|
|
||||||
GSSetupPrimCodeGenerator::GSSetupPrimCodeGenerator(u64 key, void* code, size_t maxsize)
|
|
||||||
: Xbyak::CodeGenerator(maxsize, code)
|
|
||||||
{
|
|
||||||
m_sel.key = key;
|
|
||||||
|
|
||||||
m_en.z = m_sel.zb ? 1 : 0;
|
|
||||||
m_en.f = m_sel.fb && m_sel.fge ? 1 : 0;
|
|
||||||
m_en.t = m_sel.fb && m_sel.tfx != TFX_NONE ? 1 : 0;
|
|
||||||
m_en.c = m_sel.fb && !(m_sel.tfx == TFX_DECAL && m_sel.tcc) ? 1 : 0;
|
|
||||||
|
|
||||||
GSSetupPrimCodeGenerator2(this, g_cpu, key).Generate();
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2002-2023 PCSX2 Dev Team
|
|
||||||
// SPDX-License-Identifier: LGPL-3.0+
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "GS/Renderers/SW/GSScanlineEnvironment.h"
|
|
||||||
#include "GS/Renderers/SW/GSNewCodeGenerator.h"
|
|
||||||
#include "GS/GSUtil.h"
|
|
||||||
#include "GS/MultiISA.h"
|
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_START
|
|
||||||
|
|
||||||
class GSSetupPrimCodeGenerator : public Xbyak::CodeGenerator
|
|
||||||
{
|
|
||||||
void operator=(const GSSetupPrimCodeGenerator&);
|
|
||||||
|
|
||||||
GSScanlineSelector m_sel;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
u32 z : 1, f : 1, t : 1, c : 1;
|
|
||||||
} m_en;
|
|
||||||
|
|
||||||
public:
|
|
||||||
GSSetupPrimCodeGenerator(u64 key, void* code, size_t maxsize);
|
|
||||||
};
|
|
||||||
|
|
||||||
MULTI_ISA_UNSHARED_END
|
|
|
@ -284,7 +284,6 @@
|
||||||
<ClCompile Include="GS\Renderers\Common\GSDirtyRect.cpp" />
|
<ClCompile Include="GS\Renderers\Common\GSDirtyRect.cpp" />
|
||||||
<ClCompile Include="GS\GSDrawingContext.cpp" />
|
<ClCompile Include="GS\GSDrawingContext.cpp" />
|
||||||
<ClCompile Include="GS\Renderers\SW\GSDrawScanline.cpp" />
|
<ClCompile Include="GS\Renderers\SW\GSDrawScanline.cpp" />
|
||||||
<ClCompile Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.cpp" />
|
|
||||||
<ClCompile Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.cpp" />
|
<ClCompile Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.cpp" />
|
||||||
<ClCompile Include="GS\GSDump.cpp" />
|
<ClCompile Include="GS\GSDump.cpp" />
|
||||||
<ClCompile Include="GS\Renderers\Common\GSFunctionMap.cpp" />
|
<ClCompile Include="GS\Renderers\Common\GSFunctionMap.cpp" />
|
||||||
|
@ -301,7 +300,6 @@
|
||||||
<ClCompile Include="GS\Renderers\HW\GSRendererHWMultiISA.cpp" />
|
<ClCompile Include="GS\Renderers\HW\GSRendererHWMultiISA.cpp" />
|
||||||
<ClCompile Include="GS\Renderers\Null\GSRendererNull.cpp" />
|
<ClCompile Include="GS\Renderers\Null\GSRendererNull.cpp" />
|
||||||
<ClCompile Include="GS\Renderers\SW\GSRendererSW.cpp" />
|
<ClCompile Include="GS\Renderers\SW\GSRendererSW.cpp" />
|
||||||
<ClCompile Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.cpp" />
|
|
||||||
<ClCompile Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.cpp" />
|
<ClCompile Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.cpp" />
|
||||||
<ClCompile Include="GS\GSState.cpp" />
|
<ClCompile Include="GS\GSState.cpp" />
|
||||||
<ClCompile Include="GS\GSTables.cpp" />
|
<ClCompile Include="GS\GSTables.cpp" />
|
||||||
|
@ -620,7 +618,6 @@
|
||||||
<ClInclude Include="GS\GSDrawingContext.h" />
|
<ClInclude Include="GS\GSDrawingContext.h" />
|
||||||
<ClInclude Include="GS\GSDrawingEnvironment.h" />
|
<ClInclude Include="GS\GSDrawingEnvironment.h" />
|
||||||
<ClInclude Include="GS\Renderers\SW\GSDrawScanline.h" />
|
<ClInclude Include="GS\Renderers\SW\GSDrawScanline.h" />
|
||||||
<ClInclude Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.h" />
|
|
||||||
<ClInclude Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.h" />
|
<ClInclude Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.h" />
|
||||||
<ClInclude Include="GS\Renderers\SW\GSNewCodeGenerator.h" />
|
<ClInclude Include="GS\Renderers\SW\GSNewCodeGenerator.h" />
|
||||||
<ClInclude Include="GS\GSDump.h" />
|
<ClInclude Include="GS\GSDump.h" />
|
||||||
|
@ -637,7 +634,6 @@
|
||||||
<ClInclude Include="GS\Renderers\Null\GSRendererNull.h" />
|
<ClInclude Include="GS\Renderers\Null\GSRendererNull.h" />
|
||||||
<ClInclude Include="GS\Renderers\SW\GSRendererSW.h" />
|
<ClInclude Include="GS\Renderers\SW\GSRendererSW.h" />
|
||||||
<ClInclude Include="GS\Renderers\SW\GSScanlineEnvironment.h" />
|
<ClInclude Include="GS\Renderers\SW\GSScanlineEnvironment.h" />
|
||||||
<ClInclude Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.h" />
|
|
||||||
<ClInclude Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.h" />
|
<ClInclude Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.h" />
|
||||||
<ClInclude Include="GS\GSState.h" />
|
<ClInclude Include="GS\GSState.h" />
|
||||||
<ClInclude Include="GS\GSTables.h" />
|
<ClInclude Include="GS\GSTables.h" />
|
||||||
|
|
|
@ -1046,18 +1046,12 @@
|
||||||
<ClCompile Include="GS\Renderers\SW\GSDrawScanline.cpp">
|
<ClCompile Include="GS\Renderers\SW\GSDrawScanline.cpp">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.cpp">
|
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.cpp">
|
<ClCompile Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.cpp">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="GS\Renderers\SW\GSRendererSW.cpp">
|
<ClCompile Include="GS\Renderers\SW\GSRendererSW.cpp">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.cpp">
|
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.cpp">
|
<ClCompile Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.cpp">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -1952,9 +1946,6 @@
|
||||||
<ClInclude Include="GS\Renderers\SW\GSDrawScanline.h">
|
<ClInclude Include="GS\Renderers\SW\GSDrawScanline.h">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.h">
|
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.h">
|
<ClInclude Include="GS\Renderers\SW\GSDrawScanlineCodeGenerator.all.h">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -1967,9 +1958,6 @@
|
||||||
<ClInclude Include="GS\Renderers\SW\GSScanlineEnvironment.h">
|
<ClInclude Include="GS\Renderers\SW\GSScanlineEnvironment.h">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.h">
|
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.h">
|
<ClInclude Include="GS\Renderers\SW\GSSetupPrimCodeGenerator.all.h">
|
||||||
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
<Filter>System\Ps2\GS\Renderers\Software</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
Loading…
Reference in New Issue