diff options
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 35 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_bo.h | 2 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 43 | ||||
-rw-r--r-- | src/gallium/winsys/radeon/drm/radeon_winsys.h | 16 |
4 files changed, 40 insertions, 56 deletions
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index ccf9c4f..d4746ff 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c @@ -346,11 +346,9 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, memset(&args, 0, sizeof(args)); - assert(rdesc->initial_domains && rdesc->reloc_domains); + assert(rdesc->initial_domains); assert((rdesc->initial_domains & ~(RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == 0); - assert((rdesc->reloc_domains & - ~(RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == 0); args.size = size; args.alignment = desc->alignment; @@ -377,7 +375,6 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr, bo->mgr = mgr; bo->rws = mgr->rws; bo->handle = args.handle; - bo->reloc_domains = rdesc->reloc_domains; pipe_mutex_init(bo->map_mutex); return &bo->base; @@ -526,7 +523,8 @@ static struct pb_buffer * radeon_winsys_bo_create(struct radeon_winsys *rws, unsigned size, unsigned alignment, - unsigned bind, unsigned usage) + unsigned bind, + enum radeon_bo_domain domain) { struct radeon_drm_winsys *ws = radeon_drm_winsys(rws); struct radeon_bo_desc desc; @@ -536,31 +534,9 @@ radeon_winsys_bo_create(struct radeon_winsys *rws, memset(&desc, 0, sizeof(desc)); desc.base.alignment = alignment; - /* Determine the memory domains. */ - switch (usage) { - case PIPE_USAGE_STAGING: - case PIPE_USAGE_STREAM: - case PIPE_USAGE_DYNAMIC: - desc.initial_domains = RADEON_GEM_DOMAIN_GTT; - desc.reloc_domains = RADEON_GEM_DOMAIN_GTT; - break; - case PIPE_USAGE_IMMUTABLE: - case PIPE_USAGE_STATIC: - desc.initial_domains = RADEON_GEM_DOMAIN_VRAM; - desc.reloc_domains = RADEON_GEM_DOMAIN_VRAM; - break; - default: - if (bind & (PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER | - PIPE_BIND_CONSTANT_BUFFER)) { - desc.initial_domains = RADEON_GEM_DOMAIN_GTT; - } else { - desc.initial_domains = RADEON_GEM_DOMAIN_VRAM; - } - desc.reloc_domains = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; - } - /* Additional criteria for the cache manager. */ - desc.base.usage = desc.initial_domains; + desc.base.usage = domain; + desc.initial_domains = domain; /* Assign a buffer manager. */ if (bind & (PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER | @@ -618,7 +594,6 @@ static struct pb_buffer *radeon_winsys_bo_from_handle(struct radeon_winsys *rws, } bo->handle = open_arg.handle; bo->name = whandle->handle; - bo->reloc_domains = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; /* Initialize it. */ pipe_reference_init(&bo->base.reference, 1); diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.h b/src/gallium/winsys/radeon/drm/radeon_drm_bo.h index ba71cfb..35d25e8 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.h +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.h @@ -42,7 +42,6 @@ struct radeon_bo_desc { struct pb_desc base; unsigned initial_domains; - unsigned reloc_domains; }; struct radeon_bo { @@ -58,7 +57,6 @@ struct radeon_bo { void *ptr; pipe_mutex map_mutex; - uint32_t reloc_domains; uint32_t handle; uint32_t name; diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c index 2239059..e6109af 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c @@ -181,13 +181,14 @@ static struct radeon_winsys_cs *radeon_drm_cs_create(struct radeon_winsys *rws) #define OUT_CS(cs, value) (cs)->buf[(cs)->cdw++] = (value) static INLINE void update_reloc_domains(struct drm_radeon_cs_reloc *reloc, - enum radeon_bo_usage usage, - unsigned domains) + enum radeon_bo_domain rd, + enum radeon_bo_domain wd, + enum radeon_bo_domain *added_domains) { - if (usage & RADEON_USAGE_READ) - reloc->read_domains |= domains; - if (usage & RADEON_USAGE_WRITE) - reloc->write_domain |= domains; + *added_domains = (rd | wd) & ~(reloc->read_domains | reloc->write_domain); + + reloc->read_domains |= rd; + reloc->write_domain |= wd; } int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo) @@ -209,7 +210,7 @@ int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo) if (reloc->handle == bo->handle) { /* Put this reloc in the hash list. * This will prevent additional hash collisions if there are - * several subsequent get_reloc calls of the same buffer. + * several consecutive get_reloc calls for the same buffer. * * Example: Assuming buffers A,B,C collide in the hash list, * the following sequence of relocs: @@ -230,16 +231,19 @@ int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo) static unsigned radeon_add_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo, enum radeon_bo_usage usage, - unsigned *added_domains) + enum radeon_bo_domain domains, + enum radeon_bo_domain *added_domains) { struct drm_radeon_cs_reloc *reloc; unsigned i; unsigned hash = bo->handle & (sizeof(csc->is_handle_added)-1); + enum radeon_bo_domain rd = usage & RADEON_USAGE_READ ? domains : 0; + enum radeon_bo_domain wd = usage & RADEON_USAGE_WRITE ? domains : 0; if (csc->is_handle_added[hash]) { reloc = csc->relocs_hashlist[hash]; if (reloc->handle == bo->handle) { - update_reloc_domains(reloc, usage, bo->reloc_domains); + update_reloc_domains(reloc, rd, wd, added_domains); return csc->reloc_indices_hashlist[hash]; } @@ -248,7 +252,7 @@ static unsigned radeon_add_reloc(struct radeon_cs_context *csc, --i; reloc = &csc->relocs[i]; if (reloc->handle == bo->handle) { - update_reloc_domains(reloc, usage, bo->reloc_domains); + update_reloc_domains(reloc, rd, wd, added_domains); csc->relocs_hashlist[hash] = reloc; csc->reloc_indices_hashlist[hash] = i; @@ -278,10 +282,8 @@ static unsigned radeon_add_reloc(struct radeon_cs_context *csc, p_atomic_inc(&bo->num_cs_references); reloc = &csc->relocs[csc->crelocs]; reloc->handle = bo->handle; - if (usage & RADEON_USAGE_READ) - reloc->read_domains = bo->reloc_domains; - if (usage & RADEON_USAGE_WRITE) - reloc->write_domain = bo->reloc_domains; + reloc->read_domains = rd; + reloc->write_domain = wd; reloc->flags = 0; csc->is_handle_added[hash] = TRUE; @@ -290,23 +292,24 @@ static unsigned radeon_add_reloc(struct radeon_cs_context *csc, csc->chunks[1].length_dw += RELOC_DWORDS; - *added_domains = bo->reloc_domains; + *added_domains = rd | wd; return csc->crelocs++; } static unsigned radeon_drm_cs_add_reloc(struct radeon_winsys_cs *rcs, struct radeon_winsys_cs_handle *buf, - enum radeon_bo_usage usage) + enum radeon_bo_usage usage, + enum radeon_bo_domain domains) { struct radeon_drm_cs *cs = radeon_drm_cs(rcs); struct radeon_bo *bo = (struct radeon_bo*)buf; - unsigned added_domains = 0; + enum radeon_bo_domain added_domains; - unsigned index = radeon_add_reloc(cs->csc, bo, usage, &added_domains); + unsigned index = radeon_add_reloc(cs->csc, bo, usage, domains, &added_domains); - if (added_domains & RADEON_GEM_DOMAIN_GTT) + if (added_domains & RADEON_DOMAIN_GTT) cs->csc->used_gart += bo->base.size; - if (added_domains & RADEON_GEM_DOMAIN_VRAM) + if (added_domains & RADEON_DOMAIN_VRAM) cs->csc->used_vram += bo->base.size; return index; diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h index ea335d8..59c1aad 100644 --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h @@ -58,6 +58,11 @@ enum radeon_bo_layout { RADEON_LAYOUT_UNKNOWN }; +enum radeon_bo_domain { /* bitfield */ + RADEON_DOMAIN_GTT = 2, + RADEON_DOMAIN_VRAM = 4 +}; + enum radeon_bo_usage { /* bitfield */ RADEON_USAGE_READ = 2, RADEON_USAGE_WRITE = 4, @@ -137,13 +142,14 @@ struct radeon_winsys { * \param size The size to allocate. * \param alignment An alignment of the buffer in memory. * \param bind A bitmask of the PIPE_BIND_* flags. - * \param usage A bitmask of the PIPE_USAGE_* flags. + * \param domain A bitmask of the RADEON_DOMAIN_* flags. * \return The created buffer object. */ struct pb_buffer *(*buffer_create)(struct radeon_winsys *ws, unsigned size, unsigned alignment, - unsigned bind, unsigned usage); + unsigned bind, + enum radeon_bo_domain domain); struct radeon_winsys_cs_handle *(*buffer_get_cs_handle)( struct pb_buffer *buf); @@ -271,12 +277,14 @@ struct radeon_winsys { * * \param cs A command stream to add buffer for validation against. * \param buf A winsys buffer to validate. - * \param usage Whether the buffer is used for read and/or write. + * \param usage Whether the buffer is used for read and/or write. + * \param domain Bitmask of the RADEON_DOMAIN_* flags. * \return Relocation index. */ unsigned (*cs_add_reloc)(struct radeon_winsys_cs *cs, struct radeon_winsys_cs_handle *buf, - enum radeon_bo_usage usage); + enum radeon_bo_usage usage, + enum radeon_bo_domain domain); /** * Return TRUE if there is enough memory in VRAM and GTT for the relocs |