diff options
author | Marek Olšák <[email protected]> | 2011-12-24 08:15:40 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2011-12-24 21:28:43 +0100 |
commit | 93f4e3cb6c1ca303ee1f5c2a2491a8eff33f2633 (patch) | |
tree | c6515ad448336db16756adba362412b025ce8cde /src/gallium/drivers/r300 | |
parent | e6e9becd5016df649d3c19a3e81e85bd63b895b7 (diff) |
winsys/radeon: move managing GEM domains back to drivers
This partially reverts commit 363ff844753c46ac9c13866627e096b091ea81f8.
It caused severe performance drops in Nexuiz. Reported by Phoronix.
Tested by me on r300g and by IRC people on r600g.
Diffstat (limited to 'src/gallium/drivers/r300')
-rw-r--r-- | src/gallium/drivers/r300/r300_context.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_emit.c | 20 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_flush.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_query.c | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_screen_buffer.c | 10 | ||||
-rw-r--r-- | src/gallium/drivers/r300/r300_texture.c | 10 |
6 files changed, 31 insertions, 18 deletions
diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index e1c12d9c516..5c0f53e9aad 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -302,6 +302,8 @@ struct r300_surface { struct pb_buffer *buf; struct radeon_winsys_cs_handle *cs_buf; + enum radeon_bo_domain domain; + uint32_t offset; /* COLOROFFSET or DEPTHOFFSET. */ uint32_t pitch; /* COLORPITCH or DEPTHPITCH. */ uint32_t pitch_zmask; /* ZMASK_PITCH */ @@ -385,6 +387,7 @@ struct r300_resource /* Winsys buffer backing this resource. */ struct pb_buffer *buf; struct radeon_winsys_cs_handle *cs_buf; + enum radeon_bo_domain domain; /* Constant buffers are in user memory. */ uint8_t *constant_buffer; diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index d93a5786ff8..3897e990b1c 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -1190,14 +1190,16 @@ validate: tex = r300_resource(fb->cbufs[i]->texture); assert(tex && tex->buf && "cbuf is marked, but NULL!"); r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, - RADEON_USAGE_READWRITE); + RADEON_USAGE_READWRITE, + r300_surface(fb->cbufs[i])->domain); } /* ...depth buffer... */ if (fb->zsbuf) { tex = r300_resource(fb->zsbuf->texture); assert(tex && tex->buf && "zsbuf is marked, but NULL!"); r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, - RADEON_USAGE_READWRITE); + RADEON_USAGE_READWRITE, + r300_surface(fb->zsbuf)->domain); } } if (r300->textures_state.dirty) { @@ -1208,17 +1210,19 @@ validate: } tex = r300_resource(texstate->sampler_views[i]->base.texture); - r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, RADEON_USAGE_READ); + r300->rws->cs_add_reloc(r300->cs, tex->cs_buf, RADEON_USAGE_READ, + tex->domain); } } /* ...occlusion query buffer... */ if (r300->query_current) r300->rws->cs_add_reloc(r300->cs, r300->query_current->cs_buf, - RADEON_USAGE_WRITE); + RADEON_USAGE_WRITE, RADEON_DOMAIN_GTT); /* ...vertex buffer for SWTCL path... */ if (r300->vbo) r300->rws->cs_add_reloc(r300->cs, r300_resource(r300->vbo)->cs_buf, - RADEON_USAGE_READ); + RADEON_USAGE_READ, + r300_resource(r300->vbo)->domain); /* ...vertex buffers for HWTCL path... */ if (do_validate_vertex_buffers && r300->vertex_arrays_dirty) { struct pipe_vertex_buffer *vbuf = r300->vbuf_mgr->real_vertex_buffer; @@ -1231,13 +1235,15 @@ validate: continue; r300->rws->cs_add_reloc(r300->cs, r300_resource(buf)->cs_buf, - RADEON_USAGE_READ); + RADEON_USAGE_READ, + r300_resource(buf)->domain); } } /* ...and index buffer for HWTCL path. */ if (index_buffer) r300->rws->cs_add_reloc(r300->cs, r300_resource(index_buffer)->cs_buf, - RADEON_USAGE_READ); + RADEON_USAGE_READ, + r300_resource(index_buffer)->domain); /* Now do the validation (flush is called inside cs_validate on failure). */ if (!r300->rws->cs_validate(r300->cs)) { diff --git a/src/gallium/drivers/r300/r300_flush.c b/src/gallium/drivers/r300/r300_flush.c index 9459a95cd73..f8546443692 100644 --- a/src/gallium/drivers/r300/r300_flush.c +++ b/src/gallium/drivers/r300/r300_flush.c @@ -80,11 +80,11 @@ void r300_flush(struct pipe_context *pipe, /* Create a fence, which is a dummy BO. */ *rfence = r300->rws->buffer_create(r300->rws, 1, 1, PIPE_BIND_CUSTOM, - PIPE_USAGE_IMMUTABLE); + RADEON_DOMAIN_GTT); /* Add the fence as a dummy relocation. */ r300->rws->cs_add_reloc(r300->cs, r300->rws->buffer_get_cs_handle(*rfence), - RADEON_USAGE_READWRITE); + RADEON_USAGE_READWRITE, RADEON_DOMAIN_GTT); } if (r300->dirty_hw) { diff --git a/src/gallium/drivers/r300/r300_query.c b/src/gallium/drivers/r300/r300_query.c index 8f7de79538d..bcf6d0eb475 100644 --- a/src/gallium/drivers/r300/r300_query.c +++ b/src/gallium/drivers/r300/r300_query.c @@ -58,7 +58,7 @@ static struct pipe_query *r300_create_query(struct pipe_context *pipe, q->num_pipes = r300screen->info.r300_num_gb_pipes; q->buf = r300->rws->buffer_create(r300->rws, 4096, 4096, - PIPE_BIND_CUSTOM, PIPE_USAGE_STAGING); + PIPE_BIND_CUSTOM, RADEON_DOMAIN_GTT); if (!q->buf) { FREE(q); return NULL; diff --git a/src/gallium/drivers/r300/r300_screen_buffer.c b/src/gallium/drivers/r300/r300_screen_buffer.c index a5ec8ef9656..a8392d2dc52 100644 --- a/src/gallium/drivers/r300/r300_screen_buffer.c +++ b/src/gallium/drivers/r300/r300_screen_buffer.c @@ -187,6 +187,7 @@ struct pipe_resource *r300_buffer_create(struct pipe_screen *screen, pipe_reference_init(&rbuf->b.b.b.reference, 1); rbuf->b.b.b.screen = screen; rbuf->b.user_ptr = NULL; + rbuf->domain = RADEON_DOMAIN_GTT; rbuf->buf = NULL; rbuf->constant_buffer = NULL; @@ -196,16 +197,10 @@ struct pipe_resource *r300_buffer_create(struct pipe_screen *screen, return &rbuf->b.b.b; } -#ifdef PIPE_ARCH_BIG_ENDIAN - /* Force buffer placement to GTT on big endian machines, because - * the vertex fetcher can't swap bytes from VRAM. */ - rbuf->b.b.b.usage = PIPE_USAGE_STAGING; -#endif - rbuf->buf = r300screen->rws->buffer_create(r300screen->rws, rbuf->b.b.b.width0, alignment, - rbuf->b.b.b.bind, rbuf->b.b.b.usage); + rbuf->b.b.b.bind, rbuf->domain); if (!rbuf->buf) { util_slab_free(&r300screen->pool_buffers, rbuf); return NULL; @@ -239,6 +234,7 @@ struct pipe_resource *r300_user_buffer_create(struct pipe_screen *screen, rbuf->b.b.b.flags = 0; rbuf->b.b.vtbl = &r300_buffer_vtbl; rbuf->b.user_ptr = ptr; + rbuf->domain = RADEON_DOMAIN_GTT; rbuf->buf = NULL; rbuf->constant_buffer = NULL; return &rbuf->b.b.b; diff --git a/src/gallium/drivers/r300/r300_texture.c b/src/gallium/drivers/r300/r300_texture.c index 2738f582f69..6fc60fb60d6 100644 --- a/src/gallium/drivers/r300/r300_texture.c +++ b/src/gallium/drivers/r300/r300_texture.c @@ -901,6 +901,9 @@ r300_texture_create_object(struct r300_screen *rscreen, tex->tex.microtile = microtile; tex->tex.macrotile[0] = macrotile; tex->tex.stride_in_bytes_override = stride_in_bytes_override; + tex->domain = base->flags & R300_RESOURCE_FLAG_TRANSFER ? + RADEON_DOMAIN_GTT : + RADEON_DOMAIN_VRAM | RADEON_DOMAIN_GTT; tex->buf = buffer; r300_resource_set_properties(&rscreen->screen, &tex->b.b.b, base); @@ -908,7 +911,7 @@ r300_texture_create_object(struct r300_screen *rscreen, /* Create the backing buffer if needed. */ if (!tex->buf) { tex->buf = rws->buffer_create(rws, tex->tex.size_in_bytes, 2048, - base->bind, base->usage); + base->bind, tex->domain); if (!tex->buf) { FREE(tex); @@ -1019,6 +1022,11 @@ struct pipe_surface* r300_create_surface(struct pipe_context * ctx, surface->buf = tex->buf; surface->cs_buf = tex->cs_buf; + /* Prefer VRAM if there are multiple domains to choose from. */ + surface->domain = tex->domain; + if (surface->domain & RADEON_DOMAIN_VRAM) + surface->domain &= ~RADEON_DOMAIN_GTT; + surface->offset = r300_texture_get_offset(tex, level, surf_tmpl->u.tex.first_layer); r300_texture_setup_fb_state(surface); |