Signed-off-by: Karol Herbst <kher...@redhat.com> --- src/gallium/drivers/nouveau/nouveau_buffer.c | 20 +++--- src/gallium/drivers/nouveau/nouveau_context.c | 33 ++++++++- src/gallium/drivers/nouveau/nouveau_context.h | 17 ++--- src/gallium/drivers/nouveau/nouveau_fence.h | 5 +- src/gallium/drivers/nouveau/nouveau_screen.c | 8 +-- .../drivers/nouveau/nvc0/nvc0_context.c | 72 +++++++++++++------ .../drivers/nouveau/nvc0/nvc0_context.h | 4 ++ .../drivers/nouveau/nvc0/nvc0_program.c | 2 +- .../drivers/nouveau/nvc0/nvc0_query_hw.c | 4 +- .../drivers/nouveau/nvc0/nvc0_screen.c | 18 +++-- .../drivers/nouveau/nvc0/nvc0_screen.h | 11 ++- .../nouveau/nvc0/nvc0_state_validate.c | 8 +-- .../drivers/nouveau/nvc0/nvc0_transfer.c | 2 +- src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 6 +- 14 files changed, 139 insertions(+), 71 deletions(-)
diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c index 03f214dae4c..0172082f7e0 100644 --- a/src/gallium/drivers/nouveau/nouveau_buffer.c +++ b/src/gallium/drivers/nouveau/nouveau_buffer.c @@ -216,8 +216,8 @@ nouveau_transfer_write(struct nouveau_context *nv, struct nouveau_transfer *tx, else nv->push_data(nv, buf->bo, buf->offset + base, buf->domain, size, data); - nouveau_fence_ref(nv->screen->fence.current, &buf->fence); - nouveau_fence_ref(nv->screen->fence.current, &buf->fence_wr); + nouveau_fence_ref(nv->fence.current, &buf->fence); + nouveau_fence_ref(nv->fence.current, &buf->fence_wr); } /* Does a CPU wait for the buffer's backing data to become reliably accessible @@ -286,10 +286,10 @@ nouveau_buffer_transfer_del(struct nouveau_context *nv, { if (tx->map) { if (likely(tx->bo)) { - nouveau_fence_work(nv->screen->fence.current, nv->pushbuf, + nouveau_fence_work(nv->fence.current, nv->pushbuf, nouveau_fence_unref_bo, tx->bo); if (tx->mm) - release_allocation(&tx->mm, nv->screen->fence.current, nv->pushbuf); + release_allocation(&tx->mm, nv->fence.current, nv->pushbuf); } else { align_free(tx->map - (tx->base.box.x & NOUVEAU_MIN_BUFFER_MAP_ALIGN_MASK)); @@ -573,11 +573,11 @@ nouveau_copy_buffer(struct nouveau_context *nv, src->bo, src->offset + srcx, src->domain, size); dst->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; - nouveau_fence_ref(nv->screen->fence.current, &dst->fence); - nouveau_fence_ref(nv->screen->fence.current, &dst->fence_wr); + nouveau_fence_ref(nv->fence.current, &dst->fence); + nouveau_fence_ref(nv->fence.current, &dst->fence_wr); src->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; - nouveau_fence_ref(nv->screen->fence.current, &src->fence); + nouveau_fence_ref(nv->fence.current, &src->fence); } else { struct pipe_box src_box; src_box.x = srcx; @@ -786,9 +786,9 @@ nouveau_buffer_migrate(struct nouveau_context *nv, nv->copy_data(nv, buf->bo, buf->offset, new_domain, bo, offset, old_domain, buf->base.width0); - nouveau_fence_work(screen->fence.current, nv->pushbuf, nouveau_fence_unref_bo, bo); + nouveau_fence_work(nv->fence.current, nv->pushbuf, nouveau_fence_unref_bo, bo); if (mm) - release_allocation(&mm, screen->fence.current, nv->pushbuf); + release_allocation(&mm, nv->fence.current, nv->pushbuf); } else if (new_domain == NOUVEAU_BO_VRAM && old_domain == 0) { struct nouveau_transfer tx; @@ -898,7 +898,7 @@ nouveau_scratch_runout_release(struct nouveau_context *nv) if (!nv->scratch.runout) return; - if (!nouveau_fence_work(nv->screen->fence.current, nv->pushbuf, nouveau_scratch_unref_bos, + if (!nouveau_fence_work(nv->fence.current, nv->pushbuf, nouveau_scratch_unref_bos, nv->scratch.runout)) return; diff --git a/src/gallium/drivers/nouveau/nouveau_context.c b/src/gallium/drivers/nouveau/nouveau_context.c index 96fe8d5df9b..5fc4129d0ce 100644 --- a/src/gallium/drivers/nouveau/nouveau_context.c +++ b/src/gallium/drivers/nouveau/nouveau_context.c @@ -12,8 +12,39 @@ nouveau_set_debug_callback(struct pipe_context *pipe, memset(&context->debug, 0, sizeof(context->debug)); } -void +int nouveau_context_init(struct nouveau_context *context) { + struct nouveau_screen *screen = context->screen; + int ret; + context->pipe.set_debug_callback = nouveau_set_debug_callback; + + ret = nouveau_client_new(screen->device, &context->client); + if (ret) + return ret; + + ret = nouveau_pushbuf_new(context->client, screen->channel, + 4, 512 * 1024, 1, + &context->pushbuf); + if (ret) + return ret; + + nouveau_fence_list_init(&context->fence, screen, context->pushbuf); + return ret; +} + +void +nouveau_context_destroy(struct nouveau_context *ctx) +{ + int i; + + for (i = 0; i < NOUVEAU_MAX_SCRATCH_BUFS; ++i) + if (ctx->scratch.bo[i]) + nouveau_bo_ref(NULL, &ctx->scratch.bo[i]); + + nouveau_pushbuf_del(&ctx->pushbuf); + nouveau_client_del(&ctx->client); + + FREE(ctx); } diff --git a/src/gallium/drivers/nouveau/nouveau_context.h b/src/gallium/drivers/nouveau/nouveau_context.h index 38c19790ec3..f91f2eab971 100644 --- a/src/gallium/drivers/nouveau/nouveau_context.h +++ b/src/gallium/drivers/nouveau/nouveau_context.h @@ -22,6 +22,8 @@ struct nouveau_context { struct nouveau_pushbuf *pushbuf; struct pipe_debug_callback debug; + struct nouveau_fence_list fence; + bool vbo_dirty; void (*copy_data)(struct nouveau_context *, @@ -70,7 +72,7 @@ nouveau_context(struct pipe_context *pipe) void nouveau_context_init_vdec(struct nouveau_context *); -void +int nouveau_context_init(struct nouveau_context *); void @@ -95,17 +97,8 @@ void * nouveau_scratch_get(struct nouveau_context *, unsigned size, uint64_t *gpu_addr, struct nouveau_bo **); -static inline void -nouveau_context_destroy(struct nouveau_context *ctx) -{ - int i; - - for (i = 0; i < NOUVEAU_MAX_SCRATCH_BUFS; ++i) - if (ctx->scratch.bo[i]) - nouveau_bo_ref(NULL, &ctx->scratch.bo[i]); - - FREE(ctx); -} +void +nouveau_context_destroy(struct nouveau_context *); static inline void nouveau_context_update_frame_stats(struct nouveau_context *nv) diff --git a/src/gallium/drivers/nouveau/nouveau_fence.h b/src/gallium/drivers/nouveau/nouveau_fence.h index d4c5f03b66f..d730078abe4 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.h +++ b/src/gallium/drivers/nouveau/nouveau_fence.h @@ -39,6 +39,7 @@ struct nouveau_fence_list { struct nouveau_fence *current; struct nouveau_screen *screen; + struct nouveau_pushbuf *push; void *data; uint32_t sequence; @@ -61,9 +62,11 @@ void nouveau_fence_unref_bo(void *data); /* generic unref bo callback */ static inline void nouveau_fence_list_init(struct nouveau_fence_list *list, - struct nouveau_screen *screen) + struct nouveau_screen *screen, + struct nouveau_pushbuf *push) { list->screen = screen; + list->push = push; } static inline void diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c b/src/gallium/drivers/nouveau/nouveau_screen.c index ee874a1fce7..d3c02a91657 100644 --- a/src/gallium/drivers/nouveau/nouveau_screen.c +++ b/src/gallium/drivers/nouveau/nouveau_screen.c @@ -80,12 +80,12 @@ nouveau_screen_fence_finish(struct pipe_screen *screen, struct pipe_fence_handle *pfence, uint64_t timeout) { - struct nouveau_pushbuf *push = ctx ? nouveau_context(ctx)->pushbuf : nouveau_screen(screen)->pushbuf; + struct nouveau_fence *fence = nouveau_fence(pfence); if (!timeout) - return nouveau_fence_signalled(nouveau_fence(pfence)); + return nouveau_fence_signalled(fence); - return nouveau_fence_wait(nouveau_fence(pfence), push, NULL); + return nouveau_fence_wait(fence, fence->list->push, NULL); } @@ -226,7 +226,7 @@ nouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev) if (ret) return ret; - nouveau_fence_list_init(&screen->fence, screen); + nouveau_fence_list_init(&screen->fence, screen, screen->pushbuf); /* getting CPU time first appears to be more accurate */ screen->cpu_gpu_time_delta = os_time_get(); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c index 471078c56b4..6cb22d0a633 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c @@ -34,11 +34,12 @@ nvc0_flush(struct pipe_context *pipe, unsigned flags) { struct nvc0_context *nvc0 = nvc0_context(pipe); - struct nouveau_screen *screen = &nvc0->screen->base; if (fence) - nouveau_fence_ref(screen->fence.current, (struct nouveau_fence **)fence); + nouveau_fence_ref(nvc0->base.fence.current, (struct nouveau_fence **)fence); +// nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx); +// nouveau_pushbuf_validate(nvc0->base.pushbuf); PUSH_KICK(nvc0->base.pushbuf); /* fencing handled in kick_notify */ nouveau_context_update_frame_stats(&nvc0->base); @@ -216,20 +217,35 @@ nvc0_destroy(struct pipe_context *pipe) free(pos); } + if (nvc0->base.fence.current) { + struct nouveau_fence *current = NULL; + + /* nouveau_fence_wait will create a new current fence, so wait on the + * _current_ one, and remove both. + */ + nouveau_fence_ref(nvc0->base.fence.current, ¤t); + nouveau_fence_wait(current, nvc0->base.pushbuf, NULL); + nouveau_fence_ref(NULL, ¤t); + nouveau_fence_ref(NULL, &nvc0->base.fence.current); + } + if (nvc0->base.pushbuf) + nvc0->base.pushbuf->user_priv = NULL; + + nouveau_bo_ref(NULL, &nvc0->fence.bo); + nouveau_context_destroy(&nvc0->base); } void nvc0_default_kick_notify(struct nouveau_pushbuf *push) { - struct nvc0_screen *screen = push->user_priv; - - if (screen) { - nouveau_fence_next(&screen->base.fence, push); - nouveau_fence_update(&screen->base.fence, true); - if (screen->cur_ctx) - screen->cur_ctx->state.flushed = true; - NOUVEAU_DRV_STAT(&screen->base, pushbuf_count, 1); + struct nvc0_context *nvc0 = push->user_priv; + + if (nvc0) { + nouveau_fence_next(&nvc0->base.fence, push); + nouveau_fence_update(&nvc0->base.fence, true); + nvc0->state.flushed = true; + NOUVEAU_DRV_STAT(&nvc0->screen->base, pushbuf_count, 1); } } @@ -369,8 +385,9 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags) if (!nvc0_blitctx_create(nvc0)) goto out_err; - nvc0->base.pushbuf = screen->base.pushbuf; - nvc0->base.client = screen->base.client; + nvc0->screen = screen; + nvc0->base.screen = &screen->base; + nouveau_context_init(&nvc0->base); ret = nouveau_bufctx_new(nvc0->base.client, 2, &nvc0->bufctx); if (!ret) @@ -382,9 +399,6 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags) if (ret) goto out_err; - nvc0->screen = screen; - nvc0->base.screen = &screen->base; - pipe->screen = pscreen; pipe->priv = priv; pipe->stream_uploader = u_upload_create_default(pipe); @@ -405,7 +419,24 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags) pipe->get_sample_position = nvc0_context_get_sample_position; pipe->emit_string_marker = nvc0_emit_string_marker; - nouveau_context_init(&nvc0->base); + flags = NOUVEAU_BO_GART | NOUVEAU_BO_MAP; + if (screen->base.drm->version >= 0x01000202) + flags |= NOUVEAU_BO_COHERENT; + + ret = nouveau_bo_new(screen->base.device, flags, 0, 4096, NULL, &nvc0->fence.bo); + if (ret) + goto out_err; + nouveau_bo_map(nvc0->fence.bo, 0, NULL); + nvc0->base.fence.data = nvc0->fence.bo; + nvc0->base.fence.emit = nvc0_screen_fence_emit; + nvc0->base.fence.update = nvc0_screen_fence_update; + + nouveau_fence_new(&nvc0->base.fence, &nvc0->base.fence.current); + + /* initialize the pushbuffer */ + nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx); + nouveau_pushbuf_validate(nvc0->base.pushbuf); + nvc0_init_query_functions(nvc0); nvc0_init_surface_functions(nvc0); nvc0_init_state_functions(nvc0); @@ -441,9 +472,10 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags) if (!screen->cur_ctx) { nvc0->state = screen->save_state; screen->cur_ctx = nvc0; - nouveau_pushbuf_bufctx(nvc0->base.pushbuf, nvc0->bufctx); } nvc0->base.pushbuf->kick_notify = nvc0_default_kick_notify; + nvc0->base.pushbuf->user_priv = nvc0; + nvc0->base.pushbuf->rsvd_kick = 5; /* add permanently resident buffers to bufctxts */ @@ -467,10 +499,10 @@ nvc0_create(struct pipe_screen *pscreen, void *priv, unsigned ctxflags) flags = NOUVEAU_BO_GART | NOUVEAU_BO_WR; - BCTX_REFN_bo(nvc0->bufctx_3d, 3D_SCREEN, flags, screen->fence.bo); - BCTX_REFN_bo(nvc0->bufctx, FENCE, flags, screen->fence.bo); + BCTX_REFN_bo(nvc0->bufctx_3d, 3D_SCREEN, flags, nvc0->fence.bo); + BCTX_REFN_bo(nvc0->bufctx, FENCE, flags, nvc0->fence.bo); if (screen->compute) - BCTX_REFN_bo(nvc0->bufctx_cp, CP_SCREEN, flags, screen->fence.bo); + BCTX_REFN_bo(nvc0->bufctx_cp, CP_SCREEN, flags, nvc0->fence.bo); nvc0->base.scratch.bo_size = 2 << 20; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h index b7cc415359d..bef31f6a702 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h @@ -180,6 +180,10 @@ struct nvc0_context { struct nvc0_screen *screen; + struct { + struct nouveau_bo *bo; + } fence; + void (*m2mf_copy_rect)(struct nvc0_context *, const struct nv50_m2mf_rect *dst, const struct nv50_m2mf_rect *src, diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c index 57d98753f45..f937d3420b5 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c @@ -826,7 +826,7 @@ nvc0_program_upload(struct nvc0_context *nvc0, struct nvc0_program *prog) IMMED_NVC0(nvc0->base.pushbuf, NVC0_3D(SERIALIZE), 0); if ((screen->text->size << 1) <= (1 << 23)) { - ret = nvc0_screen_resize_text_area(screen, screen->text->size << 1); + ret = nvc0_screen_resize_text_area(screen, nvc0->base.pushbuf, screen->text->size << 1); if (ret) { NOUVEAU_ERR("Error allocating TEXT area: %d\n", ret); return false; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c index 40cc552a29b..7a17f0aa604 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c @@ -49,7 +49,7 @@ nvc0_hw_query_allocate(struct nvc0_context *nvc0, struct nvc0_query *q, if (hq->state == NVC0_HW_QUERY_STATE_READY) nouveau_mm_free(hq->mm); else - nouveau_fence_work(screen->base.fence.current, nvc0->base.pushbuf, + nouveau_fence_work(nvc0->base.fence.current, nvc0->base.pushbuf, nouveau_mm_free_work, hq->mm); } } @@ -284,7 +284,7 @@ nvc0_hw_end_query(struct nvc0_context *nvc0, struct nvc0_query *q) break; } if (hq->is64bit) - nouveau_fence_ref(nvc0->screen->base.fence.current, &hq->fence); + nouveau_fence_ref(nvc0->base.fence.current, &hq->fence); } static boolean diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c index 26642c2629d..c98084f7373 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c @@ -727,7 +727,7 @@ nvc0_magic_3d_init(struct nouveau_pushbuf *push, uint16_t obj_class) * are supposed to do */ } -static void +void nvc0_screen_fence_emit(struct nouveau_fence_list *list, struct nouveau_pushbuf *push, u32 *sequence) { struct nouveau_bo *bo = list->data; @@ -744,7 +744,7 @@ nvc0_screen_fence_emit(struct nouveau_fence_list *list, struct nouveau_pushbuf * (0xf << NVC0_3D_QUERY_GET_UNIT__SHIFT)); } -static uint32_t +uint32_t nvc0_screen_fence_update(struct nouveau_fence_list *list) { struct nouveau_bo *bo = list->data; @@ -809,9 +809,8 @@ nvc0_screen_resize_tls_area(struct nvc0_screen *screen, } int -nvc0_screen_resize_text_area(struct nvc0_screen *screen, uint64_t size) +nvc0_screen_resize_text_area(struct nvc0_screen *screen, struct nouveau_pushbuf *push, uint64_t size) { - struct nouveau_pushbuf *push = screen->base.pushbuf; struct nouveau_bo *bo; int ret; @@ -851,13 +850,12 @@ nvc0_screen_resize_text_area(struct nvc0_screen *screen, uint64_t size) } void -nvc0_screen_bind_cb_3d(struct nvc0_screen *screen, bool *can_serialize, - int stage, int index, int size, uint64_t addr) +nvc0_screen_bind_cb_3d(struct nvc0_screen *screen, struct nouveau_pushbuf *push, + bool *can_serialize, int stage, int index, int size, + uint64_t addr) { assert(stage != 5); - struct nouveau_pushbuf *push = screen->base.pushbuf; - if (screen->base.class_3d >= GM107_3D_CLASS) { struct nvc0_cb_binding *binding = &screen->cb_bindings[stage][index]; @@ -1149,7 +1147,7 @@ nvc0_screen_create(struct nouveau_device *dev) nvc0_magic_3d_init(push, screen->eng3d->oclass); - ret = nvc0_screen_resize_text_area(screen, 1 << 19); + ret = nvc0_screen_resize_text_area(screen, push, 1 << 19); if (ret) FAIL_SCREEN_INIT("Error allocating TEXT area: %d\n", ret); @@ -1339,7 +1337,7 @@ nvc0_screen_create(struct nouveau_device *dev) /* TIC and TSC entries for each unit (nve4+ only) */ /* auxiliary constants (6 user clip planes, base instance id) */ - nvc0_screen_bind_cb_3d(screen, NULL, i, 15, NVC0_CB_AUX_SIZE, + nvc0_screen_bind_cb_3d(screen, push, NULL, i, 15, NVC0_CB_AUX_SIZE, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(i)); if (screen->eng3d->oclass >= NVE4_3D_CLASS) { unsigned j; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h index aecdb3494ef..24f9367560c 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h @@ -153,10 +153,11 @@ int nvc0_screen_tsc_alloc(struct nvc0_screen *, void *); int nve4_screen_compute_setup(struct nvc0_screen *, struct nouveau_pushbuf *); int nvc0_screen_compute_setup(struct nvc0_screen *, struct nouveau_pushbuf *); -int nvc0_screen_resize_text_area(struct nvc0_screen *, uint64_t); +int nvc0_screen_resize_text_area(struct nvc0_screen *, struct nouveau_pushbuf *, uint64_t); // 3D Only -void nvc0_screen_bind_cb_3d(struct nvc0_screen *, bool *, int, int, int, uint64_t); +void nvc0_screen_bind_cb_3d(struct nvc0_screen *, struct nouveau_pushbuf *push, + bool *, int, int, int, uint64_t); static inline void nvc0_resource_fence(struct nv04_resource *res, uint32_t flags) @@ -242,4 +243,10 @@ nvc0_screen_tsc_free(struct nvc0_screen *screen, struct nv50_tsc_entry *tsc) } } +void +nvc0_screen_fence_emit(struct nouveau_fence_list *, struct nouveau_pushbuf *, u32 *sequence); + +uint32_t +nvc0_screen_fence_update(struct nouveau_fence_list *); + #endif diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c index 4f004a4f705..7e3689dbb8b 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c @@ -584,7 +584,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0) if (!nvc0->state.uniform_buffer_bound[s]) { nvc0->state.uniform_buffer_bound[s] = true; - nvc0_screen_bind_cb_3d(nvc0->screen, &can_serialize, s, i, + nvc0_screen_bind_cb_3d(nvc0->screen, nvc0->base.pushbuf, &can_serialize, s, i, NVC0_MAX_CONSTBUF_SIZE, bo->offset + base); } nvc0_cb_bo_push(&nvc0->base, bo, NV_VRAM_DOMAIN(&nvc0->screen->base), @@ -595,7 +595,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0) struct nv04_resource *res = nv04_resource(nvc0->constbuf[s][i].u.buf); if (res) { - nvc0_screen_bind_cb_3d(nvc0->screen, &can_serialize, s, i, + nvc0_screen_bind_cb_3d(nvc0->screen, nvc0->base.pushbuf, &can_serialize, s, i, nvc0->constbuf[s][i].size, res->address + nvc0->constbuf[s][i].offset); @@ -607,7 +607,7 @@ nvc0_constbufs_validate(struct nvc0_context *nvc0) if (i == 0) nvc0->state.uniform_buffer_bound[s] = false; } else if (i != 0) { - nvc0_screen_bind_cb_3d(nvc0->screen, &can_serialize, s, i, -1, 0); + nvc0_screen_bind_cb_3d(nvc0->screen, nvc0->base.pushbuf, &can_serialize, s, i, -1, 0); } } } @@ -708,7 +708,7 @@ nvc0_validate_driverconst(struct nvc0_context *nvc0) int i; for (i = 0; i < 5; ++i) - nvc0_screen_bind_cb_3d(screen, NULL, i, 15, NVC0_CB_AUX_SIZE, + nvc0_screen_bind_cb_3d(screen, nvc0->base.pushbuf, NULL, i, 15, NVC0_CB_AUX_SIZE, screen->uniform_bo->offset + NVC0_CB_AUX_INFO(i)); nvc0->dirty_cp |= NVC0_NEW_CP_DRIVERCONST; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c index 440d00dcc94..02daa35921a 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_transfer.c @@ -518,7 +518,7 @@ nvc0_miptree_transfer_unmap(struct pipe_context *pctx, NOUVEAU_DRV_STAT(&nvc0->screen->base, tex_transfers_wr, 1); /* Allow the copies above to finish executing before freeing the source */ - nouveau_fence_work(nvc0->screen->base.fence.current, nvc0->base.pushbuf, + nouveau_fence_work(nvc0->base.fence.current, nvc0->base.pushbuf, nouveau_fence_unref_bo, tx->rect[1].bo); } else { nouveau_bo_ref(NULL, &tx->rect[1].bo); diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c index 31bb910c551..9bff3123f13 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c @@ -552,11 +552,11 @@ nvc0_prim_gl(unsigned prim) static void nvc0_draw_vbo_kick_notify(struct nouveau_pushbuf *push) { - struct nvc0_screen *screen = push->user_priv; + struct nvc0_context *nvc0 = push->user_priv; - nouveau_fence_update(&screen->base.fence, true); + nouveau_fence_update(&nvc0->base.fence, true); - NOUVEAU_DRV_STAT(&screen->base, pushbuf_count, 1); + NOUVEAU_DRV_STAT(&nvc0->screen->base, pushbuf_count, 1); } static void -- 2.19.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev