Mesa (master): st/va: do not destroy old buffer when new one failed

Christian König deathsimple at kemper.freedesktop.org
Fri Oct 30 12:31:57 UTC 2015


Module: Mesa
Branch: master
Commit: d42029d2d9bc6b65ccf847dc9ba2e70b496d0299
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d42029d2d9bc6b65ccf847dc9ba2e70b496d0299

Author: Julien Isorce <j.isorce at samsung.com>
Date:   Fri Oct 30 11:42:45 2015 +0000

st/va: do not destroy old buffer when new one failed

If formats are not the same vlVaPutImage re-creates the video
buffer with the right format. But if the creation of this new
video buffer fails then the surface looses its current buffer.
Let's just destroy the previous buffer on success.

Signed-off-by: Julien Isorce <j.isorce at samsung.com>
Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
Reviewed-by: Christian König <christian.koenig at amd.com>

---

 src/gallium/state_trackers/va/image.c |   19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
index 0d961b1..b0c720d 100644
--- a/src/gallium/state_trackers/va/image.c
+++ b/src/gallium/state_trackers/va/image.c
@@ -346,13 +346,20 @@ vlVaPutImage(VADriverContextP ctx, VASurfaceID surface, VAImageID image,
    if (format == PIPE_FORMAT_NONE)
       return VA_STATUS_ERROR_OPERATION_FAILED;
 
-   if (surf->buffer == NULL || format != surf->buffer->buffer_format) {
-      if (surf->buffer)
-         surf->buffer->destroy(surf->buffer);
+   if (format != surf->buffer->buffer_format) {
+      struct pipe_video_buffer *tmp_buf;
+      enum pipe_format old_surf_format = surf->templat.buffer_format;
+
       surf->templat.buffer_format = format;
-      surf->buffer = drv->pipe->create_video_buffer(drv->pipe, &surf->templat);
-      if (!surf->buffer)
-         return VA_STATUS_ERROR_ALLOCATION_FAILED;
+      tmp_buf = drv->pipe->create_video_buffer(drv->pipe, &surf->templat);
+
+      if (!tmp_buf) {
+          surf->templat.buffer_format = old_surf_format;
+          return VA_STATUS_ERROR_ALLOCATION_FAILED;
+      }
+
+      surf->buffer->destroy(surf->buffer);
+      surf->buffer = tmp_buf;
    }
 
    views = surf->buffer->get_sampler_view_planes(surf->buffer);




More information about the mesa-commit mailing list