Sounds like your version of libva ignores the DRI_PRIME environment parameter.

Not sure what to do with this, but clearly a loader and not a driver problem.


Regards,
Christian.

Am 20.09.2016 um 15:36 schrieb Mike Lothian:
Here's what I currently have:

fireburn@axion ~ $ DRI_PRIME=1 vainfo
libva info: VA-API version 0.39.3
libva info: va_getDriverName() returns 0
libva info: Trying to open /usr/lib64/va/drivers/i965_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.2)
vainfo: Driver version: Intel i965 driver for Intel(R) Skylake - 1.7.2
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileH264MultiviewHigh      : VAEntrypointVLD
      VAProfileH264MultiviewHigh      : VAEntrypointEncSlice
      VAProfileH264StereoHigh         : VAEntrypointVLD
      VAProfileH264StereoHigh         : VAEntrypointEncSlice
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileVP8Version0_3          : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice


which picks up the i965 driver despite the DRI_PRIME=1 paramerter being fed in - I have to manually specify LIBVA_DRIVER_NAME=radeonsi in order to get it to get the details out of vainfo - the same goes for vdpauinfo

fireburn@axion ~ $ LIBVA_DRIVER_NAME=radeonsi DRI_PRIME=1 vainfo
libva info: VA-API version 0.39.3
libva info: va_getDriverName() returns 0
libva info: User requested driver 'radeonsi'
libva info: Trying to open /usr/lib64/va/drivers/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_0_39
libva info: va_openDriver() returns 0
vainfo: VA-API version: 0.39 (libva 1.7.2)
vainfo: Driver version: mesa gallium vaapi
vainfo: Supported profile and entrypoints
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileH264Baseline           : VAEntrypointVLD
      VAProfileH264Baseline           : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileNone                   : VAEntrypointVideoProc


On Tue, 20 Sep 2016 at 14:13 Nayan Deshmukh <nayan26deshm...@gmail.com <mailto:nayan26deshm...@gmail.com>> wrote:

    Hi Mike,


    On Tue, Sep 20, 2016 at 5:45 PM, Mike Lothian <m...@fireburn.co.uk
    <mailto:m...@fireburn.co.uk>> wrote:

        Hi

        I've just confirmed this works for getting details from vainfo
        and vdpauinfo using DRI_PRIME=1 without needing to set up
        offloading with xrandr

        I do however need to specify the driver still, is that
        something being worked on? It would be great if it
        autoselected based on the card running at DRI_PRIME=1 (or x if
        there's more than one card)

    I have a prime system and I don't need to specify any drivers in
    my system.
    Though I am not the right person to answer this question.
    Maybe Michel can answer this.

    Cheers,
    Nayan

        Cheers

        Mike

        On Tue, 20 Sep 2016 at 05:52 Nayan Deshmukh
        <nayan26deshm...@gmail.com <mailto:nayan26deshm...@gmail.com>>
        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
            v4.2: destroy the context and handle the case when
                  create_context fails (Emil)

            Signed-off-by: Nayan Deshmukh <nayan26deshm...@gmail.com
            <mailto:nayan26deshm...@gmail.com>>
            Reviewed-by: Leo Liu <leo....@amd.com
            <mailto:leo....@amd.com>>
            Acked-by: Michel Dänzer <michel.daen...@amd.com
            <mailto:michel.daen...@amd.com>>
            ---
             src/gallium/auxiliary/vl/vl_winsys_dri3.c | 66
            +++++++++++++++++++++++++------
             1 file changed, 53 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..191a64b 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;

            @@ -622,6 +658,7 @@ vl_dri3_screen_destroy(struct
            vl_screen *vscreen)
                   xcb_discard_reply(scrn->conn, cookie.sequence);
             xcb_unregister_for_special_event(scrn->conn,
            scrn->special_event);
                }
            +   scrn->pipe->destroy(scrn->pipe);
            scrn->base.pscreen->destroy(scrn->base.pscreen);
            pipe_loader_release(&scrn->base.dev, 1);
                FREE(scrn);
            @@ -638,7 +675,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 +713,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 +732,11 @@ 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);
            +   if (!scrn->pipe)
            +       goto no_context;
            +
                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;
            @@ -709,6 +747,8 @@ vl_dri3_screen_create(Display
            *display, int screen)

                return &scrn->base;

            +no_context:
            +  scrn->base.pscreen->destroy(scrn->base.pscreen);
             release_pipe:
                if (scrn->base.dev) {
             pipe_loader_release(&scrn->base.dev, 1);
            --
            2.7.4

            _______________________________________________
            mesa-dev mailing list
            mesa-dev@lists.freedesktop.org
            <mailto:mesa-dev@lists.freedesktop.org>
            https://lists.freedesktop.org/mailman/listinfo/mesa-dev



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to