mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
r600g: fixup state calculations for picking states.
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.
This commit is contained in:
parent
f61b241eba
commit
fcae8ca575
7 changed files with 16 additions and 29 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue