[Libva] performances question with libva on i5 sandy bridge
Gilles Chanteperdrix
gilles.chanteperdrix at xenomai.org
Sun Jan 18 22:37:51 PST 2015
On Mon, Jan 19, 2015 at 10:34:37AM +0800, Xiang, Haihao wrote:
> On Mon, 2015-01-19 at 00:20 +0100, Gilles Chanteperdrix wrote:
> > Hi,
> >
> > I am testing libva with ffmpeg on Linux to decode h264 video.
> > Linux version is 3.4.29
> > FFmpeg version is 2.5.3
> > Mesa version is 10.4.0
> > libdrm version is 2.4.58
> > libva version is 1.5.0
> >
> > From what I could gather from the documentation and examples, using
> > vaDeriveImage should be preferred if it is available. However, I
> > have compared, with top, the CPU consumed, and I observe that the
> > following code:
> >
> > #ifdef USE_VADERIVEIMAGE
> > vrc = vaDeriveImage(ctx->display, buf->surface_id, &va_image);
> > CHECK_VASTATUS(vrc, "vaDeriveImage");
> > #else
> > vrc = vaGetImage(ctx->display, buf->surface_id,
> > 0, 0, cctx->coded_width, cctx->coded_height,
> > va_image.image_id);
> > CHECK_VASTATUS(vrc, "vaGetImage");
> > #endif
> >
> > vrc = vaMapBuffer(ctx->display, va_image.buf, &data);
> > CHECK_VASTATUS(vrc, "vaMapBuffer");
> >
> > memcpy(f->img[0], data + va_image.offsets[0],
> > va_image.pitches[0] * cctx->coded_height);
> > memcpy(f->img[1], data + va_image.offsets[1],
> > va_image.pitches[1] * cctx->coded_height / 2);
> >
> > vrc = vaUnmapBuffer(ctx->display, va_image.buf);
> > CHECK_VASTATUS(vrc, "vaUnmapBuffer");
> >
> > #ifdef USE_VADERIVEIMAGE
> > vrc = vaDestroyImage(ctx->display, va_image.image_id);
> > CHECK_VASTATUS(vrc, "vaDestroyImage");
> > #endif
> >
> > Results in a higher cpu consumption if compiled with
> > USE_VADERIVEIMAGE. Is this normal, or is there something I am doing
> > wrong? I can provide the complete code if needed.
>
> It depends on the the underlying memory format. Most surfaces used in
> the driver are tiled, so the derived images are tiled too, the memory
> returned is uncached and reading data from it would be slow. If the
> image isn't tiled, the returned memory is cached.
Ok. Thanks for the explanation.
Is the result of vaMapBuffer always uncached, or only for
a VA image obtained with vaDeriveImage ? If I plan to run the same
program with multiple drivers, is there a way to know whether
vaDeriveImage is optimal ?
Regards.
--
Gilles.
More information about the Libva
mailing list