st/vdpau: implement BitmapSurfaceGetParameters
[mesa.git] / src / gallium / state_trackers / vdpau / query.c
index 191e163af8e7d407dd817002c9ae4dd3071abcd3..c5f7037594abe63fc50d7b2452ca14377e686ff1 100644 (file)
@@ -72,8 +72,6 @@ vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chrom
    struct pipe_screen *pscreen;
    uint32_t max_2d_texture_level;
 
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpVideoSurface capabilities\n");
-
    if (!(is_supported && max_width && max_height))
       return VDP_STATUS_INVALID_POINTER;
 
@@ -111,8 +109,6 @@ vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaTyp
    vlVdpDevice *dev;
    struct pipe_screen *pscreen;
 
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpVideoSurface get/put bits YCbCr capabilities\n");
-
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
@@ -146,8 +142,6 @@ vlVdpDecoderQueryCapabilities(VdpDevice device, VdpDecoderProfile profile,
    struct pipe_screen *pscreen;
    enum pipe_video_profile p_profile;
 
-   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;
 
@@ -188,12 +182,44 @@ VdpStatus
 vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
                                     VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
 {
+   vlVdpDevice *dev;
+   struct pipe_screen *pscreen;
+   enum pipe_format format;
+
+   dev = vlGetDataHTAB(device);
+   if (!dev)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   pscreen = dev->vscreen->pscreen;
+   if (!pscreen)
+      return VDP_STATUS_RESOURCES;
+
+   format = FormatRGBAToPipe(surface_rgba_format);
+   if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
+      return VDP_STATUS_INVALID_RGBA_FORMAT;
+
    if (!(is_supported && max_width && max_height))
       return VDP_STATUS_INVALID_POINTER;
 
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface capabilities\n");
+   *is_supported = pscreen->is_format_supported
+   (
+      pscreen, format, PIPE_TEXTURE_3D, 1,
+      PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
+   );
+   if (*is_supported) {
+      uint32_t max_2d_texture_level = pscreen->get_param(
+         pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
 
-   return VDP_STATUS_NO_IMPLEMENTATION;
+      if (!max_2d_texture_level)
+         return VDP_STATUS_ERROR;
+
+      *max_width = *max_height = pow(2, max_2d_texture_level - 1);
+   } else {
+      *max_width = 0;
+      *max_height = 0;
+   }
+
+   return VDP_STATUS_OK;
 }
 
 /**
@@ -204,8 +230,6 @@ VdpStatus
 vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
                                                     VdpBool *is_supported)
 {
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface get/put bits native capabilities\n");
-
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
@@ -223,8 +247,6 @@ vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device,
                                                   VdpColorTableFormat color_table_format,
                                                   VdpBool *is_supported)
 {
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface put bits indexed capabilities\n");
-
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
@@ -240,8 +262,6 @@ vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device, VdpRGBAFormat
                                                 VdpYCbCrFormat bits_ycbcr_format,
                                                 VdpBool *is_supported)
 {
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpOutputSurface put bits YCbCr capabilities\n");
-
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
@@ -255,8 +275,6 @@ 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 VdpBitmapSurface capabilities\n");
-
    if (!(is_supported && max_width && max_height))
       return VDP_STATUS_INVALID_POINTER;
 
@@ -270,12 +288,19 @@ VdpStatus
 vlVdpVideoMixerQueryFeatureSupport(VdpDevice device, VdpVideoMixerFeature feature,
                                    VdpBool *is_supported)
 {
-   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Querying VdpVideoMixer feature support\n");
-
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
-   return VDP_STATUS_NO_IMPLEMENTATION;
+   switch (feature) {
+   case VDP_VIDEO_MIXER_FEATURE_SHARPNESS:
+   case VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION:
+      *is_supported = VDP_TRUE;
+      break;
+   default:
+      *is_supported = VDP_FALSE;
+      break;
+   }
+   return VDP_STATUS_OK;
 }
 
 /**
@@ -288,7 +313,18 @@ vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter pa
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
-   return VDP_STATUS_NO_IMPLEMENTATION;
+   switch (parameter) {
+   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
+   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
+   case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
+   case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
+      *is_supported = VDP_TRUE;
+      break;
+   default:
+      *is_supported = VDP_FALSE;
+      break;
+   }
+   return VDP_STATUS_OK;
 }
 
 /**
@@ -298,10 +334,34 @@ VdpStatus
 vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter parameter,
                                         void *min_value, void *max_value)
 {
+   vlVdpDevice *dev = vlGetDataHTAB(device);
+   struct pipe_screen *screen;
+   enum pipe_video_profile prof = PIPE_VIDEO_PROFILE_UNKNOWN;
+   if (!dev)
+      return VDP_STATUS_INVALID_HANDLE;
    if (!(min_value && max_value))
       return VDP_STATUS_INVALID_POINTER;
-
-   return VDP_STATUS_NO_IMPLEMENTATION;
+   screen = dev->vscreen->pscreen;
+   switch (parameter) {
+   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
+      *(uint32_t*)min_value = 48;
+      *(uint32_t*)max_value = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_WIDTH);
+      break;
+   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
+      *(uint32_t*)min_value = 48;
+      *(uint32_t*)max_value = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_HEIGHT);
+      break;
+
+   case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
+      *(uint32_t*)min_value = 0;
+      *(uint32_t*)max_value = 4;
+      break;
+
+   case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
+   default:
+      return VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
+   }
+   return VDP_STATUS_OK;
 }
 
 /**
@@ -314,7 +374,20 @@ vlVdpVideoMixerQueryAttributeSupport(VdpDevice device, VdpVideoMixerAttribute at
    if (!is_supported)
       return VDP_STATUS_INVALID_POINTER;
 
-   return VDP_STATUS_NO_IMPLEMENTATION;
+   switch (attribute) {
+   case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
+      *is_supported = VDP_TRUE;
+      break;
+   default:
+      *is_supported = VDP_FALSE;
+   }
+   return VDP_STATUS_OK;
 }
 
 /**
@@ -327,5 +400,25 @@ vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device, VdpVideoMixerAttribute
    if (!(min_value && max_value))
       return VDP_STATUS_INVALID_POINTER;
 
-   return VDP_STATUS_NO_IMPLEMENTATION;
+   switch (attribute) {
+   case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
+      *(float*)min_value = 0.f;
+      *(float*)max_value = 1.f;
+      break;
+   case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
+      *(float*)min_value = -1.f;
+      *(float*)max_value = 1.f;
+      break;
+   case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
+      *(uint8_t*)min_value = 0;
+      *(uint8_t*)max_value = 1;
+      break;
+   case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
+   case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
+   default:
+      return VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE;
+   }
+   return VDP_STATUS_OK;
 }