v3dv: implement dynamic state for blend constants
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
parent
4c15131b1d
commit
1e54b62a61
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue