diff options
author | Christoph Bumiller <[email protected]> | 2012-05-17 14:43:47 +0200 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2012-05-17 15:24:58 +0200 |
commit | 1befacc7647f51344f5cfbfa86b62e53625a436f (patch) | |
tree | cc3ef152070aeed35223e0f145792bd469dfb77f /src/gallium/drivers/nouveau | |
parent | 717f55d79d9709a31e0f85a87f076ac13446701d (diff) |
nouveau: place static buffers in VRAM if preferred by the driver
Diffstat (limited to 'src/gallium/drivers/nouveau')
-rw-r--r-- | src/gallium/drivers/nouveau/nouveau_buffer.c | 29 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nouveau_screen.c | 10 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nouveau_screen.h | 8 |
3 files changed, 42 insertions, 5 deletions
diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c index c396e3c3986..d04ac2f9f1c 100644 --- a/src/gallium/drivers/nouveau/nouveau_buffer.c +++ b/src/gallium/drivers/nouveau/nouveau_buffer.c @@ -363,10 +363,31 @@ nouveau_buffer_create(struct pipe_screen *pscreen, pipe_reference_init(&buffer->base.reference, 1); buffer->base.screen = pscreen; - if ((buffer->base.bind & screen->sysmem_bindings) == screen->sysmem_bindings) - ret = nouveau_buffer_allocate(screen, buffer, 0); - else - ret = nouveau_buffer_allocate(screen, buffer, NOUVEAU_BO_GART); + if (buffer->base.bind & + (screen->vidmem_bindings & screen->sysmem_bindings)) { + switch (buffer->base.usage) { + case PIPE_USAGE_DEFAULT: + case PIPE_USAGE_IMMUTABLE: + case PIPE_USAGE_STATIC: + buffer->domain = NOUVEAU_BO_VRAM; + break; + case PIPE_USAGE_DYNAMIC: + case PIPE_USAGE_STAGING: + case PIPE_USAGE_STREAM: + buffer->domain = NOUVEAU_BO_GART; + break; + default: + assert(0); + break; + } + } else { + if (buffer->base.bind & screen->vidmem_bindings) + buffer->domain = NOUVEAU_BO_VRAM; + else + if (buffer->base.bind & screen->sysmem_bindings) + buffer->domain = NOUVEAU_BO_GART; + } + ret = nouveau_buffer_allocate(screen, buffer, buffer->domain); if (ret == FALSE) goto fail; diff --git a/src/gallium/drivers/nouveau/nouveau_screen.c b/src/gallium/drivers/nouveau/nouveau_screen.c index 74377799977..9baa68ce151 100644 --- a/src/gallium/drivers/nouveau/nouveau_screen.c +++ b/src/gallium/drivers/nouveau/nouveau_screen.c @@ -148,6 +148,16 @@ nouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev) util_format_s3tc_init(); + screen->lowmem_bindings = PIPE_BIND_GLOBAL; /* gallium limit */ + screen->vidmem_bindings = + PIPE_BIND_RENDER_TARGET | PIPE_BIND_DEPTH_STENCIL | + PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_CURSOR | + PIPE_BIND_SAMPLER_VIEW | + PIPE_BIND_SHADER_RESOURCE | PIPE_BIND_COMPUTE_RESOURCE | + PIPE_BIND_GLOBAL; + screen->sysmem_bindings = + PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_STREAM_OUTPUT; + memset(&mm_config, 0, sizeof(mm_config)); screen->mm_GART = nouveau_mm_create(dev, diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h b/src/gallium/drivers/nouveau/nouveau_screen.h index 4ca286bfe8d..5a3cfab92e9 100644 --- a/src/gallium/drivers/nouveau/nouveau_screen.h +++ b/src/gallium/drivers/nouveau/nouveau_screen.h @@ -17,7 +17,13 @@ struct nouveau_screen { struct nouveau_client *client; struct nouveau_pushbuf *pushbuf; - unsigned sysmem_bindings; + unsigned vidmem_bindings; /* PIPE_BIND_* where VRAM placement is desired */ + unsigned sysmem_bindings; /* PIPE_BIND_* where GART placement is desired */ + unsigned lowmem_bindings; /* PIPE_BIND_* that require an address < 4 GiB */ + /* + * For bindings with (vidmem & sysmem) bits set set, PIPE_USAGE_* decides + * placement. + */ uint16_t class_3d; |