anv: Switch to using common dynamic state tracking
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17564>
This commit is contained in:

committed by
Marge Bot

parent
cc89232f2e
commit
7d25c04236
@@ -41,193 +41,6 @@
|
||||
* is concerned, most of anv_cmd_buffer is magic.
|
||||
*/
|
||||
|
||||
/* TODO: These are taken from GLES. We should check the Vulkan spec */
|
||||
const struct anv_dynamic_state default_dynamic_state = {
|
||||
.viewport = {
|
||||
.count = 0,
|
||||
},
|
||||
.scissor = {
|
||||
.count = 0,
|
||||
},
|
||||
.line_width = 1.0f,
|
||||
.depth_bias = {
|
||||
.bias = 0.0f,
|
||||
.clamp = 0.0f,
|
||||
.slope = 0.0f,
|
||||
},
|
||||
.blend_constants = { 0.0f, 0.0f, 0.0f, 0.0f },
|
||||
.depth_bounds = {
|
||||
.min = 0.0f,
|
||||
.max = 1.0f,
|
||||
},
|
||||
.stencil_compare_mask = {
|
||||
.front = ~0u,
|
||||
.back = ~0u,
|
||||
},
|
||||
.stencil_write_mask = {
|
||||
.front = ~0u,
|
||||
.back = ~0u,
|
||||
},
|
||||
.stencil_reference = {
|
||||
.front = 0u,
|
||||
.back = 0u,
|
||||
},
|
||||
.stencil_op = {
|
||||
.front = {
|
||||
.fail_op = 0,
|
||||
.pass_op = 0,
|
||||
.depth_fail_op = 0,
|
||||
.compare_op = 0,
|
||||
},
|
||||
.back = {
|
||||
.fail_op = 0,
|
||||
.pass_op = 0,
|
||||
.depth_fail_op = 0,
|
||||
.compare_op = 0,
|
||||
},
|
||||
},
|
||||
.line_stipple = {
|
||||
.factor = 0u,
|
||||
.pattern = 0u,
|
||||
},
|
||||
.cull_mode = 0,
|
||||
.front_face = 0,
|
||||
.primitive_topology = 0,
|
||||
.depth_test_enable = 0,
|
||||
.depth_write_enable = 0,
|
||||
.depth_compare_op = 0,
|
||||
.depth_bounds_test_enable = 0,
|
||||
.stencil_test_enable = 0,
|
||||
.dyn_vbo_stride = 0,
|
||||
.color_writes = 0xff,
|
||||
.raster_discard = 0,
|
||||
.depth_bias_enable = 0,
|
||||
.primitive_restart_enable = 0,
|
||||
.logic_op = 0,
|
||||
};
|
||||
|
||||
void
|
||||
anv_dynamic_state_init(struct anv_dynamic_state *state)
|
||||
{
|
||||
*state = default_dynamic_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy the dynamic state from src to dest based on the copy_mask.
|
||||
*
|
||||
* Avoid copying states that have not changed, except for VIEWPORT, SCISSOR and
|
||||
* BLEND_CONSTANTS (always copy them if they are in the copy_mask).
|
||||
*
|
||||
* Returns a mask of the states which changed.
|
||||
*/
|
||||
anv_cmd_dirty_mask_t
|
||||
anv_dynamic_state_copy(struct anv_dynamic_state *dest,
|
||||
const struct anv_dynamic_state *src,
|
||||
anv_cmd_dirty_mask_t copy_mask)
|
||||
{
|
||||
anv_cmd_dirty_mask_t changed = 0;
|
||||
|
||||
if (copy_mask & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT) {
|
||||
dest->viewport.count = src->viewport.count;
|
||||
typed_memcpy(dest->viewport.viewports, src->viewport.viewports,
|
||||
src->viewport.count);
|
||||
changed |= ANV_CMD_DIRTY_DYNAMIC_VIEWPORT;
|
||||
}
|
||||
|
||||
if (copy_mask & ANV_CMD_DIRTY_DYNAMIC_SCISSOR) {
|
||||
dest->scissor.count = src->scissor.count;
|
||||
typed_memcpy(dest->scissor.scissors, src->scissor.scissors,
|
||||
src->scissor.count);
|
||||
changed |= ANV_CMD_DIRTY_DYNAMIC_SCISSOR;
|
||||
}
|
||||
|
||||
if (copy_mask & ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS) {
|
||||
typed_memcpy(dest->blend_constants, src->blend_constants, 4);
|
||||
changed |= ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS;
|
||||
}
|
||||
|
||||
#define ANV_CMP_COPY(field, flag) \
|
||||
if (copy_mask & flag) { \
|
||||
if (dest->field != src->field) { \
|
||||
dest->field = src->field; \
|
||||
changed |= flag; \
|
||||
} \
|
||||
}
|
||||
|
||||
ANV_CMP_COPY(line_width, ANV_CMD_DIRTY_DYNAMIC_LINE_WIDTH);
|
||||
|
||||
ANV_CMP_COPY(depth_bias.bias, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS);
|
||||
ANV_CMP_COPY(depth_bias.clamp, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS);
|
||||
ANV_CMP_COPY(depth_bias.slope, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS);
|
||||
|
||||
ANV_CMP_COPY(depth_bounds.min, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS);
|
||||
ANV_CMP_COPY(depth_bounds.max, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS);
|
||||
|
||||
ANV_CMP_COPY(stencil_compare_mask.front, ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK);
|
||||
ANV_CMP_COPY(stencil_compare_mask.back, ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK);
|
||||
|
||||
ANV_CMP_COPY(stencil_write_mask.front, ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK);
|
||||
ANV_CMP_COPY(stencil_write_mask.back, ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK);
|
||||
|
||||
ANV_CMP_COPY(stencil_reference.front, ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE);
|
||||
ANV_CMP_COPY(stencil_reference.back, ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE);
|
||||
|
||||
ANV_CMP_COPY(line_stipple.factor, ANV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE);
|
||||
ANV_CMP_COPY(line_stipple.pattern, ANV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE);
|
||||
|
||||
ANV_CMP_COPY(cull_mode, ANV_CMD_DIRTY_DYNAMIC_CULL_MODE);
|
||||
ANV_CMP_COPY(front_face, ANV_CMD_DIRTY_DYNAMIC_FRONT_FACE);
|
||||
ANV_CMP_COPY(primitive_topology, ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY);
|
||||
ANV_CMP_COPY(depth_test_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE);
|
||||
ANV_CMP_COPY(depth_write_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE);
|
||||
ANV_CMP_COPY(depth_compare_op, ANV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP);
|
||||
ANV_CMP_COPY(depth_bounds_test_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE);
|
||||
ANV_CMP_COPY(stencil_test_enable, ANV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE);
|
||||
|
||||
if (copy_mask & VK_DYNAMIC_STATE_STENCIL_OP) {
|
||||
ANV_CMP_COPY(stencil_op.front.fail_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.front.pass_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.front.depth_fail_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.front.compare_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.back.fail_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.back.pass_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.back.depth_fail_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
ANV_CMP_COPY(stencil_op.back.compare_op, ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP);
|
||||
}
|
||||
|
||||
ANV_CMP_COPY(dyn_vbo_stride, ANV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE);
|
||||
|
||||
ANV_CMP_COPY(raster_discard, ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE);
|
||||
ANV_CMP_COPY(depth_bias_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE);
|
||||
ANV_CMP_COPY(primitive_restart_enable, ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE);
|
||||
ANV_CMP_COPY(logic_op, ANV_CMD_DIRTY_DYNAMIC_LOGIC_OP);
|
||||
|
||||
if (copy_mask & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS) {
|
||||
ANV_CMP_COPY(sample_locations.samples,
|
||||
ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS);
|
||||
if (memcmp(dest->sample_locations.locations,
|
||||
src->sample_locations.locations,
|
||||
src->sample_locations.samples *
|
||||
sizeof(*src->sample_locations.locations))) {
|
||||
typed_memcpy(dest->sample_locations.locations,
|
||||
src->sample_locations.locations,
|
||||
src->sample_locations.samples);
|
||||
changed |= ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS;
|
||||
}
|
||||
}
|
||||
|
||||
ANV_CMP_COPY(color_writes, ANV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_STATE);
|
||||
|
||||
ANV_CMP_COPY(fragment_shading_rate.rate.width, ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.rate.height, ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.ops[0], ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.ops[1], ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
|
||||
#undef ANV_CMP_COPY
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
static void
|
||||
anv_cmd_state_init(struct anv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
@@ -236,9 +49,8 @@ anv_cmd_state_init(struct anv_cmd_buffer *cmd_buffer)
|
||||
memset(state, 0, sizeof(*state));
|
||||
|
||||
state->current_pipeline = UINT32_MAX;
|
||||
anv_dynamic_state_init(&state->gfx.dynamic);
|
||||
state->gfx.restart_index = UINT32_MAX;
|
||||
state->gfx.dirty = ANV_CMD_DIRTY_DYNAMIC_ALL;
|
||||
state->gfx.dirty = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -291,6 +103,9 @@ static VkResult anv_create_cmd_buffer(
|
||||
goto fail_alloc;
|
||||
|
||||
cmd_buffer->vk.destroy = anv_cmd_buffer_destroy;
|
||||
cmd_buffer->vk.dynamic_graphics_state.ms.sample_locations =
|
||||
&cmd_buffer->state.gfx.sample_locations;
|
||||
|
||||
cmd_buffer->batch.status = VK_SUCCESS;
|
||||
|
||||
cmd_buffer->device = device;
|
||||
@@ -598,10 +413,8 @@ void anv_CmdBindPipeline(
|
||||
}
|
||||
|
||||
/* Apply the non dynamic state from the pipeline */
|
||||
cmd_buffer->state.gfx.dirty |=
|
||||
anv_dynamic_state_copy(&cmd_buffer->state.gfx.dynamic,
|
||||
&gfx_pipeline->non_dynamic_state,
|
||||
gfx_pipeline->non_dynamic_state_mask);
|
||||
vk_cmd_set_dynamic_graphics_state(&cmd_buffer->vk,
|
||||
&gfx_pipeline->dynamic_state);
|
||||
|
||||
state = &cmd_buffer->state.gfx.base;
|
||||
stages = gfx_pipeline->active_stages;
|
||||
@@ -635,374 +448,6 @@ void anv_CmdBindPipeline(
|
||||
anv_cmd_buffer_set_ray_query_buffer(cmd_buffer, state, pipeline, stages);
|
||||
}
|
||||
|
||||
void anv_CmdSetRasterizerDiscardEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 rasterizerDiscardEnable)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.raster_discard = rasterizerDiscardEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthBiasEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 depthBiasEnable)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_bias_enable = depthBiasEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetPrimitiveRestartEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 primitiveRestartEnable)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.primitive_restart_enable = primitiveRestartEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetLogicOpEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkLogicOp logicOp)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.logic_op = logicOp;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_LOGIC_OP;
|
||||
}
|
||||
|
||||
void anv_CmdSetPatchControlPointsEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t patchControlPoints)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_FEATURE_NOT_PRESENT);
|
||||
}
|
||||
|
||||
void anv_CmdSetViewport(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t firstViewport,
|
||||
uint32_t viewportCount,
|
||||
const VkViewport* pViewports)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
const uint32_t total_count = firstViewport + viewportCount;
|
||||
if (cmd_buffer->state.gfx.dynamic.viewport.count < total_count)
|
||||
cmd_buffer->state.gfx.dynamic.viewport.count = total_count;
|
||||
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.viewport.viewports + firstViewport,
|
||||
pViewports, viewportCount * sizeof(*pViewports));
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_VIEWPORT;
|
||||
}
|
||||
|
||||
void anv_CmdSetViewportWithCount(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t viewportCount,
|
||||
const VkViewport* pViewports)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.viewport.count = viewportCount;
|
||||
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.viewport.viewports,
|
||||
pViewports, viewportCount * sizeof(*pViewports));
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_VIEWPORT;
|
||||
}
|
||||
|
||||
void anv_CmdSetScissor(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t firstScissor,
|
||||
uint32_t scissorCount,
|
||||
const VkRect2D* pScissors)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
const uint32_t total_count = firstScissor + scissorCount;
|
||||
if (cmd_buffer->state.gfx.dynamic.scissor.count < total_count)
|
||||
cmd_buffer->state.gfx.dynamic.scissor.count = total_count;
|
||||
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.scissor.scissors + firstScissor,
|
||||
pScissors, scissorCount * sizeof(*pScissors));
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SCISSOR;
|
||||
}
|
||||
|
||||
void anv_CmdSetScissorWithCount(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t scissorCount,
|
||||
const VkRect2D* pScissors)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.scissor.count = scissorCount;
|
||||
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.scissor.scissors,
|
||||
pScissors, scissorCount * sizeof(*pScissors));
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SCISSOR;
|
||||
}
|
||||
|
||||
void anv_CmdSetPrimitiveTopology(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkPrimitiveTopology primitiveTopology)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.primitive_topology = primitiveTopology;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY;
|
||||
}
|
||||
|
||||
void anv_CmdSetLineWidth(
|
||||
VkCommandBuffer commandBuffer,
|
||||
float lineWidth)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.line_width = lineWidth;
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_LINE_WIDTH;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthBias(
|
||||
VkCommandBuffer commandBuffer,
|
||||
float depthBiasConstantFactor,
|
||||
float depthBiasClamp,
|
||||
float depthBiasSlopeFactor)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_bias.bias = depthBiasConstantFactor;
|
||||
cmd_buffer->state.gfx.dynamic.depth_bias.clamp = depthBiasClamp;
|
||||
cmd_buffer->state.gfx.dynamic.depth_bias.slope = depthBiasSlopeFactor;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS;
|
||||
}
|
||||
|
||||
void anv_CmdSetBlendConstants(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const float blendConstants[4])
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.blend_constants,
|
||||
blendConstants, sizeof(float) * 4);
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthBounds(
|
||||
VkCommandBuffer commandBuffer,
|
||||
float minDepthBounds,
|
||||
float maxDepthBounds)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_bounds.min = minDepthBounds;
|
||||
cmd_buffer->state.gfx.dynamic.depth_bounds.max = maxDepthBounds;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS;
|
||||
}
|
||||
|
||||
void anv_CmdSetStencilCompareMask(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
uint32_t compareMask)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
|
||||
cmd_buffer->state.gfx.dynamic.stencil_compare_mask.front = compareMask;
|
||||
if (faceMask & VK_STENCIL_FACE_BACK_BIT)
|
||||
cmd_buffer->state.gfx.dynamic.stencil_compare_mask.back = compareMask;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK;
|
||||
}
|
||||
|
||||
void anv_CmdSetStencilWriteMask(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
uint32_t writeMask)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
|
||||
cmd_buffer->state.gfx.dynamic.stencil_write_mask.front = writeMask;
|
||||
if (faceMask & VK_STENCIL_FACE_BACK_BIT)
|
||||
cmd_buffer->state.gfx.dynamic.stencil_write_mask.back = writeMask;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK;
|
||||
}
|
||||
|
||||
void anv_CmdSetStencilReference(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
uint32_t reference)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
|
||||
cmd_buffer->state.gfx.dynamic.stencil_reference.front = reference;
|
||||
if (faceMask & VK_STENCIL_FACE_BACK_BIT)
|
||||
cmd_buffer->state.gfx.dynamic.stencil_reference.back = reference;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE;
|
||||
}
|
||||
|
||||
void anv_CmdSetSampleLocationsEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkSampleLocationsInfoEXT* pSampleLocationsInfo)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
struct anv_dynamic_state *dyn_state = &cmd_buffer->state.gfx.dynamic;
|
||||
uint32_t samples = pSampleLocationsInfo->sampleLocationsPerPixel;
|
||||
struct intel_sample_position *positions =
|
||||
dyn_state->sample_locations.locations;
|
||||
|
||||
if (dyn_state->sample_locations.samples != samples) {
|
||||
dyn_state->sample_locations.samples = samples;
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS;
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < samples; i++) {
|
||||
if (positions[i].x != pSampleLocationsInfo->pSampleLocations[i].x ||
|
||||
positions[i].y != pSampleLocationsInfo->pSampleLocations[i].y) {
|
||||
positions[i].x = pSampleLocationsInfo->pSampleLocations[i].x;
|
||||
positions[i].y = pSampleLocationsInfo->pSampleLocations[i].y;
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void anv_CmdSetLineStippleEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t lineStippleFactor,
|
||||
uint16_t lineStipplePattern)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.line_stipple.factor = lineStippleFactor;
|
||||
cmd_buffer->state.gfx.dynamic.line_stipple.pattern = lineStipplePattern;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_LINE_STIPPLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetCullMode(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkCullModeFlags cullMode)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.cull_mode = cullMode;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_CULL_MODE;
|
||||
}
|
||||
|
||||
void anv_CmdSetFrontFace(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkFrontFace frontFace)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.front_face = frontFace;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_FRONT_FACE;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthTestEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 depthTestEnable)
|
||||
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_test_enable = depthTestEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthWriteEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 depthWriteEnable)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_write_enable = depthWriteEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthCompareOp(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkCompareOp depthCompareOp)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_compare_op = depthCompareOp;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP;
|
||||
}
|
||||
|
||||
void anv_CmdSetDepthBoundsTestEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 depthBoundsTestEnable)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.depth_bounds_test_enable = depthBoundsTestEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetStencilTestEnable(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBool32 stencilTestEnable)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.stencil_test_enable = stencilTestEnable;
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE;
|
||||
}
|
||||
|
||||
void anv_CmdSetStencilOp(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
VkStencilOp failOp,
|
||||
VkStencilOp passOp,
|
||||
VkStencilOp depthFailOp,
|
||||
VkCompareOp compareOp)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
if (faceMask & VK_STENCIL_FACE_FRONT_BIT) {
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.front.fail_op = failOp;
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.front.pass_op = passOp;
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.front.depth_fail_op = depthFailOp;
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.front.compare_op = compareOp;
|
||||
}
|
||||
|
||||
if (faceMask & VK_STENCIL_FACE_BACK_BIT) {
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.back.fail_op = failOp;
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.back.pass_op = passOp;
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.back.depth_fail_op = depthFailOp;
|
||||
cmd_buffer->state.gfx.dynamic.stencil_op.back.compare_op = compareOp;
|
||||
}
|
||||
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_OP;
|
||||
}
|
||||
|
||||
static void
|
||||
anv_cmd_buffer_bind_descriptor_set(struct anv_cmd_buffer *cmd_buffer,
|
||||
VkPipelineBindPoint bind_point,
|
||||
@@ -1167,9 +612,6 @@ void anv_CmdBindVertexBuffers2(
|
||||
/* We have to defer setting up vertex buffer since we need the buffer
|
||||
* stride from the pipeline. */
|
||||
|
||||
if (pStrides)
|
||||
cmd_buffer->state.gfx.dynamic.dyn_vbo_stride = true;
|
||||
|
||||
assert(firstBinding + bindingCount <= MAX_VBS);
|
||||
for (uint32_t i = 0; i < bindingCount; i++) {
|
||||
ANV_FROM_HANDLE(anv_buffer, buffer, pBuffers[i]);
|
||||
@@ -1184,11 +626,15 @@ void anv_CmdBindVertexBuffers2(
|
||||
.offset = pOffsets[i],
|
||||
.size = vk_buffer_range(&buffer->vk, pOffsets[i],
|
||||
pSizes ? pSizes[i] : VK_WHOLE_SIZE),
|
||||
.stride = pStrides ? pStrides[i] : 0,
|
||||
};
|
||||
}
|
||||
cmd_buffer->state.gfx.vb_dirty |= 1 << (firstBinding + i);
|
||||
}
|
||||
|
||||
if (pStrides != NULL) {
|
||||
vk_cmd_set_vertex_binding_strides(&cmd_buffer->vk, firstBinding,
|
||||
bindingCount, pStrides);
|
||||
}
|
||||
}
|
||||
|
||||
void anv_CmdBindTransformFeedbackBuffersEXT(
|
||||
@@ -1610,50 +1056,6 @@ void anv_CmdSetDeviceMask(
|
||||
/* No-op */
|
||||
}
|
||||
|
||||
void anv_CmdSetColorWriteEnableEXT(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t attachmentCount,
|
||||
const VkBool32* pColorWriteEnables)
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
assert(attachmentCount <= MAX_RTS);
|
||||
|
||||
/* Keep the existing values outside the color attachments count of the
|
||||
* current pipeline.
|
||||
*/
|
||||
uint8_t color_writes = cmd_buffer->state.gfx.dynamic.color_writes;
|
||||
for (uint32_t i = 0; i < attachmentCount; i++) {
|
||||
if (pColorWriteEnables[i])
|
||||
color_writes |= BITFIELD_BIT(i);
|
||||
else
|
||||
color_writes &= ~BITFIELD_BIT(i);
|
||||
}
|
||||
|
||||
if (cmd_buffer->state.gfx.dynamic.color_writes != color_writes) {
|
||||
cmd_buffer->state.gfx.dynamic.color_writes = color_writes;
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_STATE;
|
||||
}
|
||||
}
|
||||
|
||||
void anv_CmdSetFragmentShadingRateKHR(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const VkExtent2D* pFragmentSize,
|
||||
const VkFragmentShadingRateCombinerOpKHR combinerOps[2])
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
if (cmd_buffer->state.gfx.dynamic.fragment_shading_rate.rate.width != pFragmentSize->width ||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.rate.height != pFragmentSize->height ||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops[0] != combinerOps[0] ||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops[1] != combinerOps[1]) {
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.rate = *pFragmentSize;
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops, combinerOps,
|
||||
sizeof(cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops));
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
void anv_CmdSetRayTracingPipelineStackSizeKHR(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t pipelineStackSize)
|
||||
|
Reference in New Issue
Block a user