Module: Mesa
Branch: main
Commit: ec4dcd53dbbc964ebb488177d9265d803a2e4781
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ec4dcd53dbbc964ebb488177d9265d803a2e4781

Author: Samuel Pitoiset <[email protected]>
Date:   Wed Aug 18 10:36:28 2021 +0200

radv: stop checking if dynamic states changed

This is costly for the CPU and might hurt "good" applications that
already avoid that like DXVK/vkd3d-proton.

Gitlab: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5009
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12441>

---

 src/amd/vulkan/radv_cmd_buffer.c | 135 ---------------------------------------
 1 file changed, 135 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index ea68e67f248..f46d559744e 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -4617,7 +4617,6 @@ radv_CmdBindVertexBuffers2EXT(VkCommandBuffer 
commandBuffer, uint32_t firstBindi
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_vertex_binding *vb = cmd_buffer->vertex_bindings;
    const struct radv_vs_input_state *state = 
&cmd_buffer->state.dynamic_vs_input;
-   bool changed = false;
 
    /* We have to defer setting up vertex buffer since we need the buffer
     * stride from the pipeline. */
@@ -4631,12 +4630,6 @@ radv_CmdBindVertexBuffers2EXT(VkCommandBuffer 
commandBuffer, uint32_t firstBindi
       VkDeviceSize size = pSizes ? pSizes[i] : 0;
       VkDeviceSize stride = pStrides ? pStrides[i] : 0;
 
-      /* pSizes and pStrides are optional. */
-      if (!changed && (vb[idx].buffer != buffer || vb[idx].offset != 
pOffsets[i] ||
-                       vb[idx].size != size || (pStrides && vb[idx].stride != 
stride))) {
-         changed = true;
-      }
-
       vb[idx].buffer = buffer;
       vb[idx].offset = pOffsets[i];
       vb[idx].size = size;
@@ -4669,11 +4662,6 @@ radv_CmdBindVertexBuffers2EXT(VkCommandBuffer 
commandBuffer, uint32_t firstBindi
       }
    }
 
-   if (!changed) {
-      /* No state changes. */
-      return;
-   }
-
    cmd_buffer->state.dirty |= RADV_CMD_DIRTY_VERTEX_BUFFER |
                               RADV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT;
 }
@@ -4715,12 +4703,6 @@ radv_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, 
VkBuffer buffer, VkDevice
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    RADV_FROM_HANDLE(radv_buffer, index_buffer, buffer);
 
-   if (cmd_buffer->state.index_buffer == index_buffer && 
cmd_buffer->state.index_offset == offset &&
-       cmd_buffer->state.index_type == indexType) {
-      /* No state changes. */
-      return;
-   }
-
    cmd_buffer->state.index_buffer = index_buffer;
    cmd_buffer->state.index_offset = offset;
    cmd_buffer->state.index_type = vk_to_index_type(indexType);
