[vulkan] Use vkCmdPushDescriptorSetKHR for bsp

This makes switching textures on the fly much easier.
This commit is contained in:
Bill Currie 2021-01-21 12:39:08 +09:00
parent 9e03096da6
commit 2c1a335715
5 changed files with 18 additions and 36 deletions

View file

@ -170,6 +170,7 @@ DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdBindPipeline)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdClearColorImage) DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdClearColorImage)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdExecuteCommands) DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdExecuteCommands)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdPushConstants) DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdPushConstants)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdPushDescriptorSetKHR)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdSetViewport) DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdSetViewport)
DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdSetScissor) DEVICE_LEVEL_VULKAN_FUNCTION (vkCmdSetScissor)

View file

@ -64,7 +64,6 @@ typedef struct bspframe_s {
VkCommandBuffer bsp_cmd; VkCommandBuffer bsp_cmd;
VkCommandBuffer turb_cmd; VkCommandBuffer turb_cmd;
VkCommandBuffer sky_cmd; VkCommandBuffer sky_cmd;
VkDescriptorSet descriptors;
} bspframe_t; } bspframe_t;
typedef struct bspframeset_s typedef struct bspframeset_s

View file

@ -63,20 +63,6 @@
}, },
); );
}; };
quakebsp = {
flags = 0;
maxSets = $framebuffers.size;
bindings = (
{
type = uniform_buffer;
descriptorCount = $framebuffers.size;
},
{
type = combined_image_sampler;
descriptorCount = "5z * $framebuffers.size";
},
);
};
}; };
setLayouts = { setLayouts = {
twod = { twod = {
@ -96,6 +82,7 @@
); );
}; };
quakebsp = { quakebsp = {
flags = push_descriptor;
bindings = ( bindings = (
{ {
binding = 0; binding = 0;

View file

@ -831,32 +831,31 @@ bsp_begin (vulkan_ctx_t *ctx)
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL }, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL },
}; };
VkWriteDescriptorSet write[] = { VkWriteDescriptorSet write[] = {
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, 0,
bframe->descriptors, 0, 0, 1, 0, 0, 1,
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
0, &bufferInfo, 0 }, 0, &bufferInfo, 0 },
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, 0,
bframe->descriptors, 1, 0, 1, 1, 0, 1,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
&imageInfo[0], 0, 0 }, &imageInfo[0], 0, 0 },
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, 0,
bframe->descriptors, 2, 0, 1, 2, 0, 1,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
&imageInfo[1], 0, 0 }, &imageInfo[1], 0, 0 },
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, 0,
bframe->descriptors, 3, 0, 1, 3, 0, 1,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
&imageInfo[2], 0, 0 }, &imageInfo[2], 0, 0 },
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, 0,
bframe->descriptors, 4, 0, 1, 4, 0, 1,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
&imageInfo[3], 0, 0 }, &imageInfo[3], 0, 0 },
{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, 0, 0,
bframe->descriptors, 5, 0, 1, 5, 0, 1,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
&imageInfo[4], 0, 0 }, &imageInfo[4], 0, 0 },
}; };
dfunc->vkUpdateDescriptorSets (device->dev, 5, write, 0, 0);
dfunc->vkResetCommandBuffer (cmd, 0); dfunc->vkResetCommandBuffer (cmd, 0);
VkCommandBufferInheritanceInfo inherit = { VkCommandBufferInheritanceInfo inherit = {
@ -884,10 +883,8 @@ bsp_begin (vulkan_ctx_t *ctx)
dfunc->vkCmdBindIndexBuffer (cmd, bctx->index_buffer, bframe->index_offset, dfunc->vkCmdBindIndexBuffer (cmd, bctx->index_buffer, bframe->index_offset,
VK_INDEX_TYPE_UINT32); VK_INDEX_TYPE_UINT32);
VkDescriptorSet set = bframe->descriptors; dfunc->vkCmdPushDescriptorSetKHR (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
VkPipelineLayout layout = bctx->layout; bctx->layout, 0, 5, write);
dfunc->vkCmdBindDescriptorSets (cmd, VK_PIPELINE_BIND_POINT_GRAPHICS,
layout, 0, 1, &set, 0, 0);
//XXX glsl_Fog_GetColor (fog); //XXX glsl_Fog_GetColor (fog);
//XXX fog[3] = glsl_Fog_GetDensity () / 64.0; //XXX fog[3] = glsl_Fog_GetDensity () / 64.0;
@ -1296,20 +1293,16 @@ Vulkan_Bsp_Init (vulkan_ctx_t *ctx)
for (size_t i = 0; i < layouts->size; i++) { for (size_t i = 0; i < layouts->size; i++) {
layouts->a[i] = QFV_GetDescriptorSetLayout (ctx, "quakebsp"); layouts->a[i] = QFV_GetDescriptorSetLayout (ctx, "quakebsp");
} }
__auto_type pool = QFV_GetDescriptorPool (ctx, "quakebsp");
__auto_type cmdBuffers = QFV_AllocCommandBufferSet (3 * frames, alloca); __auto_type cmdBuffers = QFV_AllocCommandBufferSet (3 * frames, alloca);
QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdBuffers); QFV_AllocateCommandBuffers (device, ctx->cmdpool, 1, cmdBuffers);
__auto_type sets = QFV_AllocateDescriptorSet (device, pool, layouts);
for (size_t i = 0; i < frames; i++) { for (size_t i = 0; i < frames; i++) {
__auto_type bframe = &bctx->frames.a[i]; __auto_type bframe = &bctx->frames.a[i];
bframe->descriptors = sets->a[i];
bframe->bsp_cmd = cmdBuffers->a[i]; bframe->bsp_cmd = cmdBuffers->a[i];
bframe->turb_cmd = cmdBuffers->a[i]; bframe->turb_cmd = cmdBuffers->a[i];
bframe->sky_cmd = cmdBuffers->a[i]; bframe->sky_cmd = cmdBuffers->a[i];
} }
free (sets);
} }
void void

View file

@ -132,11 +132,13 @@ Vulkan_Init_Cvars (void)
static const char *instance_extensions[] = { static const char *instance_extensions[] = {
VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_SURFACE_EXTENSION_NAME,
VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
0, 0,
}; };
static const char *device_extensions[] = { static const char *device_extensions[] = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_SWAPCHAIN_EXTENSION_NAME,
VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME,
0, 0,
}; };