summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-02-24 15:14:23 +0100
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-02-24 16:00:39 +0100
commitd26b5b3642833632954b2bb6f285b11ffe7fed4a (patch)
treeee37c449066b9b7dbf980f9de22460743001a154
parent8547bef40fd7c89dd1bf2236b82025767dfb0462 (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.c4
-rw-r--r--src/vdpau_buffer.h1
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