[Mesa-dev] [PATCH 3/7] st/va: in VaPutImage only destroy previous buffer if pipe->create_video_buffer succeeds

Julien Isorce julien.isorce at gmail.com
Fri Oct 16 16:14:22 PDT 2015


If formats are not the same it seems to re-create the video
buffer with the right format.
But if the creation of this new video buffer fails the surface
loose its video buffer.
Let's just destroy the previous buffer on success.

Signed-off-by: Julien Isorce <j.isorce at samsung.com>
---
 src/gallium/state_trackers/va/image.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/gallium/state_trackers/va/image.c b/src/gallium/state_trackers/va/image.c
index c7fbe1a..d3b0cd5 100644
--- a/src/gallium/state_trackers/va/image.c
+++ b/src/gallium/state_trackers/va/image.c
@@ -338,13 +338,22 @@ 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 (format != surf->buffer->buffer_format) {
+      struct pipe_video_buffer *tmp_buf = NULL;
+      enum pipe_format old_surf_format = surf->templat.buffer_format;
+
+      surf->templat.buffer_format = format;
+      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;
+      }
+
       if (surf->buffer)
          surf->buffer->destroy(surf->buffer);
-      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;
+
+      surf->buffer = tmp_buf;
    }
 
    views = surf->buffer->get_sampler_view_planes(surf->buffer);
-- 
1.9.1



More information about the mesa-dev mailing list