st/vdpau: clear video surface at least once
authorChristian König <deathsimple@vodafone.de>
Sat, 24 Mar 2012 12:11:25 +0000 (13:11 +0100)
committerChristian König <deathsimple@vodafone.de>
Mon, 26 Mar 2012 10:39:40 +0000 (12:39 +0200)
So if anything goes wrong we won't display a random image.

v2: flush before using the surface with the decoder.

Signed-off-by: Christian König <deathsimple@vodafone.de>
src/gallium/state_trackers/vdpau/decode.c
src/gallium/state_trackers/vdpau/surface.c
src/gallium/state_trackers/vdpau/vdpau_private.h

index 6ffd17652b7e557c271c474d8fd61e5b5e8b5c72..61b10e0db335d614bb7f779f87bcf11f7c220370 100644 (file)
@@ -484,6 +484,7 @@ vlVdpDecoderRender(VdpDecoder decoder,
          pipe_mutex_unlock(vlsurf->device->mutex);
          return VDP_STATUS_NO_IMPLEMENTATION;
       }
+      vlVdpVideoSurfaceClear(vlsurf);
    }
 
    for (i = 0; i < bitstream_buffer_count; ++i) {
index c829c1ff7dec4172dd8d36eb26102ff7bd3be880..ab6960732f7dc254806b4d12160afaa4953f60c1 100644 (file)
@@ -33,6 +33,7 @@
 #include "util/u_memory.h"
 #include "util/u_debug.h"
 #include "util/u_rect.h"
+#include "vl/vl_defines.h"
 
 #include "vdpau_private.h"
 
@@ -91,6 +92,7 @@ vlVdpVideoSurfaceCreate(VdpDevice device, VdpChromaType chroma_type,
       PIPE_VIDEO_CAP_PREFERS_INTERLACED
    );
    p_surf->video_buffer = pipe->create_video_buffer(pipe, &p_surf->templat);
+   vlVdpVideoSurfaceClear(p_surf);
    pipe_mutex_unlock(dev->mutex);
 
    *surface = vlAddDataHTAB(p_surf);
@@ -282,6 +284,7 @@ vlVdpVideoSurfacePutBitsYCbCr(VdpVideoSurface surface,
          pipe_mutex_unlock(p_surf->device->mutex);
          return VDP_STATUS_NO_IMPLEMENTATION;
       }
+      vlVdpVideoSurfaceClear(p_surf);
    }
 
    sampler_views = p_surf->video_buffer->get_sampler_view_planes(p_surf->video_buffer);
@@ -311,3 +314,29 @@ vlVdpVideoSurfacePutBitsYCbCr(VdpVideoSurface surface,
 
    return VDP_STATUS_OK;
 }
+
+/**
+ * Helper function to initially clear the VideoSurface after (re-)creation
+ */
+void
+vlVdpVideoSurfaceClear(vlVdpSurface *vlsurf)
+{
+   struct pipe_context *pipe = vlsurf->device->context;
+   struct pipe_surface **surfaces;
+   unsigned i;
+
+   if (!vlsurf->video_buffer)
+      return;
+
+   surfaces = vlsurf->video_buffer->get_surfaces(vlsurf->video_buffer);
+   for (i = 0; i < VL_MAX_SURFACES; ++i) {
+      union pipe_color_union black = {};
+
+      if (!surfaces[i])
+         continue;
+
+      pipe->clear_render_target(pipe, surfaces[i], &black, 0, 0,
+                                surfaces[i]->width, surfaces[i]->height);
+   }
+   pipe->flush(pipe, NULL);
+}
index b0272d7c938427bafb6357746b453dadc14410b9..a54fcdcf2ae28e08a8c621232e3caf440bad1e15 100644 (file)
@@ -435,6 +435,7 @@ VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
 VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
 VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
 VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
+void vlVdpVideoSurfaceClear(vlVdpSurface *vlsurf);
 VdpDecoderCreate vlVdpDecoderCreate;
 VdpDecoderDestroy vlVdpDecoderDestroy;
 VdpDecoderGetParameters vlVdpDecoderGetParameters;