Compare commits

..

3 Commits

Author SHA1 Message Date
Skyth (Asilkan) 3d6dca1e6d Remove D3D12 -> Vulkan redirections. 2025-07-29 17:15:55 +03:00
Skyth 9ed7a53b4c Fix validation errors in Agility SDK 1.616.1. 2025-07-24 20:14:52 +03:00
ĐeäTh ada0db62dc Fix compilation errors on latest Windows (#1636) 2025-07-24 16:07:10 +03:00
6 changed files with 55 additions and 34 deletions
+2 -1
View File
@@ -357,7 +357,8 @@ if (WIN32)
ntdll
Shcore
Synchronization
winmm
winmm
windowsapp
)
endif()
+7 -1
View File
@@ -1566,6 +1566,10 @@ namespace plume {
auto makeBarrier = [&](ID3D12Resource *resource, D3D12_RESOURCE_STATES stateBefore, D3D12_RESOURCE_STATES stateAfter, bool supportsUAV, D3D12_RESOURCE_BARRIER &resourceBarrier) {
resourceBarrier = {};
if (type == RenderCommandListType::COPY) {
return false;
}
if (stateBefore != stateAfter) {
resourceBarrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
resourceBarrier.Transition.StateBefore = stateBefore;
@@ -2228,11 +2232,13 @@ namespace plume {
this->device = device;
HRESULT res = device->d3d->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d));
HRESULT res = device->d3d->CreateFence(1, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d));
if (FAILED(res)) {
fprintf(stderr, "CreateFence failed with error code 0x%lX.\n", res);
return;
}
semaphoreValue = 1;
}
D3D12CommandSemaphore::~D3D12CommandSemaphore() {
+44 -21
View File
@@ -315,6 +315,10 @@ static std::unique_ptr<RenderCommandQueue> g_copyQueue;
static std::unique_ptr<RenderCommandList> g_copyCommandList;
static std::unique_ptr<RenderCommandFence> g_copyCommandFence;
static Mutex g_discardMutex;
static std::unique_ptr<RenderCommandList> g_discardCommandList;
static std::unique_ptr<RenderCommandFence> g_discardCommandFence;
static std::unique_ptr<RenderSwapChain> g_swapChain;
static bool g_swapChainValid;
@@ -1724,23 +1728,10 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver, bool graphicsApiRetry)
{
bool redirectToVulkan = false;
if (deviceDescription.vendor == RenderDeviceVendor::AMD)
{
// AMD Drivers before this version have a known issue where MSAA resolve targets will fail to work correctly.
// If no specific graphics API was selected, we silently destroy this one and move to the next option as it'll
// just work incorrectly otherwise and result in visual glitches and 3D rendering not working in general.
constexpr uint64_t MinimumAMDDriverVersion = 0x1F00005DC2005CULL; // 31.0.24002.92
if ((Config::GraphicsAPI == EGraphicsAPI::Auto) && (deviceDescription.driverVersion < MinimumAMDDriverVersion))
redirectToVulkan = true;
}
else if (deviceDescription.vendor == RenderDeviceVendor::INTEL)
{
// Intel drivers on D3D12 are extremely buggy, introducing various graphical glitches.
// We will redirect users to Vulkan until a workaround can be found.
if (Config::GraphicsAPI == EGraphicsAPI::Auto)
redirectToVulkan = true;
}
// ...
// There used to be driver redirections here, but they are all free from Vulkan purgatory for now...
// ...
if (redirectToVulkan)
{
g_device.reset();
@@ -1757,10 +1748,6 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver, bool graphicsApiRetry)
continue;
}
}
// Hardware resolve seems to be completely bugged on Intel D3D12 drivers.
g_hardwareResolve = (deviceDescription.vendor != RenderDeviceVendor::INTEL);
g_hardwareDepthResolve = (deviceDescription.vendor != RenderDeviceVendor::INTEL);
}
g_vulkan = (interfaceFunction == CreateVulkanInterfaceWrapper);
@@ -1849,6 +1836,12 @@ bool Video::CreateHostDevice(const char *sdlVideoDriver, bool graphicsApiRetry)
g_copyCommandList = g_device->createCommandList(RenderCommandListType::COPY);
g_copyCommandFence = g_device->createCommandFence();
if (!g_vulkan)
{
g_discardCommandList = g_device->createCommandList(RenderCommandListType::DIRECT);
g_discardCommandFence = g_device->createCommandFence();
}
uint32_t bufferCount = 2;
switch (Config::TripleBuffering)
@@ -3093,6 +3086,27 @@ static RenderFormat ConvertFormat(uint32_t format)
}
}
static void DiscardTexture(GuestBaseTexture* texture, RenderTextureLayout layout)
{
if (!g_vulkan)
{
std::lock_guard lock(g_discardMutex);
g_discardCommandList->begin();
if (texture->layout != layout)
{
g_discardCommandList->barriers(RenderBarrierStage::GRAPHICS, RenderTextureBarrier(texture->texture, layout));
texture->layout = layout;
}
g_discardCommandList->discardTexture(texture->texture);
g_discardCommandList->end();
g_queue->executeCommandLists(g_discardCommandList.get(), g_discardCommandFence.get());
g_queue->waitForCommandFence(g_discardCommandFence.get());
}
}
static GuestTexture* CreateTexture(uint32_t width, uint32_t height, uint32_t depth, uint32_t levels, uint32_t usage, uint32_t format, uint32_t pool, uint32_t type)
{
const auto texture = g_userHeap.AllocPhysical<GuestTexture>(type == 17 ? ResourceType::VolumeTexture : ResourceType::Texture);
@@ -3150,6 +3164,12 @@ static GuestTexture* CreateTexture(uint32_t width, uint32_t height, uint32_t dep
texture->texture->setName(fmt::format("Texture {:X}", g_memory.MapVirtual(texture)));
#endif
if (desc.flags != RenderTextureFlag::NONE)
{
DiscardTexture(texture, desc.flags == RenderTextureFlag::RENDER_TARGET ?
RenderTextureLayout::COLOR_WRITE : RenderTextureLayout::DEPTH_WRITE);
}
return texture;
}
@@ -3218,6 +3238,9 @@ static GuestSurface* CreateSurface(uint32_t width, uint32_t height, uint32_t for
surface->texture->setName(fmt::format("{} {:X}", desc.flags & RenderTextureFlag::RENDER_TARGET ? "Render Target" : "Depth Stencil", g_memory.MapVirtual(surface)));
#endif
DiscardTexture(surface, desc.flags == RenderTextureFlag::RENDER_TARGET ?
RenderTextureLayout::COLOR_WRITE : RenderTextureLayout::DEPTH_WRITE);
return surface;
}
+1 -8
View File
@@ -333,14 +333,7 @@ int main(int argc, char *argv[])
if (!InstallerWizard::Run(GAME_INSTALL_DIRECTORY, isGameInstalled && forceDLCInstaller))
{
if (!forceDLCInstaller)
{
std::_Exit(0);
}
else
{
InstallerWizard::s_returnToTitle = true;
}
std::_Exit(0);
}
}
+1 -2
View File
@@ -1,6 +1,5 @@
#include <api/SWA.h>
#include <ui/game_window.h>
#include <ui/installer_wizard.h>
#include <user/achievement_manager.h>
#include <user/persistent_storage_manager.h>
#include <user/config.h>
@@ -84,7 +83,7 @@ PPC_FUNC(sub_825197C0)
PPC_FUNC_IMPL(__imp__sub_82547DF0);
PPC_FUNC(sub_82547DF0)
{
if (Config::SkipIntroLogos || InstallerWizard::s_returnToTitle)
if (Config::SkipIntroLogos)
{
ctx.r4.u64 = 0;
ctx.r5.u64 = 0;
-1
View File
@@ -5,7 +5,6 @@
struct InstallerWizard
{
static inline bool s_isVisible = false;
static inline bool s_returnToTitle = false;
static void Init();
static void Draw();