radeonsi: allocate si_state_rasterizer::pm4_poly_offset only when needed
authorMarek Olšák <marek.olsak@amd.com>
Fri, 9 Jun 2017 17:21:18 +0000 (19:21 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 12 Jun 2017 16:24:37 +0000 (18:24 +0200)
Each element has over 700 bytes.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state.h

index 27a88a8cef5e219dc4a3047166b44df224d3d191..f4d6ae1a986b2d6b9f924a382b17e3eb62f0b034 100644 (file)
@@ -870,6 +870,15 @@ static void *si_create_rs_state(struct pipe_context *ctx,
                S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->fill_front)) |
                S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->fill_back)));
 
+       if (!rs->uses_poly_offset)
+               return rs;
+
+       rs->pm4_poly_offset = CALLOC(3, sizeof(struct si_pm4_state));
+       if (!rs->pm4_poly_offset) {
+               FREE(rs);
+               return NULL;
+       }
+
        /* Precalculate polygon offset states for 16-bit, 24-bit, and 32-bit zbuffers. */
        for (i = 0; i < 3; i++) {
                struct si_pm4_state *pm4 = &rs->pm4_poly_offset[i];
@@ -965,10 +974,13 @@ static void si_bind_rs_state(struct pipe_context *ctx, void *state)
 static void si_delete_rs_state(struct pipe_context *ctx, void *state)
 {
        struct si_context *sctx = (struct si_context *)ctx;
+       struct si_state_rasterizer *rs = (struct si_state_rasterizer *)state;
 
        if (sctx->queued.named.rasterizer == state)
                si_pm4_bind_state(sctx, poly_offset, NULL);
-       si_pm4_delete_state(sctx, rasterizer, (struct si_state_rasterizer *)state);
+
+       FREE(rs->pm4_poly_offset);
+       si_pm4_delete_state(sctx, rasterizer, rs);
 }
 
 /*
index dabe9b9806e1c9a2f76aaa4dbfe28930c24450bd..8de86753f6d66138957edc86a1ba418046e92722 100644 (file)
@@ -60,7 +60,7 @@ struct si_state_blend {
 struct si_state_rasterizer {
        struct si_pm4_state     pm4;
        /* poly offset states for 16-bit, 24-bit, and 32-bit zbuffers */
-       struct si_pm4_state     pm4_poly_offset[3];
+       struct si_pm4_state     *pm4_poly_offset;
        unsigned                pa_sc_line_stipple;
        unsigned                pa_cl_clip_cntl;
        unsigned                sprite_coord_enable:8;