This will be needed to correctly cleanup fences.
Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25296>
#include "util/u_memory.h"
#include "util/u_handle_table.h"
#include "util/u_video.h"
+#include "util/set.h"
#include "vl/vl_deint_filter.h"
#include "vl/vl_winsys.h"
}
}
+ context->surfaces = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal);
+
mtx_lock(&drv->mutex);
*context_id = handle_table_add(drv->htab, context);
mtx_unlock(&drv->mutex);
return VA_STATUS_ERROR_INVALID_CONTEXT;
}
+ set_foreach(context->surfaces, entry) {
+ vlVaSurface *surf = (vlVaSurface *)entry->key;
+ assert(surf->ctx == context);
+ surf->ctx = NULL;
+ }
+ _mesa_set_destroy(context->surfaces, NULL);
+
if (context->decoder) {
if (context->desc.base.entry_point == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
if (u_reduce_video_profile(context->decoder->profile) ==
#include "util/u_handle_table.h"
#include "util/u_video.h"
#include "util/u_memory.h"
+#include "util/set.h"
#include "util/vl_vlc.h"
#include "vl/vl_winsys.h"
#include "va_private.h"
+static void
+vlVaSetSurfaceContext(vlVaSurface *surf, vlVaContext *context)
+{
+ if (surf->ctx == context)
+ return;
+
+ if (surf->ctx) {
+ assert(_mesa_set_search(surf->ctx->surfaces, surf));
+ _mesa_set_remove_key(surf->ctx->surfaces, surf);
+ }
+
+ surf->ctx = context;
+ _mesa_set_add(surf->ctx->surfaces, surf);
+}
+
VAStatus
vlVaBeginPicture(VADriverContextP ctx, VAContextID context_id, VASurfaceID render_target)
{
return VA_STATUS_ERROR_INVALID_SURFACE;
context->target_id = render_target;
- surf->ctx = context_id;
+ vlVaSetSurfaceContext(surf, context);
context->target = surf->buffer;
context->mjpeg.sampling_factor = 0;
}
if (apply_av1_fg) {
- surf->ctx = context_id;
+ vlVaSetSurfaceContext(surf, context);
*out_target = surf->buffer;
}
#include "util/u_sampler.h"
#include "util/u_surface.h"
#include "util/u_video.h"
+#include "util/set.h"
#include "vl/vl_compositor.h"
#include "vl/vl_video_buffer.h"
surf->buffer->destroy(surf->buffer);
if (surf->deint_buffer)
surf->deint_buffer->destroy(surf->deint_buffer);
+ if (surf->ctx) {
+ assert(_mesa_set_search(surf->ctx->surfaces, surf));
+ _mesa_set_remove_key(surf->ctx->surfaces, surf);
+ }
util_dynarray_fini(&surf->subpics);
FREE(surf);
handle_table_remove(drv->htab, surface_list[i]);
return VA_STATUS_SUCCESS;
}
- context = handle_table_get(drv->htab, surf->ctx);
+ context = surf->ctx;
if (!context) {
mtx_unlock(&drv->mutex);
return VA_STATUS_ERROR_INVALID_CONTEXT;
return VA_STATUS_SUCCESS;
}
- context = handle_table_get(drv->htab, surf->ctx);
+ context = surf->ctx;
if (!context) {
mtx_unlock(&drv->mutex);
return VA_STATUS_ERROR_INVALID_CONTEXT;
bool needs_begin_frame;
void *blit_cs;
int packed_header_type;
+ struct set *surfaces;
} vlVaContext;
typedef struct {
typedef struct {
struct pipe_video_buffer templat, *buffer, *deint_buffer;
struct util_dynarray subpics; /* vlVaSubpicture */
- VAContextID ctx;
+ vlVaContext *ctx;
vlVaBuffer *coded_buf;
void *feedback;
unsigned int frame_num_cnt;