1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[dxvk] Support component mappings in blitter

This commit is contained in:
Philip Rebohle 2019-10-16 18:35:57 +02:00
parent d998aaad12
commit 4b0a5dffb2
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
4 changed files with 20 additions and 9 deletions

View File

@ -265,17 +265,22 @@ namespace dxvk {
void DxvkContext::blitImage( void DxvkContext::blitImage(
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const VkComponentMapping& dstMapping,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkComponentMapping& srcMapping,
const VkImageBlit& region, const VkImageBlit& region,
VkFilter filter) { VkFilter filter) {
this->spillRenderPass(); this->spillRenderPass();
auto mapping = util::resolveSrcComponentMapping(dstMapping, srcMapping);
bool canUseFb = (srcImage->info().usage & VK_IMAGE_USAGE_SAMPLED_BIT) bool canUseFb = (srcImage->info().usage & VK_IMAGE_USAGE_SAMPLED_BIT)
&& (dstImage->info().usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && (dstImage->info().usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
&& ((dstImage->info().flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR) && ((dstImage->info().flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR)
|| (dstImage->info().type != VK_IMAGE_TYPE_3D)); || (dstImage->info().type != VK_IMAGE_TYPE_3D));
bool useFb = dstImage->info().sampleCount != VK_SAMPLE_COUNT_1_BIT; bool useFb = dstImage->info().sampleCount != VK_SAMPLE_COUNT_1_BIT
|| !util::isIdentityMapping(mapping);
if (!useFb) { if (!useFb) {
this->blitImageHw( this->blitImageHw(
@ -284,7 +289,7 @@ namespace dxvk {
} else if (canUseFb) { } else if (canUseFb) {
this->blitImageFb( this->blitImageFb(
dstImage, srcImage, dstImage, srcImage,
region, filter); region, mapping, filter);
} else { } else {
Logger::err("DxvkContext: Unsupported blit operation"); Logger::err("DxvkContext: Unsupported blit operation");
} }
@ -2396,6 +2401,7 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageBlit& region, const VkImageBlit& region,
const VkComponentMapping& mapping,
VkFilter filter) { VkFilter filter) {
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource); auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource); auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource);
@ -2431,7 +2437,7 @@ namespace dxvk {
// Begin render pass // Begin render pass
Rc<DxvkMetaBlitRenderPass> pass = new DxvkMetaBlitRenderPass( Rc<DxvkMetaBlitRenderPass> pass = new DxvkMetaBlitRenderPass(
m_device, dstImage, srcImage, region); m_device, dstImage, srcImage, region, mapping);
DxvkMetaBlitPass passObjects = pass->pass(); DxvkMetaBlitPass passObjects = pass->pass();
VkExtent3D imageExtent = dstImage->mipLevelExtent(region.dstSubresource.mipLevel); VkExtent3D imageExtent = dstImage->mipLevelExtent(region.dstSubresource.mipLevel);

View File

@ -188,7 +188,9 @@ namespace dxvk {
*/ */
void blitImage( void blitImage(
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const VkComponentMapping& dstMapping,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkComponentMapping& srcMapping,
const VkImageBlit& region, const VkImageBlit& region,
VkFilter filter); VkFilter filter);
@ -1047,6 +1049,7 @@ namespace dxvk {
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageBlit& region, const VkImageBlit& region,
const VkComponentMapping& mapping,
VkFilter filter); VkFilter filter);
void blitImageHw( void blitImageHw(

View File

@ -15,13 +15,14 @@ namespace dxvk {
const Rc<DxvkDevice>& device, const Rc<DxvkDevice>& device,
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageBlit& region) const VkImageBlit& region,
const VkComponentMapping& mapping)
: m_vkd (device->vkd()), : m_vkd (device->vkd()),
m_dstImage (dstImage), m_dstImage (dstImage),
m_srcImage (srcImage), m_srcImage (srcImage),
m_region (region), m_region (region),
m_dstView (createDstView()), m_dstView (createDstView()),
m_srcView (createSrcView()), m_srcView (createSrcView(mapping)),
m_renderPass (createRenderPass()), m_renderPass (createRenderPass()),
m_framebuffer (createFramebuffer()) { m_framebuffer (createFramebuffer()) {
@ -114,7 +115,7 @@ namespace dxvk {
} }
VkImageView DxvkMetaBlitRenderPass::createSrcView() { VkImageView DxvkMetaBlitRenderPass::createSrcView(const VkComponentMapping& mapping) {
VkImageViewUsageCreateInfo usageInfo; VkImageViewUsageCreateInfo usageInfo;
usageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO; usageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO;
usageInfo.pNext = nullptr; usageInfo.pNext = nullptr;
@ -127,7 +128,7 @@ namespace dxvk {
info.image = m_srcImage->handle(); info.image = m_srcImage->handle();
info.viewType = this->viewType(); info.viewType = this->viewType();
info.format = m_srcImage->info().format; info.format = m_srcImage->info().format;
info.components = VkComponentMapping(); info.components = mapping;
info.subresourceRange = vk::makeSubresourceRange(m_region.srcSubresource); info.subresourceRange = vk::makeSubresourceRange(m_region.srcSubresource);
VkImageView result; VkImageView result;

View File

@ -116,7 +116,8 @@ namespace dxvk {
const Rc<DxvkDevice>& device, const Rc<DxvkDevice>& device,
const Rc<DxvkImage>& dstImage, const Rc<DxvkImage>& dstImage,
const Rc<DxvkImage>& srcImage, const Rc<DxvkImage>& srcImage,
const VkImageBlit& region); const VkImageBlit& region,
const VkComponentMapping& mapping);
~DxvkMetaBlitRenderPass(); ~DxvkMetaBlitRenderPass();
@ -140,7 +141,7 @@ namespace dxvk {
VkFramebuffer m_framebuffer; VkFramebuffer m_framebuffer;
VkImageView createDstView(); VkImageView createDstView();
VkImageView createSrcView(); VkImageView createSrcView(const VkComponentMapping& mapping);
VkRenderPass createRenderPass(); VkRenderPass createRenderPass();
VkFramebuffer createFramebuffer(); VkFramebuffer createFramebuffer();