[Mesa-dev] [PATCH 2/3] nouveau: advertise only supported video entrypoints

Ilia Mirkin imirkin at alum.mit.edu
Sat Feb 15 12:18:46 PST 2014


On Sat, Feb 15, 2014 at 3:17 PM, Emil Velikov <emil.l.velikov at gmail.com> wrote:
> On 15/02/14 20:03, Ilia Mirkin wrote:
>> 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.
>>
> Except that the OMX state tracker does not call get_video_param() before
> coming here :\ (I know there is no omx-nouveau target, yet)

Bugs happen. The OMX st should be fixed.

>
> Any objections if I convert this to a switch and just assert(0) ?

instead of returning null? fine by me. you could do the same in
nouveau_video.c as well.

>
>>>        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.)
>>
> Cool, I'll drop those.
>
> Cheers
> -Emil
>>> +                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