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

View File

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

View File

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

View File

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