(Vulkan) More funcptrs

This commit is contained in:
twinaphex 2016-02-29 18:40:30 +01:00
parent fbf527eac2
commit 1d96e80b05
3 changed files with 65 additions and 33 deletions

View File

@ -504,7 +504,9 @@ void vulkan_destroy_texture(VkDevice device, struct vk_texture *tex)
memset(tex, 0, sizeof(*tex)); memset(tex, 0, sizeof(*tex));
} }
static void vulkan_write_quad_descriptors(VkDevice device, static void vulkan_write_quad_descriptors(
struct vulkan_context_fp *vkcfp,
VkDevice device,
VkDescriptorSet set, VkDescriptorSet set,
VkBuffer buffer, VkBuffer buffer,
VkDeviceSize offset, VkDeviceSize offset,
@ -512,9 +514,9 @@ static void vulkan_write_quad_descriptors(VkDevice device,
const struct vk_texture *texture, const struct vk_texture *texture,
VkSampler sampler) VkSampler sampler)
{ {
VkWriteDescriptorSet write = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET };
VkDescriptorImageInfo image_info; VkDescriptorImageInfo image_info;
VkDescriptorBufferInfo buffer_info; VkDescriptorBufferInfo buffer_info;
VkWriteDescriptorSet write = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET };
image_info.sampler = sampler; image_info.sampler = sampler;
image_info.imageView = texture->view; image_info.imageView = texture->view;
@ -529,14 +531,14 @@ static void vulkan_write_quad_descriptors(VkDevice device,
write.descriptorCount = 1; write.descriptorCount = 1;
write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
write.pBufferInfo = &buffer_info; write.pBufferInfo = &buffer_info;
vkUpdateDescriptorSets(device, 1, &write, 0, NULL); VKFUNC(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL);
write.dstSet = set; write.dstSet = set;
write.dstBinding = 1; write.dstBinding = 1;
write.descriptorCount = 1; write.descriptorCount = 1;
write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
write.pImageInfo = &image_info; write.pImageInfo = &image_info;
vkUpdateDescriptorSets(device, 1, &write, 0, NULL); VKFUNC(vkUpdateDescriptorSets)(device, 1, &write, 0, NULL);
} }
void vulkan_transition_texture(vk_t *vk, struct vk_texture *texture) void vulkan_transition_texture(vk_t *vk, struct vk_texture *texture)
@ -608,8 +610,11 @@ void vulkan_draw_triangles(vk_t *vk, const struct vk_draw_triangles *call)
memcpy(range.data, call->mvp, sizeof(*call->mvp)); memcpy(range.data, call->mvp, sizeof(*call->mvp));
set = vulkan_descriptor_manager_alloc( set = vulkan_descriptor_manager_alloc(
vk->context->device, &vk->chain->descriptor_manager); &vk->context->fp,
vulkan_write_quad_descriptors(vk->context->device, vk->context->device,
&vk->chain->descriptor_manager);
vulkan_write_quad_descriptors(&vk->context->fp,
vk->context->device,
set, set,
range.buffer, range.buffer,
range.offset, range.offset,
@ -617,7 +622,7 @@ void vulkan_draw_triangles(vk_t *vk, const struct vk_draw_triangles *call)
call->texture, call->texture,
call->sampler); call->sampler);
vkCmdBindDescriptorSets(vk->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, VKFUNC(vkCmdBindDescriptorSets)(vk->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
vk->pipelines.layout, 0, vk->pipelines.layout, 0,
1, &set, 0, NULL); 1, &set, 0, NULL);
@ -676,10 +681,13 @@ void vulkan_draw_quad(vk_t *vk, const struct vk_draw_quad *quad)
memcpy(range.data, quad->mvp, sizeof(*quad->mvp)); memcpy(range.data, quad->mvp, sizeof(*quad->mvp));
set = vulkan_descriptor_manager_alloc(vk->context->device, set = vulkan_descriptor_manager_alloc(&vk->context->fp,
vk->context->device,
&vk->chain->descriptor_manager); &vk->chain->descriptor_manager);
vulkan_write_quad_descriptors(vk->context->device, vulkan_write_quad_descriptors(
&vk->context->fp,
vk->context->device,
set, set,
range.buffer, range.buffer,
range.offset, range.offset,
@ -687,7 +695,7 @@ void vulkan_draw_quad(vk_t *vk, const struct vk_draw_quad *quad)
quad->texture, quad->texture,
quad->sampler); quad->sampler);
vkCmdBindDescriptorSets(vk->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, VKFUNC(vkCmdBindDescriptorSets)(vk->cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
vk->pipelines.layout, 0, vk->pipelines.layout, 0,
1, &set, 0, NULL); 1, &set, 0, NULL);
@ -789,6 +797,7 @@ void vulkan_destroy_buffer(VkDevice device, struct vk_buffer *buffer)
} }
static struct vk_descriptor_pool *vulkan_alloc_descriptor_pool( static struct vk_descriptor_pool *vulkan_alloc_descriptor_pool(
struct vulkan_context_fp *vkcfp,
VkDevice device, VkDevice device,
const struct vk_descriptor_manager *manager) const struct vk_descriptor_manager *manager)
{ {
@ -807,7 +816,8 @@ static struct vk_descriptor_pool *vulkan_alloc_descriptor_pool(
pool_info.poolSizeCount = manager->num_sizes; pool_info.poolSizeCount = manager->num_sizes;
pool_info.pPoolSizes = manager->sizes; pool_info.pPoolSizes = manager->sizes;
pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
vkCreateDescriptorPool(device, &pool_info, NULL, &pool->pool);
VKFUNC(vkCreateDescriptorPool)(device, &pool_info, NULL, &pool->pool);
/* Just allocate all descriptor sets up front. */ /* Just allocate all descriptor sets up front. */
alloc_info.descriptorPool = pool->pool; alloc_info.descriptorPool = pool->pool;
@ -820,6 +830,7 @@ static struct vk_descriptor_pool *vulkan_alloc_descriptor_pool(
} }
VkDescriptorSet vulkan_descriptor_manager_alloc( VkDescriptorSet vulkan_descriptor_manager_alloc(
struct vulkan_context_fp *vkcfp,
VkDevice device, struct vk_descriptor_manager *manager) VkDevice device, struct vk_descriptor_manager *manager)
{ {
if (manager->count < VULKAN_DESCRIPTOR_MANAGER_BLOCK_SETS) if (manager->count < VULKAN_DESCRIPTOR_MANAGER_BLOCK_SETS)
@ -832,7 +843,7 @@ VkDescriptorSet vulkan_descriptor_manager_alloc(
return manager->current->sets[manager->count++]; return manager->current->sets[manager->count++];
} }
manager->current->next = vulkan_alloc_descriptor_pool(device, manager); manager->current->next = vulkan_alloc_descriptor_pool(vkcfp, device, manager);
retro_assert(manager->current->next); retro_assert(manager->current->next);
manager->current = manager->current->next; manager->current = manager->current->next;
@ -847,6 +858,7 @@ void vulkan_descriptor_manager_restart(struct vk_descriptor_manager *manager)
} }
struct vk_descriptor_manager vulkan_create_descriptor_manager( struct vk_descriptor_manager vulkan_create_descriptor_manager(
struct vulkan_context_fp *vkcfp,
VkDevice device, VkDevice device,
const VkDescriptorPoolSize *sizes, const VkDescriptorPoolSize *sizes,
unsigned num_sizes, unsigned num_sizes,
@ -859,7 +871,7 @@ struct vk_descriptor_manager vulkan_create_descriptor_manager(
manager.num_sizes = num_sizes; manager.num_sizes = num_sizes;
manager.set_layout = set_layout; manager.set_layout = set_layout;
manager.head = vulkan_alloc_descriptor_pool(device, &manager); manager.head = vulkan_alloc_descriptor_pool(vkcfp, device, &manager);
retro_assert(manager.head); retro_assert(manager.head);
return manager; return manager;
} }
@ -1107,6 +1119,13 @@ bool vulkan_context_init(gfx_ctx_vulkan_data_t *vk,
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, DestroyImage); VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, DestroyImage);
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdCopyImage); VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdCopyImage);
/* Descriptor pools */
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CreateDescriptorPool);
/* Descriptor sets */
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdBindDescriptorSets);
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, UpdateDescriptorSets);
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdSetScissor); VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdSetScissor);
VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdSetViewport); VK_GET_INSTANCE_PROC_ADDR(vk, vk->context.instance, CmdSetViewport);

