From 1e54b62a61977befcd237870a49bf8c03447986d Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 18 Mar 2020 11:50:47 +0100 Subject: [PATCH] v3dv: implement dynamic state for blend constants Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 33 ++++++++++++++++++++++++++++++--- src/broadcom/vulkan/v3dv_pipeline.c | 9 +++++++++ src/broadcom/vulkan/v3dv_private.h | 6 +++++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 037c4f2..b245ff5 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -48,6 +48,7 @@ const struct v3dv_dynamic_state default_dynamic_state = { .front = 0u, .back = 0u, }, + .blend_constants = { 0.0f, 0.0f, 0.0f, 0.0f }, }; void @@ -1662,7 +1663,14 @@ cmd_buffer_bind_pipeline_static_state(struct v3dv_cmd_buffer *cmd_buffer, } } - /* FIXME: handle VK_DYNAMIC_STATE_BLEND_CONSTANTS */ + if (!(dynamic_mask & V3DV_DYNAMIC_BLEND_CONSTANTS)) { + if (memcmp(&dest->blend_constants, &src->blend_constants, + sizeof(src->blend_constants))) { + memcpy(dest->blend_constants, src->blend_constants, + sizeof(src->blend_constants)); + dirty |= V3DV_CMD_DIRTY_BLEND_CONSTANTS; + } + } cmd_buffer->state.dynamic.mask = dynamic_mask; cmd_buffer->state.dirty |= dirty; @@ -2049,9 +2057,10 @@ emit_blend(struct v3dv_cmd_buffer *cmd_buffer) } } - /* FIXME: this can be dynamic state! */ - if (pipeline->blend.needs_color_constants) + if (pipeline->blend.needs_color_constants && + (cmd_buffer->state.dirty & V3DV_CMD_DIRTY_BLEND_CONSTANTS)) { cl_emit_prepacked(&job->bcl, &pipeline->blend.constant_color); + } for (uint32_t i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) { if (pipeline->blend.enables & (1 << i)) @@ -2739,3 +2748,21 @@ v3dv_CmdPushConstants(VkCommandBuffer commandBuffer, cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_PUSH_CONSTANTS; } + +void +v3dv_CmdSetBlendConstants(VkCommandBuffer commandBuffer, + const float blendConstants[4]) +{ + V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer); + struct v3dv_cmd_buffer_state *state = &cmd_buffer->state; + + if (!memcmp(state->dynamic.blend_constants, blendConstants, + sizeof(state->dynamic.blend_constants))) { + return; + } + + memcpy(state->dynamic.blend_constants, blendConstants, + sizeof(state->dynamic.blend_constants)); + + cmd_buffer->state.dirty |= V3DV_CMD_DIRTY_BLEND_CONSTANTS; +} diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 6fd0262..06283b0 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -1183,6 +1183,8 @@ v3dv_dynamic_state_mask(VkDynamicState state) return V3DV_DYNAMIC_STENCIL_WRITE_MASK; case VK_DYNAMIC_STATE_STENCIL_REFERENCE: return V3DV_DYNAMIC_STENCIL_REFERENCE; + case VK_DYNAMIC_STATE_BLEND_CONSTANTS: + return V3DV_DYNAMIC_BLEND_CONSTANTS; default: unreachable("Unhandled dynamic state"); } @@ -1257,6 +1259,13 @@ pipeline_init_dynamic_state(struct v3dv_pipeline *pipeline, } } + if (pCreateInfo->pColorBlendState && + !(dynamic_states & V3DV_DYNAMIC_BLEND_CONSTANTS)) { + memcpy(dynamic->blend_constants, + pCreateInfo->pColorBlendState->blendConstants, + sizeof(dynamic->blend_constants)); + } + pipeline->dynamic_state.mask = dynamic_states; } diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 0040719..46e1dea 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -491,7 +491,8 @@ enum v3dv_dynamic_state_bits { V3DV_DYNAMIC_STENCIL_COMPARE_MASK = 1 << 2, V3DV_DYNAMIC_STENCIL_WRITE_MASK = 1 << 3, V3DV_DYNAMIC_STENCIL_REFERENCE = 1 << 4, - V3DV_DYNAMIC_ALL = (1 << 5) - 1, + V3DV_DYNAMIC_BLEND_CONSTANTS = 1 << 5, + V3DV_DYNAMIC_ALL = (1 << 6) - 1, }; /* Flags for dirty pipeline state. @@ -506,6 +507,7 @@ enum v3dv_cmd_dirty_bits { V3DV_CMD_DIRTY_VERTEX_BUFFER = 1 << 6, V3DV_CMD_DIRTY_DESCRIPTOR_SETS = 1 << 7, V3DV_CMD_DIRTY_PUSH_CONSTANTS = 1 << 8, + V3DV_CMD_DIRTY_BLEND_CONSTANTS = 1 << 9, }; @@ -534,6 +536,8 @@ struct v3dv_dynamic_state { uint32_t front; uint32_t back; } stencil_reference; + + float blend_constants[4]; }; extern const struct v3dv_dynamic_state default_dynamic_state; -- 2.7.4