diff options
author | Ilia Mirkin <[email protected]> | 2014-04-30 16:45:16 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-05-02 12:16:25 -0400 |
commit | 3df4d692f3282f134bb154af41be0512897d8571 (patch) | |
tree | ec986278c8c882e45fb555b7b42d024988c7d1cb /src/gallium/drivers/nouveau/nv30 | |
parent | b0d02db7e02d3007bd5635278fbcd11d84c914e5 (diff) |
nouveau: add ARB_buffer_storage support
Signed-off-by: Ilia Mirkin <[email protected]>
Diffstat (limited to 'src/gallium/drivers/nouveau/nv30')
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nv30_resource.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nv30_screen.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nv30_vbo.c | 12 |
3 files changed, 34 insertions, 1 deletions
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_resource.c b/src/gallium/drivers/nouveau/nv30/nv30_resource.c index f56ca315ff4..38fac8af898 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_resource.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_resource.c @@ -31,6 +31,26 @@ #include "nv30/nv30_resource.h" #include "nv30/nv30_transfer.h" +static void +nv30_memory_barrier(struct pipe_context *pipe, unsigned flags) +{ + struct nv30_context *nv30 = nv30_context(pipe); + int i; + + if (flags & PIPE_BARRIER_MAPPED_BUFFER) { + for (i = 0; i < nv30->num_vtxbufs; ++i) { + if (!nv30->vtxbuf[i].buffer) + continue; + if (nv30->vtxbuf[i].buffer->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) + nv30->base.vbo_dirty = TRUE; + } + + if (nv30->idxbuf.buffer && + nv30->idxbuf.buffer->flags & PIPE_RESOURCE_FLAG_MAP_PERSISTENT) + nv30->base.vbo_dirty = TRUE; + } +} + static struct pipe_resource * nv30_resource_create(struct pipe_screen *pscreen, const struct pipe_resource *tmpl) @@ -75,4 +95,5 @@ nv30_resource_init(struct pipe_context *pipe) pipe->resource_copy_region = nv30_resource_copy_region; pipe->blit = nv30_blit; pipe->flush_resource = nv30_flush_resource; + pipe->memory_barrier = nv30_memory_barrier; } diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 77a04d26bde..53ca98565ab 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -79,6 +79,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_TEXCOORD: case PIPE_CAP_USER_CONSTANT_BUFFERS: case PIPE_CAP_USER_INDEX_BUFFERS: + case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: return 1; case PIPE_CAP_USER_VERTEX_BUFFERS: return 0; @@ -132,7 +133,6 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_TGSI_VS_LAYER: case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS: case PIPE_CAP_TEXTURE_GATHER_SM5: - case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT: case PIPE_CAP_FAKE_SW_MSAA: case PIPE_CAP_TEXTURE_QUERY_LOD: case PIPE_CAP_SAMPLE_SHADING: diff --git a/src/gallium/drivers/nouveau/nv30/nv30_vbo.c b/src/gallium/drivers/nouveau/nv30/nv30_vbo.c index d9b3c3ed04a..67ab8295218 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_vbo.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_vbo.c @@ -545,6 +545,7 @@ nv30_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) { struct nv30_context *nv30 = nv30_context(pipe); struct nouveau_pushbuf *push = nv30->base.pushbuf; + int i; /* For picking only a few vertices from a large user buffer, push is better, * if index count is larger and we expect repeated vertices, suggest upload. @@ -573,6 +574,17 @@ nv30_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info) return; } + for (i = 0; i < nv30->num_vtxbufs && !nv30->base.vbo_dirty; ++i) { + if (!nv30->vtxbuf[i].buffer) + continue; + if (nv30->vtxbuf[i].buffer->flags & PIPE_RESOURCE_FLAG_MAP_COHERENT) + nv30->base.vbo_dirty = TRUE; + } + + if (!nv30->base.vbo_dirty && nv30->idxbuf.buffer && + nv30->idxbuf.buffer->flags & PIPE_RESOURCE_FLAG_MAP_COHERENT) + nv30->base.vbo_dirty = TRUE; + if (nv30->base.vbo_dirty) { BEGIN_NV04(push, NV30_3D(VTX_CACHE_INVALIDATE_1710), 1); PUSH_DATA (push, 0); |