[Mesa-dev] [PATCH 2/3] nouveau: advertise only supported video entrypoints
Ilia Mirkin
imirkin at alum.mit.edu
Sat Feb 15 12:03:36 PST 2014
On Sat, Feb 15, 2014 at 2:30 PM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> The nv84 code (vp2)
> - bitstream h264
> - idct and bitstream mpeg12
> Generic video (vpe2)
> - mc and idct mpeg12
>
> Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
> ---
>
> Seems like some explicit checks would be more robust when
> new code is added. Better to deny support for the user than
> crash of feed junk data to the gpu.
>
> src/gallium/drivers/nouveau/nouveau_video.c | 12 ++++++++----
> src/gallium/drivers/nouveau/nv50/nv84_video.c | 20 +++++++++++++++-----
> 2 files changed, 23 insertions(+), 9 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nouveau_video.c b/src/gallium/drivers/nouveau/nouveau_video.c
> index 8795c9d..9c4711b 100644
> --- a/src/gallium/drivers/nouveau/nouveau_video.c
> +++ b/src/gallium/drivers/nouveau/nouveau_video.c
> @@ -510,8 +510,7 @@ nouveau_create_decoder(struct pipe_context *context,
> int ret;
> bool is8274 = screen->device->chipset > 0x80;
>
> - debug_printf("Acceleration level: %s\n", templ->entrypoint <= PIPE_VIDEO_ENTRYPOINT_BITSTREAM ? "bit":
> - templ->entrypoint == PIPE_VIDEO_ENTRYPOINT_IDCT ? "IDCT" : "MC");
> + debug_printf("Acceleration level: %s\n", templ->entrypoint == PIPE_VIDEO_ENTRYPOINT_IDCT ? "IDCT" : "MC");
>
> if (getenv("XVMC_VL"))
> goto vl;
> @@ -838,8 +837,13 @@ nouveau_screen_get_video_param(struct pipe_screen *pscreen,
> {
> switch (param) {
> case PIPE_VIDEO_CAP_SUPPORTED:
> - return entrypoint >= PIPE_VIDEO_ENTRYPOINT_IDCT &&
> - u_reduce_video_profile(profile) == PIPE_VIDEO_FORMAT_MPEG12;
> + switch (entrypoint) {
> + case PIPE_VIDEO_ENTRYPOINT_IDCT:
> + case PIPE_VIDEO_ENTRYPOINT_MC:
> + return u_reduce_video_profile(profile) == PIPE_VIDEO_FORMAT_MPEG12;
> + default:
> + return 0;
> + }
> case PIPE_VIDEO_CAP_NPOT_TEXTURES:
> return 1;
> case PIPE_VIDEO_CAP_MAX_WIDTH:
> diff --git a/src/gallium/drivers/nouveau/nv50/nv84_video.c b/src/gallium/drivers/nouveau/nv50/nv84_video.c
> index a39f572..d0a3580 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv84_video.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv84_video.c
> @@ -281,8 +281,9 @@ nv84_create_decoder(struct pipe_context *context,
> return vl_create_decoder(context, templ);
>
> if ((is_h264 && templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
> - (is_mpeg12 && templ->entrypoint > PIPE_VIDEO_ENTRYPOINT_IDCT)) {
> - debug_printf("%x\n", templ->entrypoint);
> + (is_mpeg12 && (templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_BITSTREAM ||
> + templ->entrypoint != PIPE_VIDEO_ENTRYPOINT_IDCT))) {
> + debug_printf("invalid entrypoint %x\n", templ->entrypoint);
This code was added before the format checks had an entrypoint in
them. I think this whole if statement can safely be removed now -- the
expectation is that gallium callers perform the required checks
(except that it wasn't possible before, hence this logic). But if you
_really_ want to have the check here, may as well flip it to the
switch style.
> return NULL;
> }
>
> @@ -812,9 +813,18 @@ nv84_screen_get_video_param(struct pipe_screen *pscreen,
> switch (param) {
> case PIPE_VIDEO_CAP_SUPPORTED:
> codec = u_reduce_video_profile(profile);
> - return (codec == PIPE_VIDEO_FORMAT_MPEG4_AVC ||
> - codec == PIPE_VIDEO_FORMAT_MPEG12) &&
> - firmware_present(pscreen, codec);
> + switch (codec) {
> + case PIPE_VIDEO_FORMAT_MPEG12:
> + return ((entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM) ||
> + (entrypoint == PIPE_VIDEO_ENTRYPOINT_IDCT)) &&
You don't need the extra parens around a == b. (Same below.)
> + firmware_present(pscreen, codec);
> + case PIPE_VIDEO_FORMAT_MPEG4_AVC:
> + return (entrypoint == PIPE_VIDEO_ENTRYPOINT_BITSTREAM) &&
> + firmware_present(pscreen, codec);
> + default:
> + return 0;
> + }
> +
> case PIPE_VIDEO_CAP_NPOT_TEXTURES:
> return 1;
> case PIPE_VIDEO_CAP_MAX_WIDTH:
> --
> 1.8.5.5
With the above small changes,
Reviewed-by: Ilia Mirkin <imirkin at alum.mit.edu>
More information about the mesa-dev
mailing list