st/vdpau: use matrix filter to blur/sharpen video
[mesa.git] / src / gallium / state_trackers / vdpau / presentation.c
index b30b778aa1994508b219c23e1ab46bec9fb3a60f..25a6c861115d78601e073e6b2ac0c519ed4ab097 100644 (file)
@@ -75,6 +75,8 @@ vlVdpPresentationQueueCreate(VdpDevice device,
       goto no_compositor;
    }
 
+   vl_compositor_reset_dirty_area(&pq->dirty_area);
+
    *presentation_queue = vlAddDataHTAB(pq);
    if (*presentation_queue == 0) {
       ret = VDP_STATUS_ERROR;
@@ -119,6 +121,7 @@ vlVdpPresentationQueueSetBackgroundColor(VdpPresentationQueue presentation_queue
                                          VdpColor *const background_color)
 {
    vlVdpPresentationQueue *pq;
+   union pipe_color_union color;
 
    VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Setting background color\n");
 
@@ -129,7 +132,12 @@ vlVdpPresentationQueueSetBackgroundColor(VdpPresentationQueue presentation_queue
    if (!pq)
       return VDP_STATUS_INVALID_HANDLE;
 
-   vl_compositor_set_clear_color(&pq->compositor, (float*)background_color);
+   color.f[0] = background_color->red;
+   color.f[1] = background_color->green;
+   color.f[2] = background_color->blue;
+   color.f[3] = background_color->alpha;
+
+   vl_compositor_set_clear_color(&pq->compositor, &color);
 
    return VDP_STATUS_OK;
 }
@@ -142,6 +150,7 @@ vlVdpPresentationQueueGetBackgroundColor(VdpPresentationQueue presentation_queue
                                          VdpColor *const background_color)
 {
    vlVdpPresentationQueue *pq;
+   union pipe_color_union color;
 
    VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Getting background color\n");
 
@@ -152,7 +161,12 @@ vlVdpPresentationQueueGetBackgroundColor(VdpPresentationQueue presentation_queue
    if (!pq)
       return VDP_STATUS_INVALID_HANDLE;
 
-   vl_compositor_get_clear_color(&pq->compositor, (float*)background_color);
+   vl_compositor_get_clear_color(&pq->compositor, &color);
+
+   background_color->red = color.f[0];
+   background_color->green = color.f[1];
+   background_color->blue = color.f[2];
+   background_color->alpha = color.f[3];
 
    return VDP_STATUS_OK;
 }
@@ -199,7 +213,7 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue,
 
    struct pipe_context *pipe;
    struct pipe_surface *drawable_surface;
-   struct pipe_video_rect vo_rect;
+   struct pipe_video_rect src_rect, dst_clip;
 
    pq = vlGetDataHTAB(presentation_queue);
    if (!pq)
@@ -215,14 +229,19 @@ vlVdpPresentationQueueDisplay(VdpPresentationQueue presentation_queue,
 
    surf->timestamp = (vlVdpTime)earliest_presentation_time;
 
-   vo_rect.x = 0;
-   vo_rect.y = 0;
-   vo_rect.w = clip_width;
-   vo_rect.h = clip_height;
+   src_rect.x = 0;
+   src_rect.y = 0;
+   src_rect.w = drawable_surface->width;
+   src_rect.h = drawable_surface->height;
+
+   dst_clip.x = 0;
+   dst_clip.y = 0;
+   dst_clip.w = clip_width ? clip_width : drawable_surface->width;
+   dst_clip.h = clip_height ? clip_height : drawable_surface->height;
 
    vl_compositor_clear_layers(&pq->compositor);
-   vl_compositor_set_rgba_layer(&pq->compositor, 0, surf->sampler_view, NULL, NULL);
-   vl_compositor_render(&pq->compositor, drawable_surface, NULL, &vo_rect, true);
+   vl_compositor_set_rgba_layer(&pq->compositor, 0, surf->sampler_view, &src_rect, NULL);
+   vl_compositor_render(&pq->compositor, drawable_surface, NULL, &dst_clip, &pq->dirty_area);
 
    pipe = pq->device->context->pipe;