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:
parent
d998aaad12
commit
4b0a5dffb2
@ -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);
|
||||||
|
@ -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(
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user