[Mesa-dev] [PATCH] vl/dri3: handle the case of different GPU(v4.1)
Nayan Deshmukh
nayan26deshmukh at gmail.com
Tue Sep 20 04:31:52 UTC 2016
Hi Leo,
On Tue, Sep 20, 2016 at 1:56 AM, Leo Liu <leo.liu at amd.com> wrote:
>
>
> On 09/17/2016 07:33 AM, Nayan Deshmukh wrote:
>
> Hi Leo,
>
> Could you push the patches? I don't have the push access.
>
>
>
> Can you rebase all your reviewed patches, and add RB to it, and then you
> can send them to me ?
>
> Surely. :)
I will also include changes suggested by emil.
> Sorry for too busy to do this for you.
>
> Regards,
> Leo
>
>
>
> Regards,
> Nayan.
>
> On Fri, Sep 16, 2016 at 7:44 PM, Leo Liu <leo.liu at amd.com> wrote:
>
>> This Patch is Reviewed-by: Leo Liu <leo.liu at amd.com>
>>
>>
>> On 09/16/2016 08:51 AM, Nayan Deshmukh wrote:
>>
>>> In case of prime when rendering is done on GPU other then the
>>> server GPU, use a seprate linear buffer for each back buffer
>>> which will be displayed using present extension.
>>>
>>> v2: Use a seprate linear buffer for each back buffer (Michel)
>>> v3: Change variable names and fix coding style (Leo and Emil)
>>> v4: Use PIPE_BIND_SAMPLER_VIEW for back buffer in case when
>>> a seprate linear buffer is used (Michel)
>>> v4.1: remove empty line
>>>
>>> Signed-off-by: Nayan Deshmukh < <nayan26deshmukh at gmail.com>
>>> nayan26deshmukh at gmail.com>
>>> ---
>>> src/gallium/auxiliary/vl/vl_winsys_dri3.c | 61
>>> ++++++++++++++++++++++++-------
>>> 1 file changed, 48 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/src/gallium/auxiliary/vl/vl_winsys_dri3.c
>>> b/src/gallium/auxiliary/vl/vl_winsys_dri3.c
>>> index 3d596a6..e0aaad8 100644
>>> --- a/src/gallium/auxiliary/vl/vl_winsys_dri3.c
>>> +++ b/src/gallium/auxiliary/vl/vl_winsys_dri3.c
>>> @@ -49,6 +49,7 @@
>>> struct vl_dri3_buffer
>>> {
>>> struct pipe_resource *texture;
>>> + struct pipe_resource *linear_texture;
>>> uint32_t pixmap;
>>> uint32_t sync_fence;
>>> @@ -69,6 +70,8 @@ struct vl_dri3_screen
>>> xcb_present_event_t eid;
>>> xcb_special_event_t *special_event;
>>> + struct pipe_context *pipe;
>>> +
>>> struct vl_dri3_buffer *back_buffers[BACK_BUFFER_NUM];
>>> int cur_back;
>>> @@ -82,6 +85,7 @@ struct vl_dri3_screen
>>> int64_t last_ust, ns_frame, last_msc, next_msc;
>>> bool flushed;
>>> + bool is_different_gpu;
>>> };
>>> static void
>>> @@ -102,6 +106,8 @@ dri3_free_back_buffer(struct vl_dri3_screen *scrn,
>>> xcb_sync_destroy_fence(scrn->conn, buffer->sync_fence);
>>> xshmfence_unmap_shm(buffer->shm_fence);
>>> pipe_resource_reference(&buffer->texture, NULL);
>>> + if (buffer->linear_texture)
>>> + pipe_resource_reference(&buffer->linear_texture, NULL);
>>> FREE(buffer);
>>> }
>>> @@ -209,7 +215,7 @@ dri3_alloc_back_buffer(struct vl_dri3_screen *scrn)
>>> xcb_sync_fence_t sync_fence;
>>> struct xshmfence *shm_fence;
>>> int buffer_fd, fence_fd;
>>> - struct pipe_resource templ;
>>> + struct pipe_resource templ, *pixmap_buffer_texture;
>>> struct winsys_handle whandle;
>>> unsigned usage;
>>> @@ -226,8 +232,7 @@ dri3_alloc_back_buffer(struct vl_dri3_screen *scrn)
>>> goto close_fd;
>>> memset(&templ, 0, sizeof(templ));
>>> - templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW |
>>> - PIPE_BIND_SCANOUT | PIPE_BIND_SHARED;
>>> + templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
>>> templ.format = PIPE_FORMAT_B8G8R8X8_UNORM;
>>> templ.target = PIPE_TEXTURE_2D;
>>> templ.last_level = 0;
>>> @@ -235,16 +240,34 @@ dri3_alloc_back_buffer(struct vl_dri3_screen *scrn)
>>> templ.height0 = scrn->height;
>>> templ.depth0 = 1;
>>> templ.array_size = 1;
>>> - buffer->texture = scrn->base.pscreen->resource_c
>>> reate(scrn->base.pscreen,
>>> - &templ);
>>> - if (!buffer->texture)
>>> - goto unmap_shm;
>>> + if (scrn->is_different_gpu) {
>>> + buffer->texture = scrn->base.pscreen->resource_c
>>> reate(scrn->base.pscreen,
>>> + &templ);
>>> + if (!buffer->texture)
>>> + goto unmap_shm;
>>> +
>>> + templ.bind |= PIPE_BIND_SCANOUT | PIPE_BIND_SHARED |
>>> + PIPE_BIND_LINEAR;
>>> + buffer->linear_texture = scrn->base.pscreen->resource_c
>>> reate(scrn->base.pscreen,
>>> +
>>> &templ);
>>> + pixmap_buffer_texture = buffer->linear_texture;
>>> +
>>> + if (!buffer->linear_texture)
>>> + goto no_linear_texture;
>>> + } else {
>>> + templ.bind |= PIPE_BIND_SCANOUT | PIPE_BIND_SHARED;
>>> + buffer->texture = scrn->base.pscreen->resource_c
>>> reate(scrn->base.pscreen,
>>> + &templ);
>>> + if (!buffer->texture)
>>> + goto unmap_shm;
>>> + pixmap_buffer_texture = buffer->texture;
>>> + }
>>> memset(&whandle, 0, sizeof(whandle));
>>> whandle.type= DRM_API_HANDLE_TYPE_FD;
>>> usage = PIPE_HANDLE_USAGE_EXPLICIT_FLUSH | PIPE_HANDLE_USAGE_READ;
>>> scrn->base.pscreen->resource_get_handle(scrn->base.pscreen, NULL,
>>> - buffer->texture, &whandle,
>>> + pixmap_buffer_texture,
>>> &whandle,
>>> usage);
>>> buffer_fd = whandle.handle;
>>> buffer->pitch = whandle.stride;
>>> @@ -271,6 +294,8 @@ dri3_alloc_back_buffer(struct vl_dri3_screen *scrn)
>>> return buffer;
>>> +no_linear_texture:
>>> + pipe_resource_reference(&buffer->texture, NULL);
>>> unmap_shm:
>>> xshmfence_unmap_shm(shm_fence);
>>> close_fd:
>>> @@ -474,6 +499,7 @@ vl_dri3_flush_frontbuffer(struct pipe_screen
>>> *screen,
>>> struct vl_dri3_screen *scrn = (struct vl_dri3_screen
>>> *)context_private;
>>> uint32_t options = XCB_PRESENT_OPTION_NONE;
>>> struct vl_dri3_buffer *back;
>>> + struct pipe_box src_box;
>>> back = scrn->back_buffers[scrn->cur_back];
>>> if (!back)
>>> @@ -485,6 +511,16 @@ vl_dri3_flush_frontbuffer(struct pipe_screen
>>> *screen,
>>> return;
>>> }
>>> + if (scrn->is_different_gpu) {
>>> + u_box_origin_2d(scrn->width, scrn->height, &src_box);
>>> + scrn->pipe->resource_copy_region(scrn->pipe,
>>> + back->linear_texture,
>>> + 0, 0, 0, 0,
>>> + back->texture,
>>> + 0, &src_box);
>>> +
>>> + scrn->pipe->flush(scrn->pipe, NULL, 0);
>>> + }
>>> xshmfence_reset(back->shm_fence);
>>> back->busy = true;
>>> @@ -638,7 +674,6 @@ vl_dri3_screen_create(Display *display, int screen)
>>> xcb_dri3_open_reply_t *open_reply;
>>> xcb_get_geometry_cookie_t geom_cookie;
>>> xcb_get_geometry_reply_t *geom_reply;
>>> - int is_different_gpu;
>>> int fd;
>>> assert(display);
>>> @@ -677,10 +712,7 @@ vl_dri3_screen_create(Display *display, int screen)
>>> fcntl(fd, F_SETFD, FD_CLOEXEC);
>>> free(open_reply);
>>> - fd = loader_get_user_preferred_fd(fd, &is_different_gpu);
>>> - /* TODO support different GPU */
>>> - if (is_different_gpu)
>>> - goto close_fd;
>>> + fd = loader_get_user_preferred_fd(fd, &scrn->is_different_gpu);
>>> geom_cookie = xcb_get_geometry(scrn->conn, RootWindow(display,
>>> screen));
>>> geom_reply = xcb_get_geometry_reply(scrn->conn, geom_cookie, NULL);
>>> @@ -699,6 +731,9 @@ vl_dri3_screen_create(Display *display, int screen)
>>> if (!scrn->base.pscreen)
>>> goto release_pipe;
>>> + scrn->pipe = scrn->base.pscreen->context_cr
>>> eate(scrn->base.pscreen,
>>> + &scrn->base, 0);
>>> +
>>> scrn->base.destroy = vl_dri3_screen_destroy;
>>> scrn->base.texture_from_drawable = vl_dri3_screen_texture_from_dr
>>> awable;
>>> scrn->base.get_dirty_area = vl_dri3_screen_get_dirty_area;
>>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160920/2294c481/attachment-0001.html>
More information about the mesa-dev
mailing list