mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-20 19:54:19 +01:00
[dxvk] Rework presenter creation to take a DxvkDevice
This way we can easily query available Vulkan features.
This commit is contained in:
parent
b1b0abdbbf
commit
1728d9e89d
@ -477,15 +477,6 @@ namespace dxvk {
|
||||
|
||||
|
||||
void D3D11SwapChain::CreatePresenter() {
|
||||
DxvkDeviceQueue graphicsQueue = m_device->queues().graphics;
|
||||
|
||||
PresenterDevice presenterDevice;
|
||||
presenterDevice.queueFamily = graphicsQueue.queueFamily;
|
||||
presenterDevice.queue = graphicsQueue.queueHandle;
|
||||
presenterDevice.adapter = m_device->adapter()->handle();
|
||||
presenterDevice.features.fullScreenExclusive = m_device->features().extFullScreenExclusive;
|
||||
presenterDevice.features.hdrMetadata = m_device->features().extHdrMetadata;
|
||||
|
||||
PresenterDesc presenterDesc;
|
||||
presenterDesc.imageExtent = { m_desc.Width, m_desc.Height };
|
||||
presenterDesc.imageCount = PickImageCount(m_desc.BufferCount + 1);
|
||||
@ -493,12 +484,7 @@ namespace dxvk {
|
||||
presenterDesc.numPresentModes = PickPresentModes(false, presenterDesc.presentModes);
|
||||
presenterDesc.fullScreenExclusive = PickFullscreenMode();
|
||||
|
||||
m_presenter = new Presenter(
|
||||
m_device->adapter()->vki(),
|
||||
m_device->vkd(),
|
||||
presenterDevice,
|
||||
presenterDesc);
|
||||
|
||||
m_presenter = new Presenter(m_device, presenterDesc);
|
||||
m_presenter->setFrameRateLimit(m_parent->GetOptions()->maxFrameRate);
|
||||
}
|
||||
|
||||
|
@ -881,13 +881,6 @@ namespace dxvk {
|
||||
|
||||
m_presentStatus.result = VK_SUCCESS;
|
||||
|
||||
DxvkDeviceQueue graphicsQueue = m_device->queues().graphics;
|
||||
|
||||
PresenterDevice presenterDevice;
|
||||
presenterDevice.queueFamily = graphicsQueue.queueFamily;
|
||||
presenterDevice.queue = graphicsQueue.queueHandle;
|
||||
presenterDevice.adapter = m_device->adapter()->handle();
|
||||
|
||||
PresenterDesc presenterDesc;
|
||||
presenterDesc.imageExtent = GetPresentExtent();
|
||||
presenterDesc.imageCount = PickImageCount(m_presentParams.BackBufferCount + 1);
|
||||
@ -895,12 +888,7 @@ namespace dxvk {
|
||||
presenterDesc.numPresentModes = PickPresentModes(false, presenterDesc.presentModes);
|
||||
presenterDesc.fullScreenExclusive = PickFullscreenMode();
|
||||
|
||||
m_presenter = new Presenter(
|
||||
m_device->adapter()->vki(),
|
||||
m_device->vkd(),
|
||||
presenterDevice,
|
||||
presenterDesc);
|
||||
|
||||
m_presenter = new Presenter(m_device, presenterDesc);
|
||||
m_presenter->setFrameRateLimit(m_parent->GetOptions()->maxFrameRate);
|
||||
}
|
||||
|
||||
|
@ -563,7 +563,7 @@ namespace dxvk {
|
||||
|
||||
DxvkRecycler<DxvkCommandList, 16> m_recycledCommandLists;
|
||||
|
||||
DxvkSubmissionQueue m_submissionQueue;
|
||||
DxvkSubmissionQueue m_submissionQueue;
|
||||
|
||||
DxvkDevicePerfHints getPerfHints();
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include "dxvk_device.h"
|
||||
#include "dxvk_presenter.h"
|
||||
|
||||
#include "../wsi/wsi_window.h"
|
||||
@ -5,11 +6,11 @@
|
||||
namespace dxvk {
|
||||
|
||||
Presenter::Presenter(
|
||||
const Rc<vk::InstanceFn>& vki,
|
||||
const Rc<vk::DeviceFn>& vkd,
|
||||
PresenterDevice device,
|
||||
const Rc<DxvkDevice>& device,
|
||||
const PresenterDesc& desc)
|
||||
: m_vki(vki), m_vkd(vkd), m_device(device) {
|
||||
: m_device(device),
|
||||
m_vki(device->instance()->vki()),
|
||||
m_vkd(device->vkd()) {
|
||||
|
||||
}
|
||||
|
||||
@ -58,7 +59,8 @@ namespace dxvk {
|
||||
info.pSwapchains = &m_swapchain;
|
||||
info.pImageIndices = &m_imageIndex;
|
||||
|
||||
VkResult status = m_vkd->vkQueuePresentKHR(m_device.queue, &info);
|
||||
VkResult status = m_vkd->vkQueuePresentKHR(
|
||||
m_device->queues().graphics.queueHandle, &info);
|
||||
|
||||
if (status != VK_SUCCESS && status != VK_SUBOPTIMAL_KHR)
|
||||
return status;
|
||||
@ -111,7 +113,7 @@ namespace dxvk {
|
||||
VkResult status;
|
||||
|
||||
if ((status = m_vki->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
|
||||
m_device.adapter, m_surface, &caps)))
|
||||
m_device->adapter()->handle(), m_surface, &caps)))
|
||||
return status;
|
||||
|
||||
if ((status = getSupportedFormats(formats, desc.fullScreenExclusive)))
|
||||
@ -151,7 +153,7 @@ namespace dxvk {
|
||||
swapInfo.clipped = VK_TRUE;
|
||||
swapInfo.oldSwapchain = VK_NULL_HANDLE;
|
||||
|
||||
if (m_device.features.fullScreenExclusive)
|
||||
if (m_device->features().extFullScreenExclusive)
|
||||
swapInfo.pNext = &fullScreenInfo;
|
||||
|
||||
Logger::info(str::format(
|
||||
@ -238,7 +240,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
void Presenter::setHdrMetadata(const VkHdrMetadataEXT& hdrMetadata) {
|
||||
if (m_device.features.hdrMetadata)
|
||||
if (m_device->features().extHdrMetadata)
|
||||
m_vkd->vkSetHdrMetadataEXT(m_vkd->device(), 1, &m_swapchain, &hdrMetadata);
|
||||
}
|
||||
|
||||
@ -254,12 +256,12 @@ namespace dxvk {
|
||||
|
||||
VkResult status;
|
||||
|
||||
if (m_device.features.fullScreenExclusive) {
|
||||
if (m_device->features().extFullScreenExclusive) {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfaceFormats2KHR(
|
||||
m_device.adapter, &surfaceInfo, &numFormats, nullptr);
|
||||
m_device->adapter()->handle(), &surfaceInfo, &numFormats, nullptr);
|
||||
} else {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfaceFormatsKHR(
|
||||
m_device.adapter, m_surface, &numFormats, nullptr);
|
||||
m_device->adapter()->handle(), m_surface, &numFormats, nullptr);
|
||||
}
|
||||
|
||||
if (status != VK_SUCCESS)
|
||||
@ -267,18 +269,18 @@ namespace dxvk {
|
||||
|
||||
formats.resize(numFormats);
|
||||
|
||||
if (m_device.features.fullScreenExclusive) {
|
||||
if (m_device->features().extFullScreenExclusive) {
|
||||
std::vector<VkSurfaceFormat2KHR> tmpFormats(numFormats,
|
||||
{ VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR, nullptr, VkSurfaceFormatKHR() });
|
||||
|
||||
status = m_vki->vkGetPhysicalDeviceSurfaceFormats2KHR(
|
||||
m_device.adapter, &surfaceInfo, &numFormats, tmpFormats.data());
|
||||
m_device->adapter()->handle(), &surfaceInfo, &numFormats, tmpFormats.data());
|
||||
|
||||
for (uint32_t i = 0; i < numFormats; i++)
|
||||
formats[i] = tmpFormats[i].surfaceFormat;
|
||||
} else {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfaceFormatsKHR(
|
||||
m_device.adapter, m_surface, &numFormats, formats.data());
|
||||
m_device->adapter()->handle(), m_surface, &numFormats, formats.data());
|
||||
}
|
||||
|
||||
return status;
|
||||
@ -296,12 +298,12 @@ namespace dxvk {
|
||||
|
||||
VkResult status;
|
||||
|
||||
if (m_device.features.fullScreenExclusive) {
|
||||
if (m_device->features().extFullScreenExclusive) {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfacePresentModes2EXT(
|
||||
m_device.adapter, &surfaceInfo, &numModes, nullptr);
|
||||
m_device->adapter()->handle(), &surfaceInfo, &numModes, nullptr);
|
||||
} else {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfacePresentModesKHR(
|
||||
m_device.adapter, m_surface, &numModes, nullptr);
|
||||
m_device->adapter()->handle(), m_surface, &numModes, nullptr);
|
||||
}
|
||||
|
||||
if (status != VK_SUCCESS)
|
||||
@ -309,12 +311,12 @@ namespace dxvk {
|
||||
|
||||
modes.resize(numModes);
|
||||
|
||||
if (m_device.features.fullScreenExclusive) {
|
||||
if (m_device->features().extFullScreenExclusive) {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfacePresentModes2EXT(
|
||||
m_device.adapter, &surfaceInfo, &numModes, modes.data());
|
||||
m_device->adapter()->handle(), &surfaceInfo, &numModes, modes.data());
|
||||
} else {
|
||||
status = m_vki->vkGetPhysicalDeviceSurfacePresentModesKHR(
|
||||
m_device.adapter, m_surface, &numModes, modes.data());
|
||||
m_device->adapter()->handle(), m_surface, &numModes, modes.data());
|
||||
}
|
||||
|
||||
return status;
|
||||
|
@ -16,6 +16,8 @@
|
||||
|
||||
namespace dxvk {
|
||||
|
||||
class DxvkDevice;
|
||||
|
||||
/**
|
||||
* \brief Presenter description
|
||||
*
|
||||
@ -46,24 +48,6 @@ namespace dxvk {
|
||||
uint32_t imageCount;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Presenter features
|
||||
*/
|
||||
struct PresenterFeatures {
|
||||
bool fullScreenExclusive : 1;
|
||||
bool hdrMetadata : 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Adapter and queue
|
||||
*/
|
||||
struct PresenterDevice {
|
||||
uint32_t queueFamily = 0;
|
||||
VkQueue queue = VK_NULL_HANDLE;
|
||||
VkPhysicalDevice adapter = VK_NULL_HANDLE;
|
||||
PresenterFeatures features = { };
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Swap image and view
|
||||
*/
|
||||
@ -97,9 +81,7 @@ namespace dxvk {
|
||||
public:
|
||||
|
||||
Presenter(
|
||||
const Rc<vk::InstanceFn>& vki,
|
||||
const Rc<vk::DeviceFn>& vkd,
|
||||
PresenterDevice device,
|
||||
const Rc<DxvkDevice>& device,
|
||||
const PresenterDesc& desc);
|
||||
|
||||
~Presenter();
|
||||
@ -203,10 +185,11 @@ namespace dxvk {
|
||||
|
||||
private:
|
||||
|
||||
Rc<DxvkDevice> m_device;
|
||||
|
||||
Rc<vk::InstanceFn> m_vki;
|
||||
Rc<vk::DeviceFn> m_vkd;
|
||||
|
||||
PresenterDevice m_device;
|
||||
PresenterInfo m_info;
|
||||
|
||||
VkSurfaceKHR m_surface = VK_NULL_HANDLE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user