1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxvk] Move presenter implementation to DXVK module

This commit is contained in:
Philip Rebohle 2023-05-29 13:18:13 +02:00
parent be875cd7e6
commit b1b0abdbbf
13 changed files with 42 additions and 45 deletions

View File

@ -350,8 +350,8 @@ namespace dxvk {
return DXGI_STATUS_OCCLUDED; return DXGI_STATUS_OCCLUDED;
// Presentation semaphores and WSI swap chain image // Presentation semaphores and WSI swap chain image
vk::PresenterInfo info = m_presenter->info(); PresenterInfo info = m_presenter->info();
vk::PresenterSync sync; PresenterSync sync;
uint32_t imageIndex = 0; uint32_t imageIndex = 0;
@ -397,7 +397,7 @@ namespace dxvk {
void D3D11SwapChain::SubmitPresent( void D3D11SwapChain::SubmitPresent(
D3D11ImmediateContext* pContext, D3D11ImmediateContext* pContext,
const vk::PresenterSync& Sync, const PresenterSync& Sync,
uint32_t FrameId) { uint32_t FrameId) {
auto lock = pContext->LockContext(); auto lock = pContext->LockContext();
@ -441,7 +441,7 @@ namespace dxvk {
m_presentStatus.result = VK_SUCCESS; m_presentStatus.result = VK_SUCCESS;
m_dirtyHdrMetadata = true; m_dirtyHdrMetadata = true;
vk::PresenterDesc presenterDesc; PresenterDesc presenterDesc;
presenterDesc.imageExtent = { m_desc.Width, m_desc.Height }; presenterDesc.imageExtent = { m_desc.Width, m_desc.Height };
presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1); presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1);
presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats); presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats);
@ -479,21 +479,21 @@ namespace dxvk {
void D3D11SwapChain::CreatePresenter() { void D3D11SwapChain::CreatePresenter() {
DxvkDeviceQueue graphicsQueue = m_device->queues().graphics; DxvkDeviceQueue graphicsQueue = m_device->queues().graphics;
vk::PresenterDevice presenterDevice; PresenterDevice presenterDevice;
presenterDevice.queueFamily = graphicsQueue.queueFamily; presenterDevice.queueFamily = graphicsQueue.queueFamily;
presenterDevice.queue = graphicsQueue.queueHandle; presenterDevice.queue = graphicsQueue.queueHandle;
presenterDevice.adapter = m_device->adapter()->handle(); presenterDevice.adapter = m_device->adapter()->handle();
presenterDevice.features.fullScreenExclusive = m_device->features().extFullScreenExclusive; presenterDevice.features.fullScreenExclusive = m_device->features().extFullScreenExclusive;
presenterDevice.features.hdrMetadata = m_device->features().extHdrMetadata; presenterDevice.features.hdrMetadata = m_device->features().extHdrMetadata;
vk::PresenterDesc presenterDesc; PresenterDesc presenterDesc;
presenterDesc.imageExtent = { m_desc.Width, m_desc.Height }; presenterDesc.imageExtent = { m_desc.Width, m_desc.Height };
presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1); presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1);
presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats); presenterDesc.numFormats = PickFormats(m_desc.Format, presenterDesc.formats);
presenterDesc.numPresentModes = PickPresentModes(false, presenterDesc.presentModes); presenterDesc.numPresentModes = PickPresentModes(false, presenterDesc.presentModes);
presenterDesc.fullScreenExclusive = PickFullscreenMode(); presenterDesc.fullScreenExclusive = PickFullscreenMode();
m_presenter = new vk::Presenter( m_presenter = new Presenter(
m_device->adapter()->vki(), m_device->adapter()->vki(),
m_device->vkd(), m_device->vkd(),
presenterDevice, presenterDevice,
@ -513,7 +513,7 @@ namespace dxvk {
void D3D11SwapChain::CreateRenderTargetViews() { void D3D11SwapChain::CreateRenderTargetViews() {
vk::PresenterInfo info = m_presenter->info(); PresenterInfo info = m_presenter->info();
m_imageViews.clear(); m_imageViews.clear();
m_imageViews.resize(info.imageCount); m_imageViews.resize(info.imageCount);

View File

@ -97,7 +97,7 @@ namespace dxvk {
Rc<DxvkDevice> m_device; Rc<DxvkDevice> m_device;
Rc<DxvkContext> m_context; Rc<DxvkContext> m_context;
Rc<vk::Presenter> m_presenter; Rc<Presenter> m_presenter;
Rc<DxvkImage> m_swapImage; Rc<DxvkImage> m_swapImage;
Rc<DxvkImageView> m_swapImageView; Rc<DxvkImageView> m_swapImageView;
@ -130,7 +130,7 @@ namespace dxvk {
void SubmitPresent( void SubmitPresent(
D3D11ImmediateContext* pContext, D3D11ImmediateContext* pContext,
const vk::PresenterSync& Sync, const PresenterSync& Sync,
uint32_t FrameId); uint32_t FrameId);
void SynchronizePresent(); void SynchronizePresent();

View File

@ -754,8 +754,8 @@ namespace dxvk {
SynchronizePresent(); SynchronizePresent();
// Presentation semaphores and WSI swap chain image // Presentation semaphores and WSI swap chain image
vk::PresenterInfo info = m_presenter->info(); PresenterInfo info = m_presenter->info();
vk::PresenterSync sync; PresenterSync sync;
uint32_t imageIndex = 0; uint32_t imageIndex = 0;
@ -808,7 +808,7 @@ namespace dxvk {
} }
void D3D9SwapChainEx::SubmitPresent(const vk::PresenterSync& Sync, uint32_t FrameId) { void D3D9SwapChainEx::SubmitPresent(const PresenterSync& Sync, uint32_t FrameId) {
// Present from CS thread so that we don't // Present from CS thread so that we don't
// have to synchronize with it first. // have to synchronize with it first.
m_presentStatus.result = VK_NOT_READY; m_presentStatus.result = VK_NOT_READY;
@ -847,7 +847,7 @@ namespace dxvk {
m_presentStatus.result = VK_SUCCESS; m_presentStatus.result = VK_SUCCESS;
vk::PresenterDesc presenterDesc; PresenterDesc presenterDesc;
presenterDesc.imageExtent = GetPresentExtent(); presenterDesc.imageExtent = GetPresentExtent();
presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1); presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1);
presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats); presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats);
@ -883,19 +883,19 @@ namespace dxvk {
DxvkDeviceQueue graphicsQueue = m_device->queues().graphics; DxvkDeviceQueue graphicsQueue = m_device->queues().graphics;
vk::PresenterDevice presenterDevice; PresenterDevice presenterDevice;
presenterDevice.queueFamily = graphicsQueue.queueFamily; presenterDevice.queueFamily = graphicsQueue.queueFamily;
presenterDevice.queue = graphicsQueue.queueHandle; presenterDevice.queue = graphicsQueue.queueHandle;
presenterDevice.adapter = m_device->adapter()->handle(); presenterDevice.adapter = m_device->adapter()->handle();
vk::PresenterDesc presenterDesc; PresenterDesc presenterDesc;
presenterDesc.imageExtent = GetPresentExtent(); presenterDesc.imageExtent = GetPresentExtent();
presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1); presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1);
presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats); presenterDesc.numFormats = PickFormats(EnumerateFormat(m_presentParams.BackBufferFormat), presenterDesc.formats);
presenterDesc.numPresentModes = PickPresentModes(false, presenterDesc.presentModes); presenterDesc.numPresentModes = PickPresentModes(false, presenterDesc.presentModes);
presenterDesc.fullScreenExclusive = PickFullscreenMode(); presenterDesc.fullScreenExclusive = PickFullscreenMode();
m_presenter = new vk::Presenter( m_presenter = new Presenter(
m_device->adapter()->vki(), m_device->adapter()->vki(),
m_device->vkd(), m_device->vkd(),
presenterDevice, presenterDevice,
@ -916,7 +916,7 @@ namespace dxvk {
void D3D9SwapChainEx::CreateRenderTargetViews() { void D3D9SwapChainEx::CreateRenderTargetViews() {
vk::PresenterInfo info = m_presenter->info(); PresenterInfo info = m_presenter->info();
m_imageViews.clear(); m_imageViews.clear();
m_imageViews.resize(info.imageCount); m_imageViews.resize(info.imageCount);

View File

@ -134,7 +134,7 @@ namespace dxvk {
Rc<DxvkContext> m_context; Rc<DxvkContext> m_context;
Rc<DxvkSwapchainBlitter> m_blitter; Rc<DxvkSwapchainBlitter> m_blitter;
Rc<vk::Presenter> m_presenter; Rc<Presenter> m_presenter;
Rc<hud::Hud> m_hud; Rc<hud::Hud> m_hud;
@ -179,7 +179,7 @@ namespace dxvk {
void PresentImage(UINT PresentInterval); void PresentImage(UINT PresentInterval);
void SubmitPresent(const vk::PresenterSync& Sync, uint32_t FrameId); void SubmitPresent(const PresenterSync& Sync, uint32_t FrameId);
void SynchronizePresent(); void SynchronizePresent();

View File

@ -397,7 +397,7 @@ namespace dxvk {
m_cmdSubmissions.clear(); m_cmdSubmissions.clear();
m_cmdSparseBinds.clear(); m_cmdSparseBinds.clear();
m_wsiSemaphores = vk::PresenterSync(); m_wsiSemaphores = PresenterSync();
// Reset actual command buffers and pools // Reset actual command buffers and pools
m_graphicsPool->reset(); m_graphicsPool->reset();

View File

@ -2,8 +2,6 @@
#include <limits> #include <limits>
#include "../vulkan/vulkan_presenter.h"
#include "dxvk_bind_mask.h" #include "dxvk_bind_mask.h"
#include "dxvk_buffer.h" #include "dxvk_buffer.h"
#include "dxvk_descriptor.h" #include "dxvk_descriptor.h"
@ -14,6 +12,7 @@
#include "dxvk_lifetime.h" #include "dxvk_lifetime.h"
#include "dxvk_limits.h" #include "dxvk_limits.h"
#include "dxvk_pipelayout.h" #include "dxvk_pipelayout.h"
#include "dxvk_presenter.h"
#include "dxvk_signal.h" #include "dxvk_signal.h"
#include "dxvk_sparse.h" #include "dxvk_sparse.h"
#include "dxvk_staging.h" #include "dxvk_staging.h"
@ -354,7 +353,7 @@ namespace dxvk {
* The given semaphores must be binary semaphores. * The given semaphores must be binary semaphores.
* \param [in] wsiSemaphores Pair of WSI semaphores * \param [in] wsiSemaphores Pair of WSI semaphores
*/ */
void setWsiSemaphores(const vk::PresenterSync& wsiSemaphores) { void setWsiSemaphores(const PresenterSync& wsiSemaphores) {
m_wsiSemaphores = wsiSemaphores; m_wsiSemaphores = wsiSemaphores;
} }
@ -1027,7 +1026,7 @@ namespace dxvk {
DxvkCommandSubmissionInfo m_cmd; DxvkCommandSubmissionInfo m_cmd;
vk::PresenterSync m_wsiSemaphores = { }; PresenterSync m_wsiSemaphores = { };
DxvkLifetimeTracker m_resources; DxvkLifetimeTracker m_resources;
DxvkSignalTracker m_signalTracker; DxvkSignalTracker m_signalTracker;

View File

@ -252,7 +252,7 @@ namespace dxvk {
void DxvkDevice::presentImage( void DxvkDevice::presentImage(
const Rc<vk::Presenter>& presenter, const Rc<Presenter>& presenter,
DxvkSubmitStatus* status) { DxvkSubmitStatus* status) {
status->result = VK_NOT_READY; status->result = VK_NOT_READY;

View File

@ -15,6 +15,7 @@
#include "dxvk_objects.h" #include "dxvk_objects.h"
#include "dxvk_options.h" #include "dxvk_options.h"
#include "dxvk_pipemanager.h" #include "dxvk_pipemanager.h"
#include "dxvk_presenter.h"
#include "dxvk_queue.h" #include "dxvk_queue.h"
#include "dxvk_recycler.h" #include "dxvk_recycler.h"
#include "dxvk_renderpass.h" #include "dxvk_renderpass.h"
@ -25,8 +26,6 @@
#include "dxvk_unbound.h" #include "dxvk_unbound.h"
#include "dxvk_marker.h" #include "dxvk_marker.h"
#include "../vulkan/vulkan_presenter.h"
namespace dxvk { namespace dxvk {
class DxvkInstance; class DxvkInstance;
@ -458,7 +457,7 @@ namespace dxvk {
* \param [out] status Present status * \param [out] status Present status
*/ */
void presentImage( void presentImage(
const Rc<vk::Presenter>& presenter, const Rc<Presenter>& presenter,
DxvkSubmitStatus* status); DxvkSubmitStatus* status);
/** /**

View File

@ -1,14 +1,12 @@
#include "vulkan_presenter.h" #include "dxvk_presenter.h"
#include "../dxvk/dxvk_format.h"
#include "../wsi/wsi_window.h" #include "../wsi/wsi_window.h"
namespace dxvk::vk { namespace dxvk {
Presenter::Presenter( Presenter::Presenter(
const Rc<InstanceFn>& vki, const Rc<vk::InstanceFn>& vki,
const Rc<DeviceFn>& vkd, const Rc<vk::DeviceFn>& vkd,
PresenterDevice device, PresenterDevice device,
const PresenterDesc& desc) const PresenterDesc& desc)
: m_vki(vki), m_vkd(vkd), m_device(device) { : m_vki(vki), m_vkd(vkd), m_device(device) {

View File

@ -10,9 +10,11 @@
#include "../util/util_math.h" #include "../util/util_math.h"
#include "../util/util_string.h" #include "../util/util_string.h"
#include "vulkan_loader.h" #include "../vulkan/vulkan_loader.h"
namespace dxvk::vk { #include "dxvk_format.h"
namespace dxvk {
/** /**
* \brief Presenter description * \brief Presenter description
@ -95,8 +97,8 @@ namespace dxvk::vk {
public: public:
Presenter( Presenter(
const Rc<InstanceFn>& vki, const Rc<vk::InstanceFn>& vki,
const Rc<DeviceFn>& vkd, const Rc<vk::DeviceFn>& vkd,
PresenterDevice device, PresenterDevice device,
const PresenterDesc& desc); const PresenterDesc& desc);
@ -201,8 +203,8 @@ namespace dxvk::vk {
private: private:
Rc<InstanceFn> m_vki; Rc<vk::InstanceFn> m_vki;
Rc<DeviceFn> m_vkd; Rc<vk::DeviceFn> m_vkd;
PresenterDevice m_device; PresenterDevice m_device;
PresenterInfo m_info; PresenterInfo m_info;

View File

@ -6,9 +6,8 @@
#include "../util/thread.h" #include "../util/thread.h"
#include "../vulkan/vulkan_presenter.h"
#include "dxvk_cmdlist.h" #include "dxvk_cmdlist.h"
#include "dxvk_presenter.h"
namespace dxvk { namespace dxvk {
@ -43,7 +42,7 @@ namespace dxvk {
* a swap chain image on the device. * a swap chain image on the device.
*/ */
struct DxvkPresentInfo { struct DxvkPresentInfo {
Rc<vk::Presenter> presenter; Rc<Presenter> presenter;
}; };

View File

@ -92,6 +92,7 @@ dxvk_src = [
'dxvk_options.cpp', 'dxvk_options.cpp',
'dxvk_pipelayout.cpp', 'dxvk_pipelayout.cpp',
'dxvk_pipemanager.cpp', 'dxvk_pipemanager.cpp',
'dxvk_presenter.cpp',
'dxvk_queue.cpp', 'dxvk_queue.cpp',
'dxvk_resource.cpp', 'dxvk_resource.cpp',
'dxvk_sampler.cpp', 'dxvk_sampler.cpp',

View File

@ -1,7 +1,6 @@
vkcommon_src = files([ vkcommon_src = files([
'vulkan_loader.cpp', 'vulkan_loader.cpp',
'vulkan_names.cpp', 'vulkan_names.cpp',
'vulkan_presenter.cpp',
]) ])
thread_dep = dependency('threads') thread_dep = dependency('threads')