X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fvdpau%2Fquery.c;h=191e163af8e7d407dd817002c9ae4dd3071abcd3;hb=6cf0581159a33f3dc10be38cdc7ab94d9cbacc1e;hp=abe5b8f6701ce10c86aaaddd97ec932d0b224493;hpb=08f3a7cf7e9133f50adf33f800aa3696c909347f;p=mesa.git diff --git a/src/gallium/state_trackers/vdpau/query.c b/src/gallium/state_trackers/vdpau/query.c index abe5b8f6701..191e163af8e 100644 --- a/src/gallium/state_trackers/vdpau/query.c +++ b/src/gallium/state_trackers/vdpau/query.c @@ -25,15 +25,18 @@ * **************************************************************************/ -#include "vdpau_private.h" -#include #include -#include -#include #include -#include - +#include "vdpau_private.h" +#include "vl_winsys.h" +#include "pipe/p_screen.h" +#include "pipe/p_defines.h" +#include "util/u_debug.h" + +/** + * Retrieve the VDPAU version implemented by the backend. + */ VdpStatus vlVdpGetApiVersion(uint32_t *api_version) { @@ -44,6 +47,10 @@ vlVdpGetApiVersion(uint32_t *api_version) return VDP_STATUS_OK; } +/** + * Retrieve an implementation-specific string description of the implementation. + * This typically includes detailed version information. + */ VdpStatus vlVdpGetInformationString(char const **information_string) { @@ -54,134 +61,129 @@ vlVdpGetInformationString(char const **information_string) return VDP_STATUS_OK; } +/** + * Query the implementation's VdpVideoSurface capabilities. + */ VdpStatus vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chroma_type, VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height) { - struct vl_screen *vlscreen; + vlVdpDevice *dev; + struct pipe_screen *pscreen; uint32_t max_2d_texture_level; - VdpStatus ret; - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying video surfaces\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpVideoSurface capabilities\n"); if (!(is_supported && max_width && max_height)) return VDP_STATUS_INVALID_POINTER; - vlVdpDevice *dev = vlGetDataHTAB(device); + dev = vlGetDataHTAB(device); if (!dev) return VDP_STATUS_INVALID_HANDLE; - vlscreen = vl_screen_create(dev->display, dev->screen); - if (!vlscreen) + pscreen = dev->vscreen->pscreen; + if (!pscreen) return VDP_STATUS_RESOURCES; /* XXX: Current limits */ *is_supported = true; - if (surface_chroma_type != VDP_CHROMA_TYPE_420) { - *is_supported = false; - goto no_sup; - } + if (surface_chroma_type != VDP_CHROMA_TYPE_420) + *is_supported = false; - max_2d_texture_level = vlscreen->pscreen->get_param( vlscreen->pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS ); - if (!max_2d_texture_level) { - ret = VDP_STATUS_RESOURCES; - goto no_sup; - } + max_2d_texture_level = pscreen->get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS); + if (!max_2d_texture_level) + return VDP_STATUS_RESOURCES; /* I am not quite sure if it is max_2d_texture_level-1 or just max_2d_texture_level */ *max_width = *max_height = pow(2,max_2d_texture_level-1); - vl_screen_destroy(vlscreen); - return VDP_STATUS_OK; - no_sup: - return ret; } +/** + * Query the implementation's VdpVideoSurface GetBits/PutBits capabilities. + */ VdpStatus vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaType surface_chroma_type, VdpYCbCrFormat bits_ycbcr_format, VdpBool *is_supported) { - struct vl_screen *vlscreen; + vlVdpDevice *dev; + struct pipe_screen *pscreen; - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying get put video surfaces\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpVideoSurface get/put bits YCbCr capabilities\n"); if (!is_supported) return VDP_STATUS_INVALID_POINTER; - vlVdpDevice *dev = vlGetDataHTAB(device); + dev = vlGetDataHTAB(device); if (!dev) return VDP_STATUS_INVALID_HANDLE; - vlscreen = vl_screen_create(dev->display, dev->screen); - if (!vlscreen) + pscreen = dev->vscreen->pscreen; + if (!pscreen) return VDP_STATUS_RESOURCES; - 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), - PIPE_TEXTURE_2D, - 1, - PIPE_BIND_RENDER_TARGET); - - vl_screen_destroy(vlscreen); + *is_supported = pscreen->is_video_format_supported + ( + pscreen, + FormatYCBCRToPipe(bits_ycbcr_format), + PIPE_VIDEO_PROFILE_UNKNOWN + ); return VDP_STATUS_OK; } +/** + * Query the implementation's VdpDecoder capabilities. + */ VdpStatus vlVdpDecoderQueryCapabilities(VdpDevice device, VdpDecoderProfile profile, VdpBool *is_supported, uint32_t *max_level, uint32_t *max_macroblocks, uint32_t *max_width, uint32_t *max_height) { + vlVdpDevice *dev; + struct pipe_screen *pscreen; enum pipe_video_profile p_profile; - uint32_t max_decode_width; - uint32_t max_decode_height; - uint32_t max_2d_texture_level; - struct vl_screen *vlscreen; - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying decoder\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpDecoder capabilities\n"); if (!(is_supported && max_level && max_macroblocks && max_width && max_height)) return VDP_STATUS_INVALID_POINTER; - vlVdpDevice *dev = vlGetDataHTAB(device); + dev = vlGetDataHTAB(device); if (!dev) return VDP_STATUS_INVALID_HANDLE; - vlscreen = vl_screen_create(dev->display, dev->screen); - if (!vlscreen) + pscreen = dev->vscreen->pscreen; + if (!pscreen) return VDP_STATUS_RESOURCES; p_profile = ProfileToPipe(profile); if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN) { - *is_supported = false; - return VDP_STATUS_OK; + *is_supported = false; + return VDP_STATUS_OK; } - - if (p_profile != PIPE_VIDEO_PROFILE_MPEG2_SIMPLE && p_profile != PIPE_VIDEO_PROFILE_MPEG2_MAIN) { - *is_supported = false; - return VDP_STATUS_OK; + + *is_supported = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_CAP_SUPPORTED); + if (*is_supported) { + *max_width = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_CAP_MAX_WIDTH); + *max_height = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_CAP_MAX_HEIGHT); + *max_level = 16; + *max_macroblocks = (*max_width/16)*(*max_height/16); + } else { + *max_width = 0; + *max_height = 0; + *max_level = 0; + *max_macroblocks = 0; } - /* XXX hack, need to implement something more sane when the decoders have been implemented */ - max_2d_texture_level = vlscreen->pscreen->get_param( vlscreen->pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS ); - max_decode_width = max_decode_height = pow(2,max_2d_texture_level-2); - if (!(max_decode_width && max_decode_height)) - return VDP_STATUS_RESOURCES; - - *is_supported = true; - *max_width = max_decode_width; - *max_height = max_decode_height; - *max_level = 16; - *max_macroblocks = (max_decode_width/16) * (max_decode_height/16); - - vl_screen_destroy(vlscreen); - return VDP_STATUS_OK; } +/** + * Query the implementation's VdpOutputSurface capabilities. + */ VdpStatus vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format, VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height) @@ -189,16 +191,20 @@ vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba if (!(is_supported && max_width && max_height)) return VDP_STATUS_INVALID_POINTER; - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying ouput surfaces\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface capabilities\n"); return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's capability to perform a PutBits operation using + * application data matching the surface's format. + */ VdpStatus vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format, VdpBool *is_supported) { - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying output surfaces get put native cap\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface get/put bits native capabilities\n"); if (!is_supported) return VDP_STATUS_INVALID_POINTER; @@ -206,6 +212,10 @@ vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device, VdpRGBAFor return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's capability to perform a PutBits operation using + * application data in a specific indexed format. + */ VdpStatus vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format, @@ -213,7 +223,7 @@ vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device, VdpColorTableFormat color_table_format, VdpBool *is_supported) { - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying output surfaces get put indexed cap\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface put bits indexed capabilities\n"); if (!is_supported) return VDP_STATUS_INVALID_POINTER; @@ -221,40 +231,56 @@ vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device, return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's capability to perform a PutBits operation using + * application data in a specific YCbCr/YUB format. + */ VdpStatus vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format, VdpYCbCrFormat bits_ycbcr_format, VdpBool *is_supported) { - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying output surfaces put ycrcb cap\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface put bits YCbCr capabilities\n"); + if (!is_supported) return VDP_STATUS_INVALID_POINTER; return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's VdpBitmapSurface capabilities. + */ VdpStatus vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format, VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height) { - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying bitmap surfaces\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpBitmapSurface capabilities\n"); + if (!(is_supported && max_width && max_height)) return VDP_STATUS_INVALID_POINTER; return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's support for a specific feature. + */ VdpStatus vlVdpVideoMixerQueryFeatureSupport(VdpDevice device, VdpVideoMixerFeature feature, VdpBool *is_supported) { - VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying mixer feature support\n"); + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpVideoMixer feature support\n"); + if (!is_supported) return VDP_STATUS_INVALID_POINTER; return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's support for a specific parameter. + */ VdpStatus vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter parameter, VdpBool *is_supported) @@ -265,6 +291,9 @@ vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter pa return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's supported for a specific parameter. + */ VdpStatus vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter parameter, void *min_value, void *max_value) @@ -275,6 +304,9 @@ vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's support for a specific attribute. + */ VdpStatus vlVdpVideoMixerQueryAttributeSupport(VdpDevice device, VdpVideoMixerAttribute attribute, VdpBool *is_supported) @@ -285,6 +317,9 @@ vlVdpVideoMixerQueryAttributeSupport(VdpDevice device, VdpVideoMixerAttribute at return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Query the implementation's supported for a specific attribute. + */ VdpStatus vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device, VdpVideoMixerAttribute attribute, void *min_value, void *max_value)