mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-11-30 04:24:11 +01:00
[dxvk] Support depth-stencil meta-copy operations
This commit is contained in:
parent
0dd8cba199
commit
e611dff45e
@ -2740,18 +2740,24 @@ namespace dxvk {
|
||||
srcViewInfo.type = viewType;
|
||||
srcViewInfo.format = srcImage->info().format;
|
||||
srcViewInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
srcViewInfo.aspect = srcSubresource.aspectMask;
|
||||
srcViewInfo.aspect = srcSubresource.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
srcViewInfo.minLevel = srcSubresource.mipLevel;
|
||||
srcViewInfo.numLevels = 1;
|
||||
srcViewInfo.minLayer = srcSubresource.baseArrayLayer;
|
||||
srcViewInfo.numLayers = srcSubresource.layerCount;
|
||||
|
||||
auto tgtImageView = m_device->createImageView(tgtImage, tgtViewInfo);
|
||||
auto srcImageView = m_device->createImageView(srcImage, srcViewInfo);
|
||||
Rc<DxvkImageView> tgtImageView = m_device->createImageView(tgtImage, tgtViewInfo);
|
||||
Rc<DxvkImageView> srcImageView = m_device->createImageView(srcImage, srcViewInfo);
|
||||
Rc<DxvkImageView> srcStencilView;
|
||||
|
||||
if (srcSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
srcViewInfo.aspect = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
srcStencilView = m_device->createImageView(srcImage, srcViewInfo);
|
||||
}
|
||||
|
||||
// Create framebuffer and pipeline for the copy
|
||||
Rc<DxvkMetaCopyRenderPass> fb = new DxvkMetaCopyRenderPass(
|
||||
m_device->vkd(), tgtImageView, srcImageView,
|
||||
m_device->vkd(), tgtImageView, srcImageView, srcStencilView,
|
||||
tgtImage->isFullSubresource(tgtSubresource, extent));
|
||||
|
||||
auto pipeInfo = m_metaCopy->getPipeline(
|
||||
@ -2775,6 +2781,12 @@ namespace dxvk {
|
||||
|
||||
descriptorWrite.dstSet = allocateDescriptorSet(pipeInfo.dsetLayout);
|
||||
m_cmd->updateDescriptorSets(1, &descriptorWrite);
|
||||
|
||||
if (srcSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
|
||||
descriptorImage.imageView = srcStencilView->handle();
|
||||
descriptorWrite.dstBinding = 1;
|
||||
m_cmd->updateDescriptorSets(1, &descriptorWrite);
|
||||
}
|
||||
|
||||
VkViewport viewport;
|
||||
viewport.x = float(tgtOffset.x);
|
||||
|
@ -19,12 +19,14 @@ namespace dxvk {
|
||||
const Rc<vk::DeviceFn>& vkd,
|
||||
const Rc<DxvkImageView>& dstImageView,
|
||||
const Rc<DxvkImageView>& srcImageView,
|
||||
const Rc<DxvkImageView>& srcStencilView,
|
||||
bool discardDst)
|
||||
: m_vkd (vkd),
|
||||
m_dstImageView(dstImageView),
|
||||
m_srcImageView(srcImageView),
|
||||
m_renderPass (createRenderPass(discardDst)),
|
||||
m_framebuffer (createFramebuffer()) {
|
||||
: m_vkd (vkd),
|
||||
m_dstImageView (dstImageView),
|
||||
m_srcImageView (srcImageView),
|
||||
m_srcStencilView(srcStencilView),
|
||||
m_renderPass (createRenderPass(discardDst)),
|
||||
m_framebuffer (createFramebuffer()) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -63,6 +63,7 @@ namespace dxvk {
|
||||
const Rc<vk::DeviceFn>& vkd,
|
||||
const Rc<DxvkImageView>& dstImageView,
|
||||
const Rc<DxvkImageView>& srcImageView,
|
||||
const Rc<DxvkImageView>& srcStencilView,
|
||||
bool discardDst);
|
||||
|
||||
~DxvkMetaCopyRenderPass();
|
||||
@ -77,10 +78,11 @@ namespace dxvk {
|
||||
|
||||
private:
|
||||
|
||||
const Rc<vk::DeviceFn> m_vkd;
|
||||
Rc<vk::DeviceFn> m_vkd;
|
||||
|
||||
const Rc<DxvkImageView> m_dstImageView;
|
||||
const Rc<DxvkImageView> m_srcImageView;
|
||||
Rc<DxvkImageView> m_dstImageView;
|
||||
Rc<DxvkImageView> m_srcImageView;
|
||||
Rc<DxvkImageView> m_srcStencilView;
|
||||
|
||||
VkRenderPass m_renderPass = VK_NULL_HANDLE;
|
||||
VkFramebuffer m_framebuffer = VK_NULL_HANDLE;
|
||||
|
Loading…
Reference in New Issue
Block a user