[PATCH 3/4] wined3d: Use lookup tables in select_card_ati_mesa().

Henri Verbeet hverbeet at codeweavers.com
Tue Nov 9 04:38:43 CST 2010


---
 dlls/wined3d/directx.c |  273 +++++++++++++++++++-----------------------------
 1 files changed, 107 insertions(+), 166 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index ac23b3d..77483f6 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1857,183 +1857,124 @@ static enum wined3d_pci_device select_card_intel(const struct wined3d_gl_info *g
 static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info *gl_info,
         const char *gl_renderer)
 {
+    unsigned int i;
+
     /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
      *
      * Beware: renderer string do not match exact card model,
      * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
     if (strstr(gl_renderer, "Gallium"))
     {
-        if (strstr(gl_renderer, "HEMLOCK"))
-            return CARD_ATI_RADEON_HD5900;
-        if (strstr(gl_renderer, "CYPRESS"))
-            return CARD_ATI_RADEON_HD5800;
-        if (strstr(gl_renderer, "JUNIPER"))
-            return CARD_ATI_RADEON_HD5700;
-        if (strstr(gl_renderer, "REDWOOD"))
-            return CARD_ATI_RADEON_HD5600;
-        if (strstr(gl_renderer, "CEDAR"))
-            return CARD_ATI_RADEON_HD5400;
-
-        /* Radeon R7xx HD4800 - highend */
-        if (strstr(gl_renderer, "R700")          /* Radeon R7xx HD48xx generic renderer string */
-                || strstr(gl_renderer, "RV770")  /* Radeon RV770 */
-                || strstr(gl_renderer, "RV790"))  /* Radeon RV790 */
-        {
-            return CARD_ATI_RADEON_HD4800;
-        }
-
-        /* Radeon R740 HD4700 - midend */
-        if (strstr(gl_renderer, "RV740"))          /* Radeon RV740 */
-        {
-            return CARD_ATI_RADEON_HD4700;
-        }
-
-        /* Radeon R730 HD4600 - midend */
-        if (strstr(gl_renderer, "RV730"))        /* Radeon RV730 */
-        {
-            return CARD_ATI_RADEON_HD4600;
-        }
-
-        /* Radeon R710 HD4500/HD4350 - lowend */
-        if (strstr(gl_renderer, "RV710"))          /* Radeon RV710 */
-        {
-            return CARD_ATI_RADEON_HD4350;
-        }
-
-        /* Radeon R6xx HD2900/HD3800 - highend */
-        if (strstr(gl_renderer, "R600")
-                || strstr(gl_renderer, "RV670")
-                || strstr(gl_renderer, "R680"))
-        {
-            return CARD_ATI_RADEON_HD2900;
-        }
-
-        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
-        if (strstr(gl_renderer, "RV630")
-                || strstr(gl_renderer, "RV635"))
-        {
-            return CARD_ATI_RADEON_HD2600;
-        }
-
-        /* Radeon R6xx HD2350/HD2400/HD3400 - lowend */
-        if (strstr(gl_renderer, "RV610")
-                || strstr(gl_renderer, "RV620"))
-        {
-            return CARD_ATI_RADEON_HD2350;
-        }
-
-        /* Radeon R6xx/R7xx integrated */
-        if (strstr(gl_renderer, "RS780")
-                || strstr(gl_renderer, "RS880"))
-        {
-            return CARD_ATI_RADEON_HD3200;
-        }
-
-        /* Radeon R5xx */
-        if (strstr(gl_renderer, "RV530")
-                || strstr(gl_renderer, "RV535")
-                || strstr(gl_renderer, "RV560")
-                || strstr(gl_renderer, "R520")
-                || strstr(gl_renderer, "RV570")
-                || strstr(gl_renderer, "R580"))
-        {
-            return CARD_ATI_RADEON_X1600;
-        }
-
-        /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
-        if (strstr(gl_renderer, "R410")
-                || strstr(gl_renderer, "R420")
-                || strstr(gl_renderer, "R423")
-                || strstr(gl_renderer, "R430")
-                || strstr(gl_renderer, "R480")
-                || strstr(gl_renderer, "R481")
-                || strstr(gl_renderer, "RV410")
-                || strstr(gl_renderer, "RV515")
-                || strstr(gl_renderer, "RV516"))
+        /* 20101109 - These are never returned by current Gallium radeon
+         * drivers: R700, RV790, R680, RV535, RV516, R410, RS485, RV360, RV351.
+         *
+         * These are returned but not handled: RC410, RV380. */
+        static const struct
         {
-            return CARD_ATI_RADEON_X700;
+            const char *renderer;
+            enum wined3d_pci_device id;
         }
-
-        /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */
-        if (strstr(gl_renderer, "RS400")
-                || strstr(gl_renderer, "RS480")
-                || strstr(gl_renderer, "RS482")
-                || strstr(gl_renderer, "RS485")
-                || strstr(gl_renderer, "RS600")
-                || strstr(gl_renderer, "RS690")
-                || strstr(gl_renderer, "RS740"))
+        cards[] =
         {
-            return CARD_ATI_RADEON_XPRESS_200M;
-        }
-
-        /* Radeon R3xx */
-        if (strstr(gl_renderer, "R300")
-                || strstr(gl_renderer, "RV350")
-                || strstr(gl_renderer, "RV351")
-                || strstr(gl_renderer, "RV360")
-                || strstr(gl_renderer, "RV370")
-                || strstr(gl_renderer, "R350")
-                || strstr(gl_renderer, "R360"))
+            /* Evergreen */
+            {"HEMLOCK", CARD_ATI_RADEON_HD5900},
+            {"CYPRESS", CARD_ATI_RADEON_HD5800},
+            {"JUNIPER", CARD_ATI_RADEON_HD5700},
+            {"REDWOOD", CARD_ATI_RADEON_HD5600},
+            {"CEDAR",   CARD_ATI_RADEON_HD5400},
+            /* R700 */
+            {"R700",    CARD_ATI_RADEON_HD4800},    /* HD4800 - highend */
+            {"RV790",   CARD_ATI_RADEON_HD4800},
+            {"RV770",   CARD_ATI_RADEON_HD4800},
+            {"RV740",   CARD_ATI_RADEON_HD4700},    /* HD4700 - midend */
+            {"RV730",   CARD_ATI_RADEON_HD4600},    /* HD4600 - midend */
+            {"RV710",   CARD_ATI_RADEON_HD4350},    /* HD4500/HD4350 - lowend */
+            /* R600/R700 integrated */
+            {"RS880",   CARD_ATI_RADEON_HD3200},
+            {"RS780",   CARD_ATI_RADEON_HD3200},
+            /* R600 */
+            {"R680",    CARD_ATI_RADEON_HD2900},    /* HD2900/HD3800 - highend */
+            {"R600",    CARD_ATI_RADEON_HD2900},
+            {"RV670",   CARD_ATI_RADEON_HD2900},
+            {"RV635",   CARD_ATI_RADEON_HD2600},    /* HD2600/HD3600 - midend; HD3830 is China-only midend */
+            {"RV630",   CARD_ATI_RADEON_HD2600},
+            {"RV620",   CARD_ATI_RADEON_HD2350},    /* HD2350/HD2400/HD3400 - lowend */
+            {"RV610",   CARD_ATI_RADEON_HD2350},
+            /* R500 */
+            {"R580",    CARD_ATI_RADEON_X1600},
+            {"R520",    CARD_ATI_RADEON_X1600},
+            {"RV570",   CARD_ATI_RADEON_X1600},
+            {"RV560",   CARD_ATI_RADEON_X1600},
+            {"RV535",   CARD_ATI_RADEON_X1600},
+            {"RV530",   CARD_ATI_RADEON_X1600},
+            {"RV516",   CARD_ATI_RADEON_X700},      /* X700 is actually R400. */
+            {"RV515",   CARD_ATI_RADEON_X700},
+            /* R400 */
+            {"R481",    CARD_ATI_RADEON_X700},
+            {"R480",    CARD_ATI_RADEON_X700},
+            {"R430",    CARD_ATI_RADEON_X700},
+            {"R423",    CARD_ATI_RADEON_X700},
+            {"R420",    CARD_ATI_RADEON_X700},
+            {"R410",    CARD_ATI_RADEON_X700},
+            {"RV410",   CARD_ATI_RADEON_X700},
+            /* Radeon Xpress - onboard, DX9b, Shader 2.0, 300-400MHz */
+            {"RS740",   CARD_ATI_RADEON_XPRESS_200M},
+            {"RS690",   CARD_ATI_RADEON_XPRESS_200M},
+            {"RS600",   CARD_ATI_RADEON_XPRESS_200M},
+            {"RS485",   CARD_ATI_RADEON_XPRESS_200M},
+            {"RS482",   CARD_ATI_RADEON_XPRESS_200M},
+            {"RS480",   CARD_ATI_RADEON_XPRESS_200M},
+            {"RS400",   CARD_ATI_RADEON_XPRESS_200M},
+            /* R300 */
+            {"R360",    CARD_ATI_RADEON_9500},
+            {"R350",    CARD_ATI_RADEON_9500},
+            {"R300",    CARD_ATI_RADEON_9500},
+            {"RV370",   CARD_ATI_RADEON_9500},
+            {"RV360",   CARD_ATI_RADEON_9500},
+            {"RV351",   CARD_ATI_RADEON_9500},
+            {"RV350",   CARD_ATI_RADEON_9500},
+        };
+
+        for (i = 0; i < sizeof(cards) / sizeof(*cards); ++i)
         {
-            return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */
+            if (strstr(gl_renderer, cards[i].renderer))
+                return cards[i].id;
         }
     }
 
     if (WINE_D3D9_CAPABLE(gl_info))
     {
-        /* Radeon R7xx HD4800 - highend */
-        if (strstr(gl_renderer, "(R700")          /* Radeon R7xx HD48xx generic renderer string */
-                || strstr(gl_renderer, "(RV770")  /* Radeon RV770 */
-                || strstr(gl_renderer, "(RV790"))  /* Radeon RV790 */
+        static const struct
         {
-            return CARD_ATI_RADEON_HD4800;
+            const char *renderer;
+            enum wined3d_pci_device id;
         }
-
-        /* Radeon R740 HD4700 - midend */
-        if (strstr(gl_renderer, "(RV740"))          /* Radeon RV740 */
+        cards[] =
         {
-            return CARD_ATI_RADEON_HD4700;
-        }
-
-        /* Radeon R730 HD4600 - midend */
-        if (strstr(gl_renderer, "(RV730"))        /* Radeon RV730 */
+            /* R700 */
+            {"(R700",   CARD_ATI_RADEON_HD4800},    /* HD4800 - highend */
+            {"(RV790",  CARD_ATI_RADEON_HD4800},
+            {"(RV770",  CARD_ATI_RADEON_HD4800},
+            {"(RV740",  CARD_ATI_RADEON_HD4700},    /* HD4700 - midend */
+            {"(RV730",  CARD_ATI_RADEON_HD4600},    /* HD4600 - midend */
+            {"(RV710",  CARD_ATI_RADEON_HD4350},    /* HD4500/HD4350 - lowend */
+            /* R600/R700 integrated */
+            {"RS880",   CARD_ATI_RADEON_HD3200},
+            {"RS780",   CARD_ATI_RADEON_HD3200},
+            /* R600 */
+            {"(R680",   CARD_ATI_RADEON_HD2900},    /* HD2900/HD3800 - highend */
+            {"(R600",   CARD_ATI_RADEON_HD2900},
+            {"(RV670",  CARD_ATI_RADEON_HD2900},
+            {"(RV635",  CARD_ATI_RADEON_HD2600},    /* HD2600/HD3600 - midend; HD3830 is China-only midend */
+            {"(RV630",  CARD_ATI_RADEON_HD2600},
+            {"(RV620",  CARD_ATI_RADEON_HD2350},    /* HD2300/HD2400/HD3400 - lowend */
+            {"(RV610",  CARD_ATI_RADEON_HD2350},
+        };
+
+        for (i = 0; i < sizeof(cards) / sizeof(*cards); ++i)
         {
-            return CARD_ATI_RADEON_HD4600;
-        }
-
-        /* Radeon R710 HD4500/HD4350 - lowend */
-        if (strstr(gl_renderer, "(RV710"))          /* Radeon RV710 */
-        {
-            return CARD_ATI_RADEON_HD4350;
-        }
-
-        /* Radeon R6xx HD2900/HD3800 - highend */
-        if (strstr(gl_renderer, "(R600")
-                || strstr(gl_renderer, "(RV670")
-                || strstr(gl_renderer, "(R680"))
-        {
-            return CARD_ATI_RADEON_HD2900;
-        }
-
-        /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */
-        if (strstr(gl_renderer, "(RV630")
-                || strstr(gl_renderer, "(RV635"))
-        {
-            return CARD_ATI_RADEON_HD2600;
-        }
-
-        /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
-        if (strstr(gl_renderer, "(RV610")
-                || strstr(gl_renderer, "(RV620"))
-        {
-            return CARD_ATI_RADEON_HD2350;
-        }
-
-        /* Radeon R6xx/R7xx integrated */
-        if (strstr(gl_renderer, "(RS780")
-                || strstr(gl_renderer, "(RS880"))
-        {
-            return CARD_ATI_RADEON_HD3200;
+            if (strstr(gl_renderer, cards[i].renderer))
+                return cards[i].id;
         }
     }
 
-- 
1.7.2.2




More information about the wine-patches mailing list