@@ -5131,12 +5113,6 @@ radv_CmdSetViewport(VkCommandBuffer commandBuffer, 
uint32_t firstViewport, uint3
    assert(firstViewport < MAX_VIEWPORTS);
    assert(total_count >= 1 && total_count <= MAX_VIEWPORTS);
 
-   if (total_count <= state->dynamic.viewport.count &&
-       !memcmp(state->dynamic.viewport.viewports + firstViewport, pViewports,
-               viewportCount * sizeof(*pViewports))) {
-      return;
-   }
-
    if (state->dynamic.viewport.count < total_count)
       state->dynamic.viewport.count = total_count;
 
@@ -5162,12 +5138,6 @@ radv_CmdSetScissor(VkCommandBuffer commandBuffer, 
uint32_t firstScissor, uint32_
    assert(firstScissor < MAX_SCISSORS);
    assert(total_count >= 1 && total_count <= MAX_SCISSORS);
 
-   if (total_count <= state->dynamic.scissor.count &&
-       !memcmp(state->dynamic.scissor.scissors + firstScissor, pScissors,
-               scissorCount * sizeof(*pScissors))) {
-      return;
-   }
-
    if (state->dynamic.scissor.count < total_count)
       state->dynamic.scissor.count = total_count;
 
@@ -5182,9 +5152,6 @@ radv_CmdSetLineWidth(VkCommandBuffer commandBuffer, float 
lineWidth)
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
 
-   if (cmd_buffer->state.dynamic.line_width == lineWidth)
-      return;
-
    cmd_buffer->state.dynamic.line_width = lineWidth;
    cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_LINE_WIDTH;
 }
@@ -5196,12 +5163,6 @@ radv_CmdSetDepthBias(VkCommandBuffer commandBuffer, 
float depthBiasConstantFacto
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_bias.bias == depthBiasConstantFactor &&
-       state->dynamic.depth_bias.clamp == depthBiasClamp &&
-       state->dynamic.depth_bias.slope == depthBiasSlopeFactor) {
-      return;
-   }
-
    state->dynamic.depth_bias.bias = depthBiasConstantFactor;
    state->dynamic.depth_bias.clamp = depthBiasClamp;
    state->dynamic.depth_bias.slope = depthBiasSlopeFactor;
@@ -5215,9 +5176,6 @@ radv_CmdSetBlendConstants(VkCommandBuffer commandBuffer, 
const float blendConsta
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (!memcmp(state->dynamic.blend_constants, blendConstants, sizeof(float) * 
4))
-      return;
-
    memcpy(state->dynamic.blend_constants, blendConstants, sizeof(float) * 4);
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS;
@@ -5229,11 +5187,6 @@ radv_CmdSetDepthBounds(VkCommandBuffer commandBuffer, 
float minDepthBounds, floa
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_bounds.min == minDepthBounds &&
-       state->dynamic.depth_bounds.max == maxDepthBounds) {
-      return;
-   }
-
    state->dynamic.depth_bounds.min = minDepthBounds;
    state->dynamic.depth_bounds.max = maxDepthBounds;
 
@@ -5246,13 +5199,6 @@ radv_CmdSetStencilCompareMask(VkCommandBuffer 
commandBuffer, VkStencilFaceFlags
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
-   bool front_same = state->dynamic.stencil_compare_mask.front == compareMask;
-   bool back_same = state->dynamic.stencil_compare_mask.back == compareMask;
-
-   if ((!(faceMask & VK_STENCIL_FACE_FRONT_BIT) || front_same) &&
-       (!(faceMask & VK_STENCIL_FACE_BACK_BIT) || back_same)) {
-      return;
-   }
 
    if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
       state->dynamic.stencil_compare_mask.front = compareMask;
@@ -5268,13 +5214,6 @@ radv_CmdSetStencilWriteMask(VkCommandBuffer 
commandBuffer, VkStencilFaceFlags fa
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
-   bool front_same = state->dynamic.stencil_write_mask.front == writeMask;
-   bool back_same = state->dynamic.stencil_write_mask.back == writeMask;
-
-   if ((!(faceMask & VK_STENCIL_FACE_FRONT_BIT) || front_same) &&
-       (!(faceMask & VK_STENCIL_FACE_BACK_BIT) || back_same)) {
-      return;
-   }
 
    if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
       state->dynamic.stencil_write_mask.front = writeMask;
@@ -5289,14 +5228,6 @@ radv_CmdSetStencilReference(VkCommandBuffer 
commandBuffer, VkStencilFaceFlags fa
                             uint32_t reference)
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
-   struct radv_cmd_state *state = &cmd_buffer->state;
-   bool front_same = state->dynamic.stencil_reference.front == reference;
-   bool back_same = state->dynamic.stencil_reference.back == reference;
-
-   if ((!(faceMask & VK_STENCIL_FACE_FRONT_BIT) || front_same) &&
-       (!(faceMask & VK_STENCIL_FACE_BACK_BIT) || back_same)) {
-      return;
-   }
 
    if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
       cmd_buffer->state.dynamic.stencil_reference.front = reference;
@@ -5317,11 +5248,6 @@ radv_CmdSetDiscardRectangleEXT(VkCommandBuffer 
commandBuffer, uint32_t firstDisc
    assert(firstDiscardRectangle < MAX_DISCARD_RECTANGLES);
    assert(total_count >= 1 && total_count <= MAX_DISCARD_RECTANGLES);
 
-   if (!memcmp(state->dynamic.discard_rectangle.rectangles + 
firstDiscardRectangle,
-               pDiscardRectangles, discardRectangleCount * 
sizeof(*pDiscardRectangles))) {
-      return;
-   }
-
    
typed_memcpy(&state->dynamic.discard_rectangle.rectangles[firstDiscardRectangle],
                 pDiscardRectangles, discardRectangleCount);
 
@@ -5353,10 +5279,6 @@ radv_CmdSetLineStippleEXT(VkCommandBuffer commandBuffer, 
uint32_t lineStippleFac
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.line_stipple.factor == lineStippleFactor &&
-       state->dynamic.line_stipple.pattern == lineStipplePattern)
-      return;
-
    state->dynamic.line_stipple.factor = lineStippleFactor;
    state->dynamic.line_stipple.pattern = lineStipplePattern;
 
@@ -5369,9 +5291,6 @@ radv_CmdSetCullModeEXT(VkCommandBuffer commandBuffer, 
VkCullModeFlags cullMode)
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.cull_mode == cullMode)
-      return;
-
    state->dynamic.cull_mode = cullMode;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_CULL_MODE;
@@ -5383,9 +5302,6 @@ radv_CmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, 
VkFrontFace frontFace)
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.front_face == frontFace)
-      return;
-
    state->dynamic.front_face = frontFace;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE;
@@ -5399,9 +5315,6 @@ radv_CmdSetPrimitiveTopologyEXT(VkCommandBuffer 
commandBuffer,
    struct radv_cmd_state *state = &cmd_buffer->state;
    unsigned primitive_topology = si_translate_prim(primitiveTopology);
 
-   if (state->dynamic.primitive_topology == primitive_topology)
-      return;
-
    state->dynamic.primitive_topology = primitive_topology;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY;
@@ -5428,9 +5341,6 @@ radv_CmdSetDepthTestEnableEXT(VkCommandBuffer 
commandBuffer, VkBool32 depthTestE
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_test_enable == depthTestEnable)
-      return;
-
    state->dynamic.depth_test_enable = depthTestEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_TEST_ENABLE;
@@ -5442,9 +5352,6 @@ radv_CmdSetDepthWriteEnableEXT(VkCommandBuffer 
commandBuffer, VkBool32 depthWrit
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_write_enable == depthWriteEnable)
-      return;
-
    state->dynamic.depth_write_enable = depthWriteEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE;
@@ -5456,9 +5363,6 @@ radv_CmdSetDepthCompareOpEXT(VkCommandBuffer 
commandBuffer, VkCompareOp depthCom
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_compare_op == depthCompareOp)
-      return;
-
    state->dynamic.depth_compare_op = depthCompareOp;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP;
@@ -5470,9 +5374,6 @@ radv_CmdSetDepthBoundsTestEnableEXT(VkCommandBuffer 
commandBuffer, VkBool32 dept
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_bounds_test_enable == depthBoundsTestEnable)
-      return;
-
    state->dynamic.depth_bounds_test_enable = depthBoundsTestEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE;
@@ -5484,9 +5385,6 @@ radv_CmdSetStencilTestEnableEXT(VkCommandBuffer 
commandBuffer, VkBool32 stencilT
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.stencil_test_enable == stencilTestEnable)
-      return;
-
    state->dynamic.stencil_test_enable = stencilTestEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE;
@@ -5499,18 +5397,6 @@ radv_CmdSetStencilOpEXT(VkCommandBuffer commandBuffer, 
VkStencilFaceFlags faceMa
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
-   bool front_same = state->dynamic.stencil_op.front.fail_op == failOp &&
-                     state->dynamic.stencil_op.front.pass_op == passOp &&
-                     state->dynamic.stencil_op.front.depth_fail_op == 
depthFailOp &&
-                     state->dynamic.stencil_op.front.compare_op == compareOp;
-   bool back_same = state->dynamic.stencil_op.back.fail_op == failOp &&
-                    state->dynamic.stencil_op.back.pass_op == passOp &&
-                    state->dynamic.stencil_op.back.depth_fail_op == 
depthFailOp &&
-                    state->dynamic.stencil_op.back.compare_op == compareOp;
-
-   if ((!(faceMask & VK_STENCIL_FACE_FRONT_BIT) || front_same) &&
-       (!(faceMask & VK_STENCIL_FACE_BACK_BIT) || back_same))
-      return;
 
    if (faceMask & VK_STENCIL_FACE_FRONT_BIT) {
       state->dynamic.stencil_op.front.fail_op = failOp;
@@ -5536,12 +5422,6 @@ radv_CmdSetFragmentShadingRateKHR(VkCommandBuffer 
commandBuffer, const VkExtent2
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.fragment_shading_rate.size.width == pFragmentSize->width 
&&
-       state->dynamic.fragment_shading_rate.size.height == 
pFragmentSize->height &&
-       state->dynamic.fragment_shading_rate.combiner_ops[0] == combinerOps[0] 
&&
-       state->dynamic.fragment_shading_rate.combiner_ops[1] == combinerOps[1])
-      return;
-
    state->dynamic.fragment_shading_rate.size = *pFragmentSize;
    for (unsigned i = 0; i < 2; i++)
       state->dynamic.fragment_shading_rate.combiner_ops[i] = combinerOps[i];
@@ -5555,9 +5435,6 @@ radv_CmdSetDepthBiasEnableEXT(VkCommandBuffer 
commandBuffer, VkBool32 depthBiasE
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.depth_bias_enable == depthBiasEnable)
-      return;
-
    state->dynamic.depth_bias_enable = depthBiasEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE;
@@ -5569,9 +5446,6 @@ radv_CmdSetPrimitiveRestartEnableEXT(VkCommandBuffer 
commandBuffer, VkBool32 pri
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.primitive_restart_enable == primitiveRestartEnable)
-      return;
-
    state->dynamic.primitive_restart_enable = primitiveRestartEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
@@ -5584,9 +5458,6 @@ radv_CmdSetRasterizerDiscardEnableEXT(VkCommandBuffer 
commandBuffer,
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
    struct radv_cmd_state *state = &cmd_buffer->state;
 
-   if (state->dynamic.rasterizer_discard_enable == rasterizerDiscardEnable)
-      return;
-
    state->dynamic.rasterizer_discard_enable = rasterizerDiscardEnable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE;
@@ -5605,9 +5476,6 @@ radv_CmdSetLogicOpEXT(VkCommandBuffer commandBuffer, 
VkLogicOp logicOp)
    struct radv_cmd_state *state = &cmd_buffer->state;
    unsigned logic_op = si_translate_blend_logic_op(logicOp);
 
-   if (state->dynamic.logic_op == logic_op)
-      return;
-
    state->dynamic.logic_op = logic_op;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_LOGIC_OP;
@@ -5627,9 +5495,6 @@ radv_CmdSetColorWriteEnableEXT(VkCommandBuffer 
commandBuffer, uint32_t attachmen
       color_write_enable |= pColorWriteEnables[i] ? (0xfu << (i * 4)) : 0;
    }
 
-   if (state->dynamic.color_write_enable == color_write_enable)
-      return;
-
    state->dynamic.color_write_enable = color_write_enable;
 
    state->dirty |= RADV_CMD_DIRTY_DYNAMIC_COLOR_WRITE_ENABLE;

Reply via email to