Home | History | Annotate | Download | only in etnaviv
      1 /*
      2  * Copyright (c) 2012-2015 Etnaviv Project
      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, sub license,
      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
     12  * next paragraph) shall be included in all copies or substantial portions
     13  * of the 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 NON-INFRINGEMENT. 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
     21  * DEALINGS IN THE SOFTWARE.
     22  *
     23  * Authors:
     24  *    Wladimir J. van der Laan <laanwj (at) gmail.com>
     25  *    Christian Gmeiner <christian.gmeiner (at) gmail.com>
     26  */
     27 
     28 #include "etnaviv_screen.h"
     29 
     30 #include "hw/common.xml.h"
     31 
     32 #include "etnaviv_compiler.h"
     33 #include "etnaviv_context.h"
     34 #include "etnaviv_debug.h"
     35 #include "etnaviv_fence.h"
     36 #include "etnaviv_format.h"
     37 #include "etnaviv_query.h"
     38 #include "etnaviv_resource.h"
     39 #include "etnaviv_translate.h"
     40 
     41 #include "util/os_time.h"
     42 #include "util/u_math.h"
     43 #include "util/u_memory.h"
     44 #include "util/u_string.h"
     45 
     46 #include "state_tracker/drm_driver.h"
     47 
     48 #include <drm_fourcc.h>
     49 
     50 #define ETNA_DRM_VERSION(major, minor) ((major) << 16 | (minor))
     51 #define ETNA_DRM_VERSION_FENCE_FD      ETNA_DRM_VERSION(1, 1)
     52 
     53 static const struct debug_named_value debug_options[] = {
     54    {"dbg_msgs",       ETNA_DBG_MSGS, "Print debug messages"},
     55    {"frame_msgs",     ETNA_DBG_FRAME_MSGS, "Print frame messages"},
     56    {"resource_msgs",  ETNA_DBG_RESOURCE_MSGS, "Print resource messages"},
     57    {"compiler_msgs",  ETNA_DBG_COMPILER_MSGS, "Print compiler messages"},
     58    {"linker_msgs",    ETNA_DBG_LINKER_MSGS, "Print linker messages"},
     59    {"dump_shaders",   ETNA_DBG_DUMP_SHADERS, "Dump shaders"},
     60    {"no_ts",          ETNA_DBG_NO_TS, "Disable TS"},
     61    {"no_autodisable", ETNA_DBG_NO_AUTODISABLE, "Disable autodisable"},
     62    {"no_supertile",   ETNA_DBG_NO_SUPERTILE, "Disable supertiles"},
     63    {"no_early_z",     ETNA_DBG_NO_EARLY_Z, "Disable early z"},
     64    {"cflush_all",     ETNA_DBG_CFLUSH_ALL, "Flush every cash before state update"},
     65    {"msaa2x",         ETNA_DBG_MSAA_2X, "Force 2x msaa"},
     66    {"msaa4x",         ETNA_DBG_MSAA_4X, "Force 4x msaa"},
     67    {"flush_all",      ETNA_DBG_FLUSH_ALL, "Flush after every rendered primitive"},
     68    {"zero",           ETNA_DBG_ZERO, "Zero all resources after allocation"},
     69    {"draw_stall",     ETNA_DBG_DRAW_STALL, "Stall FE/PE after each rendered primitive"},
     70    {"shaderdb",       ETNA_DBG_SHADERDB, "Enable shaderdb output"},
     71    DEBUG_NAMED_VALUE_END
     72 };
     73 
     74 DEBUG_GET_ONCE_FLAGS_OPTION(etna_mesa_debug, "ETNA_MESA_DEBUG", debug_options, 0)
     75 int etna_mesa_debug = 0;
     76 
     77 static void
     78 etna_screen_destroy(struct pipe_screen *pscreen)
     79 {
     80    struct etna_screen *screen = etna_screen(pscreen);
     81 
     82    if (screen->pipe)
     83       etna_pipe_del(screen->pipe);
     84 
     85    if (screen->gpu)
     86       etna_gpu_del(screen->gpu);
     87 
     88    if (screen->ro)
     89       FREE(screen->ro);
     90 
     91    if (screen->dev)
     92       etna_device_del(screen->dev);
     93 
     94    FREE(screen);
     95 }
     96 
     97 static const char *
     98 etna_screen_get_name(struct pipe_screen *pscreen)
     99 {
    100    struct etna_screen *priv = etna_screen(pscreen);
    101    static char buffer[128];
    102 
    103    util_snprintf(buffer, sizeof(buffer), "Vivante GC%x rev %04x", priv->model,
    104                  priv->revision);
    105 
    106    return buffer;
    107 }
    108 
    109 static const char *
    110 etna_screen_get_vendor(struct pipe_screen *pscreen)
    111 {
    112    return "etnaviv";
    113 }
    114 
    115 static const char *
    116 etna_screen_get_device_vendor(struct pipe_screen *pscreen)
    117 {
    118    return "Vivante";
    119 }
    120 
    121 static int
    122 etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    123 {
    124    struct etna_screen *screen = etna_screen(pscreen);
    125 
    126    switch (param) {
    127    /* Supported features (boolean caps). */
    128    case PIPE_CAP_ANISOTROPIC_FILTER:
    129    case PIPE_CAP_POINT_SPRITE:
    130    case PIPE_CAP_BLEND_EQUATION_SEPARATE:
    131    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
    132    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
    133    case PIPE_CAP_SM3:
    134    case PIPE_CAP_TEXTURE_BARRIER:
    135    case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
    136    case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
    137    case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
    138    case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
    139    case PIPE_CAP_TGSI_TEXCOORD:
    140    case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
    141       return 1;
    142    case PIPE_CAP_NATIVE_FENCE_FD:
    143       return screen->drm_version >= ETNA_DRM_VERSION_FENCE_FD;
    144 
    145    /* Memory */
    146    case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
    147       return 256;
    148    case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
    149       return 4; /* XXX could easily be supported */
    150    case PIPE_CAP_GLSL_FEATURE_LEVEL:
    151       return 120;
    152 
    153    case PIPE_CAP_NPOT_TEXTURES:
    154       return true; /* VIV_FEATURE(priv->dev, chipMinorFeatures1,
    155                       NON_POWER_OF_TWO); */
    156 
    157    case PIPE_CAP_TEXTURE_SWIZZLE:
    158    case PIPE_CAP_PRIMITIVE_RESTART:
    159       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
    160 
    161    case PIPE_CAP_ENDIANNESS:
    162       return PIPE_ENDIAN_LITTLE; /* on most Viv hw this is configurable (feature
    163                                     ENDIANNESS_CONFIG) */
    164 
    165    /* Unsupported features. */
    166    case PIPE_CAP_SEAMLESS_CUBE_MAP:
    167    case PIPE_CAP_COMPUTE: /* XXX supported on gc2000 */
    168    case PIPE_CAP_MIXED_COLORBUFFER_FORMATS: /* only one colorbuffer supported, so mixing makes no sense */
    169    case PIPE_CAP_CONDITIONAL_RENDER: /* no occlusion queries */
    170    case PIPE_CAP_TGSI_INSTANCEID: /* no idea, really */
    171    case PIPE_CAP_START_INSTANCE: /* instancing not supported AFAIK */
    172    case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR: /* instancing not supported AFAIK */
    173    case PIPE_CAP_SHADER_STENCIL_EXPORT: /* Fragment shader cannot export stencil value */
    174    case PIPE_CAP_MAX_DUAL_SOURCE_RENDER_TARGETS: /* no dual-source supported */
    175    case PIPE_CAP_TEXTURE_MULTISAMPLE: /* no texture multisample */
    176    case PIPE_CAP_TEXTURE_MIRROR_CLAMP: /* only mirrored repeat */
    177    case PIPE_CAP_INDEP_BLEND_ENABLE:
    178    case PIPE_CAP_INDEP_BLEND_FUNC:
    179    case PIPE_CAP_DEPTH_CLIP_DISABLE:
    180    case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
    181    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
    182    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
    183    case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS: /* Don't skip strict max uniform limit check */
    184    case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
    185    case PIPE_CAP_VERTEX_COLOR_CLAMPED:
    186    case PIPE_CAP_USER_VERTEX_BUFFERS:
    187    case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
    188    case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
    189    case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
    190    case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES: /* TODO: test me out with piglit */
    191    case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
    192    case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
    193    case PIPE_CAP_TEXTURE_GATHER_SM5:
    194    case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
    195    case PIPE_CAP_FAKE_SW_MSAA:
    196    case PIPE_CAP_TEXTURE_QUERY_LOD:
    197    case PIPE_CAP_SAMPLE_SHADING:
    198    case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
    199    case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
    200    case PIPE_CAP_DRAW_INDIRECT:
    201    case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
    202    case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
    203    case PIPE_CAP_SAMPLER_VIEW_TARGET:
    204    case PIPE_CAP_CLIP_HALFZ:
    205    case PIPE_CAP_VERTEXID_NOBASE:
    206    case PIPE_CAP_POLYGON_OFFSET_CLAMP:
    207    case PIPE_CAP_MULTISAMPLE_Z_RESOLVE:
    208    case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
    209    case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
    210    case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
    211    case PIPE_CAP_TEXTURE_FLOAT_LINEAR:
    212    case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR:
    213    case PIPE_CAP_DEPTH_BOUNDS_TEST:
    214    case PIPE_CAP_TGSI_TXQS:
    215    case PIPE_CAP_FORCE_PERSAMPLE_INTERP:
    216    case PIPE_CAP_SHAREABLE_SHADERS:
    217    case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
    218    case PIPE_CAP_CLEAR_TEXTURE:
    219    case PIPE_CAP_DRAW_PARAMETERS:
    220    case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
    221    case PIPE_CAP_MULTI_DRAW_INDIRECT:
    222    case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
    223    case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
    224    case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
    225    case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
    226    case PIPE_CAP_INVALIDATE_BUFFER:
    227    case PIPE_CAP_GENERATE_MIPMAP:
    228    case PIPE_CAP_STRING_MARKER:
    229    case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
    230    case PIPE_CAP_QUERY_BUFFER_OBJECT:
    231    case PIPE_CAP_QUERY_MEMORY_INFO:
    232    case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
    233    case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
    234    case PIPE_CAP_CULL_DISTANCE:
    235    case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
    236    case PIPE_CAP_TGSI_VOTE:
    237    case PIPE_CAP_MAX_WINDOW_RECTANGLES:
    238    case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
    239    case PIPE_CAP_VIEWPORT_SUBPIXEL_BITS:
    240    case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
    241    case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
    242    case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS:
    243    case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
    244    case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
    245    case PIPE_CAP_TGSI_FS_FBFETCH:
    246    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    247    case PIPE_CAP_DOUBLES:
    248    case PIPE_CAP_INT64:
    249    case PIPE_CAP_INT64_DIVMOD:
    250    case PIPE_CAP_TGSI_TEX_TXF_LZ:
    251    case PIPE_CAP_TGSI_CLOCK:
    252    case PIPE_CAP_POLYGON_MODE_FILL_RECTANGLE:
    253    case PIPE_CAP_SPARSE_BUFFER_PAGE_SIZE:
    254    case PIPE_CAP_TGSI_BALLOT:
    255    case PIPE_CAP_TGSI_TES_LAYER_VIEWPORT:
    256    case PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX:
    257    case PIPE_CAP_ALLOW_MAPPED_BUFFERS_DURING_EXECUTION:
    258    case PIPE_CAP_POST_DEPTH_COVERAGE:
    259    case PIPE_CAP_BINDLESS_TEXTURE:
    260    case PIPE_CAP_NIR_SAMPLERS_AS_DEREF:
    261    case PIPE_CAP_QUERY_SO_OVERFLOW:
    262    case PIPE_CAP_MEMOBJ:
    263    case PIPE_CAP_LOAD_CONSTBUF:
    264    case PIPE_CAP_TGSI_ANY_REG_AS_ADDRESS:
    265    case PIPE_CAP_TILE_RASTER_ORDER:
    266    case PIPE_CAP_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
    267    case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:
    268    case PIPE_CAP_CONTEXT_PRIORITY_MASK:
    269       return 0;
    270 
    271    /* Stream output. */
    272    case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS:
    273    case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
    274    case PIPE_CAP_MAX_STREAM_OUTPUT_SEPARATE_COMPONENTS:
    275    case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
    276       return 0;
    277 
    278    /* Geometry shader output, unsupported. */
    279    case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
    280    case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
    281    case PIPE_CAP_MAX_VERTEX_STREAMS:
    282       return 0;
    283 
    284    case PIPE_CAP_MAX_VERTEX_ATTRIB_STRIDE:
    285       return 128;
    286 
    287    /* Texturing. */
    288    case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
    289    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
    290    {
    291       int log2_max_tex_size = util_last_bit(screen->specs.max_texture_size);
    292       assert(log2_max_tex_size > 0);
    293       return log2_max_tex_size;
    294    }
    295    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS: /* 3D textures not supported - fake it */
    296       return 5;
    297    case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
    298       return 0;
    299    case PIPE_CAP_CUBE_MAP_ARRAY:
    300       return 0;
    301    case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
    302    case PIPE_CAP_MIN_TEXEL_OFFSET:
    303       return -8;
    304    case PIPE_CAP_MAX_TEXTURE_GATHER_OFFSET:
    305    case PIPE_CAP_MAX_TEXEL_OFFSET:
    306       return 7;
    307    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
    308       return 0;
    309    case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
    310       return 65536;
    311 
    312    /* Render targets. */
    313    case PIPE_CAP_MAX_RENDER_TARGETS:
    314       return 1;
    315 
    316    /* Viewports and scissors. */
    317    case PIPE_CAP_MAX_VIEWPORTS:
    318       return 1;
    319 
    320    /* Timer queries. */
    321    case PIPE_CAP_QUERY_TIME_ELAPSED:
    322       return 0;
    323    case PIPE_CAP_OCCLUSION_QUERY:
    324       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
    325    case PIPE_CAP_QUERY_TIMESTAMP:
    326       return 1;
    327    case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
    328       return 0;
    329 
    330    /* Preferences */
    331    case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
    332       return 0;
    333 
    334    case PIPE_CAP_PCI_GROUP:
    335    case PIPE_CAP_PCI_BUS:
    336    case PIPE_CAP_PCI_DEVICE:
    337    case PIPE_CAP_PCI_FUNCTION:
    338       return 0;
    339    case PIPE_CAP_VENDOR_ID:
    340    case PIPE_CAP_DEVICE_ID:
    341       return 0xFFFFFFFF;
    342    case PIPE_CAP_ACCELERATED:
    343       return 1;
    344    case PIPE_CAP_VIDEO_MEMORY:
    345       return 0;
    346    case PIPE_CAP_UMA:
    347       return 1;
    348    }
    349 
    350    debug_printf("unknown param %d", param);
    351    return 0;
    352 }
    353 
    354 static float
    355 etna_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_capf param)
    356 {
    357    struct etna_screen *screen = etna_screen(pscreen);
    358 
    359    switch (param) {
    360    case PIPE_CAPF_MAX_LINE_WIDTH:
    361    case PIPE_CAPF_MAX_LINE_WIDTH_AA:
    362    case PIPE_CAPF_MAX_POINT_WIDTH:
    363    case PIPE_CAPF_MAX_POINT_WIDTH_AA:
    364       return 8192.0f;
    365    case PIPE_CAPF_MAX_TEXTURE_ANISOTROPY:
    366       return 16.0f;
    367    case PIPE_CAPF_MAX_TEXTURE_LOD_BIAS:
    368       return util_last_bit(screen->specs.max_texture_size);
    369    case PIPE_CAPF_GUARD_BAND_LEFT:
    370    case PIPE_CAPF_GUARD_BAND_TOP:
    371    case PIPE_CAPF_GUARD_BAND_RIGHT:
    372    case PIPE_CAPF_GUARD_BAND_BOTTOM:
    373       return 0.0f;
    374    }
    375 
    376    debug_printf("unknown paramf %d", param);
    377    return 0;
    378 }
    379 
    380 static int
    381 etna_screen_get_shader_param(struct pipe_screen *pscreen,
    382                              enum pipe_shader_type shader,
    383                              enum pipe_shader_cap param)
    384 {
    385    struct etna_screen *screen = etna_screen(pscreen);
    386 
    387    switch (shader) {
    388    case PIPE_SHADER_FRAGMENT:
    389    case PIPE_SHADER_VERTEX:
    390       break;
    391    case PIPE_SHADER_COMPUTE:
    392    case PIPE_SHADER_GEOMETRY:
    393    case PIPE_SHADER_TESS_CTRL:
    394    case PIPE_SHADER_TESS_EVAL:
    395       return 0;
    396    default:
    397       DBG("unknown shader type %d", shader);
    398       return 0;
    399    }
    400 
    401    switch (param) {
    402    case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
    403    case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
    404    case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
    405    case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
    406       return ETNA_MAX_TOKENS;
    407    case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
    408       return ETNA_MAX_DEPTH; /* XXX */
    409    case PIPE_SHADER_CAP_MAX_INPUTS:
    410       /* Maximum number of inputs for the vertex shader is the number
    411        * of vertex elements - each element defines one vertex shader
    412        * input register.  For the fragment shader, this is the number
    413        * of varyings. */
    414       return shader == PIPE_SHADER_FRAGMENT ? screen->specs.max_varyings
    415                                             : screen->specs.vertex_max_elements;
    416    case PIPE_SHADER_CAP_MAX_OUTPUTS:
    417       return 16; /* see VIVS_VS_OUTPUT */
    418    case PIPE_SHADER_CAP_MAX_TEMPS:
    419       return 64; /* Max native temporaries. */
    420    case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
    421       return 1;
    422    case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
    423       return 1;
    424    case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
    425    case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
    426    case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
    427    case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
    428       return 1;
    429    case PIPE_SHADER_CAP_SUBROUTINES:
    430       return 0;
    431    case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
    432       return VIV_FEATURE(screen, chipMinorFeatures0, HAS_SQRT_TRIG);
    433    case PIPE_SHADER_CAP_INTEGERS:
    434    case PIPE_SHADER_CAP_INT64_ATOMICS:
    435    case PIPE_SHADER_CAP_FP16:
    436       return 0;
    437    case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
    438    case PIPE_SHADER_CAP_MAX_SAMPLER_VIEWS:
    439       return shader == PIPE_SHADER_FRAGMENT
    440                 ? screen->specs.fragment_sampler_count
    441                 : screen->specs.vertex_sampler_count;
    442    case PIPE_SHADER_CAP_PREFERRED_IR:
    443       return PIPE_SHADER_IR_TGSI;
    444    case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
    445       return 4096;
    446    case PIPE_SHADER_CAP_TGSI_DROUND_SUPPORTED:
    447    case PIPE_SHADER_CAP_TGSI_DFRACEXP_DLDEXP_SUPPORTED:
    448    case PIPE_SHADER_CAP_TGSI_LDEXP_SUPPORTED:
    449    case PIPE_SHADER_CAP_TGSI_FMA_SUPPORTED:
    450    case PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE:
    451       return false;
    452    case PIPE_SHADER_CAP_SUPPORTED_IRS:
    453       return 0;
    454    case PIPE_SHADER_CAP_MAX_UNROLL_ITERATIONS_HINT:
    455       return 32;
    456    case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
    457    case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
    458    case PIPE_SHADER_CAP_LOWER_IF_THRESHOLD:
    459    case PIPE_SHADER_CAP_TGSI_SKIP_MERGE_REGISTERS:
    460    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
    461    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
    462       return 0;
    463    }
    464 
    465    debug_printf("unknown shader param %d", param);
    466    return 0;
    467 }
    468 
    469 static uint64_t
    470 etna_screen_get_timestamp(struct pipe_screen *pscreen)
    471 {
    472    return os_time_get_nano();
    473 }
    474 
    475 static bool
    476 gpu_supports_texure_format(struct etna_screen *screen, uint32_t fmt,
    477                            enum pipe_format format)
    478 {
    479    bool supported = true;
    480 
    481    if (fmt == TEXTURE_FORMAT_ETC1)
    482       supported = VIV_FEATURE(screen, chipFeatures, ETC1_TEXTURE_COMPRESSION);
    483 
    484    if (fmt >= TEXTURE_FORMAT_DXT1 && fmt <= TEXTURE_FORMAT_DXT4_DXT5)
    485       supported = VIV_FEATURE(screen, chipFeatures, DXT_TEXTURE_COMPRESSION);
    486 
    487    if (util_format_is_srgb(format))
    488       supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
    489 
    490    if (fmt & EXT_FORMAT) {
    491       supported = VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
    492 
    493       /* ETC1 is checked above, as it has its own feature bit. ETC2 is
    494        * supported with HALTI0, however that implementation is buggy in hardware.
    495        * The blob driver does per-block patching to work around this. As this
    496        * is currently not implemented by etnaviv, enable it for HALTI1 (GC3000)
    497        * only.
    498        */
    499       if (util_format_is_etc(format))
    500          supported = VIV_FEATURE(screen, chipMinorFeatures2, HALTI1);
    501    }
    502 
    503    if (fmt & ASTC_FORMAT) {
    504       supported = screen->specs.tex_astc;
    505    }
    506 
    507    if (!supported)
    508       return false;
    509 
    510    if (texture_format_needs_swiz(format))
    511       return VIV_FEATURE(screen, chipMinorFeatures1, HALTI0);
    512 
    513    return true;
    514 }
    515 
    516 static boolean
    517 etna_screen_is_format_supported(struct pipe_screen *pscreen,
    518                                 enum pipe_format format,
    519                                 enum pipe_texture_target target,
    520                                 unsigned sample_count, unsigned usage)
    521 {
    522    struct etna_screen *screen = etna_screen(pscreen);
    523    unsigned allowed = 0;
    524 
    525    if (target != PIPE_BUFFER &&
    526        target != PIPE_TEXTURE_1D &&
    527        target != PIPE_TEXTURE_2D &&
    528        target != PIPE_TEXTURE_3D &&
    529        target != PIPE_TEXTURE_CUBE &&
    530        target != PIPE_TEXTURE_RECT)
    531       return FALSE;
    532 
    533    if (usage & PIPE_BIND_RENDER_TARGET) {
    534       /* if render target, must be RS-supported format */
    535       if (translate_rs_format(format) != ETNA_NO_MATCH) {
    536          /* Validate MSAA; number of samples must be allowed, and render target
    537           * must have MSAA'able format. */
    538          if (sample_count > 1) {
    539             if (translate_samples_to_xyscale(sample_count, NULL, NULL, NULL) &&
    540                 translate_msaa_format(format) != ETNA_NO_MATCH) {
    541                allowed |= PIPE_BIND_RENDER_TARGET;
    542             }
    543          } else {
    544             allowed |= PIPE_BIND_RENDER_TARGET;
    545          }
    546       }
    547    }
    548 
    549    if (usage & PIPE_BIND_DEPTH_STENCIL) {
    550       if (translate_depth_format(format) != ETNA_NO_MATCH)
    551          allowed |= PIPE_BIND_DEPTH_STENCIL;
    552    }
    553 
    554    if (usage & PIPE_BIND_SAMPLER_VIEW) {
    555       uint32_t fmt = translate_texture_format(format);
    556 
    557       if (!gpu_supports_texure_format(screen, fmt, format))
    558          fmt = ETNA_NO_MATCH;
    559 
    560       if (sample_count < 2 && fmt != ETNA_NO_MATCH)
    561          allowed |= PIPE_BIND_SAMPLER_VIEW;
    562    }
    563 
    564    if (usage & PIPE_BIND_VERTEX_BUFFER) {
    565       if (translate_vertex_format_type(format) != ETNA_NO_MATCH)
    566          allowed |= PIPE_BIND_VERTEX_BUFFER;
    567    }
    568 
    569    if (usage & PIPE_BIND_INDEX_BUFFER) {
    570       /* must be supported index format */
    571       if (format == PIPE_FORMAT_I8_UINT || format == PIPE_FORMAT_I16_UINT ||
    572           (format == PIPE_FORMAT_I32_UINT &&
    573            VIV_FEATURE(screen, chipFeatures, 32_BIT_INDICES))) {
    574          allowed |= PIPE_BIND_INDEX_BUFFER;
    575       }
    576    }
    577 
    578    /* Always allowed */
    579    allowed |=
    580       usage & (PIPE_BIND_DISPLAY_TARGET | PIPE_BIND_SCANOUT | PIPE_BIND_SHARED);
    581 
    582    if (usage != allowed) {
    583       DBG("not supported: format=%s, target=%d, sample_count=%d, "
    584           "usage=%x, allowed=%x",
    585           util_format_name(format), target, sample_count, usage, allowed);
    586    }
    587 
    588    return usage == allowed;
    589 }
    590 
    591 const uint64_t supported_modifiers[] = {
    592    DRM_FORMAT_MOD_LINEAR,
    593    DRM_FORMAT_MOD_VIVANTE_TILED,
    594    DRM_FORMAT_MOD_VIVANTE_SUPER_TILED,
    595    DRM_FORMAT_MOD_VIVANTE_SPLIT_TILED,
    596    DRM_FORMAT_MOD_VIVANTE_SPLIT_SUPER_TILED,
    597 };
    598 
    599 static void
    600 etna_screen_query_dmabuf_modifiers(struct pipe_screen *pscreen,
    601                                    enum pipe_format format, int max,
    602                                    uint64_t *modifiers,
    603                                    unsigned int *external_only, int *count)
    604 {
    605    struct etna_screen *screen = etna_screen(pscreen);
    606    int i, num_modifiers = 0;
    607 
    608    if (max > ARRAY_SIZE(supported_modifiers))
    609       max = ARRAY_SIZE(supported_modifiers);
    610 
    611    if (!max) {
    612       modifiers = NULL;
    613       max = ARRAY_SIZE(supported_modifiers);
    614    }
    615 
    616    for (i = 0; num_modifiers < max; i++) {
    617       /* don't advertise split tiled formats on single pipe/buffer GPUs */
    618       if ((screen->specs.pixel_pipes == 1 || screen->specs.single_buffer) &&
    619           i >= 3)
    620          break;
    621 
    622       if (modifiers)
    623          modifiers[num_modifiers] = supported_modifiers[i];
    624       if (external_only)
    625          external_only[num_modifiers] = 0;
    626       num_modifiers++;
    627    }
    628 
    629    *count = num_modifiers;
    630 }
    631 
    632 static boolean
    633 etna_get_specs(struct etna_screen *screen)
    634 {
    635    uint64_t val;
    636    uint32_t instruction_count;
    637 
    638    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_INSTRUCTION_COUNT, &val)) {
    639       DBG("could not get ETNA_GPU_INSTRUCTION_COUNT");
    640       goto fail;
    641    }
    642    instruction_count = val;
    643 
    644    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_VERTEX_OUTPUT_BUFFER_SIZE,
    645                           &val)) {
    646       DBG("could not get ETNA_GPU_VERTEX_OUTPUT_BUFFER_SIZE");
    647       goto fail;
    648    }
    649    screen->specs.vertex_output_buffer_size = val;
    650 
    651    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_VERTEX_CACHE_SIZE, &val)) {
    652       DBG("could not get ETNA_GPU_VERTEX_CACHE_SIZE");
    653       goto fail;
    654    }
    655    screen->specs.vertex_cache_size = val;
    656 
    657    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_SHADER_CORE_COUNT, &val)) {
    658       DBG("could not get ETNA_GPU_SHADER_CORE_COUNT");
    659       goto fail;
    660    }
    661    screen->specs.shader_core_count = val;
    662 
    663    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_STREAM_COUNT, &val)) {
    664       DBG("could not get ETNA_GPU_STREAM_COUNT");
    665       goto fail;
    666    }
    667    screen->specs.stream_count = val;
    668 
    669    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_REGISTER_MAX, &val)) {
    670       DBG("could not get ETNA_GPU_REGISTER_MAX");
    671       goto fail;
    672    }
    673    screen->specs.max_registers = val;
    674 
    675    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_PIXEL_PIPES, &val)) {
    676       DBG("could not get ETNA_GPU_PIXEL_PIPES");
    677       goto fail;
    678    }
    679    screen->specs.pixel_pipes = val;
    680 
    681    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_NUM_CONSTANTS, &val)) {
    682       DBG("could not get %s", "ETNA_GPU_NUM_CONSTANTS");
    683       goto fail;
    684    }
    685    if (val == 0) {
    686       fprintf(stderr, "Warning: zero num constants (update kernel?)\n");
    687       val = 168;
    688    }
    689    screen->specs.num_constants = val;
    690 
    691    /* Figure out gross GPU architecture. See rnndb/common.xml for a specific
    692     * description of the differences. */
    693    if (VIV_FEATURE(screen, chipMinorFeatures5, HALTI5))
    694       screen->specs.halti = 5; /* New GC7000/GC8x00  */
    695    else if (VIV_FEATURE(screen, chipMinorFeatures5, HALTI4))
    696       screen->specs.halti = 4; /* Old GC7000/GC7400 */
    697    else if (VIV_FEATURE(screen, chipMinorFeatures5, HALTI3))
    698       screen->specs.halti = 3; /* None? */
    699    else if (VIV_FEATURE(screen, chipMinorFeatures4, HALTI2))
    700       screen->specs.halti = 2; /* GC2500/GC3000/GC5000/GC6400 */
    701    else if (VIV_FEATURE(screen, chipMinorFeatures2, HALTI1))
    702       screen->specs.halti = 1; /* GC900/GC4000/GC7000UL */
    703    else if (VIV_FEATURE(screen, chipMinorFeatures1, HALTI0))
    704       screen->specs.halti = 0; /* GC880/GC2000/GC7000TM */
    705    else
    706       screen->specs.halti = -1; /* GC7000nanolite / pre-GC2000 except GC880 */
    707    if (screen->specs.halti >= 0)
    708       DBG("etnaviv: GPU arch: HALTI%d\n", screen->specs.halti);
    709    else
    710       DBG("etnaviv: GPU arch: pre-HALTI\n");
    711 
    712    screen->specs.can_supertile =
    713       VIV_FEATURE(screen, chipMinorFeatures0, SUPER_TILED);
    714    screen->specs.bits_per_tile =
    715       VIV_FEATURE(screen, chipMinorFeatures0, 2BITPERTILE) ? 2 : 4;
    716    screen->specs.ts_clear_value =
    717       VIV_FEATURE(screen, chipMinorFeatures0, 2BITPERTILE) ? 0x55555555
    718                                                            : 0x11111111;
    719 
    720    /* vertex and fragment samplers live in one address space */
    721    screen->specs.vertex_sampler_offset = 8;
    722    screen->specs.fragment_sampler_count = 8;
    723    screen->specs.vertex_sampler_count = 4;
    724    screen->specs.vs_need_z_div =
    725       screen->model < 0x1000 && screen->model != 0x880;
    726    screen->specs.has_sin_cos_sqrt =
    727       VIV_FEATURE(screen, chipMinorFeatures0, HAS_SQRT_TRIG);
    728    screen->specs.has_sign_floor_ceil =
    729       VIV_FEATURE(screen, chipMinorFeatures0, HAS_SIGN_FLOOR_CEIL);
    730    screen->specs.has_shader_range_registers =
    731       screen->model >= 0x1000 || screen->model == 0x880;
    732    screen->specs.npot_tex_any_wrap =
    733       VIV_FEATURE(screen, chipMinorFeatures1, NON_POWER_OF_TWO);
    734    screen->specs.has_new_transcendentals =
    735       VIV_FEATURE(screen, chipMinorFeatures3, HAS_FAST_TRANSCENDENTALS);
    736    screen->specs.has_halti2_instructions =
    737       VIV_FEATURE(screen, chipMinorFeatures4, HALTI2);
    738 
    739    if (screen->specs.halti >= 5) {
    740       /* GC7000 - this core must load shaders from memory. */
    741       screen->specs.vs_offset = 0;
    742       screen->specs.ps_offset = 0;
    743       screen->specs.max_instructions = 0; /* Do not program shaders manually */
    744       screen->specs.has_icache = true;
    745    } else if (VIV_FEATURE(screen, chipMinorFeatures3, INSTRUCTION_CACHE)) {
    746       /* GC3000 - this core is capable of loading shaders from
    747        * memory. It can also run shaders from registers, as a fallback, but
    748        * "max_instructions" does not have the correct value. It has place for
    749        * 2*256 instructions just like GC2000, but the offsets are slightly
    750        * different.
    751        */
    752       screen->specs.vs_offset = 0xC000;
    753       /* State 08000-0C000 mirrors 0C000-0E000, and the Vivante driver uses
    754        * this mirror for writing PS instructions, probably safest to do the
    755        * same.
    756        */
    757       screen->specs.ps_offset = 0x8000 + 0x1000;
    758       screen->specs.max_instructions = 256; /* maximum number instructions for non-icache use */
    759       screen->specs.has_icache = true;
    760    } else {
    761       if (instruction_count > 256) { /* unified instruction memory? */
    762          screen->specs.vs_offset = 0xC000;
    763          screen->specs.ps_offset = 0xD000; /* like vivante driver */
    764          screen->specs.max_instructions = 256;
    765       } else {
    766          screen->specs.vs_offset = 0x4000;
    767          screen->specs.ps_offset = 0x6000;
    768          screen->specs.max_instructions = instruction_count / 2;
    769       }
    770       screen->specs.has_icache = false;
    771    }
    772 
    773    if (VIV_FEATURE(screen, chipMinorFeatures1, HALTI0)) {
    774       screen->specs.max_varyings = 12;
    775       screen->specs.vertex_max_elements = 16;
    776    } else {
    777       screen->specs.max_varyings = 8;
    778       /* Etna_viv documentation seems confused over the correct value
    779        * here so choose the lower to be safe: HALTI0 says 16 i.s.o.
    780        * 10, but VERTEX_ELEMENT_CONFIG register says 16 i.s.o. 12. */
    781       screen->specs.vertex_max_elements = 10;
    782    }
    783 
    784    /* Etna_viv documentation does not indicate where varyings above 8 are
    785     * stored. Moreover, if we are passed more than 8 varyings, we will
    786     * walk off the end of some arrays. Limit the maximum number of varyings. */
    787    if (screen->specs.max_varyings > ETNA_NUM_VARYINGS)
    788       screen->specs.max_varyings = ETNA_NUM_VARYINGS;
    789 
    790    /* from QueryShaderCaps in kernel driver */
    791    if (screen->model < chipModel_GC4000) {
    792       screen->specs.max_vs_uniforms = 168;
    793       screen->specs.max_ps_uniforms = 64;
    794    } else {
    795       screen->specs.max_vs_uniforms = 256;
    796       screen->specs.max_ps_uniforms = 256;
    797    }
    798 
    799    if (screen->specs.halti >= 5) {
    800       screen->specs.has_unified_uniforms = true;
    801       screen->specs.vs_uniforms_offset = VIVS_SH_HALTI5_UNIFORMS_MIRROR(0);
    802       screen->specs.ps_uniforms_offset = VIVS_SH_HALTI5_UNIFORMS(screen->specs.max_vs_uniforms*4);
    803    } else if (screen->specs.halti >= 1) {
    804       /* unified uniform memory on GC3000 - HALTI1 feature bit is just a guess
    805       */
    806       screen->specs.has_unified_uniforms = true;
    807       screen->specs.vs_uniforms_offset = VIVS_SH_UNIFORMS(0);
    808       /* hardcode PS uniforms to start after end of VS uniforms -
    809        * for more flexibility this offset could be variable based on the
    810        * shader.
    811        */
    812       screen->specs.ps_uniforms_offset = VIVS_SH_UNIFORMS(screen->specs.max_vs_uniforms*4);
    813    } else {
    814       screen->specs.has_unified_uniforms = false;
    815       screen->specs.vs_uniforms_offset = VIVS_VS_UNIFORMS(0);
    816       screen->specs.ps_uniforms_offset = VIVS_PS_UNIFORMS(0);
    817    }
    818 
    819    screen->specs.max_texture_size =
    820       VIV_FEATURE(screen, chipMinorFeatures0, TEXTURE_8K) ? 8192 : 2048;
    821    screen->specs.max_rendertarget_size =
    822       VIV_FEATURE(screen, chipMinorFeatures0, RENDERTARGET_8K) ? 8192 : 2048;
    823 
    824    screen->specs.single_buffer = VIV_FEATURE(screen, chipMinorFeatures4, SINGLE_BUFFER);
    825    if (screen->specs.single_buffer)
    826       DBG("etnaviv: Single buffer mode enabled with %d pixel pipes\n", screen->specs.pixel_pipes);
    827 
    828    screen->specs.tex_astc = VIV_FEATURE(screen, chipMinorFeatures4, TEXTURE_ASTC);
    829 
    830    screen->specs.use_blt = VIV_FEATURE(screen, chipMinorFeatures5, BLT_ENGINE);
    831 
    832    return true;
    833 
    834 fail:
    835    return false;
    836 }
    837 
    838 struct etna_bo *
    839 etna_screen_bo_from_handle(struct pipe_screen *pscreen,
    840                            struct winsys_handle *whandle, unsigned *out_stride)
    841 {
    842    struct etna_screen *screen = etna_screen(pscreen);
    843    struct etna_bo *bo;
    844 
    845    if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
    846       bo = etna_bo_from_name(screen->dev, whandle->handle);
    847    } else if (whandle->type == DRM_API_HANDLE_TYPE_FD) {
    848       bo = etna_bo_from_dmabuf(screen->dev, whandle->handle);
    849    } else {
    850       DBG("Attempt to import unsupported handle type %d", whandle->type);
    851       return NULL;
    852    }
    853 
    854    if (!bo) {
    855       DBG("ref name 0x%08x failed", whandle->handle);
    856       return NULL;
    857    }
    858 
    859    *out_stride = whandle->stride;
    860 
    861    return bo;
    862 }
    863 
    864 struct pipe_screen *
    865 etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu,
    866                    struct renderonly *ro)
    867 {
    868    struct etna_screen *screen = CALLOC_STRUCT(etna_screen);
    869    struct pipe_screen *pscreen;
    870    drmVersionPtr version;
    871    uint64_t val;
    872 
    873    if (!screen)
    874       return NULL;
    875 
    876    pscreen = &screen->base;
    877    screen->dev = dev;
    878    screen->gpu = gpu;
    879    screen->ro = renderonly_dup(ro);
    880    screen->refcnt = 1;
    881 
    882    if (!screen->ro) {
    883       DBG("could not create renderonly object");
    884       goto fail;
    885    }
    886 
    887    version = drmGetVersion(screen->ro->gpu_fd);
    888    screen->drm_version = ETNA_DRM_VERSION(version->version_major,
    889                                           version->version_minor);
    890    drmFreeVersion(version);
    891 
    892    etna_mesa_debug = debug_get_option_etna_mesa_debug();
    893 
    894    /* Disable autodisable for correct rendering with TS */
    895    etna_mesa_debug |= ETNA_DBG_NO_AUTODISABLE;
    896 
    897    screen->pipe = etna_pipe_new(gpu, ETNA_PIPE_3D);
    898    if (!screen->pipe) {
    899       DBG("could not create 3d pipe");
    900       goto fail;
    901    }
    902 
    903    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_MODEL, &val)) {
    904       DBG("could not get ETNA_GPU_MODEL");
    905       goto fail;
    906    }
    907    screen->model = val;
    908 
    909    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_REVISION, &val)) {
    910       DBG("could not get ETNA_GPU_REVISION");
    911       goto fail;
    912    }
    913    screen->revision = val;
    914 
    915    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_0, &val)) {
    916       DBG("could not get ETNA_GPU_FEATURES_0");
    917       goto fail;
    918    }
    919    screen->features[0] = val;
    920 
    921    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_1, &val)) {
    922       DBG("could not get ETNA_GPU_FEATURES_1");
    923       goto fail;
    924    }
    925    screen->features[1] = val;
    926 
    927    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_2, &val)) {
    928       DBG("could not get ETNA_GPU_FEATURES_2");
    929       goto fail;
    930    }
    931    screen->features[2] = val;
    932 
    933    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_3, &val)) {
    934       DBG("could not get ETNA_GPU_FEATURES_3");
    935       goto fail;
    936    }
    937    screen->features[3] = val;
    938 
    939    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_4, &val)) {
    940       DBG("could not get ETNA_GPU_FEATURES_4");
    941       goto fail;
    942    }
    943    screen->features[4] = val;
    944 
    945    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_5, &val)) {
    946       DBG("could not get ETNA_GPU_FEATURES_5");
    947       goto fail;
    948    }
    949    screen->features[5] = val;
    950 
    951    if (etna_gpu_get_param(screen->gpu, ETNA_GPU_FEATURES_6, &val)) {
    952       DBG("could not get ETNA_GPU_FEATURES_6");
    953       goto fail;
    954    }
    955    screen->features[6] = val;
    956 
    957    if (!etna_get_specs(screen))
    958       goto fail;
    959 
    960    /* apply debug options that disable individual features */
    961    if (DBG_ENABLED(ETNA_DBG_NO_EARLY_Z))
    962       screen->features[viv_chipFeatures] |= chipFeatures_NO_EARLY_Z;
    963    if (DBG_ENABLED(ETNA_DBG_NO_TS))
    964          screen->features[viv_chipFeatures] &= ~chipFeatures_FAST_CLEAR;
    965    if (DBG_ENABLED(ETNA_DBG_NO_AUTODISABLE))
    966       screen->features[viv_chipMinorFeatures1] &= ~chipMinorFeatures1_AUTO_DISABLE;
    967    if (DBG_ENABLED(ETNA_DBG_NO_SUPERTILE))
    968       screen->specs.can_supertile = 0;
    969 
    970    pscreen->destroy = etna_screen_destroy;
    971    pscreen->get_param = etna_screen_get_param;
    972    pscreen->get_paramf = etna_screen_get_paramf;
    973    pscreen->get_shader_param = etna_screen_get_shader_param;
    974 
    975    pscreen->get_name = etna_screen_get_name;
    976    pscreen->get_vendor = etna_screen_get_vendor;
    977    pscreen->get_device_vendor = etna_screen_get_device_vendor;
    978 
    979    pscreen->get_timestamp = etna_screen_get_timestamp;
    980    pscreen->context_create = etna_context_create;
    981    pscreen->is_format_supported = etna_screen_is_format_supported;
    982    pscreen->query_dmabuf_modifiers = etna_screen_query_dmabuf_modifiers;
    983 
    984    etna_fence_screen_init(pscreen);
    985    etna_query_screen_init(pscreen);
    986    etna_resource_screen_init(pscreen);
    987 
    988    slab_create_parent(&screen->transfer_pool, sizeof(struct etna_transfer), 16);
    989 
    990    return pscreen;
    991 
    992 fail:
    993    etna_screen_destroy(pscreen);
    994    return NULL;
    995 }
    996