Mesa (nvc0): nouveau: allow pipe driver to define which buffers should start in sysmem

Ben Skeggs darktama at kemper.freedesktop.org
Thu Mar 3 05:59:54 UTC 2011


Module: Mesa
Branch: nvc0
Commit: 6b4e3e8941f41b6d15ac557e3d47bf4f1aa8b185
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6b4e3e8941f41b6d15ac557e3d47bf4f1aa8b185

Author: Ben Skeggs <bskeggs at redhat.com>
Date:   Thu Mar  3 15:56:20 2011 +1000

nouveau: allow pipe driver to define which buffers should start in sysmem

PIPE_BIND_CONSTANT_BUFFER alone was OK for nv50/nvc0, but nv30 will need
to be able to set others on certain chipsets.

Signed-off-by: Ben Skeggs <bskeggs at redhat.com>

---

 src/gallium/drivers/nouveau/nouveau_buffer.c |    2 +-
 src/gallium/drivers/nouveau/nouveau_screen.h |    1 +
 src/gallium/drivers/nv50/nv50_screen.c       |    5 ++---
 src/gallium/drivers/nvc0/nvc0_screen.c       |    5 ++---
 4 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nouveau_buffer.c b/src/gallium/drivers/nouveau/nouveau_buffer.c
index 571fa0c..d0cc291 100644
--- a/src/gallium/drivers/nouveau/nouveau_buffer.c
+++ b/src/gallium/drivers/nouveau/nouveau_buffer.c
@@ -340,7 +340,7 @@ nouveau_buffer_create(struct pipe_screen *pscreen,
    pipe_reference_init(&buffer->base.reference, 1);
    buffer->base.screen = pscreen;
 
-   if (buffer->base.bind & PIPE_BIND_CONSTANT_BUFFER)
+   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);
diff --git a/src/gallium/drivers/nouveau/nouveau_screen.h b/src/gallium/drivers/nouveau/nouveau_screen.h
index 580b4da..c091abf 100644
--- a/src/gallium/drivers/nouveau/nouveau_screen.h
+++ b/src/gallium/drivers/nouveau/nouveau_screen.h
@@ -16,6 +16,7 @@ struct nouveau_screen {
 	 * these almost always should be set to the same value */
 	unsigned vertex_buffer_flags;
 	unsigned index_buffer_flags;
+	unsigned sysmem_bindings;
 
 	struct {
 		struct nouveau_fence *head;
diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
index 2bc26e5..3f14843 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -293,6 +293,8 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
       return NULL;
    pscreen = &screen->base.base;
 
+   screen->base.sysmem_bindings = PIPE_BIND_CONSTANT_BUFFER;
+
    ret = nouveau_screen_init(&screen->base, dev);
    if (ret)
       FAIL_SCREEN_INIT("nouveau_screen_init failed: %d\n", ret);
@@ -309,9 +311,6 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
 
    nv50_screen_init_resource_functions(pscreen);
 
-   screen->base.vertex_buffer_flags = screen->base.index_buffer_flags =
-      NOUVEAU_BO_GART;
-
    ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, 4096,
                         &screen->fence.bo);
    if (ret)
diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c
index b84a1be..923bb83 100644
--- a/src/gallium/drivers/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nvc0/nvc0_screen.c
@@ -358,6 +358,8 @@ nvc0_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
       return NULL;
    pscreen = &screen->base.base;
 
+   screen->base.sysmem_bindings = PIPE_BIND_CONSTANT_BUFFER;
+
    ret = nouveau_screen_init(&screen->base, dev);
    if (ret) {
       nvc0_screen_destroy(pscreen);
@@ -375,9 +377,6 @@ nvc0_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
 
    nvc0_screen_init_resource_functions(pscreen);
 
-   screen->base.vertex_buffer_flags = NOUVEAU_BO_GART;
-   screen->base.index_buffer_flags = 0;
-
    ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, 0, 4096,
                         &screen->fence.bo);
    if (ret)




More information about the mesa-commit mailing list