Re: [Mesa-dev] [PATCH 1/3] vl/dri3: handle the case of different GPU(v4)
Hi Michel, Thanks for the review. On Fri, Sep 16, 2016 at 1:47 PM, Christian Königwrote: > Am 16.09.2016 um 10:07 schrieb Michel Dänzer: > >> On 14/09/16 02:34 PM, 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) >>> >>> Signed-off-by: Nayan Deshmukh >>> >> Looks mostly good to me, but Leo should probably also take a look. >> >> Acked-by: Michel Dänzer >> > > I was just about to ping you guys for comments on this. > > Leo anything more you want to add or should I commit it? I'm not so deep > into this code either. > > Christian. > > > >> >> @@ -235,16 +240,35 @@ 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, >>> - ); >>> - if (!buffer->texture) >>> - goto unmap_shm; >>> + if (scrn->is_different_gpu) { >>> + buffer->texture = scrn->base.pscreen->resource_c >>> reate(scrn->base.pscreen, >>> +); >>> + 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, >>> + >>> ); >>> + pixmap_buffer_texture = buffer->linear_texture; >>> + >>> + if (!buffer->linear_texture) >>> + goto no_linear_texture; >>> + >>> + } else { >>> >> Bonus points for not adding the empty line at the end of the block here. >> :) >> >> I have submitted another patch without empty line for the bonus points. :) Regards, Nayan. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 1/3] vl/dri3: handle the case of different GPU(v4)
Am 16.09.2016 um 10:07 schrieb Michel Dänzer: On 14/09/16 02:34 PM, 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) Signed-off-by: Nayan DeshmukhLooks mostly good to me, but Leo should probably also take a look. Acked-by: Michel Dänzer I was just about to ping you guys for comments on this. Leo anything more you want to add or should I commit it? I'm not so deep into this code either. Christian. @@ -235,16 +240,35 @@ 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, - ); - if (!buffer->texture) - goto unmap_shm; + if (scrn->is_different_gpu) { + buffer->texture = scrn->base.pscreen->resource_create(scrn->base.pscreen, +); + 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, + ); + pixmap_buffer_texture = buffer->linear_texture; + + if (!buffer->linear_texture) + goto no_linear_texture; + + } else { Bonus points for not adding the empty line at the end of the block here. :) ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 1/3] vl/dri3: handle the case of different GPU(v4)
On 14/09/16 02:34 PM, 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) > > Signed-off-by: Nayan DeshmukhLooks mostly good to me, but Leo should probably also take a look. Acked-by: Michel Dänzer > @@ -235,16 +240,35 @@ 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, > - ); > - if (!buffer->texture) > - goto unmap_shm; > > + if (scrn->is_different_gpu) { > + buffer->texture = > scrn->base.pscreen->resource_create(scrn->base.pscreen, > +); > + 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, > + ); > + pixmap_buffer_texture = buffer->linear_texture; > + > + if (!buffer->linear_texture) > + goto no_linear_texture; > + > + } else { Bonus points for not adding the empty line at the end of the block here. :) -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Mesa and X developer ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 1/3] vl/dri3: handle the case of different GPU(v4)
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) Signed-off-by: Nayan Deshmukh--- src/gallium/auxiliary/vl/vl_winsys_dri3.c | 62 --- 1 file changed, 49 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..f86300d 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(>texture, NULL); + if (buffer->linear_texture) + pipe_resource_reference(>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(, 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,35 @@ 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, - ); - if (!buffer->texture) - goto unmap_shm; + if (scrn->is_different_gpu) { + buffer->texture = scrn->base.pscreen->resource_create(scrn->base.pscreen, +); + 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, + ); + 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, +); + if (!buffer->texture) + goto unmap_shm; + pixmap_buffer_texture = buffer->texture; + } memset(, 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, , + pixmap_buffer_texture, , usage); buffer_fd = whandle.handle; buffer->pitch = whandle.stride; @@ -271,6 +295,8 @@ dri3_alloc_back_buffer(struct vl_dri3_screen *scrn) return buffer; +no_linear_texture: + pipe_resource_reference(>texture, NULL); unmap_shm: xshmfence_unmap_shm(shm_fence); close_fd: @@ -474,6 +500,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 +512,16 @@ vl_dri3_flush_frontbuffer(struct pipe_screen *screen, return; } + if (scrn->is_different_gpu) { + u_box_origin_2d(scrn->width, scrn->height, _box); + scrn->pipe->resource_copy_region(scrn->pipe, +