}
}
-static void
-vl_compositor_reset_dirty_area(struct pipe_video_compositor *compositor)
+void
+vl_compositor_reset_dirty_area(struct vl_compositor *c)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
-
- assert(compositor);
+ assert(c);
c->dirty_tl.x = c->dirty_tl.y = 0.0f;
c->dirty_br.x = c->dirty_br.y = 1.0f;
}
-static void
-vl_compositor_set_clear_color(struct pipe_video_compositor *compositor, float color[4])
+void
+vl_compositor_set_clear_color(struct vl_compositor *c, float color[4])
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
unsigned i;
- assert(compositor);
+ assert(c);
for (i = 0; i < 4; ++i)
c->clear_color[i] = color[i];
}
-static void
-vl_compositor_clear_layers(struct pipe_video_compositor *compositor)
+void
+vl_compositor_clear_layers(struct vl_compositor *c)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
unsigned i, j;
- assert(compositor);
+ assert(c);
c->used_layers = 0;
for ( i = 0; i < VL_COMPOSITOR_MAX_LAYERS; ++i) {
}
}
-static void
-vl_compositor_destroy(struct pipe_video_compositor *compositor)
+void
+vl_compositor_cleanup(struct vl_compositor *c)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
- assert(compositor);
+ assert(c);
- vl_compositor_clear_layers(compositor);
+ vl_compositor_clear_layers(c);
cleanup_buffers(c);
cleanup_shaders(c);
cleanup_pipe_state(c);
-
- FREE(compositor);
}
-static void
-vl_compositor_set_csc_matrix(struct pipe_video_compositor *compositor, const float matrix[16])
+void
+vl_compositor_set_csc_matrix(struct vl_compositor *c, const float matrix[16])
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
struct pipe_transfer *buf_transfer;
- assert(compositor);
+ assert(c);
memcpy
(
pipe_buffer_unmap(c->pipe, buf_transfer);
}
-static void
-vl_compositor_set_buffer_layer(struct pipe_video_compositor *compositor,
+void
+vl_compositor_set_buffer_layer(struct vl_compositor *c,
unsigned layer,
struct pipe_video_buffer *buffer,
struct pipe_video_rect *src_rect,
struct pipe_video_rect *dst_rect)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
struct pipe_sampler_view **sampler_views;
unsigned i;
- assert(compositor && buffer);
+ assert(c && buffer);
assert(layer < VL_COMPOSITOR_MAX_LAYERS);
dst_rect ? *dst_rect : default_rect(&c->layers[layer]));
}
-static void
-vl_compositor_set_palette_layer(struct pipe_video_compositor *compositor,
+void
+vl_compositor_set_palette_layer(struct vl_compositor *c,
unsigned layer,
struct pipe_sampler_view *indexes,
struct pipe_sampler_view *palette,
struct pipe_video_rect *src_rect,
struct pipe_video_rect *dst_rect)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
- assert(compositor && indexes && palette);
+ assert(c && indexes && palette);
assert(layer < VL_COMPOSITOR_MAX_LAYERS);
}
-static void
-vl_compositor_set_rgba_layer(struct pipe_video_compositor *compositor,
+void
+vl_compositor_set_rgba_layer(struct vl_compositor *c,
unsigned layer,
struct pipe_sampler_view *rgba,
struct pipe_video_rect *src_rect,
struct pipe_video_rect *dst_rect)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
- assert(compositor && rgba);
+ assert(c && rgba);
assert(layer < VL_COMPOSITOR_MAX_LAYERS);
dst_rect ? *dst_rect : default_rect(&c->layers[layer]));
}
-static void
-vl_compositor_render(struct pipe_video_compositor *compositor,
+void
+vl_compositor_render(struct vl_compositor *c,
enum pipe_mpeg12_picture_type picture_type,
struct pipe_surface *dst_surface,
struct pipe_video_rect *dst_area,
struct pipe_fence_handle **fence)
{
- struct vl_compositor *c = (struct vl_compositor *)compositor;
struct pipe_scissor_state scissor;
- assert(compositor);
+ assert(c);
assert(dst_surface);
c->fb_state.width = dst_surface->width;
c->pipe->flush(c->pipe, fence);
}
-struct pipe_video_compositor *
-vl_compositor_init(struct pipe_video_context *vpipe, struct pipe_context *pipe)
+bool
+vl_compositor_init(struct vl_compositor *c, struct pipe_context *pipe)
{
csc_matrix csc_matrix;
- struct vl_compositor *compositor;
-
- compositor = CALLOC_STRUCT(vl_compositor);
- compositor->base.context = vpipe;
- compositor->base.destroy = vl_compositor_destroy;
- compositor->base.set_csc_matrix = vl_compositor_set_csc_matrix;
- compositor->base.reset_dirty_area = vl_compositor_reset_dirty_area;
- compositor->base.set_clear_color = vl_compositor_set_clear_color;
- compositor->base.clear_layers = vl_compositor_clear_layers;
- compositor->base.set_buffer_layer = vl_compositor_set_buffer_layer;
- compositor->base.set_palette_layer = vl_compositor_set_palette_layer;
- compositor->base.set_rgba_layer = vl_compositor_set_rgba_layer;
- compositor->base.render_picture = vl_compositor_render;
+ c->pipe = pipe;
- compositor->pipe = pipe;
-
- if (!init_pipe_state(compositor))
+ if (!init_pipe_state(c))
return false;
- if (!init_shaders(compositor)) {
- cleanup_pipe_state(compositor);
+ if (!init_shaders(c)) {
+ cleanup_pipe_state(c);
return false;
}
- if (!init_buffers(compositor)) {
- cleanup_shaders(compositor);
- cleanup_pipe_state(compositor);
+ if (!init_buffers(c)) {
+ cleanup_shaders(c);
+ cleanup_pipe_state(c);
return false;
}
- vl_compositor_clear_layers(&compositor->base);
+ vl_compositor_clear_layers(c);
vl_csc_get_matrix(VL_CSC_COLOR_STANDARD_IDENTITY, NULL, true, csc_matrix);
- vl_compositor_set_csc_matrix(&compositor->base, csc_matrix);
+ vl_compositor_set_csc_matrix(c, csc_matrix);
- compositor->clear_color[0] = compositor->clear_color[1] = 0.0f;
- compositor->clear_color[2] = compositor->clear_color[3] = 0.0f;
- vl_compositor_reset_dirty_area(&compositor->base);
+ c->clear_color[0] = c->clear_color[1] = 0.0f;
+ c->clear_color[2] = c->clear_color[3] = 0.0f;
+ vl_compositor_reset_dirty_area(c);
- return &compositor->base;
+ return true;
}
struct pipe_context;
+/**
+ * composing and displaying of image data
+ */
+
#define VL_COMPOSITOR_MAX_LAYERS 16
struct vl_compositor_layer
struct vl_compositor
{
- struct pipe_video_compositor base;
struct pipe_context *pipe;
struct pipe_framebuffer_state fb_state;
struct vl_compositor_layer layers[VL_COMPOSITOR_MAX_LAYERS];
};
-struct pipe_video_compositor *vl_compositor_init(struct pipe_video_context *vpipe,
- struct pipe_context *pipe);
+/**
+ * initialize this compositor
+ */
+bool
+vl_compositor_init(struct vl_compositor *compositor, struct pipe_context *pipe);
+
+/**
+ * set yuv -> rgba conversion matrix
+ */
+void
+vl_compositor_set_csc_matrix(struct vl_compositor *compositor, const float mat[16]);
+
+/**
+ * reset dirty area, so it's cleared with the clear colour
+ */
+void
+vl_compositor_reset_dirty_area(struct vl_compositor *compositor);
+
+/**
+ * set the clear color
+ */
+void
+vl_compositor_set_clear_color(struct vl_compositor *compositor, float color[4]);
+
+/**
+ * set overlay samplers
+ */
+/*@{*/
+
+/**
+ * reset all currently set layers
+ */
+void
+vl_compositor_clear_layers(struct vl_compositor *compositor);
+
+/**
+ * set a video buffer as a layer to render
+ */
+void
+vl_compositor_set_buffer_layer(struct vl_compositor *compositor,
+ unsigned layer,
+ struct pipe_video_buffer *buffer,
+ struct pipe_video_rect *src_rect,
+ struct pipe_video_rect *dst_rect);
+
+/**
+ * set a paletted sampler as a layer to render
+ */
+void
+vl_compositor_set_palette_layer(struct vl_compositor *compositor,
+ unsigned layer,
+ struct pipe_sampler_view *indexes,
+ struct pipe_sampler_view *palette,
+ struct pipe_video_rect *src_rect,
+ struct pipe_video_rect *dst_rect);
+
+/**
+ * set a rgba sampler as a layer to render
+ */
+void
+vl_compositor_set_rgba_layer(struct vl_compositor *compositor,
+ unsigned layer,
+ struct pipe_sampler_view *rgba,
+ struct pipe_video_rect *src_rect,
+ struct pipe_video_rect *dst_rect);
+
+/*@}*/
+
+/**
+ * render the layers to the frontbuffer
+ */
+void
+vl_compositor_render(struct vl_compositor *compositor,
+ enum pipe_mpeg12_picture_type picture_type,
+ struct pipe_surface *dst_surface,
+ struct pipe_video_rect *dst_area,
+ struct pipe_fence_handle **fence);
+
+/**
+* destroy this compositor
+*/
+void
+vl_compositor_cleanup(struct vl_compositor *compositor);
#endif /* vl_compositor_h */
return result;
}
-static struct pipe_video_compositor *
-vl_context_create_compositor(struct pipe_video_context *context)
-{
- struct vl_context *ctx = (struct vl_context*)context;
-
- assert(context);
-
- return vl_compositor_init(context, ctx->pipe);
-}
-
struct pipe_video_context *
vl_create_context(struct pipe_context *pipe)
{
ctx->base.destroy = vl_context_destroy;
ctx->base.create_decoder = vl_context_create_decoder;
ctx->base.create_buffer = vl_context_create_buffer;
- ctx->base.create_compositor = vl_context_create_compositor;
ctx->pipe = pipe;
enum pipe_format buffer_format,
enum pipe_video_chroma_format chroma_format,
unsigned width, unsigned height);
-
- /**
- * Creates a video compositor
- */
- struct pipe_video_compositor *(*create_compositor)(struct pipe_video_context *context);
};
/**
struct pipe_surface **(*get_surfaces)(struct pipe_video_buffer *buffer);
};
-/**
- * composing and displaying of image data
- */
-struct pipe_video_compositor
-{
- struct pipe_video_context *context;
-
- /**
- * destroy this compositor
- */
- void (*destroy)(struct pipe_video_compositor *compositor);
-
- /**
- * set yuv -> rgba conversion matrix
- */
- void (*set_csc_matrix)(struct pipe_video_compositor *compositor, const float mat[16]);
-
- /**
- * reset dirty area, so it's cleared with the clear colour
- */
- void (*reset_dirty_area)(struct pipe_video_compositor *compositor);
-
- /**
- * set the clear color
- */
- void (*set_clear_color)(struct pipe_video_compositor *compositor, float color[4]);
-
- /**
- * set overlay samplers
- */
- /*@{*/
-
- /**
- * reset all currently set layers
- */
- void (*clear_layers)(struct pipe_video_compositor *compositor);
-
- /**
- * set a video buffer as a layer to render
- */
- void (*set_buffer_layer)(struct pipe_video_compositor *compositor,
- unsigned layer,
- struct pipe_video_buffer *buffer,
- struct pipe_video_rect *src_rect,
- struct pipe_video_rect *dst_rect);
-
- /**
- * set a paletted sampler as a layer to render
- */
- void (*set_palette_layer)(struct pipe_video_compositor *compositor,
- unsigned layer,
- struct pipe_sampler_view *indexes,
- struct pipe_sampler_view *palette,
- struct pipe_video_rect *src_rect,
- struct pipe_video_rect *dst_rect);
-
- /**
- * set a rgba sampler as a layer to render
- */
- void (*set_rgba_layer)(struct pipe_video_compositor *compositor,
- unsigned layer,
- struct pipe_sampler_view *rgba,
- struct pipe_video_rect *src_rect,
- struct pipe_video_rect *dst_rect);
-
- /*@}*/
-
- /**
- * render the layers to the frontbuffer
- */
- void (*render_picture)(struct pipe_video_compositor *compositor,
- enum pipe_mpeg12_picture_type picture_type,
- struct pipe_surface *dst_surface,
- struct pipe_video_rect *dst_area,
- struct pipe_fence_handle **fence);
-
-};
-
#ifdef __cplusplus
}
#endif
return VDP_STATUS_RESOURCES;
vmixer->device = dev;
- vmixer->compositor = context->create_compositor(context);
+ vl_compositor_init(&vmixer->compositor, dev->context->pipe);
vl_csc_get_matrix
(
VL_CSC_COLOR_STANDARD_IDENTITY : VL_CSC_COLOR_STANDARD_BT_601,
NULL, true, csc
);
- vmixer->compositor->set_csc_matrix(vmixer->compositor, csc);
+ vl_compositor_set_csc_matrix(&vmixer->compositor, csc);
/*
* TODO: Handle features and parameters
if (!vmixer)
return VDP_STATUS_INVALID_HANDLE;
- vmixer->compositor->destroy(vmixer->compositor);
+ vl_compositor_cleanup(&vmixer->compositor);
FREE(vmixer);
if (!dst)
return VDP_STATUS_INVALID_HANDLE;
- vmixer->compositor->clear_layers(vmixer->compositor);
- vmixer->compositor->set_buffer_layer(vmixer->compositor, 0, surf->video_buffer, NULL, NULL);
- vmixer->compositor->render_picture(vmixer->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME,
- dst->surface, NULL, NULL);
+ vl_compositor_clear_layers(&vmixer->compositor);
+ vl_compositor_set_buffer_layer(&vmixer->compositor, 0, surf->video_buffer, NULL, NULL);
+ vl_compositor_render(&vmixer->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME,
+ dst->surface, NULL, NULL);
return VDP_STATUS_OK;
}
pq->device = dev;
pq->drawable = pqt->drawable;
- pq->compositor = context->create_compositor(context);
- if (!pq->compositor) {
+
+ if (!vl_compositor_init(&pq->compositor, dev->context->pipe)) {
ret = VDP_STATUS_ERROR;
goto no_compositor;
}
if (!pq)
return VDP_STATUS_INVALID_HANDLE;
- pq->compositor->destroy(pq->compositor);
+ vl_compositor_cleanup(&pq->compositor);
vlRemoveDataHTAB(presentation_queue);
FREE(pq);
if (!pq)
return VDP_STATUS_INVALID_HANDLE;
- pq->compositor->set_clear_color(pq->compositor, (float*)background_color);
+ vl_compositor_set_clear_color(&pq->compositor, (float*)background_color);
return VDP_STATUS_OK;
}
if (!surf)
return VDP_STATUS_INVALID_HANDLE;
- pq->compositor->clear_layers(pq->compositor);
- pq->compositor->set_rgba_layer(pq->compositor, 0, surf->sampler_view, NULL, NULL);
- pq->compositor->render_picture(pq->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME,
- drawable_surface, NULL, NULL);
+ vl_compositor_clear_layers(&pq->compositor);
+ vl_compositor_set_rgba_layer(&pq->compositor, 0, surf->sampler_view, NULL, NULL);
+ vl_compositor_render(&pq->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME,
+ drawable_surface, NULL, NULL);
pq->device->context->vpipe->screen->flush_frontbuffer
(
#include <pipe/p_video_context.h>
#include <util/u_debug.h>
+#include <vl/vl_compositor.h>
#include <vl_winsys.h>
{
vlVdpDevice *device;
Drawable drawable;
- struct pipe_video_compositor *compositor;
+ struct vl_compositor compositor;
} vlVdpPresentationQueue;
typedef struct
{
vlVdpDevice *device;
- struct pipe_video_compositor *compositor;
+ struct vl_compositor compositor;
} vlVdpVideoMixer;
typedef struct
context_priv->color_standard,
&context_priv->procamp, true, csc
);
- context_priv->compositor->set_csc_matrix(context_priv->compositor, csc);
+ vl_compositor_set_csc_matrix(&context_priv->compositor, csc);
XVMC_MSG(XVMC_TRACE, "[XvMC] Set attribute %s to value %d.\n", attr, value);
return BadAlloc;
}
- context_priv->compositor = vctx->vpipe->create_compositor(vctx->vpipe);
- if (!context_priv->compositor) {
+ if (!vl_compositor_init(&context_priv->compositor, vctx->pipe)) {
XVMC_MSG(XVMC_ERR, "[XvMC] Could not create VL compositor.\n");
context_priv->decoder->destroy(context_priv->decoder);
vl_video_destroy(vctx);
context_priv->color_standard,
&context_priv->procamp, true, csc
);
- context_priv->compositor->set_csc_matrix(context_priv->compositor, csc);
+ vl_compositor_set_csc_matrix(&context_priv->compositor, csc);
context_priv->vctx = vctx;
context_priv->subpicture_max_width = subpic_max_w;
vscreen = vctx->vscreen;
pipe_surface_reference(&context_priv->drawable_surface, NULL);
context_priv->decoder->destroy(context_priv->decoder);
- context_priv->compositor->destroy(context_priv->compositor);
+ vl_compositor_cleanup(&context_priv->compositor);
vl_video_destroy(vctx);
vl_screen_destroy(vscreen);
FREE(context_priv);
static int dump_window = -1;
struct pipe_video_context *vpipe;
- struct pipe_video_compositor *compositor;
+ struct vl_compositor *compositor;
XvMCSurfacePrivate *surface_priv;
XvMCContextPrivate *context_priv;
subpicture_priv = surface_priv->subpicture ? surface_priv->subpicture->privData : NULL;
vpipe = context_priv->vctx->vpipe;
- compositor = context_priv->compositor;
+ compositor = &context_priv->compositor;
if (!context_priv->drawable_surface ||
context_priv->dst_rect.x != dst_rect.x || context_priv->dst_rect.y != dst_rect.y ||
context_priv->drawable_surface = vl_drawable_surface_get(context_priv->vctx, drawable);
context_priv->dst_rect = dst_rect;
- compositor->reset_dirty_area(compositor);
+ vl_compositor_reset_dirty_area(compositor);
}
if (!context_priv->drawable_surface)
unmap_and_flush_surface(surface_priv);
- compositor->clear_layers(compositor);
- compositor->set_buffer_layer(compositor, 0, surface_priv->video_buffer, &src_rect, NULL);
+ vl_compositor_clear_layers(compositor);
+ vl_compositor_set_buffer_layer(compositor, 0, surface_priv->video_buffer, &src_rect, NULL);
if (subpicture_priv) {
XVMC_MSG(XVMC_TRACE, "[XvMC] Surface %p has subpicture %p.\n", surface, surface_priv->subpicture);
assert(subpicture_priv->surface == surface);
if (subpicture_priv->palette)
- compositor->set_palette_layer(compositor, 1, subpicture_priv->sampler, subpicture_priv->palette,
- &subpicture_priv->src_rect, &subpicture_priv->dst_rect);
+ vl_compositor_set_palette_layer(compositor, 1, subpicture_priv->sampler, subpicture_priv->palette,
+ &subpicture_priv->src_rect, &subpicture_priv->dst_rect);
else
- compositor->set_rgba_layer(compositor, 1, subpicture_priv->sampler,
- &subpicture_priv->src_rect, &subpicture_priv->dst_rect);
+ vl_compositor_set_rgba_layer(compositor, 1, subpicture_priv->sampler,
+ &subpicture_priv->src_rect, &subpicture_priv->dst_rect);
surface_priv->subpicture = NULL;
subpicture_priv->surface = NULL;
// Workaround for r600g, there seems to be a bug in the fence refcounting code
vpipe->screen->fence_reference(vpipe->screen, &surface_priv->fence, NULL);
- compositor->render_picture(compositor, PictureToPipe(flags), context_priv->drawable_surface, &dst_rect, &surface_priv->fence);
+ vl_compositor_render(compositor, PictureToPipe(flags), context_priv->drawable_surface, &dst_rect, &surface_priv->fence);
XVMC_MSG(XVMC_TRACE, "[XvMC] Submitted surface %p for display. Pushing to front buffer.\n", surface);
#include <util/u_math.h>
#include <vl/vl_csc.h>
+#include <vl/vl_compositor.h>
#define BLOCK_SIZE_SAMPLES 64
#define BLOCK_SIZE_BYTES (BLOCK_SIZE_SAMPLES * 2)
struct vl_context;
struct pipe_video_decoder;
-struct pipe_video_compositor;
struct pipe_video_decode_buffer;
struct pipe_video_buffer;
{
struct vl_context *vctx;
struct pipe_video_decoder *decoder;
- struct pipe_video_compositor *compositor;
enum VL_CSC_COLOR_STANDARD color_standard;
struct vl_procamp procamp;
+ struct vl_compositor compositor;
unsigned short subpicture_max_width;
unsigned short subpicture_max_height;