Add helpers for creating samplers

This commit is contained in:
baldurk
2020-05-27 12:47:46 +01:00
parent cb92f9be13
commit ff62ab501c
9 changed files with 91 additions and 78 deletions
+1 -8
View File
@@ -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;
}
+62
View File
@@ -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,
+3 -9
View File
@@ -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);
+4 -14
View File
@@ -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;
}
+6 -29
View File
@@ -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;
}
};
+11
View File
@@ -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;
+2
View File
@@ -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<VkBufferView> bufferviews;
std::vector<VkPipelineLayout> pipelayouts;
std::vector<VkDescriptorSetLayout> setlayouts;
std::vector<VkSampler> samplers;
std::map<VkImage, VmaAllocation> imageAllocs;
std::map<VkBuffer, VmaAllocation> bufferAllocs;
+1 -7
View File
@@ -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},
+1 -11
View File
@@ -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;
}