diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-02-24 15:14:23 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-02-24 16:00:39 +0100 |
commit | d26b5b3642833632954b2bb6f285b11ffe7fed4a (patch) | |
tree | ee37c449066b9b7dbf980f9de22460743001a154 | |
parent | 8547bef40fd7c89dd1bf2236b82025767dfb0462 (diff) |
Don't clear VA buffers too early.
vaRenderPicture() is supposed to destroy a VA buffer implicitly. However,
some buffers need to be kept until vaEndPicture() is reached. Besides, if
user calls vaDestroyBuffer() in between, we still have to keep the buffer
live for vaEndPicture().
-rw-r--r-- | src/vdpau_buffer.c | 4 | ||||
-rw-r--r-- | src/vdpau_buffer.h | 1 |
2 files changed, 4 insertions, 1 deletions
diff --git a/src/vdpau_buffer.c b/src/vdpau_buffer.c index f1171f3..540713f 100644 --- a/src/vdpau_buffer.c +++ b/src/vdpau_buffer.c @@ -57,6 +57,7 @@ create_va_buffer( obj_buffer->buffer_size = size * num_elements; obj_buffer->buffer_data = malloc(obj_buffer->buffer_size); obj_buffer->mtime = 0; + obj_buffer->delayed_destroy = 0; if (!obj_buffer->buffer_data) { destroy_va_buffer(driver_data, obj_buffer); @@ -103,6 +104,7 @@ schedule_destroy_va_buffer( ASSERT(obj_context->dead_buffers); obj_context->dead_buffers[obj_context->dead_buffers_count] = obj_buffer->base.id; obj_context->dead_buffers_count++; + obj_buffer->delayed_destroy = 1; } // vaCreateBuffer @@ -162,7 +164,7 @@ vdpau_DestroyBuffer( object_buffer_p obj_buffer = VDPAU_BUFFER(buffer_id); - if (obj_buffer) + if (obj_buffer && !obj_buffer->delayed_destroy) destroy_va_buffer(driver_data, obj_buffer); return VA_STATUS_SUCCESS; diff --git a/src/vdpau_buffer.h b/src/vdpau_buffer.h index 7790f54..0168df9 100644 --- a/src/vdpau_buffer.h +++ b/src/vdpau_buffer.h @@ -33,6 +33,7 @@ struct object_buffer { unsigned int max_num_elements; unsigned int num_elements; uint64_t mtime; + unsigned int delayed_destroy : 1; }; // Create VA buffer object |