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(
|
||||
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);
|
||||
|
@ -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(
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user