Since we upload all parameters on every program / constbuf change, we don't have to reserve space and can just use the whole buffer. Doesn't apply to the buffer holding immediates. --- src/gallium/drivers/nv50/nv50_program.c | 39 ++++++++---------------------- src/gallium/drivers/nv50/nv50_program.h | 6 ++-- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/gallium/drivers/nv50/nv50_program.c b/src/gallium/drivers/nv50/nv50_program.c index 75c5cea..28a9f2a 100644 --- a/src/gallium/drivers/nv50/nv50_program.c +++ b/src/gallium/drivers/nv50/nv50_program.c @@ -2433,7 +2433,7 @@ static void nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) { struct pipe_screen *pscreen = nv50->pipe.screen; - unsigned cbuf, start, count; + unsigned cbuf, count; if (!p->data[0] && p->immd_nr) { struct nouveau_resource *heap = nv50->screen->immd_heap[0]; @@ -2457,23 +2457,10 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) if (!p->param_nr) return; - if (!p->data[1]) { - struct nouveau_resource *heap - nv50->screen->parm_heap[p->type]; - - if (nouveau_resource_alloc(heap, p->param_nr, p, &p->data[1])) { - while (heap->next && heap->size < p->param_nr) { - struct nv50_program *evict = heap->next->priv; - nouveau_resource_free(&evict->data[1]); - } - - if (nouveau_resource_alloc(heap, p->param_nr, p, - &p->data[1])) - assert(0); - } - } - - start = p->data[1]->start; + /* we can use the whole buffer for parameters as we upload them + * all everytime anyway + */ + assert(p->param_nr <= 128); if (p->type == PIPE_SHADER_VERTEX) { count = p->param_nr - p->cfg.vp.ucp.nr * 4; @@ -2486,15 +2473,13 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p) if (count) { float *map = pipe_buffer_map(pscreen, nv50->constbuf[p->type], PIPE_BUFFER_USAGE_CPU_READ); - nv50_program_upload_data(nv50, map, start, count, cbuf); + nv50_program_upload_data(nv50, map, 0, count, cbuf); pipe_buffer_unmap(pscreen, nv50->constbuf[p->type]); } if (p->param_nr > count) { - start += count; - count = p->cfg.vp.ucp.nr * 4; nv50_program_upload_data(nv50, &p->cfg.vp.ucp.ucp[0][0], - start, count, cbuf); + count, p->cfg.vp.ucp.nr * 4, cbuf); } } @@ -2526,8 +2511,7 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) assert(!"No more space in program VRAM buffer."); } - if ((p->data[0] && p->data[0]->start != p->data_start[0]) || - (p->data[1] && p->data[1]->start != p->data_start[1])) + if (p->data[0] && p->data[0]->start != p->data_start[0]) upload = TRUE; if (upload) { @@ -2546,7 +2530,9 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) bs = (e->inst[1] >> 22) & 0x07; assert(bs < 2); ei = e->param.shift >> 5; - ci = e->param.index + p->data[bs]->start; + ci = e->param.index; + if (bs == 0) + ci += p->data[bs]->start; e->inst[ei] &= ~e->param.mask; e->inst[ei] |= (ci << e->param.shift); @@ -2554,8 +2540,6 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p) if (p->data[0]) p->data_start[0] = p->data[0]->start; - if (p->data[1]) - p->data_start[1] = p->data[1]->start; } if (!upload) @@ -2869,7 +2853,6 @@ nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p) nouveau_bo_ref(NULL, &p->bo); nouveau_resource_free(&p->data[0]); - nouveau_resource_free(&p->data[1]); nouveau_resource_free(&p->code); while (p->ln) diff --git a/src/gallium/drivers/nv50/nv50_program.h b/src/gallium/drivers/nv50/nv50_program.h index ac5230d..2b7cffd 100644 --- a/src/gallium/drivers/nv50/nv50_program.h +++ b/src/gallium/drivers/nv50/nv50_program.h @@ -32,11 +32,11 @@ struct nv50_program { struct nv50_program_exec *exec_head; struct nv50_program_exec *exec_tail; unsigned exec_size; - struct nouveau_resource *data[2]; - unsigned data_start[2]; - struct nouveau_resource *code; struct nouveau_bo *bo; + struct nouveau_resource *code; + struct nouveau_resource *data[1]; + unsigned data_start[1]; float *immd; unsigned immd_nr; -- 1.6.0.6 --------------090503050107050804030002 Content-Type: text/plain; name="0015-nv50-defer-FP-attribute-loading.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="0015-nv50-defer-FP-attribute-loading.patch"