1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-18 02:52:10 +01:00

[dxvk] Get rid of immutable sampler for resolve operations

This commit is contained in:
Philip Rebohle 2022-09-12 16:00:36 +02:00
parent 26c8f46b6b
commit d9466eb2b9
9 changed files with 32 additions and 38 deletions

View File

@ -4281,7 +4281,7 @@ namespace dxvk {
descriptorWrites[i].dstSet = descriptorSet; descriptorWrites[i].dstSet = descriptorSet;
descriptorWrites[i].dstBinding = i; descriptorWrites[i].dstBinding = i;
descriptorWrites[i].descriptorCount = 1; descriptorWrites[i].descriptorCount = 1;
descriptorWrites[i].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; descriptorWrites[i].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
descriptorWrites[i].pImageInfo = &descriptorImages[i]; descriptorWrites[i].pImageInfo = &descriptorImages[i];
} }

View File

@ -54,7 +54,6 @@ namespace dxvk {
DxvkMetaResolveObjects::DxvkMetaResolveObjects(const DxvkDevice* device) DxvkMetaResolveObjects::DxvkMetaResolveObjects(const DxvkDevice* device)
: m_vkd (device->vkd()), : m_vkd (device->vkd()),
m_sampler (createSampler()),
m_shaderFragF (device->features().amdShaderFragmentMask m_shaderFragF (device->features().amdShaderFragmentMask
? createShaderModule(dxvk_resolve_frag_f_amd) ? createShaderModule(dxvk_resolve_frag_f_amd)
: createShaderModule(dxvk_resolve_frag_f)), : createShaderModule(dxvk_resolve_frag_f)),
@ -87,8 +86,6 @@ namespace dxvk {
m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderFragU, nullptr); m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderFragU, nullptr);
m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderGeom, nullptr); m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderGeom, nullptr);
m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderVert, nullptr); m_vkd->vkDestroyShaderModule(m_vkd->device(), m_shaderVert, nullptr);
m_vkd->vkDestroySampler(m_vkd->device(), m_sampler, nullptr);
} }
@ -115,23 +112,6 @@ namespace dxvk {
} }
VkSampler DxvkMetaResolveObjects::createSampler() const {
VkSamplerCreateInfo info = { VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO };
info.magFilter = VK_FILTER_NEAREST;
info.minFilter = VK_FILTER_NEAREST;
info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
info.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
VkSampler result = VK_NULL_HANDLE;
if (m_vkd->vkCreateSampler(m_vkd->device(), &info, nullptr, &result) != VK_SUCCESS)
throw DxvkError("DxvkMetaResolveObjects: Failed to create sampler");
return result;
}
VkShaderModule DxvkMetaResolveObjects::createShaderModule( VkShaderModule DxvkMetaResolveObjects::createShaderModule(
const SpirvCodeBuffer& code) const { const SpirvCodeBuffer& code) const {
VkShaderModuleCreateInfo info = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO }; VkShaderModuleCreateInfo info = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO };
@ -158,8 +138,8 @@ namespace dxvk {
VkDescriptorSetLayout DxvkMetaResolveObjects::createDescriptorSetLayout( VkDescriptorSetLayout DxvkMetaResolveObjects::createDescriptorSetLayout(
const DxvkMetaResolvePipelineKey& key) { const DxvkMetaResolvePipelineKey& key) {
std::array<VkDescriptorSetLayoutBinding, 2> bindings = {{ std::array<VkDescriptorSetLayoutBinding, 2> bindings = {{
{ 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, &m_sampler }, { 0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr },
{ 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, &m_sampler }, { 1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr },
}}; }};
VkDescriptorSetLayoutCreateInfo info = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO }; VkDescriptorSetLayoutCreateInfo info = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };

View File

@ -112,8 +112,6 @@ namespace dxvk {
Rc<vk::DeviceFn> m_vkd; Rc<vk::DeviceFn> m_vkd;
VkSampler m_sampler;
VkShaderModule m_shaderVert = VK_NULL_HANDLE; VkShaderModule m_shaderVert = VK_NULL_HANDLE;
VkShaderModule m_shaderGeom = VK_NULL_HANDLE; VkShaderModule m_shaderGeom = VK_NULL_HANDLE;
VkShaderModule m_shaderFragF = VK_NULL_HANDLE; VkShaderModule m_shaderFragF = VK_NULL_HANDLE;
@ -129,8 +127,6 @@ namespace dxvk {
DxvkMetaResolvePipeline, DxvkMetaResolvePipeline,
DxvkHash, DxvkEq> m_pipelines; DxvkHash, DxvkEq> m_pipelines;
VkSampler createSampler() const;
VkShaderModule createShaderModule( VkShaderModule createShaderModule(
const SpirvCodeBuffer& code) const; const SpirvCodeBuffer& code) const;

View File

@ -1,5 +1,7 @@
#version 450 #version 450
#extension GL_EXT_samplerless_texture_functions : enable
#define VK_RESOLVE_MODE_NONE (0) #define VK_RESOLVE_MODE_NONE (0)
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0) #define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0)
#define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1) #define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1)
@ -9,7 +11,7 @@
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; 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 texture2DMSArray s_depth;
layout(push_constant) layout(push_constant)
uniform u_info_t { uniform u_info_t {

View File

@ -1,6 +1,7 @@
#version 450 #version 450
#extension GL_ARB_shader_stencil_export : enable #extension GL_ARB_shader_stencil_export : enable
#extension GL_EXT_samplerless_texture_functions : enable
#define VK_RESOLVE_MODE_NONE (0) #define VK_RESOLVE_MODE_NONE (0)
#define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0) #define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0)
@ -12,8 +13,8 @@ layout(constant_id = 0) const int c_samples = 1;
layout(constant_id = 1) const int c_mode_d = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; 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; 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 texture2DMSArray s_depth;
layout(binding = 1) uniform usampler2DMSArray s_stencil; layout(binding = 1) uniform utexture2DMSArray s_stencil;
layout(push_constant) layout(push_constant)
uniform u_info_t { uniform u_info_t {

View File

@ -1,8 +1,10 @@
#version 450 #version 450
#extension GL_EXT_samplerless_texture_functions : enable
layout(constant_id = 0) const int c_samples = 1; layout(constant_id = 0) const int c_samples = 1;
layout(binding = 0) uniform sampler2DMSArray s_image; layout(binding = 0) uniform texture2DMSArray s_image;
layout(location = 0) out vec4 o_color; layout(location = 0) out vec4 o_color;

View File

@ -1,11 +1,20 @@
#version 450 #version 450
#extension GL_AMD_shader_fragment_mask: enable #extension GL_EXT_samplerless_texture_functions : enable
#extension GL_EXT_spirv_intrinsics : enable
// GL_AMD_shader_fragment_mask was never updated to support
// sampler-less functions, so we have to define these manually
spirv_instruction(extensions = ["SPV_AMD_shader_fragment_mask"], capabilities = [5010], id = 5011)
uint fragment_mask_fetch(texture2DMSArray tex, ivec3 coord);
spirv_instruction(extensions = ["SPV_AMD_shader_fragment_mask"], capabilities = [5010], id = 5012)
vec4 fragment_fetch(texture2DMSArray tex, ivec3 coord, uint index);
layout(constant_id = 0) const int c_samples = 1; layout(constant_id = 0) const int c_samples = 1;
layout(set = 0, binding = 0) layout(set = 0, binding = 0)
uniform sampler2DMSArray s_image; uniform texture2DMSArray s_image;
layout(location = 0) out vec4 o_color; layout(location = 0) out vec4 o_color;
@ -18,7 +27,7 @@ void main() {
ivec3 coord = ivec3(gl_FragCoord.xy + u_info.offset, gl_Layer); ivec3 coord = ivec3(gl_FragCoord.xy + u_info.offset, gl_Layer);
// get a four-bit fragment index for each sample // get a four-bit fragment index for each sample
uint fragMask = fragmentMaskFetchAMD(s_image, coord); uint fragMask = fragment_mask_fetch(s_image, coord);
// count number of occurences of each fragment // count number of occurences of each fragment
// index in one four-bit counter for each sample // index in one four-bit counter for each sample
@ -37,11 +46,11 @@ void main() {
int fragIndex = findLSB(fragCount) >> 2; int fragIndex = findLSB(fragCount) >> 2;
int fragShift = fragIndex << 2; int fragShift = fragIndex << 2;
o_color += fragmentFetchAMD(s_image, coord, fragIndex) o_color += fragment_fetch(s_image, coord, fragIndex)
* float(bitfieldExtract(fragCount, fragShift, 4)); * float(bitfieldExtract(fragCount, fragShift, 4));
fragCount = bitfieldInsert(fragCount, 0, fragShift, 4); fragCount = bitfieldInsert(fragCount, 0, fragShift, 4);
} }
o_color /= float(c_samples); o_color /= float(c_samples);
} }

View File

@ -1,6 +1,8 @@
#version 450 #version 450
layout(binding = 0) uniform isampler2DMSArray s_image; #extension GL_EXT_samplerless_texture_functions : enable
layout(binding = 0) uniform itexture2DMSArray s_image;
layout(location = 0) out ivec4 o_color; layout(location = 0) out ivec4 o_color;

View File

@ -1,6 +1,8 @@
#version 450 #version 450
layout(binding = 0) uniform usampler2DMSArray s_image; #extension GL_EXT_samplerless_texture_functions : enable
layout(binding = 0) uniform utexture2DMSArray s_image;
layout(location = 0) out uvec4 o_color; layout(location = 0) out uvec4 o_color;