anv/meta: Allocate descriptor pools on-the-fly
We can't use a global descriptor pool like we were because it's not thread-safe. For now, we'll allocate them on-the-fly and that should work fine. At some point in the future, we could do something where we stack-allocate them or allocate them out of one of the state streams.
This commit is contained in:
@@ -138,27 +138,6 @@ anv_device_init_meta(struct anv_device *device)
|
|||||||
.pfnFree = meta_free,
|
.pfnFree = meta_free,
|
||||||
};
|
};
|
||||||
|
|
||||||
const VkDescriptorPoolCreateInfo create_info = {
|
|
||||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
|
||||||
.pNext = NULL,
|
|
||||||
.flags = 0,
|
|
||||||
.maxSets = 1,
|
|
||||||
.poolSizeCount = 1,
|
|
||||||
.pPoolSizes = (VkDescriptorPoolSize[]) {
|
|
||||||
{
|
|
||||||
.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
|
|
||||||
.descriptorCount = 1
|
|
||||||
},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
result = anv_CreateDescriptorPool(anv_device_to_handle(device),
|
|
||||||
&create_info,
|
|
||||||
&device->meta_state.alloc,
|
|
||||||
&device->meta_state.desc_pool);
|
|
||||||
if (result != VK_SUCCESS)
|
|
||||||
goto fail_desc_pool;
|
|
||||||
|
|
||||||
result = anv_device_init_meta_clear_state(device);
|
result = anv_device_init_meta_clear_state(device);
|
||||||
if (result != VK_SUCCESS)
|
if (result != VK_SUCCESS)
|
||||||
goto fail_clear;
|
goto fail_clear;
|
||||||
@@ -178,10 +157,6 @@ fail_blit:
|
|||||||
fail_resolve:
|
fail_resolve:
|
||||||
anv_device_finish_meta_clear_state(device);
|
anv_device_finish_meta_clear_state(device);
|
||||||
fail_clear:
|
fail_clear:
|
||||||
anv_DestroyDescriptorPool(anv_device_to_handle(device),
|
|
||||||
device->meta_state.desc_pool,
|
|
||||||
&device->meta_state.alloc);
|
|
||||||
fail_desc_pool:
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -243,14 +243,31 @@ meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
.minFilter = blit_filter,
|
.minFilter = blit_filter,
|
||||||
}, &cmd_buffer->pool->alloc, &sampler);
|
}, &cmd_buffer->pool->alloc, &sampler);
|
||||||
|
|
||||||
|
VkDescriptorPool desc_pool;
|
||||||
|
anv_CreateDescriptorPool(anv_device_to_handle(device),
|
||||||
|
&(const VkDescriptorPoolCreateInfo) {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
||||||
|
.pNext = NULL,
|
||||||
|
.flags = 0,
|
||||||
|
.maxSets = 1,
|
||||||
|
.poolSizeCount = 1,
|
||||||
|
.pPoolSizes = (VkDescriptorPoolSize[]) {
|
||||||
|
{
|
||||||
|
.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
|
||||||
|
.descriptorCount = 1
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}, &cmd_buffer->pool->alloc, &desc_pool);
|
||||||
|
|
||||||
VkDescriptorSet set;
|
VkDescriptorSet set;
|
||||||
anv_AllocateDescriptorSets(anv_device_to_handle(device),
|
anv_AllocateDescriptorSets(anv_device_to_handle(device),
|
||||||
&(VkDescriptorSetAllocateInfo) {
|
&(VkDescriptorSetAllocateInfo) {
|
||||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
||||||
.descriptorPool = device->meta_state.desc_pool,
|
.descriptorPool = desc_pool,
|
||||||
.descriptorSetCount = 1,
|
.descriptorSetCount = 1,
|
||||||
.pSetLayouts = &device->meta_state.blit.ds_layout
|
.pSetLayouts = &device->meta_state.blit.ds_layout
|
||||||
}, &set);
|
}, &set);
|
||||||
|
|
||||||
anv_UpdateDescriptorSets(anv_device_to_handle(device),
|
anv_UpdateDescriptorSets(anv_device_to_handle(device),
|
||||||
1, /* writeCount */
|
1, /* writeCount */
|
||||||
(VkWriteDescriptorSet[]) {
|
(VkWriteDescriptorSet[]) {
|
||||||
@@ -340,8 +357,8 @@ meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
/* At the point where we emit the draw call, all data from the
|
/* At the point where we emit the draw call, all data from the
|
||||||
* descriptor sets, etc. has been used. We are free to delete it.
|
* descriptor sets, etc. has been used. We are free to delete it.
|
||||||
*/
|
*/
|
||||||
anv_ResetDescriptorPool(anv_device_to_handle(device),
|
anv_DestroyDescriptorPool(anv_device_to_handle(device),
|
||||||
device->meta_state.desc_pool, 0);
|
desc_pool, &cmd_buffer->pool->alloc);
|
||||||
anv_DestroySampler(anv_device_to_handle(device), sampler,
|
anv_DestroySampler(anv_device_to_handle(device), sampler,
|
||||||
&cmd_buffer->pool->alloc);
|
&cmd_buffer->pool->alloc);
|
||||||
anv_DestroyFramebuffer(anv_device_to_handle(device), fb,
|
anv_DestroyFramebuffer(anv_device_to_handle(device), fb,
|
||||||
|
@@ -559,11 +559,27 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
&cmd_buffer->pool->alloc,
|
&cmd_buffer->pool->alloc,
|
||||||
&sampler_h);
|
&sampler_h);
|
||||||
|
|
||||||
|
VkDescriptorPool desc_pool;
|
||||||
|
anv_CreateDescriptorPool(anv_device_to_handle(device),
|
||||||
|
&(const VkDescriptorPoolCreateInfo) {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
|
||||||
|
.pNext = NULL,
|
||||||
|
.flags = 0,
|
||||||
|
.maxSets = 1,
|
||||||
|
.poolSizeCount = 1,
|
||||||
|
.pPoolSizes = (VkDescriptorPoolSize[]) {
|
||||||
|
{
|
||||||
|
.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
|
||||||
|
.descriptorCount = 1
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}, &cmd_buffer->pool->alloc, &desc_pool);
|
||||||
|
|
||||||
VkDescriptorSet desc_set_h;
|
VkDescriptorSet desc_set_h;
|
||||||
anv_AllocateDescriptorSets(device_h,
|
anv_AllocateDescriptorSets(device_h,
|
||||||
&(VkDescriptorSetAllocateInfo) {
|
&(VkDescriptorSetAllocateInfo) {
|
||||||
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
|
||||||
.descriptorPool = device->meta_state.desc_pool,
|
.descriptorPool = desc_pool,
|
||||||
.descriptorSetCount = 1,
|
.descriptorSetCount = 1,
|
||||||
.pSetLayouts = (VkDescriptorSetLayout[]) {
|
.pSetLayouts = (VkDescriptorSetLayout[]) {
|
||||||
device->meta_state.resolve.ds_layout,
|
device->meta_state.resolve.ds_layout,
|
||||||
@@ -641,8 +657,8 @@ emit_resolve(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
/* All objects below are consumed by the draw call. We may safely destroy
|
/* All objects below are consumed by the draw call. We may safely destroy
|
||||||
* them.
|
* them.
|
||||||
*/
|
*/
|
||||||
anv_ResetDescriptorPool(anv_device_to_handle(device),
|
anv_DestroyDescriptorPool(anv_device_to_handle(device),
|
||||||
device->meta_state.desc_pool, 0);
|
desc_pool, &cmd_buffer->pool->alloc);
|
||||||
anv_DestroySampler(device_h, sampler_h,
|
anv_DestroySampler(device_h, sampler_h,
|
||||||
&cmd_buffer->pool->alloc);
|
&cmd_buffer->pool->alloc);
|
||||||
}
|
}
|
||||||
|
@@ -571,8 +571,6 @@ void anv_finish_wsi(struct anv_instance *instance);
|
|||||||
struct anv_meta_state {
|
struct anv_meta_state {
|
||||||
VkAllocationCallbacks alloc;
|
VkAllocationCallbacks alloc;
|
||||||
|
|
||||||
VkDescriptorPool desc_pool;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use array element `i` for images with `2^i` samples.
|
* Use array element `i` for images with `2^i` samples.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user