gs: initial windows port done up to linking issues

This commit is contained in:
Gauvain 'GovanifY' Roussel-Tarbouriech 2021-05-15 23:51:58 +02:00 committed by Kojin
parent 9c77896f2d
commit c8524022b7
18 changed files with 21 additions and 521 deletions

View File

@ -25,6 +25,7 @@ EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pcsx2", "pcsx2\windows\VCprojects\pcsx2.vcxproj", "{1CEFD830-2B76-4596-A4EE-BCD7280A60BD}"
ProjectSection(ProjectDependencies) = postProject
{12728250-16EC-4DC6-94D7-E21DD88947F8} = {12728250-16EC-4DC6-94D7-E21DD88947F8}
{D6973076-9317-4EF2-A0B8-B7A18AC0713E} = {D6973076-9317-4EF2-A0B8-B7A18AC0713E}
{27F17499-A372-4408-8AFA-4F9F4584FBD3} = {27F17499-A372-4408-8AFA-4F9F4584FBD3}
{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B} = {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}
EndProjectSection

View File

@ -870,447 +870,6 @@ void GSsetExclusive(int enabled)
}
}
#ifdef _WIN32
#include <io.h>
#include <fcntl.h>
class Console
{
HANDLE m_console;
std::string m_title;
public:
Console::Console(LPCSTR title, bool open)
: m_console(NULL)
, m_title(title)
{
if (open)
Open();
}
Console::~Console()
{
Close();
}
void Console::Open()
{
if (m_console == NULL)
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
AllocConsole();
std::wstring tmp = std::wstring(m_title.begin(), m_title.end());
SetConsoleTitle(tmp.c_str());
m_console = GetStdHandle(STD_OUTPUT_HANDLE);
COORD size;
size.X = 100;
size.Y = 300;
SetConsoleScreenBufferSize(m_console, size);
GetConsoleScreenBufferInfo(m_console, &csbiInfo);
SMALL_RECT rect;
rect = csbiInfo.srWindow;
rect.Right = rect.Left + 99;
rect.Bottom = rect.Top + 64;
SetConsoleWindowInfo(m_console, TRUE, &rect);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
setvbuf(stdout, nullptr, _IONBF, 0);
setvbuf(stderr, nullptr, _IONBF, 0);
}
}
void Console::Close()
{
if (m_console != NULL)
{
FreeConsole();
m_console = NULL;
}
}
};
// lpszCmdLine:
// First parameter is the renderer.
// Second parameter is the gs file to load and run.
void GSReplay(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
GSRendererType renderer = GSRendererType::Undefined;
{
char* start = lpszCmdLine;
char* end = NULL;
long n = strtol(lpszCmdLine, &end, 10);
if (end > start)
{
renderer = static_cast<GSRendererType>(n);
lpszCmdLine = end;
}
}
while (*lpszCmdLine == ' ')
lpszCmdLine++;
::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS);
Console console{"GS", true};
const std::string f{lpszCmdLine};
const bool is_xz = f.size() >= 4 && f.compare(f.size() - 3, 3, ".xz") == 0;
auto file = is_xz ? std::unique_ptr<GSDumpFile>{std::make_unique<GSDumpLzma>(lpszCmdLine, nullptr)} : std::unique_ptr<GSDumpFile>{std::make_unique<GSDumpRaw>(lpszCmdLine, nullptr)};
GSinit();
std::array<uint8, 0x2000> regs;
GSsetBaseMem(regs.data());
s_vsync = theApp.GetConfigI("vsync");
HWND hWnd = nullptr;
_GSopen((void**)&hWnd, "", renderer);
uint32 crc;
file->Read(&crc, 4);
GSsetGameCRC(crc, 0);
{
GSFreezeData fd;
file->Read(&fd.size, 4);
std::vector<uint8> freeze_data(fd.size);
fd.data = freeze_data.data();
file->Read(fd.data, fd.size);
GSfreeze(FREEZE_LOAD, &fd);
}
file->Read(regs.data(), 0x2000);
GSvsync(1);
struct Packet
{
uint8 type, param;
uint32 size, addr;
std::vector<uint8> buff;
};
auto read_packet = [&file](uint8 type) {
Packet p;
p.type = type;
switch (p.type)
{
case 0:
file->Read(&p.param, 1);
file->Read(&p.size, 4);
switch (p.param)
{
case 0:
p.buff.resize(0x4000);
p.addr = 0x4000 - p.size;
file->Read(&p.buff[p.addr], p.size);
break;
case 1:
case 2:
case 3:
p.buff.resize(p.size);
file->Read(p.buff.data(), p.size);
break;
}
break;
case 1:
file->Read(&p.param, 1);
break;
case 2:
file->Read(&p.size, 4);
break;
case 3:
p.buff.resize(0x2000);
file->Read(p.buff.data(), 0x2000);
break;
}
return p;
};
std::list<Packet> packets;
uint8 type;
while (file->Read(&type, 1))
packets.push_back(read_packet(type));
Sleep(100);
std::vector<uint8> buff;
while (IsWindowVisible(hWnd))
{
for (auto& p : packets)
{
switch (p.type)
{
case 0:
switch (p.param)
{
case 0:
GSgifTransfer1(p.buff.data(), p.addr);
break;
case 1:
GSgifTransfer2(p.buff.data(), p.size / 16);
break;
case 2:
GSgifTransfer3(p.buff.data(), p.size / 16);
break;
case 3:
GSgifTransfer(p.buff.data(), p.size / 16);
break;
}
break;
case 1:
GSvsync(p.param);
break;
case 2:
if (buff.size() < p.size)
buff.resize(p.size);
GSreadFIFO2(p.buff.data(), p.size / 16);
break;
case 3:
memcpy(regs.data(), p.buff.data(), 0x2000);
break;
}
}
}
Sleep(100);
GSclose();
GSshutdown();
}
void GSBenchmark(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
{
::SetPriorityClass(::GetCurrentProcess(), HIGH_PRIORITY_CLASS);
Console console("GS", true);
if (1)
{
GSLocalMemory* mem = new GSLocalMemory();
static struct
{
int psm;
const char* name;
} s_format[] =
{
{PSM_PSMCT32, "32"},
{PSM_PSMCT24, "24"},
{PSM_PSMCT16, "16"},
{PSM_PSMCT16S, "16S"},
{PSM_PSMT8, "8"},
{PSM_PSMT4, "4"},
{PSM_PSMT8H, "8H"},
{PSM_PSMT4HL, "4HL"},
{PSM_PSMT4HH, "4HH"},
{PSM_PSMZ32, "32Z"},
{PSM_PSMZ24, "24Z"},
{PSM_PSMZ16, "16Z"},
{PSM_PSMZ16S, "16ZS"},
};
uint8* ptr = (uint8*)_aligned_malloc(1024 * 1024 * 4, 32);
for (int i = 0; i < 1024 * 1024 * 4; i++)
ptr[i] = (uint8)i;
//
for (int tbw = 5; tbw <= 10; tbw++)
{
int n = 256 << ((10 - tbw) * 2);
int w = 1 << tbw;
int h = 1 << tbw;
printf("%d x %d\n\n", w, h);
for (size_t i = 0; i < countof(s_format); i++)
{
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[s_format[i].psm];
GSLocalMemory::writeImage wi = psm.wi;
GSLocalMemory::readImage ri = psm.ri;
GSLocalMemory::readTexture rtx = psm.rtx;
GSLocalMemory::readTexture rtxP = psm.rtxP;
GIFRegBITBLTBUF BITBLTBUF;
BITBLTBUF.SBP = 0;
BITBLTBUF.SBW = w / 64;
BITBLTBUF.SPSM = s_format[i].psm;
BITBLTBUF.DBP = 0;
BITBLTBUF.DBW = w / 64;
BITBLTBUF.DPSM = s_format[i].psm;
GIFRegTRXPOS TRXPOS;
TRXPOS.SSAX = 0;
TRXPOS.SSAY = 0;
TRXPOS.DSAX = 0;
TRXPOS.DSAY = 0;
GIFRegTRXREG TRXREG;
TRXREG.RRW = w;
TRXREG.RRH = h;
GSVector4i r(0, 0, w, h);
GIFRegTEX0 TEX0;
TEX0.TBP0 = 0;
TEX0.TBW = w / 64;
GIFRegTEXA TEXA;
TEXA.TA0 = 0;
TEXA.TA1 = 0x80;
TEXA.AEM = 0;
int trlen = w * h * psm.trbpp / 8;
int len = w * h * psm.bpp / 8;
clock_t start, end;
printf("[%4s] ", s_format[i].name);
start = clock();
for (int j = 0; j < n; j++)
{
int x = 0;
int y = 0;
(mem->*wi)(x, y, ptr, trlen, BITBLTBUF, TRXPOS, TRXREG);
}
end = clock();
printf("%6d %6d | ", (int)((float)trlen * n / (end - start) / 1000), (int)((float)(w * h) * n / (end - start) / 1000));
start = clock();
for (int j = 0; j < n; j++)
{
int x = 0;
int y = 0;
(mem->*ri)(x, y, ptr, trlen, BITBLTBUF, TRXPOS, TRXREG);
}
end = clock();
printf("%6d %6d | ", (int)((float)trlen * n / (end - start) / 1000), (int)((float)(w * h) * n / (end - start) / 1000));
const GSOffset* off = mem->GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM);
start = clock();
for (int j = 0; j < n; j++)
{
(mem->*rtx)(off, r, ptr, w * 4, TEXA);
}
end = clock();
printf("%6d %6d ", (int)((float)len * n / (end - start) / 1000), (int)((float)(w * h) * n / (end - start) / 1000));
if (psm.pal > 0)
{
start = clock();
for (int j = 0; j < n; j++)
{
(mem->*rtxP)(off, r, ptr, w, TEXA);
}
end = clock();
printf("| %6d %6d ", (int)((float)len * n / (end - start) / 1000), (int)((float)(w * h) * n / (end - start) / 1000));
}
printf("\n");
}
printf("\n");
}
_aligned_free(ptr);
delete mem;
}
//
if (0)
{
GSLocalMemory* mem = new GSLocalMemory();
uint8* ptr = (uint8*)_aligned_malloc(1024 * 1024 * 4, 32);
for (int i = 0; i < 1024 * 1024 * 4; i++)
ptr[i] = (uint8)i;
const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[PSM_PSMCT32];
GSLocalMemory::writeImage wi = psm.wi;
GIFRegBITBLTBUF BITBLTBUF;
BITBLTBUF.DBP = 0;
BITBLTBUF.DBW = 32;
BITBLTBUF.DPSM = PSM_PSMCT32;
GIFRegTRXPOS TRXPOS;
TRXPOS.DSAX = 0;
TRXPOS.DSAY = 1;
GIFRegTRXREG TRXREG;
TRXREG.RRW = 256;
TRXREG.RRH = 256;
int trlen = 256 * 256 * psm.trbpp / 8;
int x = 0;
int y = 0;
(mem->*wi)(x, y, ptr, trlen, BITBLTBUF, TRXPOS, TRXREG);
delete mem;
}
//
PostQuitMessage(0);
}
#endif
#if defined(__unix__) || defined(__APPLE__)
inline unsigned long timeGetTime()

