Hm, I wonder what GETPARAM_PCI_DEVICE returns for GK20A. Also, not 100% sure what UMA means, but GK20A (NVEA) would defnitely qualify. Not sure about the other IGP's that steal vram from the system. All IGPs end in 0xa-0xf though, so they're easy to detect. (But some might have dedicated vram, not 100% sure.)
On Thu, Aug 14, 2014 at 6:18 PM, Emil Velikov <emil.l.veli...@gmail.com> wrote: > Signed-off-by: Emil Velikov <emil.l.veli...@gmail.com> > --- > src/gallium/drivers/nouveau/nv30/nv30_screen.c | 20 ++++++++++++++++++++ > src/gallium/drivers/nouveau/nv50/nv50_screen.c | 26 > +++++++++++++++++++++----- > src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 24 ++++++++++++++++++++---- > 3 files changed, 61 insertions(+), 9 deletions(-) > > diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c > b/src/gallium/drivers/nouveau/nv30/nv30_screen.c > index 2860188..e6540a2 100644 > --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c > +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c > @@ -23,6 +23,8 @@ > * > */ > > +#include <xf86drm.h> > +#include <nouveau_drm.h> > #include "util/u_format.h" > #include "util/u_format_s3tc.h" > > @@ -49,6 +51,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum > pipe_cap param) > { > struct nv30_screen *screen = nv30_screen(pscreen); > struct nouveau_object *eng3d = screen->eng3d; > + struct nouveau_device *dev = nouveau_screen(pscreen)->device; > > switch (param) { > /* non-boolean capabilities */ > @@ -149,6 +152,23 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum > pipe_cap param) > case PIPE_CAP_COMPUTE: > case PIPE_CAP_DRAW_INDIRECT: > return 0; > + > + case PIPE_CAP_VENDOR_ID: > + return 0x10de; > + case PIPE_CAP_DEVICE_ID: { > + uint64_t device_id; > + if (nouveau_getparam(dev, NOUVEAU_GETPARAM_PCI_DEVICE, &device_id)) { > + NOUVEAU_ERR("NOUVEAU_GETPARAM_PCI_DEVICE failed.\n"); > + return -1; > + } > + return device_id; > + } > + case PIPE_CAP_ACCELERATED: > + return 1; > + case PIPE_CAP_VIDEO_MEMORY: > + return dev->vram_size >> 20; > + case PIPE_CAP_UMA: > + return 0; > } > > debug_printf("unknown param %d\n", param); > diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c > b/src/gallium/drivers/nouveau/nv50/nv50_screen.c > index 7b1b112..d15daf0 100644 > --- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c > +++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c > @@ -20,6 +20,9 @@ > * OTHER DEALINGS IN THE SOFTWARE. > */ > > +#include <errno.h> > +#include <xf86drm.h> > +#include <nouveau_drm.h> > #include "util/u_format.h" > #include "util/u_format_s3tc.h" > #include "pipe/p_screen.h" > @@ -30,11 +33,6 @@ > #include "nouveau_vp3_video.h" > > #include "nv_object.xml.h" > -#include <errno.h> > - > -#ifndef NOUVEAU_GETPARAM_GRAPH_UNITS > -# define NOUVEAU_GETPARAM_GRAPH_UNITS 13 > -#endif > > /* affected by LOCAL_WARPS_LOG_ALLOC / LOCAL_WARPS_NO_CLAMP */ > #define LOCAL_WARPS_ALLOC 32 > @@ -83,6 +81,7 @@ static int > nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) > { > const uint16_t class_3d = nouveau_screen(pscreen)->class_3d; > + struct nouveau_device *dev = nouveau_screen(pscreen)->device; > > switch (param) { > /* non-boolean caps */ > @@ -201,6 +200,23 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum > pipe_cap param) > case PIPE_CAP_COMPUTE: > case PIPE_CAP_DRAW_INDIRECT: > return 0; > + > + case PIPE_CAP_VENDOR_ID: > + return 0x10de; > + case PIPE_CAP_DEVICE_ID: { > + uint64_t device_id; > + if (nouveau_getparam(dev, NOUVEAU_GETPARAM_PCI_DEVICE, &device_id)) { > + NOUVEAU_ERR("NOUVEAU_GETPARAM_PCI_DEVICE failed.\n"); > + return -1; > + } > + return device_id; > + } > + case PIPE_CAP_ACCELERATED: > + return 1; > + case PIPE_CAP_VIDEO_MEMORY: > + return dev->vram_size >> 20; > + case PIPE_CAP_UMA: > + return 0; > } > > NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); > diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c > b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c > index d372a0f..afe5d57 100644 > --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c > +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c > @@ -20,6 +20,8 @@ > * OTHER DEALINGS IN THE SOFTWARE. > */ > > +#include <xf86drm.h> > +#include <nouveau_drm.h> > #include "util/u_format.h" > #include "util/u_format_s3tc.h" > #include "pipe/p_screen.h" > @@ -34,10 +36,6 @@ > > #include "nvc0/mme/com9097.mme.h" > > -#ifndef NOUVEAU_GETPARAM_GRAPH_UNITS > -# define NOUVEAU_GETPARAM_GRAPH_UNITS 13 > -#endif > - > static boolean > nvc0_screen_is_format_supported(struct pipe_screen *pscreen, > enum pipe_format format, > @@ -69,6 +67,7 @@ static int > nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param) > { > const uint16_t class_3d = nouveau_screen(pscreen)->class_3d; > + struct nouveau_device *dev = nouveau_screen(pscreen)->device; > > switch (param) { > /* non-boolean caps */ > @@ -185,6 +184,23 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum > pipe_cap param) > case PIPE_CAP_FAKE_SW_MSAA: > case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: > return 0; > + > + case PIPE_CAP_VENDOR_ID: > + return 0x10de; > + case PIPE_CAP_DEVICE_ID: { > + uint64_t device_id; > + if (nouveau_getparam(dev, NOUVEAU_GETPARAM_PCI_DEVICE, &device_id)) { > + NOUVEAU_ERR("NOUVEAU_GETPARAM_PCI_DEVICE failed.\n"); > + return -1; > + } > + return device_id; > + } > + case PIPE_CAP_ACCELERATED: > + return 1; > + case PIPE_CAP_VIDEO_MEMORY: > + return dev->vram_size >> 20; > + case PIPE_CAP_UMA: > + return 0; > } > > NOUVEAU_ERR("unknown PIPE_CAP %d\n", param); > -- > 2.0.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev