[Mesa-dev] [PATCH v2 1/5] radeon/video: don't use sub-allocated buffers

Christian König christian.koenig at amd.com
Fri Sep 30 10:24:48 UTC 2016


Oh, so you use the allocation type instead of the size to determine if a 
buffer can be sub-allocated or not?

I wasn't expecting that, in this case even the DPB would have ended up 
in the sub-allocator and that would clearly blow up immediately.

Good that we stumbled over this.

Regards,
Christian.

Am 30.09.2016 um 11:54 schrieb Nicolai Hähnle:
> I should add that textures are already never sub-allocated, so with 
> this patch all the buffers used with UVD and VCE should be covered.
>
> Nicolai
>
> On 30.09.2016 11:52, Nicolai Hähnle wrote:
>> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>>
>> Cc: Christian König <christian.koenig at amd.com>
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97976
>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97969
>> ---
>>  src/gallium/drivers/radeon/r600_buffer_common.c | 3 +++
>>  src/gallium/drivers/radeon/radeon_video.c       | 8 +++++++-
>>  2 files changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c 
>> b/src/gallium/drivers/radeon/r600_buffer_common.c
>> index 9414920..4e1af92 100644
>> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
>> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
>> @@ -524,20 +524,23 @@ r600_alloc_buffer_struct(struct pipe_screen 
>> *screen,
>>
>>  struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
>>                       const struct pipe_resource *templ,
>>                       unsigned alignment)
>>  {
>>      struct r600_common_screen *rscreen = (struct 
>> r600_common_screen*)screen;
>>      struct r600_resource *rbuffer = r600_alloc_buffer_struct(screen, 
>> templ);
>>
>>      r600_init_resource_fields(rscreen, rbuffer, templ->width0, 
>> alignment);
>>
>> +    if (templ->bind & PIPE_BIND_SHARED)
>> +        rbuffer->flags |= RADEON_FLAG_HANDLE;
>> +
>>      if (!r600_alloc_resource(rscreen, rbuffer)) {
>>          FREE(rbuffer);
>>          return NULL;
>>      }
>>      return &rbuffer->b.b;
>>  }
>>
>>  struct pipe_resource *r600_aligned_buffer_create(struct pipe_screen 
>> *screen,
>>                           unsigned bind,
>>                           unsigned usage,
>> diff --git a/src/gallium/drivers/radeon/radeon_video.c 
>> b/src/gallium/drivers/radeon/radeon_video.c
>> index d7c5a16..de8e11c 100644
>> --- a/src/gallium/drivers/radeon/radeon_video.c
>> +++ b/src/gallium/drivers/radeon/radeon_video.c
>> @@ -59,22 +59,28 @@ unsigned rvid_alloc_stream_handle()
>>      stream_handle ^= ++counter;
>>      return stream_handle;
>>  }
>>
>>  /* create a buffer in the winsys */
>>  bool rvid_create_buffer(struct pipe_screen *screen, struct 
>> rvid_buffer *buffer,
>>              unsigned size, unsigned usage)
>>  {
>>      memset(buffer, 0, sizeof(*buffer));
>>      buffer->usage = usage;
>> +
>> +    /* Hardware buffer placement restrictions require the kernel to be
>> +     * able to move buffers around individually, so request a
>> +     * non-sub-allocated buffer.
>> +     */
>>      buffer->res = (struct r600_resource *)
>> -        pipe_buffer_create(screen, PIPE_BIND_CUSTOM, usage, size);
>> +        pipe_buffer_create(screen, PIPE_BIND_CUSTOM | PIPE_BIND_SHARED,
>> +                   usage, size);
>>
>>      return buffer->res != NULL;
>>  }
>>
>>  /* destroy a buffer */
>>  void rvid_destroy_buffer(struct rvid_buffer *buffer)
>>  {
>>      r600_resource_reference(&buffer->res, NULL);
>>  }
>>
>>



More information about the mesa-dev mailing list