summaryrefslogtreecommitdiffstats
path: root/video/out/vulkan
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.xyz>2017-09-08 06:13:55 +0200
committerNiklas Haas <git@haasn.xyz>2017-09-26 17:25:35 +0200
commitca85a153b4a201c7f6d600f861639ef68c1edfa3 (patch)
tree328594163e35181d10396e651c78f393cff38530 /video/out/vulkan
parented345ffc2f3373743d74a5e0a1dc73c012389273 (diff)
downloadmpv-ca85a153b4a201c7f6d600f861639ef68c1edfa3.tar.bz2
mpv-ca85a153b4a201c7f6d600f861639ef68c1edfa3.tar.xz
vo_gpu: vulkan: add support for push constants
Can in theory avoid updating the uniform buffer every frame
Diffstat (limited to 'video/out/vulkan')
-rw-r--r--video/out/vulkan/ra_vk.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/video/out/vulkan/ra_vk.c b/video/out/vulkan/ra_vk.c
index 897b2e1ff1..76e242601c 100644
--- a/video/out/vulkan/ra_vk.c
+++ b/video/out/vulkan/ra_vk.c
@@ -191,6 +191,7 @@ struct ra *ra_create_vk(struct mpvk_ctx *vk, struct mp_log *log)
ra->glsl_version = vk->spirv->glsl_version;
ra->glsl_vulkan = true;
ra->max_shmem = vk->limits.maxComputeSharedMemorySize;
+ ra->max_pushc_size = vk->limits.maxPushConstantsSize;
if (vk->pool->props.queueFlags & VK_QUEUE_COMPUTE_BIT)
ra->caps |= RA_CAP_COMPUTE;
@@ -1079,6 +1080,12 @@ static struct ra_renderpass *vk_renderpass_create(struct ra *ra,
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
.setLayoutCount = 1,
.pSetLayouts = &pass_vk->dsLayout,
+ .pushConstantRangeCount = params->push_constants_size ? 1 : 0,
+ .pPushConstantRanges = &(VkPushConstantRange){
+ .stageFlags = stageFlags[params->type],
+ .offset = 0,
+ .size = params->push_constants_size,
+ },
};
VK(vkCreatePipelineLayout(vk->dev, &linfo, MPVK_ALLOCATOR,
@@ -1416,6 +1423,13 @@ static void vk_renderpass_run(struct ra *ra,
vkCmdBindDescriptorSets(cmd->buf, bindPoint[pass->params.type],
pass_vk->pipeLayout, 0, 1, &ds, 0, NULL);
+ if (pass->params.push_constants_size) {
+ vkCmdPushConstants(cmd->buf, pass_vk->pipeLayout,
+ stageFlags[pass->params.type], 0,
+ pass->params.push_constants_size,
+ params->push_constants);
+ }
+
switch (pass->params.type) {
case RA_RENDERPASS_TYPE_COMPUTE:
vkCmdDispatch(cmd->buf, params->compute_groups[0],
@@ -1664,6 +1678,7 @@ static struct ra_fns ra_fns_vk = {
.clear = vk_clear,
.blit = vk_blit,
.uniform_layout = std140_layout,
+ .push_constant_layout = std430_layout,
.renderpass_create = vk_renderpass_create,
.renderpass_destroy = vk_renderpass_destroy_lazy,
.renderpass_run = vk_renderpass_run,