st/xorg: Obey max {width|height} from kernel and Gallium
authorJakob Bornecrantz <jakob@vmware.com>
Mon, 22 Feb 2010 13:46:10 +0000 (14:46 +0100)
committerJakob Bornecrantz <jakob@vmware.com>
Sat, 27 Feb 2010 02:12:48 +0000 (02:12 +0000)
src/gallium/state_trackers/xorg/xorg_driver.c

index 5397ee777aadd17c64fc45157a7d058cceeca519..62cf2e0006c74961c46f330ebb2f28afe19d8ab8 100644 (file)
@@ -428,8 +428,8 @@ drv_pre_init(ScrnInfoPtr pScrn, int flags)
     xf86CrtcConfigInit(pScrn, &crtc_config_funcs);
     xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
 
-    max_width = 8192;
-    max_height = 8192;
+    max_width = 2048;  /* A very low default */
+    max_height = 2048; /* see screen_init */
     xf86CrtcSetSizeRange(pScrn, 320, 200, max_width, max_height);
 
     if (xf86ReturnOptValBool(ms->Options, OPTION_SW_CURSOR, FALSE)) {
@@ -612,6 +612,7 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 {
     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
     modesettingPtr ms = modesettingPTR(pScrn);
+    unsigned max_width, max_height;
     VisualPtr visual;
     CustomizerPtr cust = ms->cust;
 
@@ -630,6 +631,26 @@ drv_screen_init(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
        return FALSE;
     }
 
+    /* get max width and height */
+    {
+       drmModeResPtr res;
+       res = drmModeGetResources(ms->fd);
+       max_width = res->max_width;
+       max_height = res->max_height;
+       drmModeFreeResources(res);
+    }
+
+    if (ms->screen) {
+       float maxf;
+       int max;
+       maxf = ms->screen->get_paramf(ms->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
+       max = (1 << (int)(maxf - 1.0f));
+       max_width = max < max_width ? max : max_width;
+       max_height = max < max_height ? max : max_height;
+    }
+
+    xf86CrtcSetSizeRange(pScrn, 1, 1, max_width, max_height);
+
     pScrn->pScreen = pScreen;
 
     /* HW dependent - FIXME */