5 Commits

Author SHA1 Message Date
Dario
888f11e7f4 Update comment. 2025-03-13 19:12:05 -03:00
Dario
cb4eaae9ff Remove waitIdle and only accept valid pointers on execute. 2025-03-13 19:11:02 -03:00
Dario
9b7625f03e Remove the need for waitIdle from Vulkan. 2025-03-13 19:08:35 -03:00
Hyper
d0368665dd Update README FAQ (#1319) 2025-03-11 15:26:14 +00:00
João Moura
cc1018a8fc Pass release path to upload-artifact step on Windows builds (#1151) 2025-03-10 15:18:37 +03:00
8 changed files with 26 additions and 33 deletions

View File

@@ -145,13 +145,11 @@ jobs:
Move-Item -Path ".\out\build\${{ env.CMAKE_PRESET }}\UnleashedRecomp\dxil.dll" -Destination ".\release\dxil.dll"
Move-Item -Path ".\out\build\${{ env.CMAKE_PRESET }}\UnleashedRecomp\UnleashedRecomp.exe" -Destination ".\release\UnleashedRecomp.exe"
Compress-Archive -Path .\release\* -DestinationPath .\UnleashedRecomp-Windows.zip
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: UnleashedRecomp-Windows-${{ env.CMAKE_PRESET }}
path: .\UnleashedRecomp-Windows.zip
path: .\release
- name: Upload PDB
uses: actions/upload-artifact@v4

View File

@@ -278,9 +278,16 @@ Simply booting at least once in Desktop Mode will enable the Deck to use the fil
## FAQ
### Do you have a Discord server?
### Do you have a website or Discord server?
Unleashed Recompiled is not associated with any Discord servers. Use the [Issues](https://github.com/hedge-dev/UnleashedRecomp/issues) page if you need support.
Unleashed Recompiled does not have an official website, nor is it affiliated with any Discord servers.
**Please link here when directing anyone to the project.**
> [!CAUTION]
> Do not download builds of Unleashed Recompiled from anywhere but our [Releases](https://github.com/hedge-dev/UnleashedRecomp/releases/latest) page.
>
> **We will never distribute builds on other websites, via Discord servers or via third-party update tools.**
### Why does the installer say my files are invalid?

View File

@@ -2285,6 +2285,9 @@ namespace plume {
}
void D3D12CommandQueue::executeCommandLists(const RenderCommandList **commandLists, uint32_t commandListCount, RenderCommandSemaphore **waitSemaphores, uint32_t waitSemaphoreCount, RenderCommandSemaphore **signalSemaphores, uint32_t signalSemaphoreCount, RenderCommandFence *signalFence) {
assert(commandLists != nullptr);
assert(commandListCount > 0);
for (uint32_t i = 0; i < waitSemaphoreCount; i++) {
D3D12CommandSemaphore *interfaceSemaphore = static_cast<D3D12CommandSemaphore *>(waitSemaphores[i]);
d3d->Wait(interfaceSemaphore->d3d, interfaceSemaphore->semaphoreValue);
@@ -2297,9 +2300,7 @@ namespace plume {
executionVector.emplace_back(static_cast<ID3D12CommandList *>(interfaceCommandList->d3d));
}
if (!executionVector.empty()) {
d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data());
}
d3d->ExecuteCommandLists(UINT(executionVector.size()), executionVector.data());
for (uint32_t i = 0; i < signalSemaphoreCount; i++) {
D3D12CommandSemaphore *interfaceSemaphore = static_cast<D3D12CommandSemaphore *>(signalSemaphores[i]);
@@ -3798,10 +3799,6 @@ namespace plume {
return countsSupported;
}
void D3D12Device::waitIdle() const {
assert(false && "Use fences to replicate wait idle behavior on D3D12.");
}
void D3D12Device::release() {
if (d3d != nullptr) {
d3d->Release();

View File

@@ -459,7 +459,6 @@ namespace plume {
const RenderDeviceCapabilities &getCapabilities() const override;
const RenderDeviceDescription &getDescription() const override;
RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override;
void waitIdle() const override;
void release();
bool isValid() const;
};

View File

@@ -200,7 +200,7 @@ namespace plume {
// Concrete implementation shortcuts.
inline void executeCommandLists(const RenderCommandList *commandList, RenderCommandFence *signalFence = nullptr) {
executeCommandLists(commandList != nullptr ? &commandList : nullptr, commandList != nullptr ? 1 : 0, nullptr, 0, nullptr, 0, signalFence);
executeCommandLists(&commandList, 1, nullptr, 0, nullptr, 0, signalFence);
}
};
@@ -242,7 +242,6 @@ namespace plume {
virtual const RenderDeviceCapabilities &getCapabilities() const = 0;
virtual const RenderDeviceDescription &getDescription() const = 0;
virtual RenderSampleCounts getSampleCountsSupported(RenderFormat format) const = 0;
virtual void waitIdle() const = 0;
};
struct RenderInterface {

View File

@@ -4190,10 +4190,6 @@ namespace plume {
}
}
void VulkanDevice::waitIdle() const {
vkDeviceWaitIdle(vk);
}
void VulkanDevice::release() {
if (allocator != VK_NULL_HANDLE) {
vmaDestroyAllocator(allocator);

View File

@@ -430,7 +430,6 @@ namespace plume {
const RenderDeviceCapabilities &getCapabilities() const override;
const RenderDeviceDescription &getDescription() const override;
RenderSampleCounts getSampleCountsSupported(RenderFormat format) const override;
void waitIdle() const override;
void release();
bool isValid() const;
};

View File

@@ -1973,23 +1973,21 @@ void Video::WaitForGPU()
{
g_waitForGPUCount++;
if (g_vulkan)
// Wait for all queued frames to finish.
for (size_t i = 0; i < NUM_FRAMES; i++)
{
g_device->waitIdle();
}
else
{
for (size_t i = 0; i < NUM_FRAMES; i++)
if (g_commandListStates[i])
{
if (g_commandListStates[i])
{
g_queue->waitForCommandFence(g_commandFences[i].get());
g_commandListStates[i] = false;
}
g_queue->waitForCommandFence(g_commandFences[i].get());
g_commandListStates[i] = false;
}
g_queue->executeCommandLists(nullptr, g_commandFences[0].get());
g_queue->waitForCommandFence(g_commandFences[0].get());
}
// Execute an empty command list and wait for it to end to guarantee that any remaining presentation has finished.
g_commandLists[0]->begin();
g_commandLists[0]->end();
g_queue->executeCommandLists(g_commandLists[0].get(), g_commandFences[0].get());
g_queue->waitForCommandFence(g_commandFences[0].get());
}
static uint32_t CreateDevice(uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5, be<uint32_t>* a6)