[Mesa-dev] [PATCH] radv: prevent dirtying of dynamic state when it does not change
Rhys Perry
pendingchaos02 at gmail.com
Wed Jan 16 00:27:59 UTC 2019
I misread some code and forgot to remove it.
It was always unrelated to this patch.
On Wed, 16 Jan 2019 at 00:22, Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl> wrote:
>
> On Tue, Jan 15, 2019 at 10:59 PM Rhys Perry <pendingchaos02 at gmail.com> wrote:
> >
> > DXVK often sets dynamic state without actually changing it.
> >
> > Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
> > ---
> > src/amd/vulkan/radv_cmd_buffer.c | 92 ++++++++++++++++++++++++++------
> > 1 file changed, 76 insertions(+), 16 deletions(-)
> >
> > diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
> > index 59903ab64d8..56b3c934c2e 100644
> > --- a/src/amd/vulkan/radv_cmd_buffer.c
> > +++ b/src/amd/vulkan/radv_cmd_buffer.c
> > @@ -2965,6 +2965,11 @@ void radv_CmdSetViewport(
> > assert(firstViewport < MAX_VIEWPORTS);
> > assert(total_count >= 1 && total_count <= MAX_VIEWPORTS);
> >
> > + if (!memcmp(state->dynamic.viewport.viewports + firstViewport,
> > + pViewports, viewportCount * sizeof(*pViewports))) {
> > + return;
> > + }
> > +
> > memcpy(state->dynamic.viewport.viewports + firstViewport, pViewports,
> > viewportCount * sizeof(*pViewports));
> >
> > @@ -2984,6 +2989,11 @@ void radv_CmdSetScissor(
> > assert(firstScissor < MAX_SCISSORS);
> > assert(total_count >= 1 && total_count <= MAX_SCISSORS);
> >
> > + if (!memcmp(state->dynamic.scissor.scissors + firstScissor, pScissors,
> > + scissorCount * sizeof(*pScissors))) {
> > + return;
> > + }
> > +
> > memcpy(state->dynamic.scissor.scissors + firstScissor, pScissors,
> > scissorCount * sizeof(*pScissors));
> >
> > @@ -2995,6 +3005,10 @@ void radv_CmdSetLineWidth(
> > 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;
> > }
> > @@ -3006,12 +3020,19 @@ void radv_CmdSetDepthBias(
> > float depthBiasSlopeFactor)
> > {
> > RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
> > + struct radv_cmd_state *state = &cmd_buffer->state;
> >
> > - cmd_buffer->state.dynamic.depth_bias.bias = depthBiasConstantFactor;
> > - cmd_buffer->state.dynamic.depth_bias.clamp = depthBiasClamp;
> > - cmd_buffer->state.dynamic.depth_bias.slope = depthBiasSlopeFactor;
> > + if (state->dynamic.depth_bias.bias == depthBiasConstantFactor &&
> > + state->dynamic.depth_bias.clamp == depthBiasClamp &&
> > + state->dynamic.depth_bias.slope == depthBiasSlopeFactor) {
> > + return;
> > + }
> >
> > - cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS;
> > + state->dynamic.depth_bias.bias = depthBiasConstantFactor;
> > + state->dynamic.depth_bias.clamp = depthBiasClamp;
> > + state->dynamic.depth_bias.slope = depthBiasSlopeFactor;
> > +
> > + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS;
> > }
> >
> > void radv_CmdSetBlendConstants(
> > @@ -3019,11 +3040,14 @@ void radv_CmdSetBlendConstants(
> > const float blendConstants[4])
> > {
> > RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
> > + struct radv_cmd_state *state = &cmd_buffer->state;
> >
> > - memcpy(cmd_buffer->state.dynamic.blend_constants,
> > - blendConstants, sizeof(float) * 4);
> > + if (!memcmp(state->dynamic.blend_constants, blendConstants, sizeof(float) * 4))
> > + return;
> > +
> > + memcpy(state->dynamic.blend_constants, blendConstants, sizeof(float) * 4);
> >
> > - cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS;
> > + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS;
> > }
> >
> > void radv_CmdSetDepthBounds(
> > @@ -3032,11 +3056,17 @@ void radv_CmdSetDepthBounds(
> > float maxDepthBounds)
> > {
> > RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
> > + struct radv_cmd_state *state = &cmd_buffer->state;
> >
> > - cmd_buffer->state.dynamic.depth_bounds.min = minDepthBounds;
> > - cmd_buffer->state.dynamic.depth_bounds.max = maxDepthBounds;
> > + 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;
> >
> > - cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS;
> > + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS;
> > }
> >
> > void radv_CmdSetStencilCompareMask(
> > @@ -3045,13 +3075,21 @@ void radv_CmdSetStencilCompareMask(
> > uint32_t compareMask)
> > {
> > 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)
> > - cmd_buffer->state.dynamic.stencil_compare_mask.front = compareMask;
> > + state->dynamic.stencil_compare_mask.front = compareMask;
> > if (faceMask & VK_STENCIL_FACE_BACK_BIT)
> > - cmd_buffer->state.dynamic.stencil_compare_mask.back = compareMask;
> > + state->dynamic.stencil_compare_mask.back = compareMask;
> >
> > - cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK;
> > + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK;
> > }
> >
> > void radv_CmdSetStencilWriteMask(
> > @@ -3060,13 +3098,21 @@ void radv_CmdSetStencilWriteMask(
> > uint32_t writeMask)
> > {
> > 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)
> > - cmd_buffer->state.dynamic.stencil_write_mask.front = writeMask;
> > + state->dynamic.stencil_write_mask.front = writeMask;
> > if (faceMask & VK_STENCIL_FACE_BACK_BIT)
> > - cmd_buffer->state.dynamic.stencil_write_mask.back = writeMask;
> > + state->dynamic.stencil_write_mask.back = writeMask;
> >
> > - cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK;
> > + state->dirty |= RADV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK;
> > }
> >
> > void radv_CmdSetStencilReference(
> > @@ -3075,6 +3121,14 @@ void radv_CmdSetStencilReference(
> > 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;
> > @@ -3097,6 +3151,11 @@ void radv_CmdSetDiscardRectangleEXT(
> > 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);
> >
> > @@ -3648,6 +3707,7 @@ static bool radv_need_late_scissor_emission(struct radv_cmd_buffer *cmd_buffer,
> > if (cmd_buffer->state.dirty & used_states)
> > return true;
> >
> > + //TODO(pendingchaos): this doesn't apply for GFX9?
>
> What do you mean with this comment?
>
> > if (indexed_draw && state->pipeline->graphics.prim_restart_enable &&
> > (state->index_type ? 0xffffffffu : 0xffffu) != state->last_primitive_reset_index)
> > return true;
> > --
> > 2.20.1
> >
More information about the mesa-dev
mailing list