Sanitize descriptors

I'm sure it will end soon, I think pipelines is the end of it.
This commit is contained in:
Bill Currie 2020-02-18 21:18:03 +09:00
parent c740dea212
commit 264c4ccdac
3 changed files with 63 additions and 286 deletions

View file

@ -1,132 +1,62 @@
#ifndef __QF_Vulkan_descriptor_h #ifndef __QF_Vulkan_descriptor_h
#define __QF_Vulkan_descriptor_h #define __QF_Vulkan_descriptor_h
typedef struct qfv_sampler_s { #include "QF/darray.h"
struct qfv_device_s *device;
VkSampler sampler;
} qfv_sampler_t;
typedef struct qfv_bindingset_s { typedef struct qfv_bindingset_s
int numBindings; DARRAY_TYPE (VkDescriptorSetLayoutBinding) qfv_bindingset_t;
VkDescriptorSetLayoutBinding bindings[];
} qfv_bindingset_t;
typedef struct qfv_descriptorsetlayout_s { typedef struct qfv_descriptorsetlayoutset_s
struct qfv_device_s *device; DARRAY_TYPE (VkDescriptorSetLayout) qfv_descriptorsetlayoutset_t;
VkDescriptorSetLayout layout;
} qfv_descriptorsetlayout_t;
typedef struct qfv_descriptorsetlayoutset_s {
uint32_t numLayouts;
qfv_descriptorsetlayout_t *layouts[];
} qfv_descriptorsetlayoutset_t;
#define QFV_AllocDescriptorSetLayoutSet(num, allocator) \ #define QFV_AllocDescriptorSetLayoutSet(num, allocator) \
allocator (field_offset (qfv_descriptorsetlayoutset_t, layouts[num])) DARRAY_ALLOCFIXED (qfv_descriptorsetlayoutset_t, num, allocator)
typedef struct qfv_descriptorsets_s
DARRAY_TYPE (VkDescriptorSet) qfv_descriptorsets_t;
typedef struct qfv_descriptorpool_s { #define QFV_AllocDescriptorSets(num, allocator) \
struct qfv_device_s *device; DARRAY_ALLOCFIXED (qfv_descriptorsets_t, num, allocator)
VkDescriptorPool pool;
} qfv_descriptorpool_t;
typedef struct qfv_descriptorset_s { typedef struct qfv_writedescriptorsets_s
struct qfv_device_s *device; DARRAY_TYPE (VkWriteDescriptorSet) qfv_writedescriptorsets_t;
qfv_descriptorpool_t *pool;
VkDescriptorSet set;
} qfv_descriptorset_t;
typedef struct qfv_imagedescriptorinfo_s { #define QFV_AllocWriteDescriptorSets(num, allocator) \
qfv_descriptorset_t *descriptorset; DARRAY_ALLOCFIXED (qfv_writedescriptorsets_t, num, allocator)
uint32_t binding;
uint32_t arrayElement;
VkDescriptorType type;
uint32_t numInfo;
VkDescriptorImageInfo infos[];
} qfv_imagedescriptorinfo_t;
typedef struct qfv_bufferdescriptorinfo_s { typedef struct qfv_copydescriptorsets_s
qfv_descriptorset_t *descriptorset; DARRAY_TYPE (VkCopyDescriptorSet) qfv_copydescriptorsets_t;
uint32_t binding;
uint32_t arrayElement;
VkDescriptorType type;
uint32_t numInfo;
VkDescriptorBufferInfo infos[];
} qfv_bufferdescriptorinfo_t;
typedef struct qfv_texelbufferdescriptorinfo_s { #define QFV_AllocCopyDescriptorSets(num, allocator) \
qfv_descriptorset_t *descriptorset; DARRAY_ALLOCFIXED (qfv_descriptorsetlayoutset_t, num, allocator)
uint32_t binding;
uint32_t arrayElement;
VkDescriptorType type;
uint32_t numInfo;
VkBufferView infos[];
} qfv_texelbufferdescriptorinfo_t;
typedef struct qfv_copydescriptorinfo_s { struct qfv_device_s;
qfv_descriptorset_t *dstSet;
uint32_t dstBinding;
uint32_t dstArrayElement;
qfv_descriptorset_t *srcSet;
uint32_t srcBinding;
uint32_t srcArrayElement;
uint32_t descriptorCount;
} qfv_copydescriptorinfo_t;
qfv_sampler_t *QFV_CreateSampler (struct qfv_device_s *device, VkSampler QFV_CreateSampler (struct qfv_device_s *device,
VkFilter magFilter, VkFilter minFilter, VkFilter magFilter, VkFilter minFilter,
VkSamplerMipmapMode mipmapMode, VkSamplerMipmapMode mipmapMode,
VkSamplerAddressMode addressModeU, VkSamplerAddressMode addressModeU,
VkSamplerAddressMode addressModeV, VkSamplerAddressMode addressModeV,
VkSamplerAddressMode addressModeW, VkSamplerAddressMode addressModeW,
float mipLodBias, float mipLodBias,
VkBool32 anisotryEnable, float maxAnisotropy, VkBool32 anisotryEnable, float maxAnisotropy,
VkBool32 compareEnable, VkCompareOp compareOp, VkBool32 compareEnable, VkCompareOp compareOp,
float minLod, float maxLod, float minLod, float maxLod,
VkBorderColor borderColor, VkBorderColor borderColor,
VkBool32 unnormalizedCoordinates); VkBool32 unnormalizedCoordinates);
qfv_bindingset_t *QFV_CreateBindingSet (int numBindings); VkDescriptorSetLayout
void QFV_DestroyBindingSet (qfv_bindingset_t *bindingset);
qfv_descriptorsetlayout_t *
QFV_CreateDescriptorSetLayout (struct qfv_device_s *device, QFV_CreateDescriptorSetLayout (struct qfv_device_s *device,
qfv_bindingset_t *bindings); qfv_bindingset_t *bindings);
qfv_descriptorpool_t * VkDescriptorPool
QFV_CreateDescriptorPool (struct qfv_device_s *device, QFV_CreateDescriptorPool (struct qfv_device_s *device,
VkDescriptorPoolCreateFlags flags, uint32_t maxSets, VkDescriptorPoolCreateFlags flags, uint32_t maxSets,
qfv_bindingset_t *bindings); qfv_bindingset_t *bindings);
qfv_descriptorset_t * qfv_descriptorsets_t *
QFV_AllocateDescriptorSet (qfv_descriptorpool_t *pool, QFV_AllocateDescriptorSet (struct qfv_device_s *device,
qfv_descriptorsetlayout_t *layout); VkDescriptorPool pool,
qfv_descriptorsetlayoutset_t *layouts);
#define QFV_allocateinfo(type, num, allocator) \
allocator (field_offset (type, infos[num]))
#define QFV_ImageDescriptorInfo(num, allocator) \
QFV_allocateinfo(qfv_imagedescriptorinfo_t, num, allocator)
#define QFV_BufferDescriptorInfo(num, allocator) \
QFV_allocateinfo(qfv_bufferdescriptorinfo_t, num, allocator)
#define QFV_TexelBufferDescriptorInfo(num, allocator) \
QFV_allocateinfo(qfv_texelbufferdescriptorinfo_t, num, allocator)
void
QFV_UpdateDescriptorSets (struct qfv_device_s *device,
uint32_t numImageInfos,
qfv_imagedescriptorinfo_t *imageInfos,
uint32_t numBufferInfos,
qfv_bufferdescriptorinfo_t *bufferInfos,
uint32_t numTexelBufferInfos,
qfv_texelbufferdescriptorinfo_t *texelbufferInfos,
uint32_t numCopyInfos,
qfv_copydescriptorinfo_t *copyInfos);
void QFV_FreeDescriptorSet (qfv_descriptorset_t *set);
void QFV_ResetDescriptorPool (qfv_descriptorpool_t *pool);
void QFV_DestroyDescriptorPool (qfv_descriptorpool_t *pool);
void QFV_DestroyDescriptorSetLayout (qfv_descriptorsetlayout_t *layout);
void QFV_DestroySampler (qfv_sampler_t *sampler);
#endif//__QF_Vulkan_descriptor_h #endif//__QF_Vulkan_descriptor_h

