From d479f8628424c235ac3e93fabdc441386a215849 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alejandro=20Pi=C3=B1eiro?= Date: Sat, 28 Dec 2019 12:20:45 +0100 Subject: [PATCH] v3dv/cmd_buffer: init command buffer dynamic state during pipeline bind So copying it from the pipeline to the cmd_buffer if defined. Starting with Viewport/Scissor dynamic state. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 37 +++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index cc3022e..b82b1ff 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -894,6 +894,42 @@ v3dv_EndCommandBuffer(VkCommandBuffer commandBuffer) return VK_SUCCESS; } +static void +bind_dynamic_state(struct v3dv_cmd_buffer *cmd_buffer, + const struct v3dv_dynamic_state *src) +{ + struct v3dv_dynamic_state *dest = &cmd_buffer->state.dynamic; + uint32_t copy_mask = src->mask; + uint32_t dest_mask = 0; + + /* See note on SetViewport. We follow radv approach to only allow to set + * the number of viewports/scissors at pipeline creation time. + */ + dest->viewport.count = src->viewport.count; + dest->scissor.count = src->scissor.count; + + if (copy_mask & V3DV_DYNAMIC_VIEWPORT) { + if (memcmp(&dest->viewport.viewports, &src->viewport.viewports, + src->viewport.count * sizeof(VkViewport))) { + typed_memcpy(dest->viewport.viewports, + src->viewport.viewports, + src->viewport.count); + dest_mask |= V3DV_DYNAMIC_VIEWPORT; + } + } + + if (copy_mask & V3DV_DYNAMIC_SCISSOR) { + if (memcmp(&dest->scissor.scissors, &src->scissor.scissors, + src->scissor.count * sizeof(VkRect2D))) { + typed_memcpy(dest->scissor.scissors, + src->scissor.scissors, src->scissor.count); + dest_mask |= V3DV_DYNAMIC_SCISSOR; + } + } + + cmd_buffer->state.dirty |= dest_mask; +} + void v3dv_CmdBindPipeline(VkCommandBuffer commandBuffer, @@ -913,6 +949,7 @@ v3dv_CmdBindPipeline(VkCommandBuffer commandBuffer, return; cmd_buffer->state.pipeline = pipeline; + bind_dynamic_state(cmd_buffer, &pipeline->dynamic_state); cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_PIPELINE; break; -- 2.7.4