Home | History | Annotate | Line # | Download | only in isl
      1 /*
      2  * Copyright 2017 Intel Corporation
      3  *
      4  *  Permission is hereby granted, free of charge, to any person obtaining a
      5  *  copy of this software and associated documentation files (the "Software"),
      6  *  to deal in the Software without restriction, including without limitation
      7  *  the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  *  and/or sell copies of the Software, and to permit persons to whom the
      9  *  Software is furnished to do so, subject to the following conditions:
     10  *
     11  *  The above copyright notice and this permission notice (including the next
     12  *  paragraph) shall be included in all copies or substantial portions of the
     13  *  Software.
     14  *
     15  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  *  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  *  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  *  IN THE SOFTWARE.
     22  */
     23 
     24 #include <assert.h>
     25 #include <stdlib.h>
     26 
     27 #include "drm-uapi/drm_fourcc.h"
     28 #include "drm-uapi/i915_drm.h"
     29 
     30 #include "isl.h"
     31 #include "dev/intel_device_info.h"
     32 #include "dev/intel_debug.h"
     33 
     34 uint32_t
     35 isl_tiling_to_i915_tiling(enum isl_tiling tiling)
     36 {
     37    switch (tiling) {
     38    case ISL_TILING_LINEAR:
     39       return I915_TILING_NONE;
     40 
     41    case ISL_TILING_X:
     42       return I915_TILING_X;
     43 
     44    case ISL_TILING_Y0:
     45    case ISL_TILING_HIZ:
     46    case ISL_TILING_CCS:
     47       return I915_TILING_Y;
     48 
     49    case ISL_TILING_W:
     50    case ISL_TILING_Yf:
     51    case ISL_TILING_Ys:
     52    case ISL_TILING_4:
     53    case ISL_TILING_64:
     54    case ISL_TILING_GFX12_CCS:
     55       return I915_TILING_NONE;
     56    }
     57 
     58    unreachable("Invalid ISL tiling");
     59 }
     60 
     61 enum isl_tiling
     62 isl_tiling_from_i915_tiling(uint32_t tiling)
     63 {
     64    switch (tiling) {
     65    case I915_TILING_NONE:
     66       return ISL_TILING_LINEAR;
     67 
     68    case I915_TILING_X:
     69       return ISL_TILING_X;
     70 
     71    case I915_TILING_Y:
     72       return ISL_TILING_Y0;
     73    }
     74 
     75    unreachable("Invalid i915 tiling");
     76 }
     77 
     78 /** Sentinel is DRM_FORMAT_MOD_INVALID. */
     79 const struct isl_drm_modifier_info
     80 isl_drm_modifier_info_list[] = {
     81    {
     82       .modifier = DRM_FORMAT_MOD_NONE,
     83       .name = "DRM_FORMAT_MOD_NONE",
     84       .tiling = ISL_TILING_LINEAR,
     85    },
     86    {
     87       .modifier = I915_FORMAT_MOD_X_TILED,
     88       .name = "I915_FORMAT_MOD_X_TILED",
     89       .tiling = ISL_TILING_X,
     90    },
     91    {
     92       .modifier = I915_FORMAT_MOD_Y_TILED,
     93       .name = "I915_FORMAT_MOD_Y_TILED",
     94       .tiling = ISL_TILING_Y0,
     95    },
     96    {
     97       .modifier = I915_FORMAT_MOD_Y_TILED_CCS,
     98       .name = "I915_FORMAT_MOD_Y_TILED_CCS",
     99       .tiling = ISL_TILING_Y0,
    100       .aux_usage = ISL_AUX_USAGE_CCS_E,
    101       .supports_clear_color = false,
    102    },
    103    {
    104       .modifier = I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS,
    105       .name = "I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS",
    106       .tiling = ISL_TILING_Y0,
    107       .aux_usage = ISL_AUX_USAGE_GFX12_CCS_E,
    108       .supports_clear_color = false,
    109    },
    110    {
    111       .modifier = I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS,
    112       .name = "I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS",
    113       .tiling = ISL_TILING_Y0,
    114       .aux_usage = ISL_AUX_USAGE_MC,
    115       .supports_clear_color = false,
    116    },
    117    {
    118       .modifier = I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC,
    119       .name = "I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS_CC",
    120       .tiling = ISL_TILING_Y0,
    121       .aux_usage = ISL_AUX_USAGE_GFX12_CCS_E,
    122       .supports_clear_color = true,
    123    },
    124    {
    125       .modifier = DRM_FORMAT_MOD_INVALID,
    126    },
    127 };
    128 
    129 const struct isl_drm_modifier_info *
    130 isl_drm_modifier_get_info(uint64_t modifier)
    131 {
    132    isl_drm_modifier_info_for_each(info) {
    133       if (info->modifier == modifier)
    134          return info;
    135    }
    136 
    137    return NULL;
    138 }
    139 
    140 uint32_t
    141 isl_drm_modifier_get_score(const struct intel_device_info *devinfo,
    142                            uint64_t modifier)
    143 {
    144    /* FINISHME: Add gfx12 modifiers */
    145    switch (modifier) {
    146    default:
    147       return 0;
    148    case DRM_FORMAT_MOD_LINEAR:
    149       return 1;
    150    case I915_FORMAT_MOD_X_TILED:
    151       return 2;
    152    case I915_FORMAT_MOD_Y_TILED:
    153       /* Gfx12.5 doesn't have Y-tiling. */
    154       if (devinfo->verx10 >= 125)
    155          return 0;
    156 
    157       return 3;
    158    case I915_FORMAT_MOD_Y_TILED_CCS:
    159       /* Gfx12's CCS layout differs from Gfx9-11. */
    160       if (devinfo->ver >= 12)
    161          return 0;
    162 
    163       if (INTEL_DEBUG(DEBUG_NO_RBC))
    164          return 0;
    165 
    166       return 4;
    167    }
    168 }
    169