View File

@ -158,6 +158,13 @@ typedef struct vulkan_context
PFN_vkCreatePipelineLayout vkCreatePipelineLayout; PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
PFN_vkCreatePipelineCache vkCreatePipelineCache; PFN_vkCreatePipelineCache vkCreatePipelineCache;
/* Descriptor pools */
PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
/* Descriptor sets */
PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
PFN_vkCreateFramebuffer vkCreateFramebuffer; PFN_vkCreateFramebuffer vkCreateFramebuffer;
PFN_vkCreateCommandPool vkCreateCommandPool; PFN_vkCreateCommandPool vkCreateCommandPool;
@ -583,12 +590,16 @@ struct vk_buffer vulkan_create_buffer(const struct vulkan_context *context,
size_t size, VkBufferUsageFlags usage); size_t size, VkBufferUsageFlags usage);
void vulkan_destroy_buffer(VkDevice device, struct vk_buffer *buffer); void vulkan_destroy_buffer(VkDevice device, struct vk_buffer *buffer);
VkDescriptorSet vulkan_descriptor_manager_alloc(VkDevice device, VkDescriptorSet vulkan_descriptor_manager_alloc(
struct vulkan_context_fp *vkcfp,
VkDevice device,
struct vk_descriptor_manager *manager); struct vk_descriptor_manager *manager);
void vulkan_descriptor_manager_restart(struct vk_descriptor_manager *manager); void vulkan_descriptor_manager_restart(struct vk_descriptor_manager *manager);
struct vk_descriptor_manager vulkan_create_descriptor_manager(VkDevice device, struct vk_descriptor_manager vulkan_create_descriptor_manager(
struct vulkan_context_fp *vkcfp,
VkDevice device,
const VkDescriptorPoolSize *sizes, unsigned num_sizes, const VkDescriptorPoolSize *sizes, unsigned num_sizes,
VkDescriptorSetLayout set_layout); VkDescriptorSetLayout set_layout);
void vulkan_destroy_descriptor_manager(VkDevice device, void vulkan_destroy_descriptor_manager(VkDevice device,

View File

@ -459,7 +459,9 @@ static void vulkan_init_descriptor_pool(vk_t *vk)
for (i = 0; i < vk->num_swapchain_images; i++) for (i = 0; i < vk->num_swapchain_images; i++)
{ {
vk->swapchain[i].descriptor_manager = vk->swapchain[i].descriptor_manager =
vulkan_create_descriptor_manager(vk->context->device, vulkan_create_descriptor_manager(
&vk->context->fp,
vk->context->device,
pool_sizes, 2, vk->pipelines.set_layout); pool_sizes, 2, vk->pipelines.set_layout);
} }
} }