Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-09-01 01:15:09 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-09-01 01:15:09 +0300
commita3fa9c26dce09a4e21935789e4f13bb537b19021 (patch)
treeb2af388beeb2add9faffbc97acbdbaa5aedfa347
parentff5507769adb6546a96da99c83e8f455c81afdda (diff)
Revert "[d3d11] Implement DXGI_SWAP_EFFECT_SEQUENTIAL and FLIP_SEQUENTIAL"
This reverts commit 79f6239df36a697ec79a1782d1df3b10607afcd1. Some engines use SEQUENTIAL presentation despite not making use of it, and sparse binding is much slower than expected on Nvidia drivers, which leads to massive performance regressions across the board.
-rw-r--r--src/d3d11/d3d11_swapchain.cpp130
-rw-r--r--src/d3d11/d3d11_swapchain.h54
-rw-r--r--src/d3d11/d3d11_texture.cpp4
3 files changed, 35 insertions, 153 deletions
diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp
index d9cc6172..0e823f41 100644
--- a/src/d3d11/d3d11_swapchain.cpp
+++ b/src/d3d11/d3d11_swapchain.cpp
@@ -140,12 +140,12 @@ namespace dxvk {
void** ppBuffer) {
InitReturnPtr(ppBuffer);
- if (BufferId > m_backBuffers.size()) {
- Logger::err(str::format("D3D11: Invalid buffer index: ", BufferId));
+ if (BufferId > 0) {
+ Logger::err("D3D11: GetImage: BufferId > 0 not supported");
return DXGI_ERROR_UNSUPPORTED;
}
- return m_backBuffers[BufferId]->QueryInterface(riid, ppBuffer);
+ return m_backBuffer->QueryInterface(riid, ppBuffer);
}
@@ -396,10 +396,7 @@ namespace dxvk {
if (m_hud != nullptr)
m_hud->render(m_context, info.format, info.imageExtent);
-
- if (!SyncInterval || i == SyncInterval - 1)
- RotateBackBuffer();
-
+
SubmitPresent(immediateContext, sync, i);
}
@@ -562,25 +559,11 @@ namespace dxvk {
void D3D11SwapChain::CreateBackBuffer() {
- bool sequentialPresent = false;
-
- if (IsSequentialSwapChain()) {
- if (!(sequentialPresent = SupportsSparseImages())) {
- Logger::warn("Sequential present mode requeted, but sparse images not supported"
- "by the Vulkan implementation. Falling back to Discard semantics.");
- }
- }
-
// Explicitly destroy current swap image before
// creating a new one to free up resources
- m_swapImages.clear();
- m_backBuffers.clear();
- m_swapImageView = nullptr;
-
- uint32_t bufferCount = 1u;
-
- if (sequentialPresent)
- bufferCount = m_desc.BufferCount;
+ m_swapImage = nullptr;
+ m_swapImageView = nullptr;
+ m_backBuffer = nullptr;
// Create new back buffer
D3D11_COMMON_TEXTURE_DESC desc;
@@ -609,47 +592,27 @@ namespace dxvk {
if (m_desc.Flags & DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE)
desc.MiscFlags |= D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
- if (sequentialPresent)
- desc.MiscFlags |= D3D11_RESOURCE_MISC_TILED;
-
DXGI_USAGE dxgiUsage = DXGI_USAGE_BACK_BUFFER;
if (m_desc.SwapEffect == DXGI_SWAP_EFFECT_DISCARD
|| m_desc.SwapEffect == DXGI_SWAP_EFFECT_FLIP_DISCARD)
dxgiUsage |= DXGI_USAGE_DISCARD_ON_PRESENT;
- for (uint32_t i = 0; i < bufferCount; i++) {
- m_backBuffers.push_back(new D3D11Texture2D(m_parent, this, &desc, dxgiUsage));
- m_swapImages.push_back(GetCommonTexture(m_backBuffers.back().ptr())->GetImage());
-
- dxgiUsage |= DXGI_USAGE_READ_ONLY;
- }
-
- // If necessary, create a sparse page allocator
- m_sparseFrameIndex = 0;
-
- if (sequentialPresent) {
- m_sparsePagesPerImage = m_swapImages.front()->getSparsePageTable()->getPageCount();
-
- m_sparseAllocator = m_device->createSparsePageAllocator();
- m_sparseAllocator->setCapacity(m_sparsePagesPerImage * bufferCount);
- } else {
- m_sparsePagesPerImage = 0;
- m_sparseAllocator = nullptr;
- }
+ m_backBuffer = new D3D11Texture2D(m_parent, this, &desc, dxgiUsage);
+ m_swapImage = GetCommonTexture(m_backBuffer.ptr())->GetImage();
// Create an image view that allows the
// image to be bound as a shader resource.
DxvkImageViewCreateInfo viewInfo;
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
- viewInfo.format = m_swapImages.front()->info().format;
+ viewInfo.format = m_swapImage->info().format;
viewInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
viewInfo.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
viewInfo.minLevel = 0;
viewInfo.numLevels = 1;
viewInfo.minLayer = 0;
viewInfo.numLayers = 1;
- m_swapImageView = m_device->createImageView(m_swapImages.front(), viewInfo);
+ m_swapImageView = m_device->createImageView(m_swapImage, viewInfo);
// Initialize the image so that we can use it. Clearing
// to black prevents garbled output for the first frame.
@@ -663,30 +626,8 @@ namespace dxvk {
m_context->beginRecording(
m_device->createCommandList());
- for (uint32_t i = 0; i < m_swapImages.size(); i++) {
- if (sequentialPresent) {
- DxvkSparseBindInfo sparseBind;
- sparseBind.dstResource = m_swapImages[i];
- sparseBind.srcAllocator = m_sparseAllocator;
-
- for (uint32_t j = 0; j < m_sparsePagesPerImage; j++) {
- auto& bind = sparseBind.binds.emplace_back();
- bind.mode = DxvkSparseBindMode::Bind;
- bind.srcPage = j + i * m_sparsePagesPerImage;
- bind.dstPage = j;
- }
-
- m_context->updatePageTable(sparseBind,
- DxvkSparseBindFlag::SkipSynchronization);
- m_context->initSparseImage(m_swapImages[i]);
-
- Rc<DxvkImageView> view = m_device->createImageView(m_swapImages.front(), viewInfo);
- m_context->clearRenderTarget(view, VK_IMAGE_ASPECT_COLOR_BIT, VkClearValue());
- } else {
- m_context->initImage(m_swapImages[i],
- subresources, VK_IMAGE_LAYOUT_UNDEFINED);
- }
- }
+ m_context->initImage(m_swapImage,
+ subresources, VK_IMAGE_LAYOUT_UNDEFINED);
m_device->submitCommandList(
m_context->endRecording(),
@@ -797,51 +738,6 @@ namespace dxvk {
}
- void D3D11SwapChain::RotateBackBuffer() {
- uint32_t bufferCount = m_swapImages.size();
-
- if (bufferCount < 2)
- return;
-
- m_sparseFrameIndex += 1;
- m_sparseFrameIndex %= bufferCount;
-
- for (uint32_t i = 0; i < bufferCount; i++) {
- uint32_t firstImage = (m_sparseFrameIndex + i) % bufferCount;
-
- DxvkSparseBindInfo sparseBind;
- sparseBind.dstResource = m_swapImages[i];
- sparseBind.srcAllocator = m_sparseAllocator;
-
- for (uint32_t j = 0; j < m_sparsePagesPerImage; j++) {
- auto& bind = sparseBind.binds.emplace_back();
- bind.mode = DxvkSparseBindMode::Bind;
- bind.srcPage = j + firstImage * m_sparsePagesPerImage;
- bind.dstPage = j;
- }
-
- m_context->updatePageTable(sparseBind, 0);
- }
- }
-
-
- bool D3D11SwapChain::IsSequentialSwapChain() const {
- return m_desc.SwapEffect == DXGI_SWAP_EFFECT_SEQUENTIAL
- || m_desc.SwapEffect == DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
- }
-
-
- bool D3D11SwapChain::SupportsSparseImages() const {
- const auto& properties = m_device->properties().core.properties;
- const auto& features = m_device->features().core.features;
-
- return features.sparseBinding
- && features.sparseResidencyImage2D
- && features.sparseResidencyAliased
- && properties.sparseProperties.residencyStandard2DBlockShape;
- }
-
-
std::string D3D11SwapChain::GetApiName() const {
Com<IDXGIDXVKDevice> device;
m_parent->QueryInterface(__uuidof(IDXGIDXVKDevice), reinterpret_cast<void**>(&device));
diff --git a/src/d3d11/d3d11_swapchain.h b/src/d3d11/d3d11_swapchain.h
index df9f5f16..00073d76 100644
--- a/src/d3d11/d3d11_swapchain.h
+++ b/src/d3d11/d3d11_swapchain.h
@@ -95,46 +95,42 @@ namespace dxvk {
Com<D3D11DXGIDevice, false> m_dxgiDevice;
- D3D11Device* m_parent;
- Com<IDXGIVkSurfaceFactory> m_surfaceFactory;
+ D3D11Device* m_parent;
+ Com<IDXGIVkSurfaceFactory> m_surfaceFactory;
- DXGI_SWAP_CHAIN_DESC1 m_desc;
+ DXGI_SWAP_CHAIN_DESC1 m_desc;
- Rc<DxvkDevice> m_device;
- Rc<DxvkContext> m_context;
+ Rc<DxvkDevice> m_device;
+ Rc<DxvkContext> m_context;
- Rc<Presenter> m_presenter;
+ Rc<Presenter> m_presenter;
- uint32_t m_sparseFrameIndex = 0u;
- uint32_t m_sparsePagesPerImage = 0u;
- Rc<DxvkSparsePageAllocator> m_sparseAllocator;
+ Rc<DxvkImage> m_swapImage;
+ Rc<DxvkImageView> m_swapImageView;
+ Rc<DxvkSwapchainBlitter> m_blitter;
- std::vector<Rc<DxvkImage>> m_swapImages;
- Rc<DxvkImageView> m_swapImageView;
- Rc<DxvkSwapchainBlitter> m_blitter;
+ Rc<hud::Hud> m_hud;
- Rc<hud::Hud> m_hud;
-
- std::vector<Com<D3D11Texture2D, false>> m_backBuffers;
- DxvkSubmitStatus m_presentStatus;
+ Com<D3D11Texture2D, false> m_backBuffer;
+ DxvkSubmitStatus m_presentStatus;
std::vector<Rc<DxvkImageView>> m_imageViews;
- uint64_t m_frameId = DXGI_MAX_SWAP_CHAIN_BUFFERS;
- uint32_t m_frameLatency = DefaultFrameLatency;
- uint32_t m_frameLatencyCap = 0;
- HANDLE m_frameLatencyEvent = nullptr;
- Rc<sync::CallbackFence> m_frameLatencySignal;
+ uint64_t m_frameId = DXGI_MAX_SWAP_CHAIN_BUFFERS;
+ uint32_t m_frameLatency = DefaultFrameLatency;
+ uint32_t m_frameLatencyCap = 0;
+ HANDLE m_frameLatencyEvent = nullptr;
+ Rc<sync::CallbackFence> m_frameLatencySignal;
- bool m_dirty = true;
+ bool m_dirty = true;
- VkColorSpaceKHR m_colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
+ VkColorSpaceKHR m_colorspace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
std::optional<VkHdrMetadataEXT> m_hdrMetadata;
- bool m_dirtyHdrMetadata = true;
+ bool m_dirtyHdrMetadata = true;
- dxvk::mutex m_frameStatisticsLock;
- DXGI_VK_FRAME_STATISTICS m_frameStatistics = { };
+ dxvk::mutex m_frameStatisticsLock;
+ DXGI_VK_FRAME_STATISTICS m_frameStatistics = { };
HRESULT PresentImage(UINT SyncInterval);
@@ -176,12 +172,6 @@ namespace dxvk {
VkFullScreenExclusiveEXT PickFullscreenMode();
- void RotateBackBuffer();
-
- bool IsSequentialSwapChain() const;
-
- bool SupportsSparseImages() const;
-
std::string GetApiName() const;
};
diff --git a/src/d3d11/d3d11_texture.cpp b/src/d3d11/d3d11_texture.cpp
index 26e7bea6..7a8c6043 100644
--- a/src/d3d11/d3d11_texture.cpp
+++ b/src/d3d11/d3d11_texture.cpp
@@ -249,10 +249,6 @@ namespace dxvk {
if (imageInfo.sharing.mode == DxvkSharedHandleMode::Export)
ExportImageInfo();
-
- // Hide some internal flags as necessary
- if (DxgiUsage & DXGI_USAGE_BACK_BUFFER)
- m_desc.MiscFlags &= ~D3D11_RESOURCE_MISC_TILED;
}