I'm running libva-1.7.2 but I notice this commit in git https://cgit.freedesktop.org/vaapi/libva/commit/?id=a55ea7cb3143d57c8dba1b76ccea3511ea69adf2 but that looks like it might only work with wayland
On Tue, 20 Sep 2016 at 14:40 Christian König <deathsim...@vodafone.de> wrote: > 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> > wrote: > >> Hi Mike, >> >> >> On Tue, Sep 20, 2016 at 5:45 PM, Mike Lothian <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> >>> 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> >>>> Reviewed-by: Leo Liu <leo....@amd.com> >>>> Acked-by: Michel Dänzer <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 >>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev >>>> >>> > > _______________________________________________ > mesa-dev mailing > listmesa-dev@lists.freedesktop.orghttps://lists.freedesktop.org/mailman/listinfo/mesa-dev > > >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev