mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 13:30:11 +01:00
nv50: fix g98+ vdec class allocation
The kernel previously exposed incorrect classes for some of the chipsets that this code supports. It no longer does, but the older object ioctls have compatibility to avoid breaking userspace. This needs to be fixed before switching over to the newer interfaces. Rather than hardcoding chipset->class like the rest of the driver does, this makes use of (new) sclass queries to determine what's available. v2. - update to use symbolic class identifier from <nvif/class.h> Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Tested-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
parent
791a3e1850
commit
33a3ba8c59
1 changed files with 51 additions and 6 deletions
|
|
@ -25,6 +25,8 @@
|
|||
#include "util/u_sampler.h"
|
||||
#include "util/u_format.h"
|
||||
|
||||
#include <nvif/class.h>
|
||||
|
||||
static void
|
||||
nv98_decoder_decode_bitstream(struct pipe_video_codec *decoder,
|
||||
struct pipe_video_buffer *video_target,
|
||||
|
|
@ -56,6 +58,28 @@ nv98_decoder_decode_bitstream(struct pipe_video_codec *decoder,
|
|||
nv98_decoder_ppp(dec, desc, target, comm_seq);
|
||||
}
|
||||
|
||||
static const struct nouveau_mclass
|
||||
nv98_decoder_msvld[] = {
|
||||
{ G98_MSVLD, -1 },
|
||||
{ IGT21A_MSVLD, -1 },
|
||||
{ GT212_MSVLD, -1 },
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct nouveau_mclass
|
||||
nv98_decoder_mspdec[] = {
|
||||
{ G98_MSPDEC, -1 },
|
||||
{ GT212_MSPDEC, -1 },
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct nouveau_mclass
|
||||
nv98_decoder_msppp[] = {
|
||||
{ G98_MSPPP, -1 },
|
||||
{ GT212_MSPPP, -1 },
|
||||
{}
|
||||
};
|
||||
|
||||
struct pipe_video_codec *
|
||||
nv98_create_decoder(struct pipe_context *context,
|
||||
const struct pipe_video_codec *templ)
|
||||
|
|
@ -103,12 +127,33 @@ nv98_create_decoder(struct pipe_context *context,
|
|||
}
|
||||
push = dec->pushbuf;
|
||||
|
||||
if (!ret)
|
||||
ret = nouveau_object_new(dec->channel[0], 0x390b1, 0x85b1, NULL, 0, &dec->bsp);
|
||||
if (!ret)
|
||||
ret = nouveau_object_new(dec->channel[1], 0x190b2, 0x85b2, NULL, 0, &dec->vp);
|
||||
if (!ret)
|
||||
ret = nouveau_object_new(dec->channel[2], 0x290b3, 0x85b3, NULL, 0, &dec->ppp);
|
||||
if (!ret) {
|
||||
ret = nouveau_object_mclass(dec->channel[0], nv98_decoder_msvld);
|
||||
if (ret >= 0) {
|
||||
ret = nouveau_object_new(dec->channel[0], 0xbeef85b1,
|
||||
nv98_decoder_msvld[ret].oclass, NULL, 0,
|
||||
&dec->bsp);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
ret = nouveau_object_mclass(dec->channel[1], nv98_decoder_mspdec);
|
||||
if (ret >= 0) {
|
||||
ret = nouveau_object_new(dec->channel[1], 0xbeef85b2,
|
||||
nv98_decoder_mspdec[ret].oclass, NULL, 0,
|
||||
&dec->vp);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
ret = nouveau_object_mclass(dec->channel[2], nv98_decoder_msppp);
|
||||
if (ret >= 0) {
|
||||
ret = nouveau_object_new(dec->channel[2], 0xbeef85b3,
|
||||
nv98_decoder_msppp[ret].oclass, NULL, 0,
|
||||
&dec->ppp);
|
||||
}
|
||||
}
|
||||
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue