diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nv50/nv50_pc.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_pc_regalloc.c | 5 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_shader_state.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nv50/nv50_tgsi_to_nc.c | 16 |
4 files changed, 19 insertions, 8 deletions
diff --git a/src/gallium/drivers/nv50/nv50_pc.c b/src/gallium/drivers/nv50/nv50_pc.c index e063888eb5..26ad9b4e3d 100644 --- a/src/gallium/drivers/nv50/nv50_pc.c +++ b/src/gallium/drivers/nv50/nv50_pc.c @@ -237,6 +237,7 @@ nv_pc_free_refs(struct nv_pc *pc) int i; for (i = 0; i < pc->num_refs; i += 64) FREE(pc->refs[i]); + FREE(pc->refs); } static const char * @@ -525,7 +526,8 @@ out: for (i = 0; i < pc->num_blocks; ++i) FREE(pc->bb_list[i]); - + if (pc->root) + FREE(pc->root); if (ret) { /* on success, these will be referenced by nv50_program */ if (pc->emit) FREE(pc->emit); diff --git a/src/gallium/drivers/nv50/nv50_pc_regalloc.c b/src/gallium/drivers/nv50/nv50_pc_regalloc.c index 2998343db5..b9d5ba5ef6 100644 --- a/src/gallium/drivers/nv50/nv50_pc_regalloc.c +++ b/src/gallium/drivers/nv50/nv50_pc_regalloc.c @@ -888,6 +888,10 @@ nv_pc_pass1(struct nv_pc *pc, struct nv_basic_block *root) ctx->pc = pc; ctx->insns = CALLOC(NV_PC_MAX_INSTRUCTIONS, sizeof(struct nv_instruction *)); + if (!ctx->insns) { + FREE(ctx); + return -1; + } pc->pass_seq++; ret = pass_generate_phi_movs(ctx, root); @@ -941,6 +945,7 @@ nv_pc_pass1(struct nv_pc *pc, struct nv_basic_block *root) NV50_DBGMSG("REGISTER ALLOCATION - leaving\n"); out: + FREE(ctx->insns); FREE(ctx); return ret; } diff --git a/src/gallium/drivers/nv50/nv50_shader_state.c b/src/gallium/drivers/nv50/nv50_shader_state.c index f187a074e6..564f7e5324 100644 --- a/src/gallium/drivers/nv50/nv50_shader_state.c +++ b/src/gallium/drivers/nv50/nv50_shader_state.c @@ -44,7 +44,7 @@ nv50_transfer_constbuf(struct nv50_context *nv50, if (!map) return; - count = buf->width0; /* MIN2(buf->width0, size); */ + count = (buf->width0 + 3) / 4; start = 0; while (count) { diff --git a/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c b/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c index 6fd749b35f..5994d1c27e 100644 --- a/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c +++ b/src/gallium/drivers/nv50/nv50_tgsi_to_nc.c @@ -39,7 +39,7 @@ #define BLD_MAX_PREDS 4 #define BLD_MAX_IMMDS 128 -#define BLD_MAX_COND_NESTING 4 +#define BLD_MAX_COND_NESTING 8 #define BLD_MAX_LOOP_NESTING 4 #define BLD_MAX_CALL_NESTING 2 @@ -70,14 +70,14 @@ bld_vals_del_val(struct bld_value_stack *stk, struct nv_value *val) { unsigned i; - for (i = stk->size - 1; i >= 0; --i) - if (stk->body[i] == val) + for (i = stk->size; i > 0; --i) + if (stk->body[i - 1] == val) break; - if (i < 0) + if (!i) return FALSE; - if (i != stk->size - 1) - stk->body[i] = stk->body[stk->size - 1]; + if (i != stk->size) + stk->body[i - 1] = stk->body[stk->size - 1]; --stk->size; /* XXX: old size in REALLOC */ return TRUE; @@ -1643,6 +1643,8 @@ bld_instruction(struct bld_context *bld, { struct nv_basic_block *b = new_basic_block(bld->pc); + assert(bld->cond_lvl < BLD_MAX_COND_NESTING); + nvbb_attach_block(bld->pc->current_block, b, CFG_EDGE_FORWARD); bld->join_bb[bld->cond_lvl] = bld->pc->current_block; @@ -1695,6 +1697,8 @@ bld_instruction(struct bld_context *bld, struct nv_basic_block *bl = new_basic_block(bld->pc); struct nv_basic_block *bb = new_basic_block(bld->pc); + assert(bld->loop_lvl < BLD_MAX_LOOP_NESTING); + bld->loop_bb[bld->loop_lvl] = bl; bld->brkt_bb[bld->loop_lvl] = bb; |