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 <[email protected]>

Cc: Christian König <[email protected]>
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);
 }



_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to