[Mesa-dev] [PATCH] vl/dri3: handle the case of different GPU(v4.1)

Leo Liu leo.liu at amd.com
Mon Sep 19 20:26:46 UTC 2016



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 ?

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 
> <mailto:leo.liu at amd.com>> wrote:
>
>     This Patch is Reviewed-by: Leo Liu <leo.liu at amd.com
>     <mailto: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
>         <mailto: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_create(scrn->base.pscreen,
>         -    &templ);
>         -   if (!buffer->texture)
>         -      goto unmap_shm;
>           +   if (scrn->is_different_gpu) {
>         +      buffer->texture =
>         scrn->base.pscreen->resource_create(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_create(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_create(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_create(scrn->base.pscreen,
>         +  &scrn->base, 0);
>         +
>              scrn->base.destroy = vl_dri3_screen_destroy;
>              scrn->base.texture_from_drawable =
>         vl_dri3_screen_texture_from_drawable;
>              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/20160919/7b1f8435/attachment-0001.html>


More information about the mesa-dev mailing list