v3dv: implement dynamic state for blend constants
authorIago Toral Quiroga <itoral@igalia.com>
Wed, 18 Mar 2020 10:50:47 +0000 (11:50 +0100)
committerMarge Bot <eric+marge@anholt.net>
Tue, 13 Oct 2020 21:21:28 +0000 (21:21 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>

src/broadcom/vulkan/v3dv_cmd_buffer.c
src/broadcom/vulkan/v3dv_pipeline.c
src/broadcom/vulkan/v3dv_private.h

index 037c4f2..b245ff5 100644 (file)
@@ -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;
+}
index 6fd0262..06283b0 100644 (file)
@@ -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;
 }
 
index 0040719..46e1dea 100644 (file)
@@ -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;