On Thu, 2013-09-19 at 16:07 +0800, Ung, Teng En wrote: > Signed-off-by: Ung, Teng En <teng.en....@intel.com> > --- > src/i965_drv_video.c | 11 +++++++++++ > src/i965_output_xv.c | 46 +++++++++++++++++++++++++++++++++++++++------- > src/i965_output_xv.h | 4 ++++ > 3 files changed, 54 insertions(+), 7 deletions(-) > > diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c > index fb23c8d..d2b8456 100755 > --- a/src/i965_drv_video.c > +++ b/src/i965_drv_video.c > @@ -2532,6 +2532,17 @@ i965_SetDisplayAttributes( > src_attrib->value > dst_attrib->max_value) > return VA_STATUS_ERROR_INVALID_PARAMETER; > > +#ifdef HAVE_X11_XV > + if (dst_attrib->type == VADisplayAttribRenderMode) { > + if ((src_attrib->value == VA_RENDER_MODE_LOCAL_OVERLAY)) { > + if (!i965_output_xv_enable(ctx)) > + return VA_STATUS_ERROR_OPERATION_FAILED; > + } else { > + i965_output_xv_disable(ctx); > + } > + } > +#endif > + > dst_attrib->value = src_attrib->value; > /* XXX: track modified attributes through timestamps */ > } > diff --git a/src/i965_output_xv.c b/src/i965_output_xv.c > index 0138e99..d884ed1 100644 > --- a/src/i965_output_xv.c > +++ b/src/i965_output_xv.c > @@ -96,7 +96,6 @@ i965_output_xv_init(VADriverContextP ctx) > { > struct i965_driver_data * const i965 = i965_driver_data(ctx); > unsigned short major = 0, minor = 0; > - int port_id = 0; > > if (va_xvQueryVersion(ctx, &major, &minor) != VA_XV_STATUS_SUCCESS) > goto error; > @@ -111,12 +110,6 @@ i965_output_xv_init(VADriverContextP ctx) > i965->xv_output->vaxv_format_index = -1; > } > > - if ((va_xvFindAndReservePort(ctx, &port_id) != VA_XV_STATUS_SUCCESS) && > - (!port_id)) > - goto error; > - > - i965->xv_output->vaxv_port = port_id; > - > return true; > > error : > @@ -152,6 +145,45 @@ i965_output_xv_terminate(VADriverContextP ctx) > i965->xv_output = NULL; > } > > +bool i965_output_xv_enable(VADriverContextP ctx) > +{ > + struct i965_driver_data * const i965 = i965_driver_data(ctx); > + int port_id = 0; > + > + /* If the port alreay grabed, just return true */ > + if (i965->xv_output->vaxv_port) > + return true; > + > + if ((va_xvFindAndReservePort(ctx, &port_id) != VA_XV_STATUS_SUCCESS) && > + (!port_id)) > + return false; > + > + i965->xv_output->vaxv_port = port_id; > + > + return true; > +} > + > +void i965_output_xv_disable(VADriverContextP ctx) > +{ > + struct i965_driver_data * const i965 = i965_driver_data(ctx); > + struct va_xv_output * const xv_output = i965->xv_output; > + int i = 0; > + > + if (!xv_output) > + return; > + > + if (xv_output->vaxv_port) { > + va_xvFreePort(ctx, xv_output->vaxv_port); > + xv_output->vaxv_port = 0; > + } > + > + for (i = 0; i < (NUM_VAXV_BUF - 1); ++i) { > + if (xv_output->va_surf_id[i]) {
Check it against VA_INVALID_SURFACE too. > + i965_DestroyVAXVBuffer(ctx, xv_output, i); > + } > + } > +} > + > VAStatus > i965_put_surface_xv( > VADriverContextP ctx, > diff --git a/src/i965_output_xv.h b/src/i965_output_xv.h > index 7d0cb91..0d39996 100644 > --- a/src/i965_output_xv.h > +++ b/src/i965_output_xv.h > @@ -46,4 +46,8 @@ i965_put_surface_xv( > unsigned int flags > ); > > +bool i965_output_xv_enable(VADriverContextP ctx); > + > +void i965_output_xv_disable(VADriverContextP ctx); > + > #endif /* I965_OUTPUT_XV_H */ _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva