summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <[email protected]>2011-07-10 14:13:08 +0200
committerChristian König <[email protected]>2011-07-10 14:13:08 +0200
commitcd4f18089e44872ce9e3c04ac5e808a7204ffc49 (patch)
treeba70c1eee92cf45fd93ea68fbda16532c9b4d928
parent3d769619e2937cb4f2a036e82b396d9e53d65ba8 (diff)
vdpau: make capabilities query more sane
-rw-r--r--src/gallium/state_trackers/vdpau/device.c2
-rw-r--r--src/gallium/state_trackers/vdpau/query.c73
-rw-r--r--src/gallium/state_trackers/vdpau/vdpau_private.h2
3 files changed, 32 insertions, 45 deletions
diff --git a/src/gallium/state_trackers/vdpau/device.c b/src/gallium/state_trackers/vdpau/device.c
index 41248cde705..b032e83dc80 100644
--- a/src/gallium/state_trackers/vdpau/device.c
+++ b/src/gallium/state_trackers/vdpau/device.c
@@ -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;
diff --git a/src/gallium/state_trackers/vdpau/query.c b/src/gallium/state_trackers/vdpau/query.c
index 971ac672229..a32fd406bf5 100644
--- a/src/gallium/state_trackers/vdpau/query.c
+++ b/src/gallium/state_trackers/vdpau/query.c
@@ -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;
}
diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
index bbc426e0e27..e5d945629fb 100644
--- a/src/gallium/state_trackers/vdpau/vdpau_private.h
+++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
@@ -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;