11ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs#ifndef __NOUVEAU_CONTEXT_H__ 21ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs#define __NOUVEAU_CONTEXT_H__ 31ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 41ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs#include "pipe/p_context.h" 517e047242e82111859eb8220369c601c79a26350Marcin Slusarz#include <libdrm/nouveau.h> 61ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 7680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller#define NOUVEAU_MAX_SCRATCH_BUFS 4 8680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller 91ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsstruct nouveau_context { 101ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct pipe_context pipe; 111ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct nouveau_screen *screen; 121ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 13a2fc42b899de22273c1df96091bfb5c636075cb0Ben Skeggs struct nouveau_client *client; 146d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller struct nouveau_pushbuf *pushbuf; 156d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller 161ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs boolean vbo_dirty; 17d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller boolean cb_dirty; 181ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 191ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs void (*copy_data)(struct nouveau_context *, 201ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct nouveau_bo *dst, unsigned, unsigned, 211ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct nouveau_bo *src, unsigned, unsigned, unsigned); 221ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs void (*push_data)(struct nouveau_context *, 231ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs struct nouveau_bo *dst, unsigned, unsigned, 24150bb0fb34b74055c7dd6d2925ce9c5a1d7decf5Christoph Bumiller unsigned, const void *); 25d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller /* base, size refer to the whole constant buffer */ 26d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller void (*push_cb)(struct nouveau_context *, 27d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller struct nouveau_bo *, unsigned domain, 28d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller unsigned base, unsigned size, 29d988361ead27ce61615669bd428b04d2aac7af4fChristoph Bumiller unsigned offset, unsigned words, const uint32_t *); 30680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller 31680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller struct { 32680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller uint8_t *map; 33680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller unsigned id; 34680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller unsigned wrap; 35680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller unsigned offset; 36680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller unsigned end; 37680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller struct nouveau_bo *bo[NOUVEAU_MAX_SCRATCH_BUFS]; 38680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller struct nouveau_bo *current; 39680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller struct nouveau_bo **runout; 40680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller unsigned nr_runout; 41680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller unsigned bo_size; 42680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller } scratch; 431ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs}; 441ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 451ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsstatic INLINE struct nouveau_context * 461ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggsnouveau_context(struct pipe_context *pipe) 471ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs{ 481ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs return (struct nouveau_context *)pipe; 491ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs} 501ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs 51ea316c5e060cbd92b34e0d794c0707d4ca79e6e8Christoph Bumillervoid 52ea316c5e060cbd92b34e0d794c0707d4ca79e6e8Christoph Bumillernouveau_context_init_vdec(struct nouveau_context *); 53ea316c5e060cbd92b34e0d794c0707d4ca79e6e8Christoph Bumiller 54680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillervoid 55680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillernouveau_scratch_runout_release(struct nouveau_context *); 56680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller 57680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller/* This is needed because we don't hold references outside of context::scratch, 58680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller * because we don't want to un-bo_ref each allocation every time. This is less 59680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller * work, and we need the wrap index anyway for extreme situations. 60680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller */ 61680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillerstatic INLINE void 62680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillernouveau_scratch_done(struct nouveau_context *nv) 63680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller{ 64680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller nv->scratch.wrap = nv->scratch.id; 65680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller if (unlikely(nv->scratch.nr_runout)) 66680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller nouveau_scratch_runout_release(nv); 67680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller} 68680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller 69680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller/* Get pointer to scratch buffer. 70680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller * The returned nouveau_bo is only referenced by the context, don't un-ref it ! 71680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller */ 72680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillervoid * 73680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumillernouveau_scratch_get(struct nouveau_context *, unsigned size, uint64_t *gpu_addr, 74680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller struct nouveau_bo **); 75680f20351ec65fb22774dc08f63d26cf66b47c59Christoph Bumiller 7617e047242e82111859eb8220369c601c79a26350Marcin Slusarzstatic INLINE void 7717e047242e82111859eb8220369c601c79a26350Marcin Slusarznouveau_context_destroy(struct nouveau_context *ctx) 7817e047242e82111859eb8220369c601c79a26350Marcin Slusarz{ 7917e047242e82111859eb8220369c601c79a26350Marcin Slusarz int i; 8017e047242e82111859eb8220369c601c79a26350Marcin Slusarz 8117e047242e82111859eb8220369c601c79a26350Marcin Slusarz for (i = 0; i < NOUVEAU_MAX_SCRATCH_BUFS; ++i) 8217e047242e82111859eb8220369c601c79a26350Marcin Slusarz if (ctx->scratch.bo[i]) 8317e047242e82111859eb8220369c601c79a26350Marcin Slusarz nouveau_bo_ref(NULL, &ctx->scratch.bo[i]); 8417e047242e82111859eb8220369c601c79a26350Marcin Slusarz 8517e047242e82111859eb8220369c601c79a26350Marcin Slusarz FREE(ctx); 8617e047242e82111859eb8220369c601c79a26350Marcin Slusarz} 871ba8e9510812f155359d380bda6876cdee5ba21eBen Skeggs#endif 88