v3dv: implement dynamic state for blend constants

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
Iago Toral Quiroga 2020-03-18 11:50:47 +01:00 committed by Marge Bot
parent 4c15131b1d
commit 1e54b62a61
3 changed files with 44 additions and 4 deletions

View 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;
}

View 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;
}

View 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;