mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-01 19:29:16 +01:00
[dxvk] Replace VK_KHR_depth_stencil_resolve with core feature
This commit is contained in:
parent
b701dd497f
commit
956f293a69
@ -1071,8 +1071,8 @@ namespace dxvk {
|
|||||||
else {
|
else {
|
||||||
ctx->resolveDepthStencilImage(
|
ctx->resolveDepthStencilImage(
|
||||||
cDstImage, cSrcImage, cRegion,
|
cDstImage, cSrcImage, cRegion,
|
||||||
VK_RESOLVE_MODE_AVERAGE_BIT_KHR,
|
VK_RESOLVE_MODE_AVERAGE_BIT,
|
||||||
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR);
|
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -4250,8 +4250,8 @@ namespace dxvk {
|
|||||||
else {
|
else {
|
||||||
ctx->resolveDepthStencilImage(
|
ctx->resolveDepthStencilImage(
|
||||||
cResolveImage, cMainImage, region,
|
cResolveImage, cMainImage, region,
|
||||||
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR,
|
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT,
|
||||||
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR);
|
VK_RESOLVE_MODE_SAMPLE_ZERO_BIT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -6876,7 +6876,7 @@ namespace dxvk {
|
|||||||
// We should resolve using the first sample according to
|
// We should resolve using the first sample according to
|
||||||
// http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/Advanced-DX9-Capabilities-for-ATI-Radeon-Cards_v2.pdf
|
// http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/Advanced-DX9-Capabilities-for-ATI-Radeon-Cards_v2.pdf
|
||||||
// "The resolve operation copies the depth value from the *first sample only* into the resolved depth stencil texture."
|
// "The resolve operation copies the depth value from the *first sample only* into the resolved depth stencil texture."
|
||||||
constexpr auto resolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR;
|
constexpr auto resolveMode = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
|
||||||
|
|
||||||
VkImageResolve region;
|
VkImageResolve region;
|
||||||
region.srcSubresource = cSrcSubres;
|
region.srcSubresource = cSrcSubres;
|
||||||
|
@ -283,7 +283,7 @@ namespace dxvk {
|
|||||||
DxvkDeviceFeatures enabledFeatures) {
|
DxvkDeviceFeatures enabledFeatures) {
|
||||||
DxvkDeviceExtensions devExtensions;
|
DxvkDeviceExtensions devExtensions;
|
||||||
|
|
||||||
std::array<DxvkExt*, 29> devExtensionList = {{
|
std::array<DxvkExt*, 28> devExtensionList = {{
|
||||||
&devExtensions.amdMemoryOverallocationBehaviour,
|
&devExtensions.amdMemoryOverallocationBehaviour,
|
||||||
&devExtensions.amdShaderFragmentMask,
|
&devExtensions.amdShaderFragmentMask,
|
||||||
&devExtensions.ext4444Formats,
|
&devExtensions.ext4444Formats,
|
||||||
@ -303,7 +303,6 @@ namespace dxvk {
|
|||||||
&devExtensions.extShaderStencilExport,
|
&devExtensions.extShaderStencilExport,
|
||||||
&devExtensions.extTransformFeedback,
|
&devExtensions.extTransformFeedback,
|
||||||
&devExtensions.extVertexAttributeDivisor,
|
&devExtensions.extVertexAttributeDivisor,
|
||||||
&devExtensions.khrDepthStencilResolve,
|
|
||||||
&devExtensions.khrDriverProperties,
|
&devExtensions.khrDriverProperties,
|
||||||
&devExtensions.khrDynamicRendering,
|
&devExtensions.khrDynamicRendering,
|
||||||
&devExtensions.khrExternalMemoryWin32,
|
&devExtensions.khrExternalMemoryWin32,
|
||||||
@ -662,11 +661,6 @@ namespace dxvk {
|
|||||||
m_deviceInfo.extVertexAttributeDivisor.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extVertexAttributeDivisor);
|
m_deviceInfo.extVertexAttributeDivisor.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.extVertexAttributeDivisor);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_deviceExtensions.supports(VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME)) {
|
|
||||||
m_deviceInfo.khrDepthStencilResolve.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR;
|
|
||||||
m_deviceInfo.khrDepthStencilResolve.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDepthStencilResolve);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_deviceExtensions.supports(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
|
if (m_deviceExtensions.supports(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
|
||||||
m_deviceInfo.khrDeviceDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
|
m_deviceInfo.khrDeviceDriverProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR;
|
||||||
m_deviceInfo.khrDeviceDriverProperties.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDeviceDriverProperties);
|
m_deviceInfo.khrDeviceDriverProperties.pNext = std::exchange(m_deviceInfo.core.pNext, &m_deviceInfo.khrDeviceDriverProperties);
|
||||||
|
@ -1809,8 +1809,8 @@ namespace dxvk {
|
|||||||
} else {
|
} else {
|
||||||
this->resolveImageFb(
|
this->resolveImageFb(
|
||||||
dstImage, srcImage, region, format,
|
dstImage, srcImage, region, format,
|
||||||
VK_RESOLVE_MODE_NONE_KHR,
|
VK_RESOLVE_MODE_NONE,
|
||||||
VK_RESOLVE_MODE_NONE_KHR);
|
VK_RESOLVE_MODE_NONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1819,8 +1819,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageResolve& region,
|
const VkImageResolve& region,
|
||||||
VkResolveModeFlagBitsKHR depthMode,
|
VkResolveModeFlagBits depthMode,
|
||||||
VkResolveModeFlagBitsKHR stencilMode) {
|
VkResolveModeFlagBits stencilMode) {
|
||||||
this->spillRenderPass(true);
|
this->spillRenderPass(true);
|
||||||
this->prepareImage(m_execBarriers, dstImage, vk::makeSubresourceRange(region.dstSubresource));
|
this->prepareImage(m_execBarriers, dstImage, vk::makeSubresourceRange(region.dstSubresource));
|
||||||
this->prepareImage(m_execBarriers, srcImage, vk::makeSubresourceRange(region.srcSubresource));
|
this->prepareImage(m_execBarriers, srcImage, vk::makeSubresourceRange(region.srcSubresource));
|
||||||
@ -1834,7 +1834,7 @@ namespace dxvk {
|
|||||||
if (!(region.dstSubresource.aspectMask
|
if (!(region.dstSubresource.aspectMask
|
||||||
& region.srcSubresource.aspectMask
|
& region.srcSubresource.aspectMask
|
||||||
& VK_IMAGE_ASPECT_STENCIL_BIT))
|
& VK_IMAGE_ASPECT_STENCIL_BIT))
|
||||||
stencilMode = VK_RESOLVE_MODE_NONE_KHR;
|
stencilMode = VK_RESOLVE_MODE_NONE;
|
||||||
|
|
||||||
// We can only use the depth-stencil resolve path if we are resolving
|
// We can only use the depth-stencil resolve path if we are resolving
|
||||||
// a full subresource and both images have the same format.
|
// a full subresource and both images have the same format.
|
||||||
@ -1844,7 +1844,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
if (!useFb) {
|
if (!useFb) {
|
||||||
// Additionally, the given mode combination must be supported.
|
// Additionally, the given mode combination must be supported.
|
||||||
const auto& properties = m_device->properties().khrDepthStencilResolve;
|
const auto& properties = m_device->properties().vk12;
|
||||||
|
|
||||||
useFb |= (properties.supportedDepthResolveModes & depthMode) != depthMode
|
useFb |= (properties.supportedDepthResolveModes & depthMode) != depthMode
|
||||||
|| (properties.supportedStencilResolveModes & stencilMode) != stencilMode;
|
|| (properties.supportedStencilResolveModes & stencilMode) != stencilMode;
|
||||||
@ -3711,8 +3711,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageResolve& region,
|
const VkImageResolve& region,
|
||||||
VkResolveModeFlagBitsKHR depthMode,
|
VkResolveModeFlagBits depthMode,
|
||||||
VkResolveModeFlagBitsKHR stencilMode) {
|
VkResolveModeFlagBits stencilMode) {
|
||||||
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
|
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
|
||||||
auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource);
|
auto srcSubresourceRange = vk::makeSubresourceRange(region.srcSubresource);
|
||||||
|
|
||||||
@ -3813,8 +3813,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageResolve& region,
|
const VkImageResolve& region,
|
||||||
VkFormat format,
|
VkFormat format,
|
||||||
VkResolveModeFlagBitsKHR depthMode,
|
VkResolveModeFlagBits depthMode,
|
||||||
VkResolveModeFlagBitsKHR stencilMode) {
|
VkResolveModeFlagBits stencilMode) {
|
||||||
this->invalidateState();
|
this->invalidateState();
|
||||||
|
|
||||||
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
|
auto dstSubresourceRange = vk::makeSubresourceRange(region.dstSubresource);
|
||||||
@ -3829,9 +3829,9 @@ namespace dxvk {
|
|||||||
bool doDiscard = dstImage->isFullSubresource(region.dstSubresource, region.extent);
|
bool doDiscard = dstImage->isFullSubresource(region.dstSubresource, region.extent);
|
||||||
|
|
||||||
if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT)
|
if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT)
|
||||||
doDiscard &= depthMode != VK_RESOLVE_MODE_NONE_KHR;
|
doDiscard &= depthMode != VK_RESOLVE_MODE_NONE;
|
||||||
if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)
|
if (region.dstSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)
|
||||||
doDiscard &= stencilMode != VK_RESOLVE_MODE_NONE_KHR;
|
doDiscard &= stencilMode != VK_RESOLVE_MODE_NONE;
|
||||||
|
|
||||||
VkPipelineStageFlags dstStages;
|
VkPipelineStageFlags dstStages;
|
||||||
VkImageLayout dstLayout;
|
VkImageLayout dstLayout;
|
||||||
|
@ -832,8 +832,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageResolve& region,
|
const VkImageResolve& region,
|
||||||
VkResolveModeFlagBitsKHR depthMode,
|
VkResolveModeFlagBits depthMode,
|
||||||
VkResolveModeFlagBitsKHR stencilMode);
|
VkResolveModeFlagBits stencilMode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Transforms image subresource layouts
|
* \brief Transforms image subresource layouts
|
||||||
@ -1270,16 +1270,16 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageResolve& region,
|
const VkImageResolve& region,
|
||||||
VkResolveModeFlagBitsKHR depthMode,
|
VkResolveModeFlagBits depthMode,
|
||||||
VkResolveModeFlagBitsKHR stencilMode);
|
VkResolveModeFlagBits stencilMode);
|
||||||
|
|
||||||
void resolveImageFb(
|
void resolveImageFb(
|
||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
const Rc<DxvkImage>& srcImage,
|
const Rc<DxvkImage>& srcImage,
|
||||||
const VkImageResolve& region,
|
const VkImageResolve& region,
|
||||||
VkFormat format,
|
VkFormat format,
|
||||||
VkResolveModeFlagBitsKHR depthMode,
|
VkResolveModeFlagBits depthMode,
|
||||||
VkResolveModeFlagBitsKHR stencilMode);
|
VkResolveModeFlagBits stencilMode);
|
||||||
|
|
||||||
void performClear(
|
void performClear(
|
||||||
const Rc<DxvkImageView>& imageView,
|
const Rc<DxvkImageView>& imageView,
|
||||||
|
@ -22,7 +22,6 @@ namespace dxvk {
|
|||||||
VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2;
|
VkPhysicalDeviceRobustness2PropertiesEXT extRobustness2;
|
||||||
VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback;
|
VkPhysicalDeviceTransformFeedbackPropertiesEXT extTransformFeedback;
|
||||||
VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor;
|
VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT extVertexAttributeDivisor;
|
||||||
VkPhysicalDeviceDepthStencilResolvePropertiesKHR khrDepthStencilResolve;
|
|
||||||
VkPhysicalDeviceDriverPropertiesKHR khrDeviceDriverProperties;
|
VkPhysicalDeviceDriverPropertiesKHR khrDeviceDriverProperties;
|
||||||
VkPhysicalDeviceFloatControlsPropertiesKHR khrShaderFloatControls;
|
VkPhysicalDeviceFloatControlsPropertiesKHR khrShaderFloatControls;
|
||||||
};
|
};
|
||||||
|
@ -295,7 +295,6 @@ namespace dxvk {
|
|||||||
DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional };
|
DxvkExt extShaderStencilExport = { VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||||
DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, DxvkExtMode::Optional };
|
DxvkExt extTransformFeedback = { VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||||
DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional };
|
DxvkExt extVertexAttributeDivisor = { VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||||
DxvkExt khrDepthStencilResolve = { VK_KHR_DEPTH_STENCIL_RESOLVE_EXTENSION_NAME, DxvkExtMode::Required };
|
|
||||||
DxvkExt khrDriverProperties = { VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, DxvkExtMode::Optional };
|
DxvkExt khrDriverProperties = { VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||||
DxvkExt khrDynamicRendering = { VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, DxvkExtMode::Required };
|
DxvkExt khrDynamicRendering = { VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME, DxvkExtMode::Required };
|
||||||
DxvkExt khrExternalMemoryWin32 = { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, DxvkExtMode::Optional };
|
DxvkExt khrExternalMemoryWin32 = { VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, DxvkExtMode::Optional };
|
||||||
|
@ -95,8 +95,8 @@ namespace dxvk {
|
|||||||
DxvkMetaResolvePipeline DxvkMetaResolveObjects::getPipeline(
|
DxvkMetaResolvePipeline DxvkMetaResolveObjects::getPipeline(
|
||||||
VkFormat format,
|
VkFormat format,
|
||||||
VkSampleCountFlagBits samples,
|
VkSampleCountFlagBits samples,
|
||||||
VkResolveModeFlagBitsKHR depthResolveMode,
|
VkResolveModeFlagBits depthResolveMode,
|
||||||
VkResolveModeFlagBitsKHR stencilResolveMode) {
|
VkResolveModeFlagBits stencilResolveMode) {
|
||||||
std::lock_guard<dxvk::mutex> lock(m_mutex);
|
std::lock_guard<dxvk::mutex> lock(m_mutex);
|
||||||
|
|
||||||
DxvkMetaResolvePipelineKey key;
|
DxvkMetaResolvePipelineKey key;
|
||||||
@ -214,8 +214,8 @@ namespace dxvk {
|
|||||||
|
|
||||||
std::array<VkSpecializationMapEntry, 3> specEntries = {{
|
std::array<VkSpecializationMapEntry, 3> specEntries = {{
|
||||||
{ 0, offsetof(DxvkMetaResolvePipelineKey, samples), sizeof(VkSampleCountFlagBits) },
|
{ 0, offsetof(DxvkMetaResolvePipelineKey, samples), sizeof(VkSampleCountFlagBits) },
|
||||||
{ 1, offsetof(DxvkMetaResolvePipelineKey, modeD), sizeof(VkResolveModeFlagBitsKHR) },
|
{ 1, offsetof(DxvkMetaResolvePipelineKey, modeD), sizeof(VkResolveModeFlagBits) },
|
||||||
{ 2, offsetof(DxvkMetaResolvePipelineKey, modeS), sizeof(VkResolveModeFlagBitsKHR) },
|
{ 2, offsetof(DxvkMetaResolvePipelineKey, modeS), sizeof(VkResolveModeFlagBits) },
|
||||||
}};
|
}};
|
||||||
|
|
||||||
VkSpecializationInfo specInfo;
|
VkSpecializationInfo specInfo;
|
||||||
@ -304,10 +304,10 @@ namespace dxvk {
|
|||||||
stencilOp.writeMask = 0xFFFFFFFF;
|
stencilOp.writeMask = 0xFFFFFFFF;
|
||||||
|
|
||||||
VkPipelineDepthStencilStateCreateInfo dsState = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO };
|
VkPipelineDepthStencilStateCreateInfo dsState = { VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO };
|
||||||
dsState.depthTestEnable = key.modeD != VK_RESOLVE_MODE_NONE_KHR;
|
dsState.depthTestEnable = key.modeD != VK_RESOLVE_MODE_NONE;
|
||||||
dsState.depthWriteEnable = key.modeD != VK_RESOLVE_MODE_NONE_KHR;
|
dsState.depthWriteEnable = key.modeD != VK_RESOLVE_MODE_NONE;
|
||||||
dsState.depthCompareOp = VK_COMPARE_OP_ALWAYS;
|
dsState.depthCompareOp = VK_COMPARE_OP_ALWAYS;
|
||||||
dsState.stencilTestEnable = key.modeS != VK_RESOLVE_MODE_NONE_KHR;
|
dsState.stencilTestEnable = key.modeS != VK_RESOLVE_MODE_NONE;
|
||||||
dsState.front = stencilOp;
|
dsState.front = stencilOp;
|
||||||
dsState.back = stencilOp;
|
dsState.back = stencilOp;
|
||||||
|
|
||||||
|
@ -32,8 +32,8 @@ namespace dxvk {
|
|||||||
struct DxvkMetaResolvePipelineKey {
|
struct DxvkMetaResolvePipelineKey {
|
||||||
VkFormat format;
|
VkFormat format;
|
||||||
VkSampleCountFlagBits samples;
|
VkSampleCountFlagBits samples;
|
||||||
VkResolveModeFlagBitsKHR modeD;
|
VkResolveModeFlagBits modeD;
|
||||||
VkResolveModeFlagBitsKHR modeS;
|
VkResolveModeFlagBits modeS;
|
||||||
|
|
||||||
bool eq(const DxvkMetaResolvePipelineKey& other) const {
|
bool eq(const DxvkMetaResolvePipelineKey& other) const {
|
||||||
return this->format == other.format
|
return this->format == other.format
|
||||||
@ -105,8 +105,8 @@ namespace dxvk {
|
|||||||
DxvkMetaResolvePipeline getPipeline(
|
DxvkMetaResolvePipeline getPipeline(
|
||||||
VkFormat format,
|
VkFormat format,
|
||||||
VkSampleCountFlagBits samples,
|
VkSampleCountFlagBits samples,
|
||||||
VkResolveModeFlagBitsKHR depthResolveMode,
|
VkResolveModeFlagBits depthResolveMode,
|
||||||
VkResolveModeFlagBitsKHR stencilResolveMode);
|
VkResolveModeFlagBits stencilResolveMode);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
#version 450
|
#version 450
|
||||||
|
|
||||||
#define VK_RESOLVE_MODE_NONE_KHR (0)
|
#define VK_RESOLVE_MODE_NONE (0)
|
||||||
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR (1 << 0)
|
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0)
|
||||||
#define VK_RESOLVE_MODE_AVERAGE_BIT_KHR (1 << 1)
|
#define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1)
|
||||||
#define VK_RESOLVE_MODE_MIN_BIT_KHR (1 << 2)
|
#define VK_RESOLVE_MODE_MIN_BIT (1 << 2)
|
||||||
#define VK_RESOLVE_MODE_MAX_BIT_KHR (1 << 3)
|
#define VK_RESOLVE_MODE_MAX_BIT (1 << 3)
|
||||||
|
|
||||||
layout(constant_id = 0) const int c_samples = 1;
|
layout(constant_id = 0) const int c_samples = 1;
|
||||||
layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR;
|
layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
|
||||||
|
|
||||||
layout(binding = 0) uniform sampler2DMSArray s_depth;
|
layout(binding = 0) uniform sampler2DMSArray s_depth;
|
||||||
|
|
||||||
@ -20,24 +20,24 @@ float resolve_depth(ivec3 coord) {
|
|||||||
float depth = 0.0f;
|
float depth = 0.0f;
|
||||||
|
|
||||||
switch (c_mode_d) {
|
switch (c_mode_d) {
|
||||||
case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR:
|
case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_AVERAGE_BIT_KHR:
|
case VK_RESOLVE_MODE_AVERAGE_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
depth += texelFetch(s_depth, coord, i).r;
|
depth += texelFetch(s_depth, coord, i).r;
|
||||||
depth /= float(c_samples);
|
depth /= float(c_samples);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_MIN_BIT_KHR:
|
case VK_RESOLVE_MODE_MIN_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
depth = min(depth, texelFetch(s_depth, coord, i).r);
|
depth = min(depth, texelFetch(s_depth, coord, i).r);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_MAX_BIT_KHR:
|
case VK_RESOLVE_MODE_MAX_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
depth = max(depth, texelFetch(s_depth, coord, i).r);
|
depth = max(depth, texelFetch(s_depth, coord, i).r);
|
||||||
|
@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
#extension GL_ARB_shader_stencil_export : enable
|
#extension GL_ARB_shader_stencil_export : enable
|
||||||
|
|
||||||
#define VK_RESOLVE_MODE_NONE_KHR (0)
|
#define VK_RESOLVE_MODE_NONE (0)
|
||||||
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR (1 << 0)
|
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0)
|
||||||
#define VK_RESOLVE_MODE_AVERAGE_BIT_KHR (1 << 1)
|
#define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1)
|
||||||
#define VK_RESOLVE_MODE_MIN_BIT_KHR (1 << 2)
|
#define VK_RESOLVE_MODE_MIN_BIT (1 << 2)
|
||||||
#define VK_RESOLVE_MODE_MAX_BIT_KHR (1 << 3)
|
#define VK_RESOLVE_MODE_MAX_BIT (1 << 3)
|
||||||
|
|
||||||
layout(constant_id = 0) const int c_samples = 1;
|
layout(constant_id = 0) const int c_samples = 1;
|
||||||
layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR;
|
layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
|
||||||
layout(constant_id = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR;
|
layout(constant_id = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT;
|
||||||
|
|
||||||
layout(binding = 0) uniform sampler2DMSArray s_depth;
|
layout(binding = 0) uniform sampler2DMSArray s_depth;
|
||||||
layout(binding = 1) uniform usampler2DMSArray s_stencil;
|
layout(binding = 1) uniform usampler2DMSArray s_stencil;
|
||||||
@ -24,24 +24,24 @@ float resolve_depth(ivec3 coord) {
|
|||||||
float depth = 0.0f;
|
float depth = 0.0f;
|
||||||
|
|
||||||
switch (c_mode_d) {
|
switch (c_mode_d) {
|
||||||
case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR:
|
case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_AVERAGE_BIT_KHR:
|
case VK_RESOLVE_MODE_AVERAGE_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
depth += texelFetch(s_depth, coord, i).r;
|
depth += texelFetch(s_depth, coord, i).r;
|
||||||
depth /= float(c_samples);
|
depth /= float(c_samples);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_MIN_BIT_KHR:
|
case VK_RESOLVE_MODE_MIN_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
depth = min(depth, texelFetch(s_depth, coord, i).r);
|
depth = min(depth, texelFetch(s_depth, coord, i).r);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_MAX_BIT_KHR:
|
case VK_RESOLVE_MODE_MAX_BIT:
|
||||||
depth = texelFetch(s_depth, coord, 0).r;
|
depth = texelFetch(s_depth, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
depth = max(depth, texelFetch(s_depth, coord, i).r);
|
depth = max(depth, texelFetch(s_depth, coord, i).r);
|
||||||
@ -55,17 +55,17 @@ int resolve_stencil(ivec3 coord) {
|
|||||||
uint stencil = 0u;
|
uint stencil = 0u;
|
||||||
|
|
||||||
switch (c_mode_s) {
|
switch (c_mode_s) {
|
||||||
case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR:
|
case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT:
|
||||||
stencil = texelFetch(s_stencil, coord, 0).r;
|
stencil = texelFetch(s_stencil, coord, 0).r;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_MIN_BIT_KHR:
|
case VK_RESOLVE_MODE_MIN_BIT:
|
||||||
stencil = texelFetch(s_stencil, coord, 0).r;
|
stencil = texelFetch(s_stencil, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
stencil = min(stencil, texelFetch(s_stencil, coord, i).r);
|
stencil = min(stencil, texelFetch(s_stencil, coord, i).r);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VK_RESOLVE_MODE_MAX_BIT_KHR:
|
case VK_RESOLVE_MODE_MAX_BIT:
|
||||||
stencil = texelFetch(s_stencil, coord, 0).r;
|
stencil = texelFetch(s_stencil, coord, 0).r;
|
||||||
for (int i = 1; i < c_samples; i++)
|
for (int i = 1; i < c_samples; i++)
|
||||||
stencil = max(stencil, texelFetch(s_stencil, coord, i).r);
|
stencil = max(stencil, texelFetch(s_stencil, coord, i).r);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user