nvfx: delay allocation of buffers in GART/VRAM to validation time
authorLuca Barbieri <luca@luca-barbieri.com>
Tue, 23 Mar 2010 15:34:51 +0000 (16:34 +0100)
committerLuca Barbieri <luca@luca-barbieri.com>
Tue, 23 Mar 2010 17:10:59 +0000 (18:10 +0100)
Currently we allocate buffers in GART or VRAM at creation time.

However, when using swtnl, this results in reads from uncached
memory, which drastically impair performance.

So, for now, cause nouveau_screen.c to not pass any placement flags
to buffer creation, so that the buffers are moved later.

Previously libdrm itself did this, but was changed to not to do it.

This may introduce an extra copy in normal usage, but this currently
does not seem to introduce significant performance degradation.

This will be revisited when pipebuffer is integrated.

Note that for AGP systems, properly solving this may be complex
since currently there is no fast way of reading from GART/VRAM.

We will probably need to try mapping AGP as writethrough and, in
addition, make buffer creation more aware of future buffer usage.

src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/nvfx/nvfx_vbo.c

index 8138715cc7d1899e39d71af677e9c40d132d73f1..6cbd8b23e1f033f59443788c29faa2aec4795f18 100644 (file)
@@ -68,11 +68,9 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, int param)
        case PIPE_CAP_BLEND_EQUATION_SEPARATE:
                return !!screen->is_nv4x;
        case NOUVEAU_CAP_HW_VTXBUF:
-               /* TODO: this is almost surely wrong */
-               return !!screen->is_nv4x;
+               return 0;
        case NOUVEAU_CAP_HW_IDXBUF:
-               /* TODO: this is also almost surely wrong */
-               return screen->is_nv4x && screen->eng3d->grclass == NV40TCL;
+               return 0;
        case PIPE_CAP_MAX_COMBINED_SAMPLERS:
                return 16;
        case PIPE_CAP_INDEP_BLEND_ENABLE:
index 257087f8f636e7b507ce1eda5c5167cedc5f147b..db47acb9502f0e7f8b449f244fda12d19c2a8b39 100644 (file)
@@ -495,7 +495,7 @@ nvfx_vbo_validate(struct nvfx_context *nvfx)
        struct nouveau_grobj *eng3d = nvfx->screen->eng3d;
        struct pipe_buffer *ib = nvfx->idxbuf;
        unsigned ib_format = nvfx->idxbuf_format;
-       unsigned vb_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
+       unsigned vb_flags = NOUVEAU_BO_GART | NOUVEAU_BO_RD;
        int hw;
 
        vtxbuf = so_new(3, 17, 18);