diff --git a/util/test/demos/vk/vk_descriptor_index.cpp b/util/test/demos/vk/vk_descriptor_index.cpp index 63df268e0..992416376 100644 --- a/util/test/demos/vk/vk_descriptor_index.cpp +++ b/util/test/demos/vk/vk_descriptor_index.cpp @@ -439,13 +439,7 @@ void main() descset)); } - VkSampler sampler = VK_NULL_HANDLE; - - VkSamplerCreateInfo sampInfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - sampInfo.magFilter = VK_FILTER_LINEAR; - sampInfo.minFilter = VK_FILTER_LINEAR; - - vkCreateSampler(device, &sampInfo, NULL, &sampler); + VkSampler sampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); vkh::DescriptorImageInfo iminfo(badimgview, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, sampler); vkh::WriteDescriptorSet up(VK_NULL_HANDLE, 0, 0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, @@ -603,7 +597,6 @@ void main() vkDeviceWaitIdle(device); vkDestroyDescriptorPool(device, descpool, NULL); - vkDestroySampler(device, sampler, NULL); return 0; } diff --git a/util/test/demos/vk/vk_helpers.h b/util/test/demos/vk/vk_helpers.h index 3cfb5d72e..4b36e2632 100644 --- a/util/test/demos/vk/vk_helpers.h +++ b/util/test/demos/vk/vk_helpers.h @@ -513,6 +513,68 @@ struct ImageCreateInfo : public VkImageCreateInfo operator const VkImageCreateInfo *() const { return this; } }; +struct SamplerCreateInfo : public VkSamplerCreateInfo +{ + // simplified constructor, filter and address mode identical in all directions + SamplerCreateInfo(VkFilter filter, + VkSamplerAddressMode addressMode = VK_SAMPLER_ADDRESS_MODE_REPEAT, + float maxAnisotropy = 0.0f, + VkBorderColor borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + float mipLodBias = 0.0f, float minLod = 0.0f, float maxLod = 0.0f, + VkCompareOp compareOp = VK_COMPARE_OP_NEVER, + VkBool32 unnormalizedCoordinates = VK_FALSE, VkSamplerCreateFlags flags = 0) + : SamplerCreateInfo(filter, filter, + filter == VK_FILTER_NEAREST ? VK_SAMPLER_MIPMAP_MODE_NEAREST + : VK_SAMPLER_MIPMAP_MODE_LINEAR, + addressMode, addressMode, addressMode, maxAnisotropy, borderColor, + mipLodBias, minLod, maxLod, compareOp, unnormalizedCoordinates, flags) + { + } + + SamplerCreateInfo(VkFilter minFilter, VkFilter magFilter, + VkSamplerMipmapMode mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR, + VkSamplerAddressMode addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT, + VkSamplerAddressMode addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT, + VkSamplerAddressMode addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT, + float maxAnisotropy = 0.0f, + VkBorderColor borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, + float mipLodBias = 0.0f, float minLod = 0.0f, float maxLod = 0.0f, + VkCompareOp compareOp = VK_COMPARE_OP_NEVER, + VkBool32 unnormalizedCoordinates = VK_FALSE, VkSamplerCreateFlags flags = 0) + { + sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + pNext = NULL; + + this->flags = flags; + this->magFilter = magFilter; + this->minFilter = minFilter; + this->mipmapMode = mipmapMode; + this->addressModeU = addressModeU; + this->addressModeV = addressModeV; + this->addressModeW = addressModeW; + + this->mipLodBias = mipLodBias; + + this->anisotropyEnable = (maxAnisotropy > 1.0f); + this->maxAnisotropy = maxAnisotropy; + + this->compareEnable = compareOp != VK_COMPARE_OP_NEVER; + this->compareOp = compareOp; + this->minLod = minLod; + this->maxLod = maxLod; + this->borderColor = borderColor; + this->unnormalizedCoordinates = unnormalizedCoordinates; + } + + SamplerCreateInfo &next(const void *next) + { + this->pNext = next; + return *this; + } + + operator const VkSamplerCreateInfo *() const { return this; } +}; + struct ImageViewCreateInfo : public VkImageViewCreateInfo { ImageViewCreateInfo(VkImage image, VkImageViewType viewType, VkFormat format, diff --git a/util/test/demos/vk/vk_parameter_zoo.cpp b/util/test/demos/vk/vk_parameter_zoo.cpp index 045d53fd4..b1b867eab 100644 --- a/util/test/demos/vk/vk_parameter_zoo.cpp +++ b/util/test/demos/vk/vk_parameter_zoo.cpp @@ -291,11 +291,7 @@ void main() })); VkSampler invalidSampler = (VkSampler)0x1234; - VkSampler validSampler = VK_NULL_HANDLE; - VkSamplerCreateInfo sampInfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - sampInfo.magFilter = VK_FILTER_LINEAR; - sampInfo.minFilter = VK_FILTER_LINEAR; - vkCreateSampler(device, &sampInfo, NULL, &validSampler); + VkSampler validSampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); VkDescriptorSetLayout immutsetlayout = createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_VERTEX_BIT, &validSampler}, @@ -855,10 +851,10 @@ void main() // create the specific resources that will only be referenced through descriptor updates for(int i = 0; i < 4; i++) { - vkCreateSampler(device, &sampInfo, NULL, &refsamp[i]); + refsamp[i] = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); setName(refsamp[i], "refsamp" + std::to_string(i)); - vkCreateSampler(device, &sampInfo, NULL, &refcombinedsamp[i]); + refcombinedsamp[i] = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); setName(refcombinedsamp[i], "refcombinedsamp" + std::to_string(i)); VkFormat fmt = VK_FORMAT_R32G32B32A32_SFLOAT; @@ -1291,8 +1287,6 @@ void main() vkDestroyFence(device, fence, NULL); vkDestroySemaphore(device, sem, NULL); - vkDestroySampler(device, validSampler, NULL); - vkDestroyImageView(device, view1, NULL); vkDestroyImageView(device, view3, NULL); diff --git a/util/test/demos/vk/vk_resource_lifetimes.cpp b/util/test/demos/vk/vk_resource_lifetimes.cpp index 105b64934..90df70c4f 100644 --- a/util/test/demos/vk/vk_resource_lifetimes.cpp +++ b/util/test/demos/vk/vk_resource_lifetimes.cpp @@ -203,18 +203,10 @@ void main() badcb.upload(&flags, sizeof(flags)); - VkSampler checkersampler = VK_NULL_HANDLE; - VkSampler smileysampler = VK_NULL_HANDLE; - - VkSamplerCreateInfo sampInfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - sampInfo.magFilter = VK_FILTER_NEAREST; - sampInfo.minFilter = VK_FILTER_NEAREST; - - vkCreateSampler(device, &sampInfo, NULL, &checkersampler); - - sampInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - - vkCreateSampler(device, &sampInfo, NULL, &smileysampler); + VkSampler checkersampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_NEAREST)); + VkSampler smileysampler = createSampler( + vkh::SamplerCreateInfo(VK_FILTER_NEAREST, VK_FILTER_NEAREST, VK_SAMPLER_MIPMAP_MODE_LINEAR, + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)); auto SetupBuffer = [this]() { VkBuffer cb = VK_NULL_HANDLE; @@ -580,8 +572,6 @@ void main() TrashDescSet(descset); vkDestroyDescriptorPool(device, descpool, NULL); - vkDestroySampler(device, checkersampler, NULL); - vkDestroySampler(device, smileysampler, NULL); return 0; } diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index 136f21197..4728091f8 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -3730,30 +3730,12 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource vkDeviceWaitIdle(device); } - VkSampler pointsampler = VK_NULL_HANDLE; - VkSampler linearsampler = VK_NULL_HANDLE; - VkSampler mipsampler = VK_NULL_HANDLE; - VkSampler shadowsampler = VK_NULL_HANDLE; - - VkSamplerCreateInfo sampInfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - sampInfo.magFilter = VK_FILTER_NEAREST; - sampInfo.minFilter = VK_FILTER_NEAREST; - - vkCreateSampler(device, &sampInfo, NULL, &pointsampler); - - sampInfo.magFilter = VK_FILTER_LINEAR; - sampInfo.minFilter = VK_FILTER_LINEAR; - - vkCreateSampler(device, &sampInfo, NULL, &linearsampler); - - sampInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; - - vkCreateSampler(device, &sampInfo, NULL, &mipsampler); - - sampInfo.compareEnable = VK_TRUE; - sampInfo.compareOp = VK_COMPARE_OP_LESS_OR_EQUAL; - - vkCreateSampler(device, &sampInfo, NULL, &shadowsampler); + VkSampler pointsampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_NEAREST)); + VkSampler linearsampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); + VkSampler mipsampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); + VkSampler shadowsampler = createSampler(vkh::SamplerCreateInfo( + VK_FILTER_LINEAR, VK_SAMPLER_ADDRESS_MODE_REPEAT, 0.0f, + VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, 0.0f, 0.0f, 0.0f, VK_COMPARE_OP_LESS_OR_EQUAL)); VkDescriptorSet descset0 = allocateDescriptorSet(setlayout0); VkDescriptorSet descset1; @@ -4178,11 +4160,6 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource Present(); } - vkDestroySampler(device, pointsampler, NULL); - vkDestroySampler(device, linearsampler, NULL); - vkDestroySampler(device, mipsampler, NULL); - vkDestroySampler(device, shadowsampler, NULL); - return 0; } }; diff --git a/util/test/demos/vk/vk_test.cpp b/util/test/demos/vk/vk_test.cpp index a75f0956b..81563d838 100644 --- a/util/test/demos/vk/vk_test.cpp +++ b/util/test/demos/vk/vk_test.cpp @@ -569,6 +569,9 @@ void VulkanGraphicsTest::Shutdown() for(VkDescriptorSetLayout layout : setlayouts) vkDestroyDescriptorSetLayout(device, layout, NULL); + for(VkSampler sampler : samplers) + vkDestroySampler(device, sampler, NULL); + for(auto it : imageAllocs) vmaDestroyImage(allocator, it.first, it.second); @@ -928,6 +931,14 @@ VkDescriptorSetLayout VulkanGraphicsTest::createDescriptorSetLayout( return ret; } +VkSampler VulkanGraphicsTest::createSampler(const VkSamplerCreateInfo *info) +{ + VkSampler ret; + CHECK_VKR(vkCreateSampler(device, info, NULL, &ret)); + samplers.push_back(ret); + return ret; +} + VulkanWindow::VulkanWindow(VulkanGraphicsTest *test, GraphicsWindow *win) { m_Test = test; diff --git a/util/test/demos/vk/vk_test.h b/util/test/demos/vk/vk_test.h index c7fc59b1a..ca2fdb867 100644 --- a/util/test/demos/vk/vk_test.h +++ b/util/test/demos/vk/vk_test.h @@ -220,6 +220,7 @@ struct VulkanGraphicsTest : public GraphicsTest VkBufferView createBufferView(const VkBufferViewCreateInfo *info); VkPipelineLayout createPipelineLayout(const VkPipelineLayoutCreateInfo *info); VkDescriptorSetLayout createDescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *info); + VkSampler createSampler(const VkSamplerCreateInfo *info); void getPhysFeatures2(void *nextStruct); @@ -267,6 +268,7 @@ struct VulkanGraphicsTest : public GraphicsTest std::vector bufferviews; std::vector pipelayouts; std::vector setlayouts; + std::vector samplers; std::map imageAllocs; std::map bufferAllocs; diff --git a/util/test/demos/vk/vk_texture_zoo.cpp b/util/test/demos/vk/vk_texture_zoo.cpp index 3c9cadbaf..84c453b8b 100644 --- a/util/test/demos/vk/vk_texture_zoo.cpp +++ b/util/test/demos/vk/vk_texture_zoo.cpp @@ -631,13 +631,7 @@ void main() if(!Init()) return 3; - VkSampler sampler = VK_NULL_HANDLE; - - VkSamplerCreateInfo sampInfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; - sampInfo.magFilter = VK_FILTER_LINEAR; - sampInfo.minFilter = VK_FILTER_LINEAR; - - vkCreateSampler(device, &sampInfo, NULL, &sampler); + VkSampler sampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR)); setlayout = createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, &sampler}, diff --git a/util/test/demos/vk/vk_video_textures.cpp b/util/test/demos/vk/vk_video_textures.cpp index a04201af2..08727acd0 100644 --- a/util/test/demos/vk/vk_video_textures.cpp +++ b/util/test/demos/vk/vk_video_textures.cpp @@ -859,16 +859,10 @@ void main() for(size_t i = 0; i < ARRAY_COUNT(ycbcr); i++) { - VkSamplerCreateInfo sampInfo = {VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO}; VkSamplerYcbcrConversionInfo ycbcrChain = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO}; - sampInfo.pNext = &ycbcrChain; - - sampInfo.magFilter = VK_FILTER_LINEAR; - sampInfo.minFilter = VK_FILTER_LINEAR; - ycbcrChain.conversion = ycbcr[i].conv; - vkCreateSampler(device, &sampInfo, NULL, &ycbcr[i].sampler); + ycbcr[i].sampler = createSampler(vkh::SamplerCreateInfo(VK_FILTER_LINEAR).next(&ycbcrChain)); setlayout = createDescriptorSetLayout(vkh::DescriptorSetLayoutCreateInfo({ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, @@ -986,11 +980,7 @@ void main() vkDeviceWaitIdle(device); for(size_t i = 0; i < ARRAY_COUNT(ycbcr); i++) - { - vkDestroySampler(device, ycbcr[i].sampler, NULL); - vkDestroySamplerYcbcrConversionKHR(device, ycbcr[i].conv, NULL); - } return 0; }