vdpau: make capabilities query more sane
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user