Home | History | Annotate | Download | only in r300
      1 /*
      2  * Copyright 2008 Corbin Simpson <MostAwesomeDude (at) gmail.com>
      3  * Copyright 2011 Marek Olk <maraeo (at) gmail.com>
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * on the rights to use, copy, modify, merge, publish, distribute, sub
      9  * license, and/or sell copies of the Software, and to permit persons to whom
     10  * the Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the next
     13  * paragraph) shall be included in all copies or substantial portions of the
     14  * Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     19  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     20  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     21  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     22  * USE OR OTHER DEALINGS IN THE SOFTWARE. */
     23 
     24 #include "r300_chipset.h"
     25 #include "radeon/radeon_winsys.h"
     26 
     27 #include "util/u_debug.h"
     28 #include "util/u_memory.h"
     29 #include "os/os_process.h"
     30 
     31 #include <stdio.h>
     32 #include <errno.h>
     33 
     34 /* r300_chipset: A file all to itself for deducing the various properties of
     35  * Radeons. */
     36 
     37 static void r300_apply_hyperz_blacklist(struct r300_capabilities* caps)
     38 {
     39     static const char *list[] = {
     40         "X",    /* the DDX or indirect rendering */
     41         "Xorg", /* (alternative name) */
     42         "check_gl_texture_size", /* compiz */
     43         "Compiz",
     44         "gnome-session-check-accelerated-helper",
     45         "gnome-shell",
     46         "kwin_opengl_test",
     47         "kwin",
     48         "firefox",
     49     };
     50     int i;
     51     char proc_name[128];
     52 
     53     if (!os_get_process_name(proc_name, sizeof(proc_name)))
     54         return;
     55 
     56     for (i = 0; i < ARRAY_SIZE(list); i++) {
     57         if (strcmp(list[i], proc_name) == 0) {
     58             caps->zmask_ram = 0;
     59             caps->hiz_ram = 0;
     60             break;
     61         }
     62     }
     63 }
     64 
     65 /* Parse a PCI ID and fill an r300_capabilities struct with information. */
     66 void r300_parse_chipset(uint32_t pci_id, struct r300_capabilities* caps)
     67 {
     68     switch (pci_id) {
     69 #define CHIPSET(pci_id, name, chipfamily) \
     70         case pci_id: \
     71             caps->family = CHIP_##chipfamily; \
     72             break;
     73 #include "pci_ids/r300_pci_ids.h"
     74 #undef CHIPSET
     75 
     76     default:
     77         fprintf(stderr, "r300: Warning: Unknown chipset 0x%x\nAborting...",
     78                 pci_id);
     79         abort();
     80     }
     81 
     82     /* Defaults. */
     83     caps->high_second_pipe = FALSE;
     84     caps->num_vert_fpus = 0;
     85     caps->hiz_ram = 0;
     86     caps->zmask_ram = 0;
     87     caps->has_cmask = FALSE;
     88 
     89 
     90     switch (caps->family) {
     91     case CHIP_R300:
     92     case CHIP_R350:
     93         caps->high_second_pipe = TRUE;
     94         caps->num_vert_fpus = 4;
     95         caps->has_cmask = TRUE; /* guessed because there is also HiZ */
     96         caps->hiz_ram = R300_HIZ_LIMIT;
     97         caps->zmask_ram = PIPE_ZMASK_SIZE;
     98         break;
     99 
    100     case CHIP_RV350:
    101     case CHIP_RV370:
    102         caps->high_second_pipe = TRUE;
    103         caps->num_vert_fpus = 2;
    104         caps->zmask_ram = RV3xx_ZMASK_SIZE;
    105         break;
    106 
    107     case CHIP_RV380:
    108         caps->high_second_pipe = TRUE;
    109         caps->num_vert_fpus = 2;
    110         caps->has_cmask = TRUE; /* guessed because there is also HiZ */
    111         caps->hiz_ram = R300_HIZ_LIMIT;
    112         caps->zmask_ram = RV3xx_ZMASK_SIZE;
    113         break;
    114 
    115     case CHIP_RS400:
    116     case CHIP_RS600:
    117     case CHIP_RS690:
    118     case CHIP_RS740:
    119         break;
    120 
    121     case CHIP_RC410:
    122     case CHIP_RS480:
    123         caps->zmask_ram = RV3xx_ZMASK_SIZE;
    124         break;
    125 
    126     case CHIP_R420:
    127     case CHIP_R423:
    128     case CHIP_R430:
    129     case CHIP_R480:
    130     case CHIP_R481:
    131     case CHIP_RV410:
    132         caps->num_vert_fpus = 6;
    133         caps->has_cmask = TRUE; /* guessed because there is also HiZ */
    134         caps->hiz_ram = R300_HIZ_LIMIT;
    135         caps->zmask_ram = PIPE_ZMASK_SIZE;
    136         break;
    137 
    138     case CHIP_R520:
    139         caps->num_vert_fpus = 8;
    140         caps->has_cmask = TRUE;
    141         caps->hiz_ram = R300_HIZ_LIMIT;
    142         caps->zmask_ram = PIPE_ZMASK_SIZE;
    143         break;
    144 
    145     case CHIP_RV515:
    146         caps->num_vert_fpus = 2;
    147         caps->has_cmask = TRUE;
    148         caps->hiz_ram = R300_HIZ_LIMIT;
    149         caps->zmask_ram = PIPE_ZMASK_SIZE;
    150         break;
    151 
    152     case CHIP_RV530:
    153         caps->num_vert_fpus = 5;
    154         caps->has_cmask = TRUE;
    155         caps->hiz_ram = RV530_HIZ_LIMIT;
    156         caps->zmask_ram = PIPE_ZMASK_SIZE;
    157         break;
    158 
    159     case CHIP_R580:
    160     case CHIP_RV560:
    161     case CHIP_RV570:
    162         caps->num_vert_fpus = 8;
    163         caps->has_cmask = TRUE;
    164         caps->hiz_ram = RV530_HIZ_LIMIT;
    165         caps->zmask_ram = PIPE_ZMASK_SIZE;
    166         break;
    167     }
    168 
    169     caps->num_tex_units = 16;
    170     caps->is_r400 = caps->family >= CHIP_R420 && caps->family < CHIP_RV515;
    171     caps->is_r500 = caps->family >= CHIP_RV515;
    172     caps->is_rv350 = caps->family >= CHIP_RV350;
    173     caps->z_compress = caps->is_rv350 ? R300_ZCOMP_8X8 : R300_ZCOMP_4X4;
    174     caps->dxtc_swizzle = caps->is_r400 || caps->is_r500;
    175     caps->has_us_format = caps->family == CHIP_R520;
    176     caps->has_tcl = caps->num_vert_fpus > 0;
    177 
    178     if (caps->has_tcl) {
    179         caps->has_tcl = debug_get_bool_option("RADEON_NO_TCL", FALSE) ? FALSE : TRUE;
    180     }
    181 
    182     r300_apply_hyperz_blacklist(caps);
    183 }
    184