vdpau: make capabilities query more sane
authorChristian König <deathsimple@vodafone.de>
Sun, 10 Jul 2011 12:13:08 +0000 (14:13 +0200)
committerChristian König <deathsimple@vodafone.de>
Sun, 10 Jul 2011 12:13:08 +0000 (14:13 +0200)
src/gallium/state_trackers/vdpau/device.c
src/gallium/state_trackers/vdpau/query.c
src/gallium/state_trackers/vdpau/vdpau_private.h

index 41248cde7056469556eb1f61865417c6c03bb6ed..b032e83dc80e491be6feca6088f7244b368ba735 100644 (file)
@@ -55,8 +55,6 @@ vdp_imp_device_create_x11(Display *display, int screen, VdpDevice *device,
       goto no_dev;
    }
 
-   dev->display = display;
-   dev->screen = screen;
    dev->vscreen = vl_screen_create(display, screen);
    if (!dev->vscreen) {
       ret = VDP_STATUS_RESOURCES;
index 971ac672229fe49a6216a6d70ac1d33011c40b52..a32fd406bf54857ce7ba8229005af5075d2a776d 100644 (file)
@@ -58,44 +58,36 @@ 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");
 
    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;
 }
 
 VdpStatus
@@ -103,29 +95,28 @@ vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaTyp
                                                   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");
 
    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,
-                                                             FormatYCBCRToPipe(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;
 }
@@ -135,38 +126,40 @@ 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");
 
    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 = false;
+      return VDP_STATUS_OK;
    }
 
    /* 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_2d_texture_level = pscreen->get_param(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;
@@ -177,8 +170,6 @@ vlVdpDecoderQueryCapabilities(VdpDevice device, VdpDecoderProfile profile,
    *max_level = 16;
    *max_macroblocks = (max_decode_width/16) * (max_decode_height/16);
 
-   vl_screen_destroy(vlscreen);
-
    return VDP_STATUS_OK;
 }
 
index bbc426e0e274e4079c7cfd3804fe124b05e69d27..e5d945629fb2d353cf18fe12f478f5382b2e3540 100644 (file)
@@ -216,8 +216,6 @@ PipeToProfile(enum pipe_video_profile p_profile)
 
 typedef struct
 {
-   Display *display;
-   int screen;
    struct vl_screen *vscreen;
    struct vl_context *context;
 } vlVdpDevice;