[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