diff options
Diffstat (limited to 'src/gallium/drivers')
-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 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600.h | 3 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_buffer.c | 30 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_hw_context_priv.h | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600_texture.c | 2 |
10 files changed, 66 insertions, 20 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); diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h index fbd12fbe1b7..4bfb5a980f1 100644 --- a/src/gallium/drivers/r600/r600.h +++ b/src/gallium/drivers/r600/r600.h @@ -88,6 +88,9 @@ struct r600_resource { /* Winsys objects. */ struct pb_buffer *buf; struct radeon_winsys_cs_handle *cs_buf; + + /* Resource state. */ + unsigned domains; }; /* R600/R700 STATES */ diff --git a/src/gallium/drivers/r600/r600_buffer.c b/src/gallium/drivers/r600/r600_buffer.c index f4388867a92..a0386fe4b26 100644 --- a/src/gallium/drivers/r600/r600_buffer.c +++ b/src/gallium/drivers/r600/r600_buffer.c @@ -151,12 +151,40 @@ bool r600_init_resource(struct r600_screen *rscreen, unsigned size, unsigned alignment, unsigned bind, unsigned usage) { - res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment, bind, usage); + uint32_t initial_domain, domains; + + /* Staging resources particpate in transfers and blits only + * and are used for uploads and downloads from regular + * resources. We generate them internally for some transfers. + */ + if (usage == PIPE_USAGE_STAGING) { + domains = RADEON_DOMAIN_GTT; + initial_domain = RADEON_DOMAIN_GTT; + } else { + domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM; + + switch(usage) { + case PIPE_USAGE_DYNAMIC: + case PIPE_USAGE_STREAM: + case PIPE_USAGE_STAGING: + initial_domain = RADEON_DOMAIN_GTT; + break; + case PIPE_USAGE_DEFAULT: + case PIPE_USAGE_STATIC: + case PIPE_USAGE_IMMUTABLE: + default: + initial_domain = RADEON_DOMAIN_VRAM; + break; + } + } + + res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment, bind, initial_domain); if (!res->buf) { return false; } res->cs_buf = rscreen->ws->buffer_get_cs_handle(res->buf); + res->domains = domains; return true; } diff --git a/src/gallium/drivers/r600/r600_hw_context_priv.h b/src/gallium/drivers/r600/r600_hw_context_priv.h index 206de7e819f..2ad56242059 100644 --- a/src/gallium/drivers/r600/r600_hw_context_priv.h +++ b/src/gallium/drivers/r600/r600_hw_context_priv.h @@ -90,7 +90,7 @@ static INLINE unsigned r600_context_bo_reloc(struct r600_context *ctx, struct r6 assert(usage); - reloc_index = ctx->ws->cs_add_reloc(ctx->cs, rbo->cs_buf, usage); + reloc_index = ctx->ws->cs_add_reloc(ctx->cs, rbo->cs_buf, usage, rbo->domains); if (reloc_index >= ctx->creloc) ctx->creloc = reloc_index+1; diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c index 2d041b04e49..8fe54c8a539 100644 --- a/src/gallium/drivers/r600/r600_texture.c +++ b/src/gallium/drivers/r600/r600_texture.c @@ -469,11 +469,13 @@ r600_texture_create_object(struct pipe_screen *screen, } else if (buf) { resource->buf = buf; resource->cs_buf = rscreen->ws->buffer_get_cs_handle(buf); + resource->domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM; } if (rtex->stencil) { pb_reference(&rtex->stencil->resource.buf, rtex->resource.buf); rtex->stencil->resource.cs_buf = rtex->resource.cs_buf; + rtex->stencil->resource.domains = rtex->resource.domains; } return rtex; } |