View file

@ -61,7 +61,7 @@
#include "util.h" #include "util.h"
qfv_sampler_t * VkSampler
QFV_CreateSampler (qfv_device_t *device, QFV_CreateSampler (qfv_device_t *device,
VkFilter magFilter, VkFilter minFilter, VkFilter magFilter, VkFilter minFilter,
VkSamplerMipmapMode mipmapMode, VkSamplerMipmapMode mipmapMode,
@ -90,29 +90,12 @@ QFV_CreateSampler (qfv_device_t *device,
borderColor, unnormalizedCoordinates, borderColor, unnormalizedCoordinates,
}; };
qfv_sampler_t *sampler = malloc (sizeof (*sampler)); VkSampler sampler;
sampler->device = device; dfunc->vkCreateSampler (dev, &createInfo, 0, &sampler);
dfunc->vkCreateSampler (dev, &createInfo, 0, &sampler->sampler);
return sampler; return sampler;
} }
qfv_bindingset_t * VkDescriptorSetLayout
QFV_CreateBindingSet (int numBindings)
{
qfv_bindingset_t *bindingset;
bindingset = malloc (field_offset (qfv_bindingset_t,
bindings[numBindings]));
bindingset->numBindings = numBindings;
return bindingset;
}
void
QFV_DestroyBindingSet (qfv_bindingset_t *bindingset)
{
free (bindingset);
}
qfv_descriptorsetlayout_t *
QFV_CreateDescriptorSetLayout (qfv_device_t *device, QFV_CreateDescriptorSetLayout (qfv_device_t *device,
qfv_bindingset_t *bindingset) qfv_bindingset_t *bindingset)
{ {
@ -122,12 +105,11 @@ QFV_CreateDescriptorSetLayout (qfv_device_t *device,
VkDescriptorSetLayoutCreateInfo createInfo = { VkDescriptorSetLayoutCreateInfo createInfo = {
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 0, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, 0,
0, 0,
bindingset->numBindings, bindingset->bindings, bindingset->size, bindingset->a,
}; };
qfv_descriptorsetlayout_t *layout = malloc (sizeof (layout)); VkDescriptorSetLayout layout;
layout->device = device; dfunc->vkCreateDescriptorSetLayout (dev, &createInfo, 0, &layout);
dfunc->vkCreateDescriptorSetLayout (dev, &createInfo, 0, &layout->layout);
return layout; return layout;
} }
@ -151,7 +133,7 @@ poolsize_compmare (const void *ele1, const void *ele2, void *unused)
} }
//FIXME not thread-safe //FIXME not thread-safe
qfv_descriptorpool_t * VkDescriptorPool
QFV_CreateDescriptorPool (qfv_device_t *device, QFV_CreateDescriptorPool (qfv_device_t *device,
VkDescriptorPoolCreateFlags flags, uint32_t maxSets, VkDescriptorPoolCreateFlags flags, uint32_t maxSets,
qfv_bindingset_t *bindings) qfv_bindingset_t *bindings)
@ -170,8 +152,8 @@ QFV_CreateDescriptorPool (qfv_device_t *device,
poolsize_next = poolsize_pool; poolsize_next = poolsize_pool;
VkDescriptorPoolSize *ps; VkDescriptorPoolSize *ps;
for (int i = 0; i < bindings->numBindings; i++) { for (size_t i = 0; i < bindings->size; i++) {
VkDescriptorPoolSize test = { bindings->bindings[i].descriptorType, 0 }; VkDescriptorPoolSize test = { bindings->a[i].descriptorType, 0 };
ps = Hash_FindElement (poolsizes, &test); ps = Hash_FindElement (poolsizes, &test);
if (!ps) { if (!ps) {
ps = poolsize_next++; ps = poolsize_next++;
@ -183,7 +165,7 @@ QFV_CreateDescriptorPool (qfv_device_t *device,
} }
//XXX is descriptorCount correct? //XXX is descriptorCount correct?
//FIXME assumes only one layout is used with this pool //FIXME assumes only one layout is used with this pool
ps->descriptorCount += bindings->bindings[i].descriptorCount * maxSets; ps->descriptorCount += bindings->a[i].descriptorCount * maxSets;
} }
VkDescriptorPoolCreateInfo createInfo = { VkDescriptorPoolCreateInfo createInfo = {
@ -191,155 +173,26 @@ QFV_CreateDescriptorPool (qfv_device_t *device,
flags, maxSets, poolsize_next - poolsize_pool, poolsize_pool, flags, maxSets, poolsize_next - poolsize_pool, poolsize_pool,
}; };
qfv_descriptorpool_t *descriptorpool = malloc (sizeof (descriptorpool)); VkDescriptorPool pool;
descriptorpool->device = device; dfunc->vkCreateDescriptorPool (dev, &createInfo, 0, &pool);
dfunc->vkCreateDescriptorPool (dev, &createInfo, 0, &descriptorpool->pool); return pool;
return descriptorpool;
} }
qfv_descriptorset_t * qfv_descriptorsets_t *
QFV_AllocateDescriptorSet (qfv_descriptorpool_t *pool, QFV_AllocateDescriptorSet (qfv_device_t *device,
qfv_descriptorsetlayout_t *layout) VkDescriptorPool pool,
qfv_descriptorsetlayoutset_t *layouts)
{ {
qfv_device_t *device = pool->device;
VkDevice dev = device->dev; VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs; qfv_devfuncs_t *dfunc = device->funcs;
VkDescriptorSetAllocateInfo allocateInfo = { VkDescriptorSetAllocateInfo allocateInfo = {
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 0, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, 0,
pool->pool, 1, &layout->layout, pool, layouts->size, layouts->a,
}; };
qfv_descriptorset_t *descriptorset = malloc (sizeof (*descriptorset)); __auto_type descriptorsets
descriptorset->device = device; = QFV_AllocDescriptorSets (layouts->size, malloc);
descriptorset->pool = pool; dfunc->vkAllocateDescriptorSets (dev, &allocateInfo, descriptorsets->a);
dfunc->vkAllocateDescriptorSets (dev, &allocateInfo, &descriptorset->set); return descriptorsets;
return descriptorset;
}
void
QFV_UpdateDescriptorSets (qfv_device_t *device,
uint32_t numImageInfos,
qfv_imagedescriptorinfo_t *imageInfos,
uint32_t numBufferInfos,
qfv_bufferdescriptorinfo_t *bufferInfos,
uint32_t numTexelBufferInfos,
qfv_texelbufferdescriptorinfo_t *texelbufferInfos,
uint32_t numCopyInfos,
qfv_copydescriptorinfo_t *copyInfos)
{
VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs;
uint32_t numWrite = 0;
numWrite += numImageInfos;
numWrite += numBufferInfos;
numWrite += numTexelBufferInfos;
VkWriteDescriptorSet *writeSets = alloca (numWrite * sizeof (*writeSets));
VkWriteDescriptorSet *writeSet = writeSets;
for (uint32_t i = 0; i < numImageInfos; i++, writeSet++) {
writeSet->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeSet->pNext = 0;
writeSet->dstSet = imageInfos[i].descriptorset->set;
writeSet->dstBinding = imageInfos[i].binding;
writeSet->dstArrayElement = imageInfos[i].arrayElement;
writeSet->descriptorCount = imageInfos[i].numInfo;
writeSet->descriptorType = imageInfos[i].type;
writeSet->pImageInfo = imageInfos[i].infos;
writeSet->pBufferInfo = 0;
writeSet->pTexelBufferView = 0;
}
for (uint32_t i = 0; i < numBufferInfos; i++, writeSet++) {
writeSet->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeSet->pNext = 0;
writeSet->dstSet = bufferInfos[i].descriptorset->set;
writeSet->dstBinding = bufferInfos[i].binding;
writeSet->dstArrayElement = bufferInfos[i].arrayElement;
writeSet->descriptorCount = bufferInfos[i].numInfo;
writeSet->descriptorType = bufferInfos[i].type;
writeSet->pImageInfo = 0;
writeSet->pBufferInfo = bufferInfos[i].infos;
writeSet->pTexelBufferView = 0;
}
for (uint32_t i = 0; i < numTexelBufferInfos; i++, writeSet++) {
writeSet->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeSet->pNext = 0;
writeSet->dstSet = bufferInfos[i].descriptorset->set;
writeSet->dstBinding = texelbufferInfos[i].binding;
writeSet->dstArrayElement = texelbufferInfos[i].arrayElement;
writeSet->descriptorCount = texelbufferInfos[i].numInfo;
writeSet->descriptorType = texelbufferInfos[i].type;
writeSet->pImageInfo = 0;
writeSet->pBufferInfo = 0;
writeSet->pTexelBufferView = texelbufferInfos[i].infos;
}
VkCopyDescriptorSet *copySets = alloca (numWrite * sizeof (*copySets));
VkCopyDescriptorSet *copySet = copySets;
for (uint32_t i = 0; i < numCopyInfos; i++, copySet++) {
copySet->sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
copySet->pNext = 0;
copySet->srcSet = copyInfos[i].srcSet->set;
copySet->srcBinding = copyInfos[i].srcBinding;
copySet->srcArrayElement = copyInfos[i].srcArrayElement;
copySet->dstSet = copyInfos[i].dstSet->set;
copySet->dstBinding = copyInfos[i].dstBinding;
copySet->dstArrayElement = copyInfos[i].dstArrayElement;
copySet->descriptorCount = copyInfos[i].descriptorCount;
}
dfunc->vkUpdateDescriptorSets (dev, numWrite, writeSets,
numCopyInfos, copySets);
}
void
QFV_FreeDescriptorSet (qfv_descriptorset_t *set)
{
qfv_device_t *device = set->device;
VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs;
VkDescriptorPool pool = set->pool->pool;
dfunc->vkFreeDescriptorSets (dev, pool, 1, &set->set);
}
void
QFV_ResetDescriptorPool (qfv_descriptorpool_t *pool)
{
qfv_device_t *device = pool->device;
VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs;
dfunc->vkResetDescriptorPool (dev, pool->pool, 0);
}
void
QFV_DestroyDescriptorPool (qfv_descriptorpool_t *pool)
{
qfv_device_t *device = pool->device;
VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs;
dfunc->vkDestroyDescriptorPool (dev, pool->pool, 0);
free (pool);
}
void
QFV_DestroyDescriptorSetLayout (qfv_descriptorsetlayout_t *layout)
{
qfv_device_t *device = layout->device;
VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs;
dfunc->vkDestroyDescriptorSetLayout (dev, layout->layout, 0);
free (layout);
}
void
QFV_DestroySampler (qfv_sampler_t *sampler)
{
qfv_device_t *device = sampler->device;
VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs;
dfunc->vkDestroySampler (dev, sampler->sampler, 0);
free (sampler);
} }

View file

@ -154,22 +154,16 @@ QFV_DestroyPipelineCache (qfv_pipelinecache_t *cache)
qfv_pipelinelayout_t * qfv_pipelinelayout_t *
QFV_CreatePipelineLayout (qfv_device_t *device, QFV_CreatePipelineLayout (qfv_device_t *device,
qfv_descriptorsetlayoutset_t *layoutset, qfv_descriptorsetlayoutset_t *layouts,
qfv_pushconstantrangeset_t *pushConstants) qfv_pushconstantrangeset_t *pushConstants)
{ {
VkDevice dev = device->dev; VkDevice dev = device->dev;
qfv_devfuncs_t *dfunc = device->funcs; qfv_devfuncs_t *dfunc = device->funcs;
uint32_t numLayouts = layoutset->numLayouts;
VkDescriptorSetLayout *layouts = alloca (numLayouts * sizeof (*layouts));
for (uint32_t i = 0; i < numLayouts; i++) {
layouts[i] = layoutset->layouts[i]->layout;
}
VkPipelineLayoutCreateInfo createInfo = { VkPipelineLayoutCreateInfo createInfo = {
VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 0, 0, VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, 0, 0,
numLayouts, layouts, pushConstants->numRanges, pushConstants->ranges, layouts->size, layouts->a,
pushConstants->numRanges, pushConstants->ranges,
}; };
qfv_pipelinelayout_t *layout = malloc (sizeof (layout)); qfv_pipelinelayout_t *layout = malloc (sizeof (layout));