.front = 0u,
.back = 0u,
},
+ .blend_constants = { 0.0f, 0.0f, 0.0f, 0.0f },
};
void
}
}
- /* 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;
}
}
- /* 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))
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;
+}
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");
}
}
}
+ 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;
}
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.
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,
};
uint32_t front;
uint32_t back;
} stencil_reference;
+
+ float blend_constants[4];
};
extern const struct v3dv_dynamic_state default_dynamic_state;