From d9466eb2b99f210b1afc465d83bdfdc4b01e6cd5 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 12 Sep 2022 16:00:36 +0200 Subject: [PATCH] [dxvk] Get rid of immutable sampler for resolve operations --- src/dxvk/dxvk_context.cpp | 2 +- src/dxvk/dxvk_meta_resolve.cpp | 24 ++----------------- src/dxvk/dxvk_meta_resolve.h | 4 ---- src/dxvk/shaders/dxvk_resolve_frag_d.frag | 4 +++- src/dxvk/shaders/dxvk_resolve_frag_ds.frag | 5 ++-- src/dxvk/shaders/dxvk_resolve_frag_f.frag | 4 +++- src/dxvk/shaders/dxvk_resolve_frag_f_amd.frag | 19 +++++++++++---- src/dxvk/shaders/dxvk_resolve_frag_i.frag | 4 +++- src/dxvk/shaders/dxvk_resolve_frag_u.frag | 4 +++- 9 files changed, 32 insertions(+), 38 deletions(-) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index a99659f21..b4215ddbb 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -4281,7 +4281,7 @@ namespace dxvk { descriptorWrites[i].dstSet = descriptorSet; descriptorWrites[i].dstBinding = i; 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]; } diff --git a/src/dxvk/dxvk_meta_resolve.cpp b/src/dxvk/dxvk_meta_resolve.cpp index 7e3dfd2e8..f611fbaf9 100644 --- a/src/dxvk/dxvk_meta_resolve.cpp +++ b/src/dxvk/dxvk_meta_resolve.cpp @@ -54,7 +54,6 @@ namespace dxvk { DxvkMetaResolveObjects::DxvkMetaResolveObjects(const DxvkDevice* device) : m_vkd (device->vkd()), - m_sampler (createSampler()), m_shaderFragF (device->features().amdShaderFragmentMask ? createShaderModule(dxvk_resolve_frag_f_amd) : 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_shaderGeom, 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( const SpirvCodeBuffer& code) const { VkShaderModuleCreateInfo info = { VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO }; @@ -158,8 +138,8 @@ namespace dxvk { VkDescriptorSetLayout DxvkMetaResolveObjects::createDescriptorSetLayout( const DxvkMetaResolvePipelineKey& key) { std::array bindings = {{ - { 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, &m_sampler }, - { 1, 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_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr }, }}; VkDescriptorSetLayoutCreateInfo info = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO }; diff --git a/src/dxvk/dxvk_meta_resolve.h b/src/dxvk/dxvk_meta_resolve.h index 5bf26301a..c481cee68 100644 --- a/src/dxvk/dxvk_meta_resolve.h +++ b/src/dxvk/dxvk_meta_resolve.h @@ -112,8 +112,6 @@ namespace dxvk { Rc m_vkd; - VkSampler m_sampler; - VkShaderModule m_shaderVert = VK_NULL_HANDLE; VkShaderModule m_shaderGeom = VK_NULL_HANDLE; VkShaderModule m_shaderFragF = VK_NULL_HANDLE; @@ -129,8 +127,6 @@ namespace dxvk { DxvkMetaResolvePipeline, DxvkHash, DxvkEq> m_pipelines; - VkSampler createSampler() const; - VkShaderModule createShaderModule( const SpirvCodeBuffer& code) const; diff --git a/src/dxvk/shaders/dxvk_resolve_frag_d.frag b/src/dxvk/shaders/dxvk_resolve_frag_d.frag index dd913bee9..70152d014 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_d.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_d.frag @@ -1,5 +1,7 @@ #version 450 +#extension GL_EXT_samplerless_texture_functions : enable + #define VK_RESOLVE_MODE_NONE (0) #define VK_RESOLVE_MODE_SAMPLE_ZERO_BIT (1 << 0) #define VK_RESOLVE_MODE_AVERAGE_BIT (1 << 1) @@ -9,7 +11,7 @@ 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(binding = 0) uniform sampler2DMSArray s_depth; +layout(binding = 0) uniform texture2DMSArray s_depth; layout(push_constant) uniform u_info_t { diff --git a/src/dxvk/shaders/dxvk_resolve_frag_ds.frag b/src/dxvk/shaders/dxvk_resolve_frag_ds.frag index 3c9564685..b92a03d71 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_ds.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_ds.frag @@ -1,6 +1,7 @@ #version 450 #extension GL_ARB_shader_stencil_export : enable +#extension GL_EXT_samplerless_texture_functions : enable #define VK_RESOLVE_MODE_NONE (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 = 2) const int c_mode_s = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT; -layout(binding = 0) uniform sampler2DMSArray s_depth; -layout(binding = 1) uniform usampler2DMSArray s_stencil; +layout(binding = 0) uniform texture2DMSArray s_depth; +layout(binding = 1) uniform utexture2DMSArray s_stencil; layout(push_constant) uniform u_info_t { diff --git a/src/dxvk/shaders/dxvk_resolve_frag_f.frag b/src/dxvk/shaders/dxvk_resolve_frag_f.frag index 645a2f9bf..2c7442c14 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_f.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_f.frag @@ -1,8 +1,10 @@ #version 450 +#extension GL_EXT_samplerless_texture_functions : enable + 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; diff --git a/src/dxvk/shaders/dxvk_resolve_frag_f_amd.frag b/src/dxvk/shaders/dxvk_resolve_frag_f_amd.frag index a9cf9ee48..a550e3507 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_f_amd.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_f_amd.frag @@ -1,11 +1,20 @@ #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(set = 0, binding = 0) -uniform sampler2DMSArray s_image; +uniform texture2DMSArray s_image; layout(location = 0) out vec4 o_color; @@ -18,7 +27,7 @@ void main() { ivec3 coord = ivec3(gl_FragCoord.xy + u_info.offset, gl_Layer); // 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 // index in one four-bit counter for each sample @@ -37,11 +46,11 @@ void main() { int fragIndex = findLSB(fragCount) >> 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)); fragCount = bitfieldInsert(fragCount, 0, fragShift, 4); } o_color /= float(c_samples); -} \ No newline at end of file +} diff --git a/src/dxvk/shaders/dxvk_resolve_frag_i.frag b/src/dxvk/shaders/dxvk_resolve_frag_i.frag index 021980d64..a721897a5 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_i.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_i.frag @@ -1,6 +1,8 @@ #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; diff --git a/src/dxvk/shaders/dxvk_resolve_frag_u.frag b/src/dxvk/shaders/dxvk_resolve_frag_u.frag index 3d3cfdf36..f7b4e73da 100644 --- a/src/dxvk/shaders/dxvk_resolve_frag_u.frag +++ b/src/dxvk/shaders/dxvk_resolve_frag_u.frag @@ -1,6 +1,8 @@ #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;