st/vdpau: use a separate lock per decoder
authorChristian König <christian.koenig@amd.com>
Sun, 22 Sep 2013 10:16:20 +0000 (12:16 +0200)
committerChristian König <christian.koenig@amd.com>
Wed, 25 Sep 2013 08:58:58 +0000 (10:58 +0200)
Signed-off-by: Christian König <christian.koenig@amd.com>
src/gallium/state_trackers/vdpau/decode.c
src/gallium/state_trackers/vdpau/vdpau_private.h

index e884fb24191d0ebdc4108b4c3b78cbe68f6bfa35..d741c79efc33b580dd0030e3ed3266d57f4ec7b2 100644 (file)
@@ -130,6 +130,8 @@ vlVdpDecoderCreate(VdpDevice device,
       ret = VDP_STATUS_ERROR;
       goto error_handle;
    }
+
+   pipe_mutex_init(vldecoder->mutex);
    pipe_mutex_unlock(dev->mutex);
 
    return VDP_STATUS_OK;
@@ -155,9 +157,10 @@ vlVdpDecoderDestroy(VdpDecoder decoder)
    if (!vldecoder)
       return VDP_STATUS_INVALID_HANDLE;
 
-   pipe_mutex_lock(vldecoder->device->mutex);
+   pipe_mutex_lock(vldecoder->mutex);
    vldecoder->decoder->destroy(vldecoder->decoder);
-   pipe_mutex_unlock(vldecoder->device->mutex);
+   pipe_mutex_unlock(vldecoder->mutex);
+   pipe_mutex_destroy(vldecoder->mutex);
 
    vlRemoveDataHTAB(decoder);
    FREE(vldecoder);
@@ -477,8 +480,6 @@ vlVdpDecoderRender(VdpDecoder decoder,
       // TODO: Recreate decoder with correct chroma
       return VDP_STATUS_INVALID_CHROMA_TYPE;
 
-   pipe_mutex_lock(vlsurf->device->mutex);
-
    buffer_support[0] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
                                                PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE);
    buffer_support[1] = screen->get_video_param(screen, dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
@@ -489,6 +490,8 @@ vlVdpDecoderRender(VdpDecoder decoder,
                                           dec->profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
        !buffer_support[vlsurf->video_buffer->interlaced]) {
 
+      pipe_mutex_lock(vlsurf->device->mutex);
+
       /* destroy the old one */
       if (vlsurf->video_buffer)
          vlsurf->video_buffer->destroy(vlsurf->video_buffer);
@@ -510,6 +513,7 @@ vlVdpDecoderRender(VdpDecoder decoder,
          return VDP_STATUS_NO_IMPLEMENTATION;
       }
       vlVdpVideoSurfaceClear(vlsurf);
+      pipe_mutex_unlock(vlsurf->device->mutex);
    }
 
    for (i = 0; i < bitstream_buffer_count; ++i) {
@@ -535,18 +539,16 @@ vlVdpDecoderRender(VdpDecoder decoder,
       ret = vlVdpDecoderRenderH264(&desc.h264, (VdpPictureInfoH264 *)picture_info);
       break;
    default:
-      pipe_mutex_unlock(vlsurf->device->mutex);
       return VDP_STATUS_INVALID_DECODER_PROFILE;
    }
 
-   if (ret != VDP_STATUS_OK) {
-      pipe_mutex_unlock(vlsurf->device->mutex);
+   if (ret != VDP_STATUS_OK)
       return ret;
-   }
 
+   pipe_mutex_lock(vldecoder->mutex);
    dec->begin_frame(dec, vlsurf->video_buffer, &desc.base);
    dec->decode_bitstream(dec, vlsurf->video_buffer, &desc.base, bitstream_buffer_count, buffers, sizes);
    dec->end_frame(dec, vlsurf->video_buffer, &desc.base);
-   pipe_mutex_unlock(vlsurf->device->mutex);
+   pipe_mutex_unlock(vldecoder->mutex);
    return ret;
 }
index 54545fe764089ca6aa7dc751b65ecabfeeef5a78..0812767cb9908658785a7a6a4b39d30d463c7ed7 100644 (file)
@@ -387,6 +387,7 @@ typedef struct
 typedef struct
 {
    vlVdpDevice *device;
+   pipe_mutex mutex;
    struct pipe_video_codec *decoder;
 } vlVdpDecoder;