mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-28 07:54:14 +01:00
[dxgi] DxgiVkPresenter: use Microsoft-style API
This commit is contained in:
parent
5d7c83855e
commit
ded6dec7eb
@ -7,7 +7,7 @@
|
||||
|
||||
namespace dxvk {
|
||||
|
||||
DxgiPresenter::DxgiPresenter(
|
||||
DxgiVkPresenter::DxgiVkPresenter(
|
||||
const Rc<DxvkDevice>& device,
|
||||
HWND window)
|
||||
: m_device (device),
|
||||
@ -28,16 +28,16 @@ namespace dxvk {
|
||||
// Samplers for presentation. We'll create one with point sampling that will
|
||||
// be used when the back buffer resolution matches the output resolution, and
|
||||
// one with linar sampling that will be used when the image will be scaled.
|
||||
m_samplerFitting = this->createSampler(VK_FILTER_NEAREST, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER);
|
||||
m_samplerScaling = this->createSampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER);
|
||||
m_samplerFitting = CreateSampler(VK_FILTER_NEAREST, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER);
|
||||
m_samplerScaling = CreateSampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER);
|
||||
|
||||
// Create objects required for the gamma ramp. This is implemented partially
|
||||
// with an UBO, which stores global parameters, and a lookup texture, which
|
||||
// stores the actual gamma ramp and can be sampled with a linear filter.
|
||||
m_gammaUbo = this->createGammaUbo();
|
||||
m_gammaSampler = this->createSampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
|
||||
m_gammaTexture = this->createGammaTexture();
|
||||
m_gammaTextureView = this->createGammaTextureView();
|
||||
m_gammaUbo = CreateGammaUbo();
|
||||
m_gammaSampler = CreateSampler(VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE);
|
||||
m_gammaTexture = CreateGammaTexture();
|
||||
m_gammaTextureView = CreateGammaTextureView();
|
||||
|
||||
// Set up context state. The shader bindings and the
|
||||
// constant state objects will never be modified.
|
||||
@ -108,33 +108,33 @@ namespace dxvk {
|
||||
|
||||
m_context->bindShader(
|
||||
VK_SHADER_STAGE_VERTEX_BIT,
|
||||
this->createVertexShader());
|
||||
CreateVertexShader());
|
||||
|
||||
m_context->bindShader(
|
||||
VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||
this->createFragmentShader());
|
||||
CreateFragmentShader());
|
||||
|
||||
m_hud = hud::Hud::createHud(m_device);
|
||||
}
|
||||
|
||||
|
||||
DxgiPresenter::~DxgiPresenter() {
|
||||
DxgiVkPresenter::~DxgiVkPresenter() {
|
||||
m_device->waitForIdle();
|
||||
}
|
||||
|
||||
|
||||
void DxgiPresenter::initBackBuffer(const Rc<DxvkImage>& image) {
|
||||
void DxgiVkPresenter::InitBackBuffer(const Rc<DxvkImage>& Image) {
|
||||
m_context->beginRecording(
|
||||
m_device->createCommandList());
|
||||
|
||||
VkImageSubresourceRange sr;
|
||||
sr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
sr.baseMipLevel = 0;
|
||||
sr.levelCount = image->info().mipLevels;
|
||||
sr.levelCount = Image->info().mipLevels;
|
||||
sr.baseArrayLayer = 0;
|
||||
sr.layerCount = image->info().numLayers;
|
||||
sr.layerCount = Image->info().numLayers;
|
||||
|
||||
m_context->initImage(image, sr);
|
||||
m_context->initImage(Image, sr);
|
||||
|
||||
m_device->submitCommandList(
|
||||
m_context->endRecording(),
|
||||
@ -142,7 +142,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxgiPresenter::presentImage() {
|
||||
void DxgiVkPresenter::PresentImage() {
|
||||
if (m_hud != nullptr) {
|
||||
m_hud->render({
|
||||
m_options.preferredBufferSize.width,
|
||||
@ -222,22 +222,22 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxgiPresenter::updateBackBuffer(const Rc<DxvkImage>& image) {
|
||||
void DxgiVkPresenter::UpdateBackBuffer(const Rc<DxvkImage>& Image) {
|
||||
// Explicitly destroy the old stuff
|
||||
m_backBuffer = image;
|
||||
m_backBuffer = Image;
|
||||
m_backBufferResolve = nullptr;
|
||||
m_backBufferView = nullptr;
|
||||
|
||||
// If a multisampled back buffer was requested, we also need to
|
||||
// create a resolve image with otherwise identical properties.
|
||||
// Multisample images cannot be sampled from.
|
||||
if (image->info().sampleCount != VK_SAMPLE_COUNT_1_BIT) {
|
||||
if (Image->info().sampleCount != VK_SAMPLE_COUNT_1_BIT) {
|
||||
DxvkImageCreateInfo resolveInfo;
|
||||
resolveInfo.type = VK_IMAGE_TYPE_2D;
|
||||
resolveInfo.format = image->info().format;
|
||||
resolveInfo.format = Image->info().format;
|
||||
resolveInfo.flags = 0;
|
||||
resolveInfo.sampleCount = VK_SAMPLE_COUNT_1_BIT;
|
||||
resolveInfo.extent = image->info().extent;
|
||||
resolveInfo.extent = Image->info().extent;
|
||||
resolveInfo.numLayers = 1;
|
||||
resolveInfo.mipLevels = 1;
|
||||
resolveInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT
|
||||
@ -257,7 +257,7 @@ namespace dxvk {
|
||||
// image to be bound as a shader resource.
|
||||
DxvkImageViewCreateInfo viewInfo;
|
||||
viewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
||||
viewInfo.format = image->info().format;
|
||||
viewInfo.format = Image->info().format;
|
||||
viewInfo.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
viewInfo.minLevel = 0;
|
||||
viewInfo.numLevels = 1;
|
||||
@ -270,41 +270,39 @@ namespace dxvk {
|
||||
: m_backBuffer,
|
||||
viewInfo);
|
||||
|
||||
this->initBackBuffer(m_backBuffer);
|
||||
InitBackBuffer(m_backBuffer);
|
||||
}
|
||||
|
||||
|
||||
void DxgiPresenter::recreateSwapchain(const DxvkSwapchainProperties& options) {
|
||||
void DxgiVkPresenter::RecreateSwapchain(const DxvkSwapchainProperties* pOptions) {
|
||||
const bool doRecreate =
|
||||
options.preferredSurfaceFormat.format != m_options.preferredSurfaceFormat.format
|
||||
|| options.preferredSurfaceFormat.colorSpace != m_options.preferredSurfaceFormat.colorSpace
|
||||
|| options.preferredPresentMode != m_options.preferredPresentMode
|
||||
|| options.preferredBufferSize.width != m_options.preferredBufferSize.width
|
||||
|| options.preferredBufferSize.height != m_options.preferredBufferSize.height;
|
||||
pOptions->preferredSurfaceFormat.format != m_options.preferredSurfaceFormat.format
|
||||
|| pOptions->preferredSurfaceFormat.colorSpace != m_options.preferredSurfaceFormat.colorSpace
|
||||
|| pOptions->preferredPresentMode != m_options.preferredPresentMode
|
||||
|| pOptions->preferredBufferSize.width != m_options.preferredBufferSize.width
|
||||
|| pOptions->preferredBufferSize.height != m_options.preferredBufferSize.height;
|
||||
|
||||
if (doRecreate) {
|
||||
Logger::info(str::format(
|
||||
"DxgiPresenter: Recreating swap chain: ",
|
||||
"\n Format: ", options.preferredSurfaceFormat.format,
|
||||
"\n Present mode: ", options.preferredPresentMode,
|
||||
"\n Buffer size: ", options.preferredBufferSize.width, "x", options.preferredBufferSize.height));
|
||||
"DxgiVkPresenter: Recreating swap chain: ",
|
||||
"\n Format: ", pOptions->preferredSurfaceFormat.format,
|
||||
"\n Present mode: ", pOptions->preferredPresentMode,
|
||||
"\n Buffer size: ", pOptions->preferredBufferSize.width, "x", pOptions->preferredBufferSize.height));
|
||||
|
||||
m_options = options;
|
||||
if (m_swapchain == nullptr)
|
||||
m_swapchain = m_device->createSwapchain(m_surface, *pOptions);
|
||||
else
|
||||
m_swapchain->changeProperties(*pOptions);
|
||||
|
||||
if (m_swapchain == nullptr) {
|
||||
m_swapchain = m_device->createSwapchain(
|
||||
m_surface, options);
|
||||
} else {
|
||||
m_swapchain->changeProperties(options);
|
||||
}
|
||||
m_options = *pOptions;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VkSurfaceFormatKHR DxgiPresenter::pickSurfaceFormat(DXGI_FORMAT fmt) const {
|
||||
VkSurfaceFormatKHR DxgiVkPresenter::PickSurfaceFormat(DXGI_FORMAT Fmt) const {
|
||||
std::vector<VkSurfaceFormatKHR> formats;
|
||||
|
||||
switch (fmt) {
|
||||
switch (Fmt) {
|
||||
case DXGI_FORMAT_R8G8B8A8_UNORM:
|
||||
case DXGI_FORMAT_B8G8R8A8_UNORM: {
|
||||
formats.push_back({ VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR });
|
||||
@ -327,7 +325,7 @@ namespace dxvk {
|
||||
} break;
|
||||
|
||||
default:
|
||||
Logger::warn(str::format("DxgiPresenter: Unknown format: ", fmt));
|
||||
Logger::warn(str::format("DxgiVkPresenter: Unknown format: ", Fmt));
|
||||
}
|
||||
|
||||
return m_surface->pickSurfaceFormat(
|
||||
@ -335,12 +333,12 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
VkPresentModeKHR DxgiPresenter::pickPresentMode(VkPresentModeKHR preferred) const {
|
||||
return m_surface->pickPresentMode(1, &preferred);
|
||||
VkPresentModeKHR DxgiVkPresenter::PickPresentMode(VkPresentModeKHR Preferred) const {
|
||||
return m_surface->pickPresentMode(1, &Preferred);
|
||||
}
|
||||
|
||||
|
||||
void DxgiPresenter::setGammaControl(
|
||||
void DxgiVkPresenter::SetGammaControl(
|
||||
const DXGI_VK_GAMMA_INPUT_CONTROL* pGammaControl,
|
||||
const DXGI_VK_GAMMA_CURVE* pGammaCurve) {
|
||||
m_context->beginRecording(
|
||||
@ -362,21 +360,21 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkSampler> DxgiPresenter::createSampler(
|
||||
VkFilter filter,
|
||||
VkSamplerAddressMode addressMode) {
|
||||
Rc<DxvkSampler> DxgiVkPresenter::CreateSampler(
|
||||
VkFilter Filter,
|
||||
VkSamplerAddressMode AddressMode) {
|
||||
DxvkSamplerCreateInfo samplerInfo;
|
||||
samplerInfo.magFilter = filter;
|
||||
samplerInfo.minFilter = filter;
|
||||
samplerInfo.magFilter = Filter;
|
||||
samplerInfo.minFilter = Filter;
|
||||
samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
|
||||
samplerInfo.mipmapLodBias = 0.0f;
|
||||
samplerInfo.mipmapLodMin = 0.0f;
|
||||
samplerInfo.mipmapLodMax = 0.0f;
|
||||
samplerInfo.useAnisotropy = VK_FALSE;
|
||||
samplerInfo.maxAnisotropy = 1.0f;
|
||||
samplerInfo.addressModeU = addressMode;
|
||||
samplerInfo.addressModeV = addressMode;
|
||||
samplerInfo.addressModeW = addressMode;
|
||||
samplerInfo.addressModeU = AddressMode;
|
||||
samplerInfo.addressModeV = AddressMode;
|
||||
samplerInfo.addressModeW = AddressMode;
|
||||
samplerInfo.compareToDepth = VK_FALSE;
|
||||
samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS;
|
||||
samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
||||
@ -385,7 +383,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkBuffer> DxgiPresenter::createGammaUbo() {
|
||||
Rc<DxvkBuffer> DxgiVkPresenter::CreateGammaUbo() {
|
||||
DxvkBufferCreateInfo info;
|
||||
info.size = sizeof(DXGI_VK_GAMMA_INPUT_CONTROL);
|
||||
info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT
|
||||
@ -398,7 +396,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkImage> DxgiPresenter::createGammaTexture() {
|
||||
Rc<DxvkImage> DxgiVkPresenter::CreateGammaTexture() {
|
||||
DxvkImageCreateInfo info;
|
||||
info.type = VK_IMAGE_TYPE_1D;
|
||||
info.format = VK_FORMAT_R16G16B16A16_UNORM;
|
||||
@ -419,7 +417,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkImageView> DxgiPresenter::createGammaTextureView() {
|
||||
Rc<DxvkImageView> DxgiVkPresenter::CreateGammaTextureView() {
|
||||
DxvkImageViewCreateInfo info;
|
||||
info.type = VK_IMAGE_VIEW_TYPE_1D;
|
||||
info.format = VK_FORMAT_R16G16B16A16_UNORM;
|
||||
@ -432,7 +430,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkShader> DxgiPresenter::createVertexShader() {
|
||||
Rc<DxvkShader> DxgiVkPresenter::CreateVertexShader() {
|
||||
const SpirvCodeBuffer codeBuffer(dxgi_presenter_vert);
|
||||
|
||||
return m_device->createShader(
|
||||
@ -442,7 +440,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
Rc<DxvkShader> DxgiPresenter::createFragmentShader() {
|
||||
Rc<DxvkShader> DxgiVkPresenter::CreateFragmentShader() {
|
||||
const SpirvCodeBuffer codeBuffer(dxgi_presenter_frag);
|
||||
|
||||
// Shader resource slots
|
||||
|
@ -84,27 +84,26 @@ namespace dxvk {
|
||||
* \ref DxgiSwapChain to the Vulkan
|
||||
* swap chain.
|
||||
*/
|
||||
class DxgiPresenter : public RcObject {
|
||||
class DxgiVkPresenter : public RcObject {
|
||||
|
||||
public:
|
||||
|
||||
DxgiPresenter(
|
||||
DxgiVkPresenter(
|
||||
const Rc<DxvkDevice>& device,
|
||||
HWND window);
|
||||
|
||||
~DxgiPresenter();
|
||||
~DxgiVkPresenter();
|
||||
|
||||
/**
|
||||
* \brief Initializes back buffer image
|
||||
* \param [in] image Back buffer image
|
||||
*/
|
||||
void initBackBuffer(
|
||||
const Rc<DxvkImage>& image);
|
||||
void InitBackBuffer(const Rc<DxvkImage>& Image);
|
||||
|
||||
/**
|
||||
* \brief Renders back buffer to the screen
|
||||
*/
|
||||
void presentImage();
|
||||
void PresentImage();
|
||||
|
||||
/**
|
||||
* \brief Sets new back buffer
|
||||
@ -113,8 +112,7 @@ namespace dxvk {
|
||||
* the back buffer image was replaced.
|
||||
* \param [in] image Back buffer image
|
||||
*/
|
||||
void updateBackBuffer(
|
||||
const Rc<DxvkImage>& image);
|
||||
void UpdateBackBuffer(const Rc<DxvkImage>& Image);
|
||||
|
||||
/**
|
||||
* \brief Recreats Vulkan swap chain
|
||||
@ -124,8 +122,8 @@ namespace dxvk {
|
||||
* properties have changed, this is a no-op.
|
||||
* \param [in] options New swap chain options
|
||||
*/
|
||||
void recreateSwapchain(
|
||||
const DxvkSwapchainProperties& options);
|
||||
void RecreateSwapchain(
|
||||
const DxvkSwapchainProperties* pOptions);
|
||||
|
||||
/**
|
||||
* \brief Picks a surface format based on a DXGI format
|
||||
@ -135,7 +133,7 @@ namespace dxvk {
|
||||
* \param [in] fmt The DXGI format
|
||||
* \returns The Vulkan format
|
||||
*/
|
||||
VkSurfaceFormatKHR pickSurfaceFormat(DXGI_FORMAT fmt) const;
|
||||
VkSurfaceFormatKHR PickSurfaceFormat(DXGI_FORMAT Fmt) const;
|
||||
|
||||
/**
|
||||
* \brief Picks a supported present mode
|
||||
@ -143,7 +141,7 @@ namespace dxvk {
|
||||
* \param [in] preferred Preferred present mode
|
||||
* \returns An actually supported present mode
|
||||
*/
|
||||
VkPresentModeKHR pickPresentMode(VkPresentModeKHR preferred) const;
|
||||
VkPresentModeKHR PickPresentMode(VkPresentModeKHR Preferred) const;
|
||||
|
||||
/**
|
||||
* \brief Sets gamma curve
|
||||
@ -152,7 +150,7 @@ namespace dxvk {
|
||||
* \param [in] pGammaControl Input parameters
|
||||
* \param [in] pGammaCurve Gamma curve
|
||||
*/
|
||||
void setGammaControl(
|
||||
void SetGammaControl(
|
||||
const DXGI_VK_GAMMA_INPUT_CONTROL* pGammaControl,
|
||||
const DXGI_VK_GAMMA_CURVE* pGammaCurve);
|
||||
|
||||
@ -189,16 +187,16 @@ namespace dxvk {
|
||||
DxvkBlendMode m_blendMode;
|
||||
DxvkSwapchainProperties m_options;
|
||||
|
||||
Rc<DxvkSampler> createSampler(
|
||||
VkFilter filter,
|
||||
VkSamplerAddressMode addressMode);
|
||||
Rc<DxvkSampler> CreateSampler(
|
||||
VkFilter Filter,
|
||||
VkSamplerAddressMode AddressMode);
|
||||
|
||||
Rc<DxvkBuffer> createGammaUbo();
|
||||
Rc<DxvkImage> createGammaTexture();
|
||||
Rc<DxvkImageView> createGammaTextureView();
|
||||
Rc<DxvkBuffer> CreateGammaUbo();
|
||||
Rc<DxvkImage> CreateGammaTexture();
|
||||
Rc<DxvkImageView> CreateGammaTextureView();
|
||||
|
||||
Rc<DxvkShader> createVertexShader();
|
||||
Rc<DxvkShader> createFragmentShader();
|
||||
Rc<DxvkShader> CreateVertexShader();
|
||||
Rc<DxvkShader> CreateFragmentShader();
|
||||
|
||||
};
|
||||
|
||||
|
@ -199,14 +199,14 @@ namespace dxvk {
|
||||
// Vulkan swap chain itself remains valid.
|
||||
DxvkSwapchainProperties swapchainProps;
|
||||
swapchainProps.preferredSurfaceFormat
|
||||
= m_presenter->pickSurfaceFormat(m_desc.BufferDesc.Format);
|
||||
= m_presenter->PickSurfaceFormat(m_desc.BufferDesc.Format);
|
||||
swapchainProps.preferredPresentMode = SyncInterval == 0
|
||||
? m_presenter->pickPresentMode(VK_PRESENT_MODE_IMMEDIATE_KHR)
|
||||
: m_presenter->pickPresentMode(VK_PRESENT_MODE_FIFO_KHR);
|
||||
? m_presenter->PickPresentMode(VK_PRESENT_MODE_IMMEDIATE_KHR)
|
||||
: m_presenter->PickPresentMode(VK_PRESENT_MODE_FIFO_KHR);
|
||||
swapchainProps.preferredBufferSize = GetWindowSize();
|
||||
|
||||
m_presenter->recreateSwapchain(swapchainProps);
|
||||
m_presenter->presentImage();
|
||||
m_presenter->RecreateSwapchain(&swapchainProps);
|
||||
m_presenter->PresentImage();
|
||||
return S_OK;
|
||||
} catch (const DxvkError& err) {
|
||||
Logger::err(err.message());
|
||||
@ -301,7 +301,7 @@ namespace dxvk {
|
||||
curve.ControlPoints[i].A = 0;
|
||||
}
|
||||
|
||||
m_presenter->setGammaControl(&control, &curve);
|
||||
m_presenter->SetGammaControl(&control, &curve);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@ -321,14 +321,14 @@ namespace dxvk {
|
||||
curve.ControlPoints[i] = { value, value, value, 0 };
|
||||
}
|
||||
|
||||
m_presenter->setGammaControl(&control, &curve);
|
||||
m_presenter->SetGammaControl(&control, &curve);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
HRESULT DxgiSwapChain::CreatePresenter() {
|
||||
try {
|
||||
m_presenter = new DxgiPresenter(
|
||||
m_presenter = new DxgiVkPresenter(
|
||||
m_device->GetDXVKDevice(),
|
||||
m_desc.OutputWindow);
|
||||
return S_OK;
|
||||
@ -357,7 +357,7 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
try {
|
||||
m_presenter->updateBackBuffer(m_backBuffer->GetDXVKImage());
|
||||
m_presenter->UpdateBackBuffer(m_backBuffer->GetDXVKImage());
|
||||
return S_OK;
|
||||
} catch (const DxvkError& e) {
|
||||
Logger::err(e.message());
|
||||
|
@ -104,7 +104,7 @@ namespace dxvk {
|
||||
DXGI_SWAP_CHAIN_DESC m_desc;
|
||||
DXGI_FRAME_STATISTICS m_stats;
|
||||
|
||||
Rc<DxgiPresenter> m_presenter;
|
||||
Rc<DxgiVkPresenter> m_presenter;
|
||||
Com<IDXGIVkBackBuffer> m_backBuffer;
|
||||
|
||||
HMONITOR m_monitor;
|
||||
|
Loading…
x
Reference in New Issue
Block a user