<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 27, 2016 at 11:07 PM, Leo Liu <span dir="ltr"><<a href="mailto:leo.liu@amd.com" target="_blank">leo.liu@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><div><div class="h5">
<br>
<br>
<div class="m_2199568300170825623moz-cite-prefix">On 10/27/2016 01:20 PM, Nayan Deshmukh
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Thu, Oct 27, 2016 at 10:17 PM, Leo
Liu <span dir="ltr"><<a href="mailto:leo.liu@amd.com" target="_blank">leo.liu@amd.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="m_2199568300170825623gmail-HOEnZb">
<div class="m_2199568300170825623gmail-h5"><br>
<br>
On 10/27/2016 12:20 PM, Nayan Deshmukh wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
On Thu, Oct 27, 2016 at 10:38:30AM -0400, Leo Liu
wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
On 10/24/2016 09:55 AM, Nayan Deshmukh wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Suggested-by: Leo Liu <<a href="mailto:leo.liu@amd.com" target="_blank"></a><a class="m_2199568300170825623moz-txt-link-abbreviated" href="mailto:leo.liu@amd.com" target="_blank">leo.liu@amd.com</a>><br>
Signed-off-by: Nayan Deshmukh <<a href="mailto:nayan26deshmukh@gmail.com" target="_blank"></a><a class="m_2199568300170825623moz-txt-link-abbreviated" href="mailto:nayan26deshmukh@gmail.com" target="_blank">nayan26deshmukh@gmail.com</a>><br>
---<br>
src/gallium/auxiliary/vl/vl_w<wbr>insys.h
| 4 ++<br>
src/gallium/auxiliary/vl/vl_w<wbr>insys_dri3.c
| 89 +++++++++++++++++++++++++++---<wbr>-<br>
2 files changed, 83 insertions(+), 10
deletions(-)<br>
<br>
diff --git a/src/gallium/auxiliary/vl/vl_<wbr>winsys.h
b/src/gallium/auxiliary/vl/vl_<wbr>winsys.h<br>
index 26db9f2..7c56b48 100644<br>
--- a/src/gallium/auxiliary/vl/vl_<wbr>winsys.h<br>
+++ b/src/gallium/auxiliary/vl/vl_<wbr>winsys.h<br>
@@ -59,6 +59,10 @@ struct vl_screen<br>
void *<br>
(*get_private)(struct vl_screen *vscreen);<br>
+ void<br>
+ (*set_output_texture)(struct vl_screen
*vscreen, struct pipe_resource *buffer,<br>
+ uint32_t width,
uint32_t height);<br>
+<br>
</blockquote>
I think it's more appropriate if it's called
"set_back_texture_from_output"<br>
</blockquote>
Yeah that makes more sense.<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
struct pipe_screen *pscreen;<br>
struct pipe_loader_device *dev;<br>
};<br>
diff --git a/src/gallium/auxiliary/vl/vl_<wbr>winsys_dri3.c
b/src/gallium/auxiliary/vl/vl_<wbr>winsys_dri3.c<br>
index 2929928..44d6f4c 100644<br>
--- a/src/gallium/auxiliary/vl/vl_<wbr>winsys_dri3.c<br>
+++ b/src/gallium/auxiliary/vl/vl_<wbr>winsys_dri3.c<br>
@@ -56,6 +56,7 @@ struct vl_dri3_buffer<br>
struct xshmfence *shm_fence;<br>
bool busy;<br>
+ bool is_external_texture;<br>
uint32_t width, height, pitch;<br>
};<br>
@@ -71,6 +72,9 @@ struct vl_dri3_screen<br>
xcb_special_event_t *special_event;<br>
struct pipe_context *pipe;<br>
+ struct pipe_resource *output_texture;<br>
+ uint32_t output_texture_width;<br>
+ uint32_t output_texture_height;<br>
struct vl_dri3_buffer
*back_buffers[BACK_BUFFER_NUM]<wbr>;<br>
int cur_back;<br>
@@ -105,7 +109,8 @@ dri3_free_back_buffer(struct
vl_dri3_screen *scrn,<br>
xcb_free_pixmap(scrn->conn,
buffer->pixmap);<br>
xcb_sync_destroy_fence(scrn->c<wbr>onn,
buffer->sync_fence);<br>
xshmfence_unmap_shm(buffer->sh<wbr>m_fence);<br>
- pipe_resource_reference(&buff<wbr>er->texture,
NULL);<br>
+ if (!buffer->is_external_texture)<br>
+ pipe_resource_reference(&buffe<wbr>r->texture,
NULL);<br>
if (buffer->linear_texture)<br>
pipe_resource_reference(&buffe<wbr>r->linear_texture,
NULL);<br>
FREE(buffer);<br>
@@ -236,13 +241,24 @@
dri3_alloc_back_buffer(struct vl_dri3_screen
*scrn)<br>
templ.format = PIPE_FORMAT_B8G8R8X8_UNORM;<br>
templ.target = PIPE_TEXTURE_2D;<br>
templ.last_level = 0;<br>
- templ.width0 = scrn->width;<br>
- templ.height0 = scrn->height;<br>
+ if (scrn->output_texture) {<br>
+ templ.width0 =
(scrn->output_texture_width) ?<br>
+
scrn->output_texture_width :<br>
+
scrn->output_texture->width0;<br>
+ templ.height0 =
(scrn->output_texture_height) ?<br>
+
scrn->output_texture_height :<br>
+
scrn->output_texture->height0;<br>
+ } else {<br>
+ templ.width0 = scrn->width;<br>
+ templ.height0 = scrn->height;<br>
+ }<br>
templ.depth0 = 1;<br>
templ.array_size = 1;<br>
if (scrn->is_different_gpu) {<br>
- buffer->texture =
scrn->base.pscreen->resource_c<wbr>reate(scrn->base.pscreen,<br>
+ buffer->texture =
(scrn->output_texture) ?<br>
+ scrn->output_texture
:<br>
+
scrn->base.pscreen->resource_c<wbr>reate(scrn->base.pscreen,<br>
&templ);<br>
</blockquote>
Why not just make it in the same line?<br>
<br>
</blockquote>
I was just trying to limit characters to 78 as given
in mesa coding style.<br>
</blockquote>
<br>
</div>
</div>
It's really matters if just over a few chars. which way do
you think it will look better?
<div>
<div class="m_2199568300170825623gmail-h5"><br>
<br>
</div>
</div>
</blockquote>
<div>I would prefer it in a single line, anyways I just
checked that it used in single line in entire </div>
<div>vl code. </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<div class="m_2199568300170825623gmail-h5">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
if (!buffer->texture)<br>
goto unmap_shm;<br>
@@ -257,7 +273,9 @@
dri3_alloc_back_buffer(struct vl_dri3_screen
*scrn)<br>
goto no_linear_texture;<br>
} else {<br>
templ.bind |= PIPE_BIND_SCANOUT |
PIPE_BIND_SHARED;<br>
- buffer->texture =
scrn->base.pscreen->resource_c<wbr>reate(scrn->base.pscreen,<br>
+ buffer->texture =
(scrn->output_texture) ?<br>
+ scrn->output_texture
:<br>
+
scrn->base.pscreen->resource_c<wbr>reate(scrn->base.pscreen,<br>
&templ);<br>
</blockquote>
Same as above .<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
if (!buffer->texture)<br>
goto unmap_shm;<br>
@@ -271,11 +289,20 @@
dri3_alloc_back_buffer(struct vl_dri3_screen
*scrn)<br>
usage);<br>
buffer_fd = whandle.handle;<br>
buffer->pitch = whandle.stride;<br>
+ buffer->width = templ.width0;<br>
+ buffer->height = templ.height0;<br>
+ buffer->is_external_texture =
(scrn->output_texture) ?<br>
+ true :<br>
+ false;<br>
</blockquote>
Same as above.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+ scrn->output_texture = NULL;<br>
+ scrn->output_texture_width = 0;<br>
+ scrn->output_texture_height = 0;<br>
+<br>
xcb_dri3_pixmap_from_buffer(sc<wbr>rn->conn,<br>
(pixmap =
xcb_generate_id(scrn->conn)),<br>
scrn->drawable,<br>
0,<br>
- scrn->width,
scrn->height, buffer->pitch,<br>
+
buffer->width, buffer->height,
buffer->pitch,<br>
</blockquote>
The width/height here should be same as buffer
texture width/height.<br>
That's case before, now that is changed to<br>
<br>
templ.width0 =
(scrn->output_texture_width) ?<br>
scrn->output_texture_width :<br>
scrn->output_texture->width0;<br>
templ.height0 =
(scrn->output_texture_height) ?<br>
scrn->output_texture_height :<br>
scrn->output_texture->height0<wbr>;<br>
<br>
</blockquote>
I did this to support clipping for vdpau target
display as we<br>
may have to display a portion of the buffer instead
of the entire buffer<br>
<br>
In the patch you suggested you were using scrn
width/height for the buffer<br>
width/height but if there is a screen resize event
then we are sending a small<br>
buffer to X with extra width/height and would lead
to error and hence I used<br>
buffer width/height<br>
</blockquote>
<br>
</div>
</div>
scrn size always updated when resize event happens, and
back buffer size is updated accordingly.<br>
<br>
</blockquote>
<div>Exactly but when this happens the back buffer size is
updated accordingly but the output texture will still</div>
<div>be of smaller size and won't get get updated until the
next frame so it will also cause errors when we have a</div>
<div>pixmap of screen size. I tried setting it to screen
size instead of buffer size and got the following errors</div>
<div>
<div><br>
</div>
<div>X11 error: BadAlloc (insufficient resources for
operation)</div>
<div>X11 error: BadDrawable (invalid Pixmap or Window
parameter)</div>
<div>X11 error: BadPixmap (invalid Pixmap parameter)</div>
</div>
</div>
</div>
</div>
</blockquote>
<br></div></div>
You got misunderstood it.<br>
<br>
You problem is here:<span class=""><br>
<br>
templ.width0 = (scrn->output_texture_width) ?<br>
scrn->output_texture_width :<br>
scrn->output_texture->width0;<br>
templ.height0 = (scrn->output_texture_height) ?<br>
scrn->output_texture_height :<br>
scrn->output_texture-><wbr>height0;<br>
<br></span>
should be like:<br>
<br>
templ.width0 = scrn->output_texture->width0;<br>
templ.height0 = scrn->output_texture->height0;<br>
<br>
<br>
requested pixmap needs size according to that back buffer, not clips
size, not scrn size.<br>
<br></div></blockquote><div> Oh now I get it.</div><div>This will work fine but then we have to somehow support cliping in vdpau, any thoughts Christian?</div><div><br></div><div>Regards,</div><div>Nayan.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
It was scrn size before, because the scrn size is same as back
buffer size.<br>
<br>
Regards,<br>
Leo<div><div class="h5"><br>
<br>
<br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
The major problem causing resize corruption is now you
request pixmaps to X dri3 ext. with wrong size.<span class="m_2199568300170825623gmail-"><br>
<br>
xcb_dri3_pixmap_from_buffer(sc<wbr>rn->conn,<br>
(pixmap =
xcb_generate_id(scrn->conn)),<br>
scrn->drawable,<br>
0,<br>
- scrn->width,
scrn->height, buffer->pitch,<br>
+ buffer->width,
buffer->height, buffer->pitch,<br>
<br>
</span></blockquote>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="m_2199568300170825623gmail-"><br>
</span>
<div>
<div class="m_2199568300170825623gmail-h5">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
thus causing the corruption appears when resizing.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
scrn->depth, 32,<br>
buffer_fd);<br>
xcb_dri3_fence_from_fd(scrn->c<wbr>onn,<br>
@@ -287,8 +314,6 @@
dri3_alloc_back_buffer(struct vl_dri3_screen
*scrn)<br>
buffer->pixmap = pixmap;<br>
buffer->sync_fence = sync_fence;<br>
buffer->shm_fence = shm_fence;<br>
- buffer->width = scrn->width;<br>
- buffer->height = scrn->height;<br>
xshmfence_trigger(buffer->shm_<wbr>fence);<br>
@@ -310,6 +335,7 @@ dri3_get_back_buffer(struct
vl_dri3_screen *scrn)<br>
{<br>
struct vl_dri3_buffer *buffer;<br>
struct pipe_resource *texture = NULL;<br>
+ bool allocate_new_buffer = false;<br>
assert(scrn);<br>
@@ -318,8 +344,30 @@ dri3_get_back_buffer(struct
vl_dri3_screen *scrn)<br>
return NULL;<br>
buffer =
scrn->back_buffers[scrn->cur_b<wbr>ack];<br>
- if (!buffer || buffer->width !=
scrn->width ||<br>
- buffer->height != scrn->height) {<br>
+ /* This is normal case when our buffer is
smaller<br>
+ * than the screen this will be same for
external<br>
+ * texture<br>
+ */<br>
</blockquote>
Why do you change to size comparison to < from
!= ?, it will be a waste when<br>
from larger window to small one.<br>
</blockquote>
Since I am setting buffer width/height to texture
width/height which will be<br>
always greater than the screen size as vdpau
allocates slightly larger buffers<br>
</blockquote>
<br>
</div>
</div>
Do you consider the VA-API case?<span class="m_2199568300170825623gmail-"><br>
<br>
</span></blockquote>
<div>I did not give much thought to it, need to see how
VA-API allocates buffer. </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="m_2199568300170825623gmail-">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+ if (!buffer || buffer->width <
scrn->width ||<br>
+ buffer->height < scrn->height)<br>
+ allocate_new_buffer = true;<br>
+<br>
+ /* If we were using a external texture buffer
and<br>
+ * the texture is not provided then we need a
new<br>
+ * buffer<br>
+ */<br>
+ if (buffer &&
buffer->is_external_texture &&<br>
+ !scrn->output_texture)<br>
+ allocate_new_buffer = true;<br>
</blockquote>
Can you elaborate this case? I cannot think of any.<br>
the texture is output surface, it should be always
provided, otherwise the<br>
where vdpau mixer render to.<br>
</blockquote>
vl_winsys_dri3.c is also used by va, and since we did
not change their<br>
code it will not set the output texture and would
expect us to send a<br>
buffer on which it will copy the output.<br>
</blockquote>
<br>
</span>
Yeah, we should definitely keep previous code path for
VA-API.<br>
<br>
But this case is not fit to VA-API, because there is no
"is_external_texture" for it.<span class="m_2199568300170825623gmail-"><br>
<br>
+ if (buffer && buffer->is_external_texture
&&<br>
+ !scrn->output_texture)<br>
+ allocate_new_buffer = true;<br>
<br>
<br>
</span>
This always is false for VA-API, right?</blockquote>
<div>Yes I will remove it then. </div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="m_2199568300170825623gmail-"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
You allocate a back buffer, but that cannot be used
as output surface by<br>
vdpau. right?<br>
</blockquote>
Yes. But this case won't occur anyway<br>
</blockquote>
<br>
</span>
Please remove that to avoid the confusion if that's not
necessary.<span class="m_2199568300170825623gmail-"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
but I just added it for safety as any<br>
state tracker would either set output texture or not
for all frames.<br>
</blockquote>
<br>
</span>
If that's the case, the handling here is still not
correct, like being said, the back buffer won't be the
target for output.<br>
<br>
Regards,<br>
Leo
<div class="m_2199568300170825623gmail-HOEnZb">
<div class="m_2199568300170825623gmail-h5"><br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Regards,<br>
Nayan<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Regards,<br>
Leo<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+ /* In case of a single gpu we need to get
the<br>
+ * handle and pixmap for the texture that is
set<br>
+ */<br>
+ if (buffer &&
buffer->is_external_texture &&<br>
+ !scrn->is_different_gpu)<br>
+ allocate_new_buffer = true;<br>
+<br>
+ if (allocate_new_buffer) {<br>
struct vl_dri3_buffer *new_buffer;<br>
new_buffer =
dri3_alloc_back_buffer(scrn);<br>
@@ -332,6 +380,13 @@ dri3_get_back_buffer(struct
vl_dri3_screen *scrn)<br>
vl_compositor_reset_dirty_are<wbr>a(&scrn->dirty_areas[scrn->cur<wbr>_back]);<br>
buffer = new_buffer;<br>
scrn->back_buffers[scrn->cur_<wbr>back]
= buffer;<br>
+ } else if (buffer->is_external_texture) {<br>
+ /* In case of different gpu we can reuse
the linear<br>
+ * texture so we only need to set the
external<br>
+ * texture for copying<br>
+ */<br>
+ buffer->texture =
scrn->output_texture;<br>
+ scrn->output_texture = NULL;<br>
}<br>
pipe_resource_reference(&textu<wbr>re,
buffer->texture);<br>
@@ -627,6 +682,19 @@
vl_dri3_screen_get_private(str<wbr>uct vl_screen
*vscreen)<br>
}<br>
static void<br>
+vl_dri3_screen_set_output_tex<wbr>ture(struct
vl_screen *vscreen, struct pipe_resource
*buffer,<br>
+ uint32_t width,
uint32_t height)<br>
+{<br>
+ struct vl_dri3_screen *scrn = (struct
vl_dri3_screen *)vscreen;<br>
+<br>
+ assert(scrn);<br>
+<br>
+ scrn->output_texture = buffer;<br>
+ scrn->output_texture_width = width;<br>
+ scrn->output_texture_height = height;<br>
+}<br>
+<br>
+static void<br>
vl_dri3_screen_destroy(struct vl_screen
*vscreen)<br>
{<br>
struct vl_dri3_screen *scrn = (struct
vl_dri3_screen *)vscreen;<br>
@@ -744,6 +812,7 @@
vl_dri3_screen_create(Display *display, int
screen)<br>
scrn->base.set_next_timestamp =
vl_dri3_screen_set_next_timest<wbr>amp;<br>
scrn->base.get_private =
vl_dri3_screen_get_private;<br>
scrn->base.pscreen->flush_fron<wbr>tbuffer
= vl_dri3_flush_frontbuffer;<br>
+ scrn->base.set_output_texture =
vl_dri3_screen_set_output_text<wbr>ure;<br>
return &scrn->base;<br>
</blockquote>
</blockquote>
</blockquote>
<br>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
<br>
</div></div></div>
</blockquote></div><br></div></div>