Am 14.08.2014 um 23:06 schrieb Jerome Glisse: > On Thu, Aug 14, 2014 at 04:34:29PM -0400, Alex Deucher wrote: >> On Thu, Aug 14, 2014 at 2:43 PM, Jerome Glisse <j.glisse at gmail.com> wrote: >>> On Thu, Aug 14, 2014 at 06:12:04PM +0200, Christian K?nig wrote: >>>> From: Christian K?nig <christian.koenig at amd.com> >>>> >>>> This allows userspace to explicitly don't sync submission to >>>> different rings as long as all uses stay in the same client. >>>> >>>> Signed-off-by: Christian K?nig <christian.koenig at amd.com> >>>> --- >>>> drivers/gpu/drm/radeon/radeon.h | 3 +++ >>>> drivers/gpu/drm/radeon/radeon_cs.c | 23 ++++++++++++++++++++++- >>>> drivers/gpu/drm/radeon/radeon_gem.c | 1 + >>>> drivers/gpu/drm/radeon/radeon_ttm.c | 3 +++ >>>> include/uapi/drm/radeon_drm.h | 2 ++ >>>> 5 files changed, 31 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/gpu/drm/radeon/radeon.h >>>> b/drivers/gpu/drm/radeon/radeon.h >>>> index c0f7773..740a0b2 100644 >>>> --- a/drivers/gpu/drm/radeon/radeon.h >>>> +++ b/drivers/gpu/drm/radeon/radeon.h >>>> @@ -478,6 +478,8 @@ struct radeon_bo { >>>> u32 tiling_flags; >>>> u32 pitch; >>>> int surface_reg; >>>> + struct drm_file *last_user; >>>> + struct radeon_fence *last_sync; >>>> struct radeon_fence *written; >>>> /* list of all virtual address to which this bo >>>> * is associated to >>>> @@ -1018,6 +1020,7 @@ struct radeon_cs_reloc { >>>> unsigned allowed_domains; >>>> uint32_t tiling_flags; >>>> uint32_t handle; >>>> + uint32_t flags; >>>> bool written; >>>> }; >>>> >>>> diff --git a/drivers/gpu/drm/radeon/radeon_cs.c >>>> b/drivers/gpu/drm/radeon/radeon_cs.c >>>> index 3aa7e48..11e4789 100644 >>>> --- a/drivers/gpu/drm/radeon/radeon_cs.c >>>> +++ b/drivers/gpu/drm/radeon/radeon_cs.c >>>> @@ -166,6 +166,7 @@ static int radeon_cs_parser_relocs(struct >>>> radeon_cs_parser *p) >>>> >>>> p->relocs[i].tv.bo = &p->relocs[i].robj->tbo; >>>> p->relocs[i].handle = r->handle; >>>> + p->relocs[i].flags = r->flags; >>>> p->relocs[i].written = !!r->write_domain; >>>> >>>> radeon_cs_buckets_add(&buckets, &p->relocs[i].tv.head, >>>> @@ -236,6 +237,14 @@ static void radeon_cs_sync_rings(struct >>>> radeon_cs_parser *p) >>>> if (!bo) >>>> continue; >>>> >>>> + /* always sync to the last operation >>>> + the clients doesn't know about */ >>>> + radeon_semaphore_sync_to(p->ib.presync, bo->last_sync); >>>> + >>>> + if (bo->last_user == p->filp && >>>> + reloc->flags & RADEON_RELOC_DONT_SYNC) >>>> + continue; >>>> + >>>> fence = bo->tbo.sync_obj; >>>> >>>> if (bo->written && radeon_fence_signaled(bo->written)) >>>> @@ -421,7 +430,19 @@ static void radeon_cs_parser_fini(struct >>>> radeon_cs_parser *parser, int error, bo >>>> struct radeon_cs_reloc *reloc = &parser->relocs[i]; >>>> struct radeon_bo *bo = reloc->robj; >>>> >>>> - if (!bo || !reloc->written) >>>> + if (!bo) >>>> + continue; >>>> + >>>> + /* if the client changes remember that and always >>>> serialize >>>> + all operations from different clients */ >>>> + if (bo->last_user != parser->filp && >>>> bo->tbo.sync_obj) { >>>> + struct radeon_fence *fence = >>>> bo->tbo.sync_obj; >>>> + radeon_fence_unref(&bo->last_sync); >>>> + bo->last_sync = radeon_fence_ref(fence); >>>> + } >>>> + bo->last_user = parser->filp; >>>> + >>>> + if (!reloc->written) >>>> continue; >>>> >>>> radeon_fence_unref(&bo->written); >>>> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c >>>> b/drivers/gpu/drm/radeon/radeon_gem.c >>>> index bfd7e1b..c73dbc1 100644 >>>> --- a/drivers/gpu/drm/radeon/radeon_gem.c >>>> +++ b/drivers/gpu/drm/radeon/radeon_gem.c >>>> @@ -259,6 +259,7 @@ int radeon_gem_create_ioctl(struct drm_device *dev, >>>> void *data, >>>> r = radeon_gem_handle_lockup(rdev, r); >>>> return r; >>>> } >>>> + gem_to_radeon_bo(gobj)->last_user = filp; >>>> r = drm_gem_handle_create(filp, gobj, &handle); >>>> /* drop reference from allocate - handle holds it now */ >>>> drm_gem_object_unreference_unlocked(gobj); >>>> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c >>>> b/drivers/gpu/drm/radeon/radeon_ttm.c >>>> index 76be612..a4f964f 100644 >>>> --- a/drivers/gpu/drm/radeon/radeon_ttm.c >>>> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c >>>> @@ -273,6 +273,9 @@ static int radeon_move_blit(struct ttm_buffer_object >>>> *bo, >>>> &fence); >>>> >>>> if (!r) { >>>> + rbo->last_user = NULL; >>>> + radeon_fence_unref(&rbo->last_sync); >>>> + rbo->last_sync = radeon_fence_ref(fence); >>>> radeon_fence_unref(&rbo->written); >>>> rbo->written = radeon_fence_ref(fence); >>>> } >>>> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h >>>> index 509b2d7..5bd3f68 100644 >>>> --- a/include/uapi/drm/radeon_drm.h >>>> +++ b/include/uapi/drm/radeon_drm.h >>>> @@ -944,6 +944,8 @@ struct drm_radeon_cs_chunk { >>>> }; >>>> >>>> /* drm_radeon_cs_reloc.flags */ >>>> +#define RADEON_RELOC_PRIO_MASK (0xf << 0) >>> RADEON_RELOC_PRIO_MASK not use anywhere, not explain by anything, so new API >>> with no justification, i would say NAK >> The first 4 bits are used in: >> http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c9b76548899cde2e729e3bca015d7e78ec5baad7 >> and that interface is already used in mesa. >> >> This just makes it clear that those bits are already used when adding >> additional flags. > Well would be good to introduce the flag and use it as part of > separate patch.
Which is what I actually wanted to do, but forgotten about it because all of the fence discussion. Going to send out a separate cleanup patch soon, Christian. > >> Alex >> >>>> +#define RADEON_RELOC_DONT_SYNC (1 << 4) >>>> >>>> struct drm_radeon_cs_reloc { >>>> uint32_t handle; >>>> -- >>>> 1.9.1 >>>> >>>> _______________________________________________ >>>> dri-devel mailing list >>>> dri-devel at lists.freedesktop.org >>>> http://lists.freedesktop.org/mailman/listinfo/dri-devel >>> _______________________________________________ >>> dri-devel mailing list >>> dri-devel at lists.freedesktop.org >>> http://lists.freedesktop.org/mailman/listinfo/dri-devel