diff options
Diffstat (limited to 'src/gallium/drivers/nouveau/nv30')
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nv30_screen.c | 20 | ||||
-rw-r--r-- | src/gallium/drivers/nouveau/nv30/nv30_screen.h | 2 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c index 7aad26ba18b..efa3a59f450 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c @@ -319,8 +319,9 @@ nv30_screen_is_format_supported(struct pipe_screen *pscreen, unsigned sample_count, unsigned bindings) { - if (sample_count > 4) + if (sample_count > nv30_screen(pscreen)->max_sample_count) return false; + if (!(0x00000017 & (1 << sample_count))) return false; @@ -450,6 +451,23 @@ nv30_screen_create(struct nouveau_device *dev) return NULL; } + /* + * Some modern apps try to use msaa without keeping in mind the + * restrictions on videomem of older cards. Resulting in dmesg saying: + * [ 1197.850642] nouveau E[soffice.bin[3785]] fail ttm_validate + * [ 1197.850648] nouveau E[soffice.bin[3785]] validating bo list + * [ 1197.850654] nouveau E[soffice.bin[3785]] validate: -12 + * + * Because we are running out of video memory, after which the program + * using the msaa visual freezes, and eventually the entire system freezes. + * + * To work around this we do not allow msaa visauls by default and allow + * the user to override this via NV30_MAX_MSAA. + */ + screen->max_sample_count = debug_get_num_option("NV30_MAX_MSAA", 0); + if (screen->max_sample_count > 4) + screen->max_sample_count = 4; + pscreen = &screen->base.base; pscreen->destroy = nv30_screen_destroy; pscreen->get_param = nv30_screen_get_param; diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.h b/src/gallium/drivers/nouveau/nv30/nv30_screen.h index 7b17b88097c..df11233d07a 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_screen.h +++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.h @@ -38,6 +38,8 @@ struct nv30_screen { /*XXX: nvfx state */ struct nouveau_heap *vp_exec_heap; struct nouveau_heap *vp_data_heap; + + unsigned max_sample_count; }; static inline struct nv30_screen * |