View File

@ -8,9 +8,6 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

View File

@ -29,62 +29,6 @@
Xbyak::util::Cpu g_cpu;
const char* GSUtil::GetLibName()
{
// The following ifdef mess is courtesy of "static string str;"
// being optimised by GCC to be unusable by older CPUs. Enjoy!
static char name[255];
#if _M_SSE < 0x501
const char* sw_sse = g_cpu.has(Xbyak::util::Cpu::tAVX) ? "AVX" :
g_cpu.has(Xbyak::util::Cpu::tSSE41) ? "SSE41" :
g_cpu.has(Xbyak::util::Cpu::tSSSE3) ? "SSSE3" : "SSE2";
#endif
snprintf(name, sizeof(name), "GS "
#ifdef _WIN32
"%lld "
#endif
#ifdef _M_AMD64
"64-bit "
#endif
#ifdef __INTEL_COMPILER
"(Intel C++ %d.%02d %s/%s)",
#elif _MSC_VER
"(MSVC %d.%02d %s/%s)",
#elif __clang__
"(clang %d.%d.%d %s/%s)",
#elif __GNUC__
"(GCC %d.%d.%d %s/%s)",
#else
"(%s/%s)",
#endif
#ifdef _WIN32
SVN_REV,
#endif
#ifdef __INTEL_COMPILER
__INTEL_COMPILER / 100, __INTEL_COMPILER % 100,
#elif _MSC_VER
_MSC_VER / 100, _MSC_VER % 100,
#elif __clang__
__clang_major__, __clang_minor__, __clang_patchlevel__,
#elif __GNUC__
__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__,
#endif
#if _M_SSE >= 0x501
"AVX2", "AVX2"
#elif _M_SSE >= 0x500
"AVX", sw_sse
#elif _M_SSE >= 0x401
"SSE4.1", sw_sse
#endif
);
return name;
}
static class GSUtilMaps
{
public:

View File

@ -22,8 +22,6 @@ class GSUtil
public:
static void Init();
static const char* GetLibName();
static GS_PRIM_CLASS GetPrimClass(uint32 prim);
static int GetVertexCount(uint32 prim);
static int GetClassVertexCount(uint32 primclass);

View File

@ -17,7 +17,7 @@
#include "GS/GS.h"
#include "GSOsdManager.h"
#ifdef _WIN32
#include "resource.h"
#include "GS/resource.h"
#endif
void GSOsdManager::LoadFont()

View File

@ -16,8 +16,8 @@
#include "PrecompiledHeader.h"
#include "GS.h"
#include "GSDevice11.h"
#include "GSUtil.h"
#include "resource.h"
#include "GS/GSUtil.h"
#include "GS/resource.h"
#include <fstream>
#include <VersionHelpers.h>

View File

@ -16,8 +16,8 @@
#pragma once
#include "GSTexture11.h"
#include "GSVector.h"
#include "Renderers/Common/GSDevice.h"
#include "GS/GSVector.h"
#include "GS/Renderers/Common/GSDevice.h"
struct GSVertexShader11
{

View File

@ -15,9 +15,9 @@
#pragma once
#include "Renderers/HW/GSRendererHW.h"
#include "GS/Renderers/HW/GSRendererHW.h"
#include "GSTextureCache11.h"
#include "Renderers/HW/GSVertexHW.h"
#include "GS/Renderers/HW/GSVertexHW.h"
class GSRendererDX11 final : public GSRendererHW
{

View File

@ -15,7 +15,7 @@
#include "PrecompiledHeader.h"
#include "GSTexture11.h"
#include "GSPng.h"
#include "GS/GSPng.h"
GSTexture11::GSTexture11(ID3D11Texture2D* texture)
: m_texture(texture), m_layer(0)

View File

@ -15,7 +15,8 @@
#pragma once
#include "Renderers/Common/GSTexture.h"
#include "GS.h"
#include "GS/Renderers/Common/GSTexture.h"
class GSTexture11 : public GSTexture
{

View File

@ -15,7 +15,7 @@
#pragma once
#include "Renderers/HW/GSTextureCache.h"
#include "GS/Renderers/HW/GSTextureCache.h"
#include "GSDevice11.h"
class GSTextureCache11 : public GSTextureCache

View File

@ -15,8 +15,8 @@
#include "PrecompiledHeader.h"
#include "GSDevice11.h"
#include "resource.h"
#include "GSTables.h"
#include "GS/resource.h"
#include "GS/GSTables.h"
bool GSDevice11::CreateTextureFX()
{

View File

@ -16,7 +16,7 @@
#pragma once
#include "GSDialog.h"
#include "resource.h"
#include "GS/resource.h"
#include <streams.h>
class GSCaptureDlg : public GSDialog

View File

@ -18,7 +18,7 @@
#include <CommCtrl.h>
#include "GS.h"
#include "GSDialog.h"
#include "GSVector.h"
#include "GS/GSVector.h"
GSDialog::GSDialog(UINT id)
: m_id(id)

View File

@ -16,7 +16,7 @@
#include "PrecompiledHeader.h"
#include "GSSetting.h"
#ifdef _WIN32
#include "resource.h"
#include "GS/resource.h"
#endif
#ifdef _WIN32

View File

@ -16,9 +16,9 @@
#include "PrecompiledHeader.h"
#include "GS.h"
#include "GSSettingsDlg.h"
#include "GSUtil.h"
#include "Renderers/DX11/GSDevice11.h"
#include "resource.h"
#include "GS/GSUtil.h"
#include "GS/Renderers/DX11/GSDevice11.h"
#include "GS/resource.h"
#include "GSSetting.h"
#include <algorithm>

View File

@ -57,7 +57,7 @@
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>$(ProjectRootDir)/gui;$(SolutionDir)3rdparty\xbyak;$(SolutionDir)3rdparty\freetype\include;$(SolutionDir)3rdparty\xz\xz\src\liblzma\api;$(SolutionDir)3rdparty/baseclasses/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(ProjectRootDir)/gui;$(SolutionDir)3rdparty\xbyak;$(SolutionDir)3rdparty\freetype\include;$(SolutionDir)3rdparty\xz\xz\src\liblzma\api;$(SolutionDir)3rdparty/baseclasses/;$(SolutionDir)3rdparty/zlib/;$(SolutionDir)3rdparty/libpng/;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<ExceptionHandling>Async</ExceptionHandling>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>PrecompiledHeader.h</PrecompiledHeaderFile>