freedreno: scissor vs disabled scissor micro-opt
authorRob Clark <robdclark@chromium.org>
Wed, 22 Apr 2020 22:26:02 +0000 (15:26 -0700)
committerMarge Bot <eric+marge@anholt.net>
Thu, 30 Apr 2020 20:03:17 +0000 (20:03 +0000)
We don't need to deref and check rast state every time scissor changes,
only when rast state changes.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4813>

src/gallium/drivers/freedreno/freedreno_context.c
src/gallium/drivers/freedreno/freedreno_context.h
src/gallium/drivers/freedreno/freedreno_state.c

index 7c9eb4186b2c3cbfb69c9500f7f6726f1e10906d..17a40a9fa6a261ed1cc6ee8ef3b15cefae502598 100644 (file)
@@ -427,6 +427,8 @@ fd_context_init(struct fd_context *ctx, struct pipe_screen *pscreen,
        list_add(&ctx->node, &ctx->screen->context_list);
        fd_screen_unlock(ctx->screen);
 
+       ctx->current_scissor = &ctx->disabled_scissor;
+
        ctx->log_out = stdout;
 
        if ((fd_mesa_debug & FD_DBG_LOG) &&
index b6a8aa3bf5f8a298f35ccf4ddee25ce410ca65ef..b3a0f212dd0454333c259aa455d17cf05623bc83 100644 (file)
@@ -278,6 +278,9 @@ struct fd_context {
         */
        bool in_discard_blit : 1;
 
+       /* points to either scissor or disabled_scissor depending on rast state: */
+       struct pipe_scissor_state *current_scissor;
+
        struct pipe_scissor_state scissor;
 
        /* we don't have a disable/enable bit for scissor, so instead we keep
@@ -463,9 +466,7 @@ fd_context_all_clean(struct fd_context *ctx)
 static inline struct pipe_scissor_state *
 fd_context_get_scissor(struct fd_context *ctx)
 {
-       if (ctx->rasterizer && ctx->rasterizer->scissor)
-               return &ctx->scissor;
-       return &ctx->disabled_scissor;
+       return ctx->current_scissor;
 }
 
 static inline bool
index b2e8c53676c3c85e227f5ffd8ef67f9849d9df5a..698ca82e521437515d7327d5a52c608c8d2b77fd 100644 (file)
@@ -400,6 +400,12 @@ fd_rasterizer_state_bind(struct pipe_context *pctx, void *hwcso)
        ctx->rasterizer = hwcso;
        ctx->dirty |= FD_DIRTY_RASTERIZER;
 
+       if (ctx->rasterizer && ctx->rasterizer->scissor) {
+               ctx->current_scissor = &ctx->scissor;
+       } else {
+               ctx->current_scissor = &ctx->disabled_scissor;
+       }
+
        /* if scissor enable bit changed we need to mark scissor
         * state as dirty as well:
         * NOTE: we can do a shallow compare, since we only care