r600g: avoid reemiting literal, avoid scheduling empty cs

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
This commit is contained in:
Jerome Glisse 2010-08-10 11:52:00 -04:00
parent 247b253d32
commit 72f8edfc0b
6 changed files with 40 additions and 32 deletions

View file

@ -179,12 +179,13 @@ int r600_bc_add_literal(struct r600_bc *bc, const u32 *value)
return -EINVAL;
}
alu = LIST_ENTRY(struct r600_bc_alu, bc->cf_last->alu.prev, list);
if (!alu->last || !alu->nliteral) {
if (!alu->last || !alu->nliteral || alu->literal_added) {
return 0;
}
memcpy(alu->value, value, 4 * 4);
bc->cf_last->ndw += alu->nliteral;
bc->ndw += alu->nliteral;
alu->literal_added = 1;
return 0;
}

View file

@ -48,6 +48,7 @@ struct r600_bc_alu {
unsigned last;
unsigned is_op3;
unsigned nliteral;
unsigned literal_added;
u32 value[4];
};

View file

@ -54,15 +54,18 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
/* FIXME dumping should be removed once shader support instructions
* without throwing bad code
*/
if (!rctx->ctx->cpm4)
goto out;
sprintf(dname, "gallium-%08d.bof", dc);
if (dc < 1)
radeon_ctx_dump_bof(rctx->ctx, dname);
#if 1
radeon_ctx_submit(rctx->ctx);
#endif
dc++;
out:
rctx->ctx = radeon_ctx_decref(rctx->ctx);
rctx->ctx = radeon_ctx(rscreen->rw);
dc++;
}
static void r600_init_config(struct r600_context *rctx)

View file

@ -156,6 +156,37 @@ int radeon_ctx_pm4(struct radeon_ctx *ctx);
int radeon_ctx_submit(struct radeon_ctx *ctx);
void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file);
/*
* radeon context functions
*/
#pragma pack(1)
struct radeon_cs_reloc {
uint32_t handle;
uint32_t read_domain;
uint32_t write_domain;
uint32_t flags;
};
#pragma pack()
struct radeon_ctx {
int refcount;
struct radeon *radeon;
u32 *pm4;
u32 cpm4;
u32 draw_cpm4;
unsigned id;
unsigned next_id;
unsigned nreloc;
struct radeon_cs_reloc *reloc;
unsigned nbo;
struct radeon_bo **bo;
unsigned ndraw;
struct radeon_draw *cdraw;
struct radeon_draw **draw;
unsigned nstate;
struct radeon_state **state;
};
/*
* R600/R700
*/

View file

@ -151,6 +151,8 @@ int radeon_ctx_submit(struct radeon_ctx *ctx)
uint64_t chunk_array[2];
int r = 0;
if (!ctx->cpm4)
return 0;
#if 0
for (r = 0; r < ctx->cpm4; r++) {
fprintf(stderr, "0x%08X\n", ctx->pm4[r]);

View file

@ -68,36 +68,6 @@ extern int radeon_is_family_compatible(unsigned family1, unsigned family2);
extern int radeon_reg_id(struct radeon *radeon, unsigned offset, unsigned *typeid, unsigned *stateid, unsigned *id);
extern unsigned radeon_type_from_id(struct radeon *radeon, unsigned id);
/*
* radeon context functions
*/
#pragma pack(1)
struct radeon_cs_reloc {
uint32_t handle;
uint32_t read_domain;
uint32_t write_domain;
uint32_t flags;
};
#pragma pack()
struct radeon_ctx {
int refcount;
struct radeon *radeon;
u32 *pm4;
u32 cpm4;
u32 draw_cpm4;
unsigned id;
unsigned next_id;
unsigned nreloc;
struct radeon_cs_reloc *reloc;
unsigned nbo;
struct radeon_bo **bo;
unsigned ndraw;
struct radeon_draw *cdraw;
struct radeon_draw **draw;
unsigned nstate;
struct radeon_state **state;
};
int radeon_ctx_set_bo_new(struct radeon_ctx *ctx, struct radeon_bo *bo);
struct radeon_bo *radeon_ctx_get_bo(struct radeon_ctx *ctx, unsigned reloc);