mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-19 14:52:10 +01:00
[dxvk] Remove legacy depth/stencil repacking code
This commit is contained in:
parent
ad1f70beea
commit
e6f90b8003
@ -644,125 +644,6 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::copyDepthStencilImageToPackedBuffer(
|
||||
const Rc<DxvkBuffer>& dstBuffer,
|
||||
VkDeviceSize dstBufferOffset,
|
||||
VkOffset2D dstOffset,
|
||||
VkExtent2D dstExtent,
|
||||
const Rc<DxvkImage>& srcImage,
|
||||
VkImageSubresourceLayers srcSubresource,
|
||||
VkOffset2D srcOffset,
|
||||
VkExtent2D srcExtent,
|
||||
VkFormat format) {
|
||||
this->spillRenderPass(true);
|
||||
this->prepareImage(srcImage, vk::makeSubresourceRange(srcSubresource));
|
||||
|
||||
this->invalidateState();
|
||||
|
||||
DxvkImageUsageInfo usageInfo = { };
|
||||
usageInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
|
||||
if (!ensureImageCompatibility(srcImage, usageInfo)) {
|
||||
Logger::err(str::format("DxvkContext: copyDepthStencilImageToPackedBuffer: Unsupported image:"
|
||||
"\n src format: ", srcImage->info().format));
|
||||
}
|
||||
|
||||
// Retrieve compute pipeline for the given format
|
||||
auto pipeInfo = m_common->metaPack().getPackPipeline(format);
|
||||
|
||||
if (!pipeInfo.pipeHandle)
|
||||
return;
|
||||
|
||||
// Create one depth view and one stencil view
|
||||
DxvkImageViewKey dViewInfo = { };
|
||||
dViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
|
||||
dViewInfo.format = srcImage->info().format;
|
||||
dViewInfo.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||
dViewInfo.aspects = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
dViewInfo.mipIndex = srcSubresource.mipLevel;
|
||||
dViewInfo.mipCount = 1;
|
||||
dViewInfo.layerIndex = srcSubresource.baseArrayLayer;
|
||||
dViewInfo.layerCount = srcSubresource.layerCount;
|
||||
|
||||
DxvkImageViewKey sViewInfo = dViewInfo;
|
||||
sViewInfo.aspects = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
Rc<DxvkImageView> dView = srcImage->createView(dViewInfo);
|
||||
Rc<DxvkImageView> sView = srcImage->createView(sViewInfo);
|
||||
|
||||
// Create a descriptor set for the pack operation
|
||||
VkImageLayout layout = srcImage->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL);
|
||||
|
||||
DxvkMetaPackDescriptors descriptors;
|
||||
descriptors.dstBuffer = dstBuffer->getDescriptor(dstBufferOffset, VK_WHOLE_SIZE).buffer;
|
||||
descriptors.srcDepth = dView->getDescriptor(VK_IMAGE_VIEW_TYPE_2D_ARRAY, layout).image;
|
||||
descriptors.srcStencil = sView->getDescriptor(VK_IMAGE_VIEW_TYPE_2D_ARRAY, layout).image;
|
||||
|
||||
VkDescriptorSet dset = m_descriptorPool->alloc(pipeInfo.dsetLayout);
|
||||
m_cmd->updateDescriptorSetWithTemplate(dset, pipeInfo.dsetTemplate, &descriptors);
|
||||
|
||||
// Since this is a meta operation, the image may be
|
||||
// in a different layout and we have to transition it
|
||||
auto subresourceRange = vk::makeSubresourceRange(srcSubresource);
|
||||
|
||||
if (m_execBarriers.isImageDirty(srcImage, subresourceRange, DxvkAccess::Write))
|
||||
m_execBarriers.recordCommands(m_cmd);
|
||||
|
||||
if (srcImage->info().layout != layout) {
|
||||
m_execAcquires.accessImage(
|
||||
srcImage, subresourceRange,
|
||||
srcImage->info().layout,
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0,
|
||||
layout,
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT);
|
||||
|
||||
m_execAcquires.recordCommands(m_cmd);
|
||||
}
|
||||
|
||||
// Execute the actual pack operation
|
||||
DxvkMetaPackArgs args;
|
||||
args.srcOffset = srcOffset;
|
||||
args.srcExtent = srcExtent;
|
||||
args.dstOffset = dstOffset;
|
||||
args.dstExtent = dstExtent;
|
||||
|
||||
m_cmd->cmdBindPipeline(DxvkCmdBuffer::ExecBuffer,
|
||||
VK_PIPELINE_BIND_POINT_COMPUTE, pipeInfo.pipeHandle);
|
||||
|
||||
m_cmd->cmdBindDescriptorSet(DxvkCmdBuffer::ExecBuffer,
|
||||
VK_PIPELINE_BIND_POINT_COMPUTE, pipeInfo.pipeLayout,
|
||||
dset, 0, nullptr);
|
||||
|
||||
m_cmd->cmdPushConstants(DxvkCmdBuffer::ExecBuffer,
|
||||
pipeInfo.pipeLayout, VK_SHADER_STAGE_COMPUTE_BIT,
|
||||
0, sizeof(args), &args);
|
||||
|
||||
m_cmd->cmdDispatch(DxvkCmdBuffer::ExecBuffer,
|
||||
(srcExtent.width + 7) / 8,
|
||||
(srcExtent.height + 7) / 8,
|
||||
srcSubresource.layerCount);
|
||||
|
||||
m_execBarriers.accessImage(
|
||||
srcImage, subresourceRange, layout,
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
srcImage->info().layout,
|
||||
srcImage->info().stages,
|
||||
srcImage->info().access);
|
||||
|
||||
m_execBarriers.accessBuffer(
|
||||
dstBuffer->getSliceHandle(),
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_WRITE_BIT,
|
||||
dstBuffer->info().stages,
|
||||
dstBuffer->info().access);
|
||||
|
||||
m_cmd->trackResource<DxvkAccess::Write>(dstBuffer);
|
||||
m_cmd->trackResource<DxvkAccess::Read>(srcImage);
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::copyPackedBufferImage(
|
||||
const Rc<DxvkBuffer>& dstBuffer,
|
||||
VkDeviceSize dstBufferOffset,
|
||||
@ -928,204 +809,6 @@ namespace dxvk {
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::copyPackedBufferToDepthStencilImage(
|
||||
const Rc<DxvkImage>& dstImage,
|
||||
VkImageSubresourceLayers dstSubresource,
|
||||
VkOffset2D dstOffset,
|
||||
VkExtent2D dstExtent,
|
||||
const Rc<DxvkBuffer>& srcBuffer,
|
||||
VkDeviceSize srcBufferOffset,
|
||||
VkOffset2D srcOffset,
|
||||
VkExtent2D srcExtent,
|
||||
VkFormat format) {
|
||||
this->spillRenderPass(true);
|
||||
this->invalidateState();
|
||||
|
||||
this->prepareImage(dstImage, vk::makeSubresourceRange(dstSubresource));
|
||||
|
||||
DxvkImageUsageInfo usageInfo = { };
|
||||
usageInfo.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||
|
||||
if (!ensureImageCompatibility(dstImage, usageInfo)) {
|
||||
Logger::err(str::format("DxvkCOntext: copyPackedBufferToDepthStencilImage: Unsupported image:"
|
||||
"\n dst format: ", dstImage->info().format));
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_execBarriers.isBufferDirty(srcBuffer->getSliceHandle(), DxvkAccess::Read)
|
||||
|| m_execBarriers.isImageDirty(dstImage, vk::makeSubresourceRange(dstSubresource), DxvkAccess::Write))
|
||||
m_execBarriers.recordCommands(m_cmd);
|
||||
|
||||
// Retrieve compute pipeline for the given format
|
||||
auto pipeInfo = m_common->metaPack().getUnpackPipeline(dstImage->info().format, format);
|
||||
|
||||
if (!pipeInfo.pipeHandle) {
|
||||
Logger::err(str::format(
|
||||
"DxvkContext: copyPackedBufferToDepthStencilImage: Unhandled formats"
|
||||
"\n dstFormat = ", dstImage->info().format,
|
||||
"\n srcFormat = ", format));
|
||||
return;
|
||||
}
|
||||
|
||||
// Pick depth and stencil data formats
|
||||
VkFormat dataFormatD = VK_FORMAT_UNDEFINED;
|
||||
VkFormat dataFormatS = VK_FORMAT_UNDEFINED;
|
||||
|
||||
const std::array<std::tuple<VkFormat, VkFormat, VkFormat>, 2> formats = {{
|
||||
{ VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_R32_UINT, VK_FORMAT_R8_UINT },
|
||||
{ VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R8_UINT },
|
||||
}};
|
||||
|
||||
for (const auto& e : formats) {
|
||||
if (std::get<0>(e) == dstImage->info().format) {
|
||||
dataFormatD = std::get<1>(e);
|
||||
dataFormatS = std::get<2>(e);
|
||||
}
|
||||
}
|
||||
|
||||
// Create temporary buffer for depth/stencil data
|
||||
VkDeviceSize pixelCount = dstExtent.width * dstExtent.height * dstSubresource.layerCount;
|
||||
VkDeviceSize dataSizeD = align(pixelCount * lookupFormatInfo(dataFormatD)->elementSize, 256);
|
||||
VkDeviceSize dataSizeS = align(pixelCount * lookupFormatInfo(dataFormatS)->elementSize, 256);
|
||||
|
||||
DxvkBufferCreateInfo tmpBufferInfo;
|
||||
tmpBufferInfo.size = dataSizeD + dataSizeS;
|
||||
tmpBufferInfo.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT
|
||||
| VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
|
||||
tmpBufferInfo.stages = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
|
||||
| VK_PIPELINE_STAGE_TRANSFER_BIT;
|
||||
tmpBufferInfo.access = VK_ACCESS_SHADER_WRITE_BIT
|
||||
| VK_ACCESS_TRANSFER_READ_BIT;
|
||||
|
||||
auto tmpBuffer = m_device->createBuffer(tmpBufferInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
|
||||
|
||||
// Create formatted buffer views
|
||||
DxvkBufferViewKey tmpViewInfoD;
|
||||
tmpViewInfoD.format = dataFormatD;
|
||||
tmpViewInfoD.offset = 0;
|
||||
tmpViewInfoD.size = dataSizeD;
|
||||
tmpViewInfoD.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
||||
|
||||
DxvkBufferViewKey tmpViewInfoS;
|
||||
tmpViewInfoS.format = dataFormatS;
|
||||
tmpViewInfoS.offset = dataSizeD;
|
||||
tmpViewInfoS.size = dataSizeS;
|
||||
tmpViewInfoS.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
|
||||
|
||||
auto tmpBufferViewD = tmpBuffer->createView(tmpViewInfoD);
|
||||
auto tmpBufferViewS = tmpBuffer->createView(tmpViewInfoS);
|
||||
|
||||
// Create descriptor set for the unpack operation
|
||||
DxvkMetaUnpackDescriptors descriptors;
|
||||
descriptors.dstDepth = tmpBufferViewD->handle();
|
||||
descriptors.dstStencil = tmpBufferViewS->handle();
|
||||
descriptors.srcBuffer = srcBuffer->getDescriptor(srcBufferOffset, VK_WHOLE_SIZE).buffer;
|
||||
|
||||
VkDescriptorSet dset = m_descriptorPool->alloc(pipeInfo.dsetLayout);
|
||||
m_cmd->updateDescriptorSetWithTemplate(dset, pipeInfo.dsetTemplate, &descriptors);
|
||||
|
||||
// Unpack the source buffer to temporary buffers
|
||||
DxvkMetaPackArgs args;
|
||||
args.srcOffset = srcOffset;
|
||||
args.srcExtent = srcExtent;
|
||||
args.dstOffset = VkOffset2D { 0, 0 };
|
||||
args.dstExtent = dstExtent;
|
||||
|
||||
m_cmd->cmdBindPipeline(DxvkCmdBuffer::ExecBuffer,
|
||||
VK_PIPELINE_BIND_POINT_COMPUTE, pipeInfo.pipeHandle);
|
||||
|
||||
m_cmd->cmdBindDescriptorSet(DxvkCmdBuffer::ExecBuffer,
|
||||
VK_PIPELINE_BIND_POINT_COMPUTE, pipeInfo.pipeLayout,
|
||||
dset, 0, nullptr);
|
||||
|
||||
m_cmd->cmdPushConstants(DxvkCmdBuffer::ExecBuffer,
|
||||
pipeInfo.pipeLayout, VK_SHADER_STAGE_COMPUTE_BIT,
|
||||
0, sizeof(args), &args);
|
||||
|
||||
m_cmd->cmdDispatch(DxvkCmdBuffer::ExecBuffer,
|
||||
(dstExtent.width + 63) / 64,
|
||||
dstExtent.height,
|
||||
dstSubresource.layerCount);
|
||||
|
||||
m_execBarriers.accessBuffer(
|
||||
tmpBuffer->getSliceHandle(),
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_WRITE_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_READ_BIT);
|
||||
|
||||
m_execBarriers.accessBuffer(
|
||||
srcBuffer->getSliceHandle(),
|
||||
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
srcBuffer->info().stages,
|
||||
srcBuffer->info().access);
|
||||
|
||||
// Prepare image for the data transfer operation
|
||||
VkOffset3D dstOffset3D = { dstOffset.x, dstOffset.y, 0 };
|
||||
VkExtent3D dstExtent3D = { dstExtent.width, dstExtent.height, 1 };
|
||||
|
||||
VkImageLayout initialImageLayout = dstImage->info().layout;
|
||||
|
||||
if (dstImage->isFullSubresource(dstSubresource, dstExtent3D))
|
||||
initialImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
|
||||
m_execBarriers.accessImage(
|
||||
dstImage, vk::makeSubresourceRange(dstSubresource),
|
||||
initialImageLayout,
|
||||
dstImage->info().stages,
|
||||
dstImage->info().access,
|
||||
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||
|
||||
m_execBarriers.recordCommands(m_cmd);
|
||||
|
||||
// Copy temporary buffer data to depth-stencil image
|
||||
VkImageSubresourceLayers dstSubresourceD = dstSubresource;
|
||||
dstSubresourceD.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
|
||||
|
||||
VkImageSubresourceLayers dstSubresourceS = dstSubresource;
|
||||
dstSubresourceS.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
|
||||
|
||||
std::array<VkBufferImageCopy2, 2> copyRegions;
|
||||
copyRegions[0] = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
|
||||
copyRegions[0].bufferOffset = tmpBufferViewD->info().offset;
|
||||
copyRegions[0].imageSubresource = dstSubresourceD;
|
||||
copyRegions[0].imageOffset = dstOffset3D;
|
||||
copyRegions[0].imageExtent = dstExtent3D;
|
||||
|
||||
copyRegions[1] = { VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 };
|
||||
copyRegions[1].bufferOffset = tmpBufferViewS->info().offset;
|
||||
copyRegions[1].imageSubresource = dstSubresourceS;
|
||||
copyRegions[1].imageOffset = dstOffset3D;
|
||||
copyRegions[1].imageExtent = dstExtent3D;
|
||||
|
||||
VkCopyBufferToImageInfo2 copyInfo = { VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 };
|
||||
copyInfo.srcBuffer = tmpBuffer->getSliceHandle().handle;
|
||||
copyInfo.dstImage = dstImage->handle();
|
||||
copyInfo.dstImageLayout = dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
copyInfo.regionCount = copyRegions.size();
|
||||
copyInfo.pRegions = copyRegions.data();
|
||||
|
||||
m_cmd->cmdCopyBufferToImage(DxvkCmdBuffer::ExecBuffer, ©Info);
|
||||
|
||||
m_execBarriers.accessImage(
|
||||
dstImage, vk::makeSubresourceRange(dstSubresource),
|
||||
dstImage->pickLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL),
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT,
|
||||
dstImage->info().layout,
|
||||
dstImage->info().stages,
|
||||
dstImage->info().access);
|
||||
|
||||
// Track all involved resources
|
||||
m_cmd->trackResource<DxvkAccess::Write>(dstImage);
|
||||
m_cmd->trackResource<DxvkAccess::Read>(srcBuffer);
|
||||
m_cmd->trackResource<DxvkAccess::Read>(tmpBuffer);
|
||||
}
|
||||
|
||||
|
||||
void DxvkContext::copySparsePagesToBuffer(
|
||||
const Rc<DxvkBuffer>& dstBuffer,
|
||||
VkDeviceSize dstOffset,
|
||||
|
@ -622,34 +622,6 @@ namespace dxvk {
|
||||
VkOffset3D srcOffset,
|
||||
VkExtent3D srcExtent);
|
||||
|
||||
/**
|
||||
* \brief Packs depth-stencil image data to a buffer
|
||||
*
|
||||
* Packs data from both the depth and stencil aspects
|
||||
* of an image into a buffer. The supported formats are:
|
||||
* - \c VK_FORMAT_D24_UNORM_S8_UINT: 0xssdddddd
|
||||
* - \c VK_FORMAT_D32_SFLOAT_S8_UINT: 0xdddddddd 0x000000ss
|
||||
* \param [in] dstBuffer Destination buffer
|
||||
* \param [in] dstBufferOffset Destination offset, in bytes
|
||||
* \param [in] dstOffset Destination image offset
|
||||
* \param [in] dstSize Destination image size
|
||||
* \param [in] srcImage Source image
|
||||
* \param [in] srcSubresource Source subresource
|
||||
* \param [in] srcOffset Source area offset
|
||||
* \param [in] srcExtent Source area size
|
||||
* \param [in] format Packed data format
|
||||
*/
|
||||
void copyDepthStencilImageToPackedBuffer(
|
||||
const Rc<DxvkBuffer>& dstBuffer,
|
||||
VkDeviceSize dstBufferOffset,
|
||||
VkOffset2D dstOffset,
|
||||
VkExtent2D dstExtent,
|
||||
const Rc<DxvkImage>& srcImage,
|
||||
VkImageSubresourceLayers srcSubresource,
|
||||
VkOffset2D srcOffset,
|
||||
VkExtent2D srcExtent,
|
||||
VkFormat format);
|
||||
|
||||
/**
|
||||
* \brief Copies image data stored in a linear buffer to another
|
||||
*
|
||||
@ -678,33 +650,6 @@ namespace dxvk {
|
||||
VkExtent3D extent,
|
||||
VkDeviceSize elementSize);
|
||||
|
||||
/**
|
||||
* \brief Unpacks buffer data to a depth-stencil image
|
||||
*
|
||||
* Writes the packed depth-stencil data to an image.
|
||||
* See \ref copyDepthStencilImageToPackedBuffer for
|
||||
* which formats are supported and how they are packed.
|
||||
* \param [in] dstImage Destination image
|
||||
* \param [in] dstSubresource Destination subresource
|
||||
* \param [in] dstOffset Image area offset
|
||||
* \param [in] dstExtent Image area size
|
||||
* \param [in] srcBuffer Packed data buffer
|
||||
* \param [in] srcBufferOffset Buffer offset of source image
|
||||
* \param [in] srcOffset Offset into the source image
|
||||
* \param [in] srcExtent Total size of the source image
|
||||
* \param [in] format Packed data format
|
||||
*/
|
||||
void copyPackedBufferToDepthStencilImage(
|
||||
const Rc<DxvkImage>& dstImage,
|
||||
VkImageSubresourceLayers dstSubresource,
|
||||
VkOffset2D dstOffset,
|
||||
VkExtent2D dstExtent,
|
||||
const Rc<DxvkBuffer>& srcBuffer,
|
||||
VkDeviceSize srcBufferOffset,
|
||||
VkOffset2D srcOffset,
|
||||
VkExtent2D srcExtent,
|
||||
VkFormat format);
|
||||
|
||||
/**
|
||||
* \brief Copies pages from a sparse resource to a buffer
|
||||
*
|
||||
|
@ -1,226 +0,0 @@
|
||||
#include "dxvk_meta_pack.h"
|
||||
#include "dxvk_device.h"
|
||||
|
||||
#include <dxvk_pack_d24s8.h>
|
||||
#include <dxvk_pack_d32s8.h>
|
||||
|
||||
#include <dxvk_unpack_d24s8_as_d32s8.h>
|
||||
#include <dxvk_unpack_d24s8.h>
|
||||
#include <dxvk_unpack_d32s8.h>
|
||||
|
||||
namespace dxvk {
|
||||
|
||||
DxvkMetaPackObjects::DxvkMetaPackObjects(const DxvkDevice* device)
|
||||
: m_vkd (device->vkd()),
|
||||
m_dsetLayoutPack (createPackDescriptorSetLayout()),
|
||||
m_dsetLayoutUnpack(createUnpackDescriptorSetLayout()),
|
||||
m_pipeLayoutPack (createPipelineLayout(m_dsetLayoutPack, sizeof(DxvkMetaPackArgs))),
|
||||
m_pipeLayoutUnpack(createPipelineLayout(m_dsetLayoutUnpack, sizeof(DxvkMetaPackArgs))),
|
||||
m_templatePack (createPackDescriptorUpdateTemplate()),
|
||||
m_templateUnpack (createUnpackDescriptorUpdateTemplate()),
|
||||
m_pipePackD24S8 (createPipeline(m_pipeLayoutPack, dxvk_pack_d24s8)),
|
||||
m_pipePackD32S8 (createPipeline(m_pipeLayoutPack, dxvk_pack_d32s8)),
|
||||
m_pipeUnpackD24S8AsD32S8(createPipeline(m_pipeLayoutUnpack, dxvk_unpack_d24s8_as_d32s8)),
|
||||
m_pipeUnpackD24S8 (createPipeline(m_pipeLayoutUnpack, dxvk_unpack_d24s8)),
|
||||
m_pipeUnpackD32S8 (createPipeline(m_pipeLayoutUnpack, dxvk_unpack_d32s8)) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
DxvkMetaPackObjects::~DxvkMetaPackObjects() {
|
||||
m_vkd->vkDestroyPipeline(m_vkd->device(), m_pipeUnpackD32S8, nullptr);
|
||||
m_vkd->vkDestroyPipeline(m_vkd->device(), m_pipeUnpackD24S8, nullptr);
|
||||
m_vkd->vkDestroyPipeline(m_vkd->device(), m_pipeUnpackD24S8AsD32S8, nullptr);
|
||||
|
||||
m_vkd->vkDestroyPipeline(m_vkd->device(), m_pipePackD32S8, nullptr);
|
||||
m_vkd->vkDestroyPipeline(m_vkd->device(), m_pipePackD24S8, nullptr);
|
||||
|
||||
m_vkd->vkDestroyDescriptorUpdateTemplate(m_vkd->device(), m_templatePack, nullptr);
|
||||
m_vkd->vkDestroyDescriptorUpdateTemplate(m_vkd->device(), m_templateUnpack, nullptr);
|
||||
|
||||
m_vkd->vkDestroyPipelineLayout(m_vkd->device(), m_pipeLayoutPack, nullptr);
|
||||
m_vkd->vkDestroyPipelineLayout(m_vkd->device(), m_pipeLayoutUnpack, nullptr);
|
||||
|
||||
m_vkd->vkDestroyDescriptorSetLayout(m_vkd->device(), m_dsetLayoutPack, nullptr);
|
||||
m_vkd->vkDestroyDescriptorSetLayout(m_vkd->device(), m_dsetLayoutUnpack, nullptr);
|
||||
}
|
||||
|
||||
|
||||
DxvkMetaPackPipeline DxvkMetaPackObjects::getPackPipeline(VkFormat format) {
|
||||
DxvkMetaPackPipeline result;
|
||||
result.dsetTemplate = m_templatePack;
|
||||
result.dsetLayout = m_dsetLayoutPack;
|
||||
result.pipeLayout = m_pipeLayoutPack;
|
||||
result.pipeHandle = VK_NULL_HANDLE;
|
||||
|
||||
switch (format) {
|
||||
case VK_FORMAT_D24_UNORM_S8_UINT: result.pipeHandle = m_pipePackD24S8; break;
|
||||
case VK_FORMAT_D32_SFLOAT_S8_UINT: result.pipeHandle = m_pipePackD32S8; break;
|
||||
default: Logger::err(str::format("DxvkMetaPackObjects: Unknown format: ", format));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
DxvkMetaPackPipeline DxvkMetaPackObjects::getUnpackPipeline(
|
||||
VkFormat dstFormat,
|
||||
VkFormat srcFormat) {
|
||||
DxvkMetaPackPipeline result;
|
||||
result.dsetTemplate = m_templateUnpack;
|
||||
result.dsetLayout = m_dsetLayoutUnpack;
|
||||
result.pipeLayout = m_pipeLayoutUnpack;
|
||||
result.pipeHandle = VK_NULL_HANDLE;
|
||||
|
||||
std::array<std::tuple<VkFormat, VkFormat, VkPipeline>, 3> pipeSelector = {{
|
||||
{ VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, m_pipeUnpackD24S8 },
|
||||
{ VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, m_pipeUnpackD24S8AsD32S8 },
|
||||
{ VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, m_pipeUnpackD32S8 },
|
||||
}};
|
||||
|
||||
for (const auto& e : pipeSelector) {
|
||||
if (std::get<0>(e) == dstFormat
|
||||
&& std::get<1>(e) == srcFormat)
|
||||
result.pipeHandle = std::get<2>(e);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VkDescriptorSetLayout DxvkMetaPackObjects::createPackDescriptorSetLayout() {
|
||||
std::array<VkDescriptorSetLayoutBinding, 3> bindings = {{
|
||||
{ 0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
|
||||
{ 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
|
||||
{ 2, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
|
||||
}};
|
||||
|
||||
VkDescriptorSetLayoutCreateInfo dsetInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };
|
||||
dsetInfo.bindingCount = bindings.size();
|
||||
dsetInfo.pBindings = bindings.data();
|
||||
|
||||
VkDescriptorSetLayout result = VK_NULL_HANDLE;
|
||||
if (m_vkd->vkCreateDescriptorSetLayout(m_vkd->device(), &dsetInfo, nullptr, &result) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create descriptor set layout");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VkDescriptorSetLayout DxvkMetaPackObjects::createUnpackDescriptorSetLayout() {
|
||||
std::array<VkDescriptorSetLayoutBinding, 3> bindings = {{
|
||||
{ 0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
|
||||
{ 1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
|
||||
{ 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr },
|
||||
}};
|
||||
|
||||
VkDescriptorSetLayoutCreateInfo dsetInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };
|
||||
dsetInfo.bindingCount = bindings.size();
|
||||
dsetInfo.pBindings = bindings.data();
|
||||
|
||||
VkDescriptorSetLayout result = VK_NULL_HANDLE;
|
||||
if (m_vkd->vkCreateDescriptorSetLayout(m_vkd->device(), &dsetInfo, nullptr, &result) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create descriptor set layout");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VkPipelineLayout DxvkMetaPackObjects::createPipelineLayout(
|
||||
VkDescriptorSetLayout dsetLayout,
|
||||
uint32_t pushLayout) {
|
||||
VkPushConstantRange push = { VK_SHADER_STAGE_COMPUTE_BIT, 0, pushLayout };
|
||||
|
||||
VkPipelineLayoutCreateInfo layoutInfo = { VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO };
|
||||
layoutInfo.setLayoutCount = 1;
|
||||
layoutInfo.pSetLayouts = &dsetLayout;
|
||||
layoutInfo.pushConstantRangeCount = 1;
|
||||
layoutInfo.pPushConstantRanges = &push;
|
||||
|
||||
VkPipelineLayout result = VK_NULL_HANDLE;
|
||||
if (m_vkd->vkCreatePipelineLayout(m_vkd->device(), &layoutInfo, nullptr, &result) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create pipeline layout");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VkDescriptorUpdateTemplate DxvkMetaPackObjects::createPackDescriptorUpdateTemplate() {
|
||||
std::array<VkDescriptorUpdateTemplateEntry, 3> bindings = {{
|
||||
{ 0, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, offsetof(DxvkMetaPackDescriptors, dstBuffer), 0 },
|
||||
{ 1, 0, 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, offsetof(DxvkMetaPackDescriptors, srcDepth), 0 },
|
||||
{ 2, 0, 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, offsetof(DxvkMetaPackDescriptors, srcStencil), 0 },
|
||||
}};
|
||||
|
||||
VkDescriptorUpdateTemplateCreateInfo templateInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO };
|
||||
templateInfo.descriptorUpdateEntryCount = bindings.size();
|
||||
templateInfo.pDescriptorUpdateEntries = bindings.data();
|
||||
templateInfo.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET;
|
||||
templateInfo.descriptorSetLayout = m_dsetLayoutPack;
|
||||
templateInfo.pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE;
|
||||
templateInfo.pipelineLayout = m_pipeLayoutPack;
|
||||
|
||||
VkDescriptorUpdateTemplate result = VK_NULL_HANDLE;
|
||||
if (m_vkd->vkCreateDescriptorUpdateTemplate(m_vkd->device(),
|
||||
&templateInfo, nullptr, &result) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create descriptor update template");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VkDescriptorUpdateTemplate DxvkMetaPackObjects::createUnpackDescriptorUpdateTemplate() {
|
||||
std::array<VkDescriptorUpdateTemplateEntry, 3> bindings = {{
|
||||
{ 0, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, offsetof(DxvkMetaUnpackDescriptors, dstDepth), 0 },
|
||||
{ 1, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, offsetof(DxvkMetaUnpackDescriptors, dstStencil), 0 },
|
||||
{ 2, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, offsetof(DxvkMetaUnpackDescriptors, srcBuffer), 0 },
|
||||
}};
|
||||
|
||||
VkDescriptorUpdateTemplateCreateInfo templateInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO };
|
||||
templateInfo.descriptorUpdateEntryCount = bindings.size();
|
||||
templateInfo.pDescriptorUpdateEntries = bindings.data();
|
||||
templateInfo.templateType = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET;
|
||||
templateInfo.descriptorSetLayout = m_dsetLayoutUnpack;
|
||||
templateInfo.pipelineBindPoint = VK_PIPELINE_BIND_POINT_COMPUTE;
|
||||
templateInfo.pipelineLayout = m_pipeLayoutUnpack;
|
||||
templateInfo.set = 0;
|
||||
|
||||
VkDescriptorUpdateTemplate result = VK_NULL_HANDLE;
|
||||
if (m_vkd->vkCreateDescriptorUpdateTemplate(m_vkd->device(),
|
||||
&templateInfo, nullptr, &result) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create descriptor update template");
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
VkPipeline DxvkMetaPackObjects::createPipeline(
|
||||
VkPipelineLayout pipeLayout,
|
||||
const SpirvCodeBuffer& code) {
|
||||
VkShaderModuleCreateInfo shaderInfo = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO };
|
||||
shaderInfo.codeSize = code.size();
|
||||
shaderInfo.pCode = code.data();
|
||||
|
||||
VkShaderModule module = VK_NULL_HANDLE;
|
||||
|
||||
if (m_vkd->vkCreateShaderModule(m_vkd->device(), &shaderInfo, nullptr, &module) != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create shader module");
|
||||
|
||||
VkPipelineShaderStageCreateInfo stageInfo = { VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO };
|
||||
stageInfo.stage = VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
stageInfo.module = module;
|
||||
stageInfo.pName = "main";
|
||||
|
||||
VkComputePipelineCreateInfo pipeInfo = { VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO };
|
||||
pipeInfo.stage = stageInfo;
|
||||
pipeInfo.layout = pipeLayout;
|
||||
pipeInfo.basePipelineIndex = -1;
|
||||
|
||||
VkPipeline result = VK_NULL_HANDLE;
|
||||
|
||||
VkResult status = m_vkd->vkCreateComputePipelines(
|
||||
m_vkd->device(), VK_NULL_HANDLE, 1, &pipeInfo, nullptr, &result);
|
||||
|
||||
m_vkd->vkDestroyShaderModule(m_vkd->device(), module, nullptr);
|
||||
|
||||
if (status != VK_SUCCESS)
|
||||
throw DxvkError("DxvkMetaPackObjects: Failed to create pipeline");
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
@ -1,129 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "../spirv/spirv_code_buffer.h"
|
||||
|
||||
#include "dxvk_cmdlist.h"
|
||||
#include "dxvk_resource.h"
|
||||
|
||||
namespace dxvk {
|
||||
|
||||
/**
|
||||
* \brief Packing arguments
|
||||
*
|
||||
* Passed in as push constants
|
||||
* to the compute shader.
|
||||
*/
|
||||
struct DxvkMetaPackArgs {
|
||||
VkOffset2D srcOffset;
|
||||
VkExtent2D srcExtent;
|
||||
VkOffset2D dstOffset;
|
||||
VkExtent2D dstExtent;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \brief Packing pipeline
|
||||
*
|
||||
* Stores the objects for a single pipeline
|
||||
* that is used to pack depth-stencil image
|
||||
* data into a linear buffer.
|
||||
*/
|
||||
struct DxvkMetaPackPipeline {
|
||||
VkDescriptorUpdateTemplateKHR dsetTemplate;
|
||||
VkDescriptorSetLayout dsetLayout;
|
||||
VkPipelineLayout pipeLayout;
|
||||
VkPipeline pipeHandle;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \brief Packing descriptors
|
||||
*/
|
||||
struct DxvkMetaPackDescriptors {
|
||||
VkDescriptorBufferInfo dstBuffer;
|
||||
VkDescriptorImageInfo srcDepth;
|
||||
VkDescriptorImageInfo srcStencil;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \brief Unpacking descriptors
|
||||
*/
|
||||
struct DxvkMetaUnpackDescriptors {
|
||||
VkBufferView dstDepth;
|
||||
VkBufferView dstStencil;
|
||||
VkDescriptorBufferInfo srcBuffer;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* \brief Depth-stencil pack objects
|
||||
*
|
||||
* Stores compute shaders and related objects
|
||||
* for depth-stencil image packing operations.
|
||||
*/
|
||||
class DxvkMetaPackObjects {
|
||||
|
||||
public:
|
||||
|
||||
DxvkMetaPackObjects(const DxvkDevice* device);
|
||||
~DxvkMetaPackObjects();
|
||||
|
||||
/**
|
||||
* \brief Retrieves depth-stencil packing pipeline
|
||||
*
|
||||
* \param [in] format Destination format
|
||||
* \returns Data packing pipeline
|
||||
*/
|
||||
DxvkMetaPackPipeline getPackPipeline(VkFormat format);
|
||||
|
||||
/**
|
||||
* \brief Retrieves depth-stencil unpacking pipeline
|
||||
*
|
||||
* \param [in] dstFormat Destination image format
|
||||
* \param [in] srcFormat Source buffer format
|
||||
* \returns Data unpacking pipeline
|
||||
*/
|
||||
DxvkMetaPackPipeline getUnpackPipeline(
|
||||
VkFormat dstFormat,
|
||||
VkFormat srcFormat);
|
||||
|
||||
private:
|
||||
|
||||
Rc<vk::DeviceFn> m_vkd;
|
||||
|
||||
VkDescriptorSetLayout m_dsetLayoutPack;
|
||||
VkDescriptorSetLayout m_dsetLayoutUnpack;
|
||||
|
||||
VkPipelineLayout m_pipeLayoutPack;
|
||||
VkPipelineLayout m_pipeLayoutUnpack;
|
||||
|
||||
VkDescriptorUpdateTemplateKHR m_templatePack;
|
||||
VkDescriptorUpdateTemplateKHR m_templateUnpack;
|
||||
|
||||
VkPipeline m_pipePackD24S8;
|
||||
VkPipeline m_pipePackD32S8;
|
||||
|
||||
VkPipeline m_pipeUnpackD24S8AsD32S8;
|
||||
VkPipeline m_pipeUnpackD24S8;
|
||||
VkPipeline m_pipeUnpackD32S8;
|
||||
|
||||
VkDescriptorSetLayout createPackDescriptorSetLayout();
|
||||
|
||||
VkDescriptorSetLayout createUnpackDescriptorSetLayout();
|
||||
|
||||
VkPipelineLayout createPipelineLayout(
|
||||
VkDescriptorSetLayout dsetLayout,
|
||||
uint32_t pushLayout);
|
||||
|
||||
VkDescriptorUpdateTemplateKHR createPackDescriptorUpdateTemplate();
|
||||
|
||||
VkDescriptorUpdateTemplateKHR createUnpackDescriptorUpdateTemplate();
|
||||
|
||||
VkPipeline createPipeline(
|
||||
VkPipelineLayout pipeLayout,
|
||||
const SpirvCodeBuffer& code);
|
||||
|
||||
};
|
||||
|
||||
}
|
@ -7,7 +7,6 @@
|
||||
#include "dxvk_meta_clear.h"
|
||||
#include "dxvk_meta_copy.h"
|
||||
#include "dxvk_meta_mipgen.h"
|
||||
#include "dxvk_meta_pack.h"
|
||||
#include "dxvk_meta_resolve.h"
|
||||
#include "dxvk_pipemanager.h"
|
||||
#include "dxvk_renderpass.h"
|
||||
@ -73,10 +72,6 @@ namespace dxvk {
|
||||
return m_metaResolve.get(m_device);
|
||||
}
|
||||
|
||||
DxvkMetaPackObjects& metaPack() {
|
||||
return m_metaPack.get(m_device);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
DxvkDevice* m_device;
|
||||
@ -94,7 +89,6 @@ namespace dxvk {
|
||||
Lazy<DxvkMetaClearObjects> m_metaClear;
|
||||
Lazy<DxvkMetaCopyObjects> m_metaCopy;
|
||||
Lazy<DxvkMetaResolveObjects> m_metaResolve;
|
||||
Lazy<DxvkMetaPackObjects> m_metaPack;
|
||||
|
||||
};
|
||||
|
||||
|
@ -37,9 +37,6 @@ dxvk_shaders = files([
|
||||
'shaders/dxvk_image_to_buffer_ds.comp',
|
||||
'shaders/dxvk_image_to_buffer_f.comp',
|
||||
|
||||
'shaders/dxvk_pack_d24s8.comp',
|
||||
'shaders/dxvk_pack_d32s8.comp',
|
||||
|
||||
'shaders/dxvk_present_frag.frag',
|
||||
'shaders/dxvk_present_frag_blit.frag',
|
||||
'shaders/dxvk_present_frag_ms.frag',
|
||||
@ -54,10 +51,6 @@ dxvk_shaders = files([
|
||||
'shaders/dxvk_resolve_frag_i.frag',
|
||||
'shaders/dxvk_resolve_frag_u.frag',
|
||||
|
||||
'shaders/dxvk_unpack_d24s8_as_d32s8.comp',
|
||||
'shaders/dxvk_unpack_d24s8.comp',
|
||||
'shaders/dxvk_unpack_d32s8.comp',
|
||||
|
||||
'hud/shaders/hud_chunk_frag_background.frag',
|
||||
'hud/shaders/hud_chunk_frag_visualize.frag',
|
||||
'hud/shaders/hud_chunk_vert_background.vert',
|
||||
@ -99,7 +92,6 @@ dxvk_src = [
|
||||
'dxvk_meta_clear.cpp',
|
||||
'dxvk_meta_copy.cpp',
|
||||
'dxvk_meta_mipgen.cpp',
|
||||
'dxvk_meta_pack.cpp',
|
||||
'dxvk_meta_resolve.cpp',
|
||||
'dxvk_options.cpp',
|
||||
'dxvk_pipelayout.cpp',
|
||||
|
@ -1,43 +0,0 @@
|
||||
#version 450
|
||||
|
||||
#extension GL_EXT_samplerless_texture_functions : require
|
||||
|
||||
layout(
|
||||
local_size_x = 8,
|
||||
local_size_y = 8,
|
||||
local_size_z = 1) in;
|
||||
|
||||
layout(binding = 0, std430)
|
||||
writeonly buffer s_buffer_t {
|
||||
uint data[];
|
||||
} s_buffer;
|
||||
|
||||
layout(binding = 1) uniform texture2DArray u_depth;
|
||||
layout(binding = 2) uniform utexture2DArray u_stencil;
|
||||
|
||||
layout(push_constant)
|
||||
uniform u_info_t {
|
||||
uvec2 src_offset;
|
||||
uvec2 src_extent;
|
||||
uvec2 dst_offset;
|
||||
uvec2 dst_extent;
|
||||
} u_info;
|
||||
|
||||
void main() {
|
||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.src_extent))) {
|
||||
uvec3 src_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.src_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uvec3 dst_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||
|
||||
float depth = texelFetch(u_depth, ivec3(src_coord), 0).r;
|
||||
uint stencil = texelFetch(u_stencil, ivec3(src_coord), 0).r;
|
||||
|
||||
s_buffer.data[dst_index] = uint(mix(0.0f, float((1 << 24) - 1), depth)) | (stencil << 24);
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
#version 450
|
||||
|
||||
#extension GL_EXT_samplerless_texture_functions : require
|
||||
|
||||
layout(
|
||||
local_size_x = 8,
|
||||
local_size_y = 8,
|
||||
local_size_z = 1) in;
|
||||
|
||||
struct d32s8_t {
|
||||
float d32;
|
||||
uint s8;
|
||||
};
|
||||
|
||||
layout(binding = 0, std430)
|
||||
writeonly buffer s_buffer_t {
|
||||
d32s8_t data[];
|
||||
} s_buffer;
|
||||
|
||||
layout(binding = 1) uniform texture2DArray u_depth;
|
||||
layout(binding = 2) uniform utexture2DArray u_stencil;
|
||||
|
||||
layout(push_constant)
|
||||
uniform u_info_t {
|
||||
uvec2 src_offset;
|
||||
uvec2 src_extent;
|
||||
uvec2 dst_offset;
|
||||
uvec2 dst_extent;
|
||||
} u_info;
|
||||
|
||||
void main() {
|
||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.src_extent))) {
|
||||
uvec3 src_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.src_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uvec3 dst_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||
|
||||
s_buffer.data[dst_index].d32 = texelFetch(u_depth, ivec3(src_coord), 0).r;
|
||||
s_buffer.data[dst_index].s8 = texelFetch(u_stencil, ivec3(src_coord), 0).r;
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
#version 450
|
||||
|
||||
layout(
|
||||
local_size_x = 64,
|
||||
local_size_y = 1,
|
||||
local_size_z = 1) in;
|
||||
|
||||
layout(binding = 0, r32ui) writeonly uniform uimageBuffer u_depth;
|
||||
layout(binding = 1, r8ui) writeonly uniform uimageBuffer u_stencil;
|
||||
|
||||
layout(binding = 2)
|
||||
readonly buffer s_buffer_t {
|
||||
uint data[];
|
||||
} s_buffer;
|
||||
|
||||
layout(push_constant)
|
||||
uniform u_info_t {
|
||||
uvec2 src_offset;
|
||||
uvec2 src_extent;
|
||||
uvec2 dst_offset;
|
||||
uvec2 dst_extent;
|
||||
} u_info;
|
||||
|
||||
void main() {
|
||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) {
|
||||
uvec3 src_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.src_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uvec3 dst_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uint src_index = src_coord.x + u_info.src_extent.x * (src_coord.y + u_info.src_extent.y * src_coord.z);
|
||||
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||
|
||||
uint src_data = s_buffer.data[src_index];
|
||||
imageStore(u_depth, int(dst_index), uvec4(src_data & 0xFFFFFF));
|
||||
imageStore(u_stencil, int(dst_index), uvec4(src_data >> 24));
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
#version 450
|
||||
|
||||
layout(
|
||||
local_size_x = 64,
|
||||
local_size_y = 1,
|
||||
local_size_z = 1) in;
|
||||
|
||||
layout(binding = 0, r32f) writeonly uniform imageBuffer u_depth;
|
||||
layout(binding = 1, r8ui) writeonly uniform uimageBuffer u_stencil;
|
||||
|
||||
layout(binding = 2)
|
||||
readonly buffer s_buffer_t {
|
||||
uint data[];
|
||||
} s_buffer;
|
||||
|
||||
layout(push_constant)
|
||||
uniform u_info_t {
|
||||
uvec2 src_offset;
|
||||
uvec2 src_extent;
|
||||
uvec2 dst_offset;
|
||||
uvec2 dst_extent;
|
||||
} u_info;
|
||||
|
||||
void main() {
|
||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) {
|
||||
uvec3 src_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.src_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uvec3 dst_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uint src_index = src_coord.x + u_info.src_extent.x * (src_coord.y + u_info.src_extent.y * src_coord.z);
|
||||
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||
|
||||
uint src_data = s_buffer.data[src_index];
|
||||
imageStore(u_depth, int(dst_index), vec4(float(src_data & 0xFFFFFF) / float(0xFFFFFF)));
|
||||
imageStore(u_stencil, int(dst_index), uvec4(src_data >> 24));
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
#version 450
|
||||
|
||||
layout(
|
||||
local_size_x = 64,
|
||||
local_size_y = 1,
|
||||
local_size_z = 1) in;
|
||||
|
||||
struct d32s8_t {
|
||||
float d32;
|
||||
uint s8;
|
||||
};
|
||||
|
||||
layout(binding = 0, r32f) writeonly uniform imageBuffer u_depth;
|
||||
layout(binding = 1, r8ui) writeonly uniform uimageBuffer u_stencil;
|
||||
|
||||
layout(binding = 2)
|
||||
readonly buffer s_buffer_t {
|
||||
d32s8_t data[];
|
||||
} s_buffer;
|
||||
|
||||
layout(push_constant)
|
||||
uniform u_info_t {
|
||||
uvec2 src_offset;
|
||||
uvec2 src_extent;
|
||||
uvec2 dst_offset;
|
||||
uvec2 dst_extent;
|
||||
} u_info;
|
||||
|
||||
void main() {
|
||||
if (all(lessThan(gl_GlobalInvocationID.xy, u_info.dst_extent))) {
|
||||
uvec3 src_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.src_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uvec3 dst_coord = uvec3(
|
||||
gl_GlobalInvocationID.xy + u_info.dst_offset,
|
||||
gl_GlobalInvocationID.z);
|
||||
|
||||
uint src_index = src_coord.x + u_info.src_extent.x * (src_coord.y + u_info.src_extent.y * src_coord.z);
|
||||
uint dst_index = dst_coord.x + u_info.dst_extent.x * (dst_coord.y + u_info.dst_extent.y * dst_coord.z);
|
||||
|
||||
d32s8_t src_data = s_buffer.data[src_index];
|
||||
imageStore(u_depth, int(dst_index), vec4(src_data.d32));
|
||||
imageStore(u_stencil, int(dst_index), uvec4(src_data.s8));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user