r600g: fixup state calculations for picking states.
authorDave Airlie <airlied@redhat.com>
Fri, 10 Sep 2010 12:41:00 +0000 (22:41 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 10 Sep 2010 12:41:00 +0000 (22:41 +1000)
for evergreen I ended up using a non-contig array of states, but
this code needs a bit of fixing up to deal with that.

src/gallium/drivers/r600/radeon.h
src/gallium/winsys/r600/drm/r600_state.c
src/gallium/winsys/r600/drm/radeon.c
src/gallium/winsys/r600/drm/radeon_ctx.c
src/gallium/winsys/r600/drm/radeon_draw.c
src/gallium/winsys/r600/drm/radeon_priv.h
src/gallium/winsys/r600/drm/radeon_state.c

index cd063e4..7991821 100644 (file)
@@ -214,6 +214,7 @@ enum r600_stype {
        R600_STATE_DRAW,
        R600_STATE_CB_FLUSH,
        R600_STATE_DB_FLUSH,
+       R600_STATE_MAX,
 };
 
 #include "r600_states_inc.h"
index 4a0111b..b8ef89d 100644 (file)
@@ -632,6 +632,7 @@ static void build_types_array(struct radeon *radeon, struct radeon_stype_info *t
                        }
                }
        }
+       radeon->max_states = id;
        radeon->stype = types;
        radeon->nstype = size;
 }
index 64ccc7d..ccf6060 100644 (file)
@@ -45,7 +45,7 @@ static int radeon_get_device(struct radeon *radeon)
 struct radeon *radeon_new(int fd, unsigned device)
 {
        struct radeon *radeon;
-       int r, i, id;
+       int r, i, id, j, k;
 
        radeon = calloc(1, sizeof(*radeon));
        if (radeon == NULL) {
@@ -120,19 +120,6 @@ struct radeon *radeon_new(int fd, unsigned device)
                        __func__, radeon->device);
                break;
        }
-       radeon->state_type_id = calloc(radeon->nstype, sizeof(unsigned));
-       if (radeon->state_type_id == NULL) {
-               return radeon_decref(radeon);
-       }
-       for (i = 0, id = 0; i < radeon->nstype; i++) {
-               radeon->state_type_id[i] = id;
-               for (int j = 0; j < radeon->nstype; j++) {
-                       if (radeon->stype[j].stype != i)
-                               continue;
-                       id += radeon->stype[j].num;
-               }
-       }
-       radeon->nstate_per_shader = id;
        return radeon;
 }
 
index 5d9cdca..bd0916a 100644 (file)
@@ -259,25 +259,24 @@ int radeon_ctx_set_draw(struct radeon_ctx *ctx, struct radeon_draw *draw)
 {
        unsigned previous_cdwords;
        int r = 0;
+       int i;
 
-       for (int i = 0; i < (ctx->radeon->nstate_per_shader * R600_SHADER_MAX); i++) {
+       for (i = 0; i < ctx->radeon->max_states; i++) {
                r = radeon_ctx_state_bo(ctx, draw->state[i]);
                if (r)
                        return r;
        }
        previous_cdwords = ctx->cdwords;
-       for (int i = 0, id = 0; i < ctx->radeon->nstate_per_shader; i++) {
-               for (int j = 0; j < R600_SHADER_MAX; j++) {
-                       id = j * ctx->radeon->nstate_per_shader + i;
-                       if (draw->state[id]) {
-                               r = radeon_ctx_state_schedule(ctx, draw->state[id]);
-                               if (r) {
-                                       ctx->cdwords = previous_cdwords;
-                                       return r;
-                               }
+       for (i = 0; i < ctx->radeon->max_states; i++) {
+               if (draw->state[i]) {
+                       r = radeon_ctx_state_schedule(ctx, draw->state[i]);
+                       if (r) {
+                               ctx->cdwords = previous_cdwords;
+                               return r;
                        }
                }
        }
+
        return 0;
 }
 
index b992c4a..a126901 100644 (file)
@@ -34,7 +34,7 @@
 int radeon_draw_init(struct radeon_draw *draw, struct radeon *radeon)
 {
        draw->radeon = radeon;
-       draw->state = calloc(radeon->nstate_per_shader * R600_SHADER_MAX, sizeof(void*));
+       draw->state = calloc(radeon->max_states, sizeof(void*));
        if (draw->state == NULL)
                return -ENOMEM;
        return 0;
index 84e552b..bcaa91d 100644 (file)
@@ -59,9 +59,8 @@ struct radeon {
        unsigned                        device;
        unsigned                        family;
        unsigned                        nstype;
-       unsigned                        nstate_per_shader;
-       unsigned                        *state_type_id;
        struct radeon_stype_info        *stype;
+       unsigned max_states;
 };
 
 extern struct radeon *radeon_new(int fd, unsigned device);
index ac60485..e37e714 100644 (file)
@@ -70,8 +70,8 @@ int radeon_state_init(struct radeon_state *state, struct radeon *radeon, u32 sty
        }
 
        memset(state, 0, sizeof(struct radeon_state));
-       state->state_id = radeon->nstate_per_shader * shader_index + radeon->state_type_id[stype] + id;
        state->stype = found;
+       state->state_id = state->stype->num * shader_index + state->stype->base_id + id;
        state->radeon = radeon;
        state->id = id;
        state->shader_index = shader_index;
@@ -128,7 +128,7 @@ int radeon_state_convert(struct radeon_state *state, u32 stype, u32 id, u32 shad
        state->stype = found;
        state->id = id;
        state->shader_index = shader_index;
-       state->state_id = state->radeon->nstate_per_shader * shader_index + state->radeon->state_type_id[stype] + id;
+       state->state_id = state->stype->num * shader_index + state->stype->base_id + id;
        return radeon_state_pm4(state);
 }