From 3d769619e2937cb4f2a036e82b396d9e53d65ba8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20K=C3=B6nig?= Date: Sun, 10 Jul 2011 13:40:04 +0200 Subject: [PATCH] vdpau: implement VdpOutputSurfaceGetParameters --- src/gallium/state_trackers/vdpau/output.c | 14 ++++- src/gallium/state_trackers/vdpau/query.c | 2 +- src/gallium/state_trackers/vdpau/surface.c | 2 +- .../state_trackers/vdpau/vdpau_private.h | 51 +++++++++++++------ 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/src/gallium/state_trackers/vdpau/output.c b/src/gallium/state_trackers/vdpau/output.c index fc9e02ded47..f67d6ccff6b 100644 --- a/src/gallium/state_trackers/vdpau/output.c +++ b/src/gallium/state_trackers/vdpau/output.c @@ -135,7 +135,19 @@ vlVdpOutputSurfaceGetParameters(VdpOutputSurface surface, VdpRGBAFormat *rgba_format, uint32_t *width, uint32_t *height) { - return VDP_STATUS_NO_IMPLEMENTATION; + vlVdpOutputSurface *vlsurface; + + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] getting surface parameters\n"); + + vlsurface = vlGetDataHTAB(surface); + if (!vlsurface) + return VDP_STATUS_INVALID_HANDLE; + + *rgba_format = PipeToFormatRGBA(vlsurface->sampler_view->texture->format); + *width = vlsurface->sampler_view->texture->width0; + *height = vlsurface->sampler_view->texture->height0; + + return VDP_STATUS_OK; } VdpStatus diff --git a/src/gallium/state_trackers/vdpau/query.c b/src/gallium/state_trackers/vdpau/query.c index abe5b8f6701..971ac672229 100644 --- a/src/gallium/state_trackers/vdpau/query.c +++ b/src/gallium/state_trackers/vdpau/query.c @@ -120,7 +120,7 @@ vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaTyp if (bits_ycbcr_format != VDP_YCBCR_FORMAT_Y8U8V8A8 && bits_ycbcr_format != VDP_YCBCR_FORMAT_V8U8Y8A8) *is_supported = vlscreen->pscreen->is_format_supported(vlscreen->pscreen, - FormatToPipe(bits_ycbcr_format), + FormatYCBCRToPipe(bits_ycbcr_format), PIPE_TEXTURE_2D, 1, PIPE_BIND_RENDER_TARGET); diff --git a/src/gallium/state_trackers/vdpau/surface.c b/src/gallium/state_trackers/vdpau/surface.c index 877d0259c56..d3f6b5d8bc5 100644 --- a/src/gallium/state_trackers/vdpau/surface.c +++ b/src/gallium/state_trackers/vdpau/surface.c @@ -158,7 +158,7 @@ vlVdpVideoSurfacePutBitsYCbCr(VdpVideoSurface surface, void const *const *source_data, uint32_t const *source_pitches) { - enum pipe_format pformat = FormatToPipe(source_ycbcr_format); + enum pipe_format pformat = FormatYCBCRToPipe(source_ycbcr_format); struct pipe_context *pipe; struct pipe_sampler_view **sampler_views; unsigned i; diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h index 8cf9ca1f4e5..bbc426e0e27 100644 --- a/src/gallium/state_trackers/vdpau/vdpau_private.h +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h @@ -84,7 +84,7 @@ PipeToChroma(enum pipe_video_chroma_format pipe_type) static inline enum pipe_format -FormatToPipe(VdpYCbCrFormat vdpau_format) +FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format) { switch (vdpau_format) { case VDP_YCBCR_FORMAT_NV12: @@ -106,6 +106,29 @@ FormatToPipe(VdpYCbCrFormat vdpau_format) return -1; } +static inline VdpYCbCrFormat +PipeToFormatYCBCR(enum pipe_format p_format) +{ + switch (p_format) { + case PIPE_FORMAT_NV12: + return VDP_YCBCR_FORMAT_NV12; + case PIPE_FORMAT_YV12: + return VDP_YCBCR_FORMAT_YV12; + case PIPE_FORMAT_UYVY: + return VDP_YCBCR_FORMAT_UYVY; + case PIPE_FORMAT_YUYV: + return VDP_YCBCR_FORMAT_YUYV; + //case PIPE_FORMAT_YUVA: + // return VDP_YCBCR_FORMAT_Y8U8V8A8; + case PIPE_FORMAT_VUYA: + return VDP_YCBCR_FORMAT_V8U8Y8A8; + default: + assert(0); + } + + return -1; +} + static inline enum pipe_format FormatRGBAToPipe(VdpRGBAFormat vdpau_format) { @@ -127,22 +150,20 @@ FormatRGBAToPipe(VdpRGBAFormat vdpau_format) return -1; } -static inline VdpYCbCrFormat -PipeToFormat(enum pipe_format p_format) +static inline VdpRGBAFormat +PipeToFormatRGBA(enum pipe_format p_format) { switch (p_format) { - case PIPE_FORMAT_NV12: - return VDP_YCBCR_FORMAT_NV12; - case PIPE_FORMAT_YV12: - return VDP_YCBCR_FORMAT_YV12; - case PIPE_FORMAT_UYVY: - return VDP_YCBCR_FORMAT_UYVY; - case PIPE_FORMAT_YUYV: - return VDP_YCBCR_FORMAT_YUYV; - //case PIPE_FORMAT_YUVA: - // return VDP_YCBCR_FORMAT_Y8U8V8A8; - case PIPE_FORMAT_VUYA: - return VDP_YCBCR_FORMAT_V8U8Y8A8; + case PIPE_FORMAT_A8_UNORM: + return VDP_RGBA_FORMAT_A8; + case PIPE_FORMAT_B10G10R10A2_UNORM: + return VDP_RGBA_FORMAT_B10G10R10A2; + case PIPE_FORMAT_B8G8R8A8_UNORM: + return VDP_RGBA_FORMAT_B8G8R8A8; + case PIPE_FORMAT_R10G10B10A2_UNORM: + return VDP_RGBA_FORMAT_R10G10B10A2; + case PIPE_FORMAT_R8G8B8A8_UNORM: + return VDP_RGBA_FORMAT_R8G8B8A8; default: assert(0); } -- 2.30.2