Home | History | Annotate | Download | only in i965
      1 /*
      2  * Copyright 2003 VMware, Inc.
      3  * All Rights Reserved.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sublicense, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     20  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     21  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     22  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     23  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  */
     25 
     26 #include <errno.h>
     27 #include <time.h>
     28 #include <unistd.h>
     29 #include "main/context.h"
     30 #include "main/framebuffer.h"
     31 #include "main/renderbuffer.h"
     32 #include "main/texobj.h"
     33 #include "main/hash.h"
     34 #include "main/fbobject.h"
     35 #include "main/version.h"
     36 #include "swrast/s_renderbuffer.h"
     37 #include "util/ralloc.h"
     38 #include "brw_shader.h"
     39 #include "compiler/nir/nir.h"
     40 
     41 #include "utils.h"
     42 #include "xmlpool.h"
     43 
     44 static const __DRIconfigOptionsExtension brw_config_options = {
     45    .base = { __DRI_CONFIG_OPTIONS, 1 },
     46    .xml =
     47 DRI_CONF_BEGIN
     48    DRI_CONF_SECTION_PERFORMANCE
     49       DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
     50       /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
     51        * DRI_CONF_BO_REUSE_ALL
     52        */
     53       DRI_CONF_OPT_BEGIN_V(bo_reuse, enum, 1, "0:1")
     54 	 DRI_CONF_DESC_BEGIN(en, "Buffer object reuse")
     55 	    DRI_CONF_ENUM(0, "Disable buffer object reuse")
     56 	    DRI_CONF_ENUM(1, "Enable reuse of all sizes of buffer objects")
     57 	 DRI_CONF_DESC_END
     58       DRI_CONF_OPT_END
     59 
     60       DRI_CONF_OPT_BEGIN_B(hiz, "true")
     61 	 DRI_CONF_DESC(en, "Enable Hierarchical Z on gen6+")
     62       DRI_CONF_OPT_END
     63    DRI_CONF_SECTION_END
     64 
     65    DRI_CONF_SECTION_QUALITY
     66       DRI_CONF_FORCE_S3TC_ENABLE("false")
     67 
     68       DRI_CONF_PRECISE_TRIG("false")
     69 
     70       DRI_CONF_OPT_BEGIN(clamp_max_samples, int, -1)
     71               DRI_CONF_DESC(en, "Clamp the value of GL_MAX_SAMPLES to the "
     72                             "given integer. If negative, then do not clamp.")
     73       DRI_CONF_OPT_END
     74    DRI_CONF_SECTION_END
     75 
     76    DRI_CONF_SECTION_DEBUG
     77       DRI_CONF_NO_RAST("false")
     78       DRI_CONF_ALWAYS_FLUSH_BATCH("false")
     79       DRI_CONF_ALWAYS_FLUSH_CACHE("false")
     80       DRI_CONF_DISABLE_THROTTLING("false")
     81       DRI_CONF_FORCE_GLSL_EXTENSIONS_WARN("false")
     82       DRI_CONF_FORCE_GLSL_VERSION(0)
     83       DRI_CONF_DISABLE_GLSL_LINE_CONTINUATIONS("false")
     84       DRI_CONF_DISABLE_BLEND_FUNC_EXTENDED("false")
     85       DRI_CONF_DUAL_COLOR_BLEND_BY_LOCATION("false")
     86       DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER("false")
     87 
     88       DRI_CONF_OPT_BEGIN_B(shader_precompile, "true")
     89 	 DRI_CONF_DESC(en, "Perform code generation at shader link time.")
     90       DRI_CONF_OPT_END
     91    DRI_CONF_SECTION_END
     92 
     93    DRI_CONF_SECTION_MISCELLANEOUS
     94       DRI_CONF_GLSL_ZERO_INIT("false")
     95    DRI_CONF_SECTION_END
     96 DRI_CONF_END
     97 };
     98 
     99 #include "intel_batchbuffer.h"
    100 #include "intel_buffers.h"
    101 #include "intel_bufmgr.h"
    102 #include "intel_fbo.h"
    103 #include "intel_mipmap_tree.h"
    104 #include "intel_screen.h"
    105 #include "intel_tex.h"
    106 #include "intel_image.h"
    107 
    108 #include "brw_context.h"
    109 
    110 #include "i915_drm.h"
    111 
    112 /**
    113  * For debugging purposes, this returns a time in seconds.
    114  */
    115 double
    116 get_time(void)
    117 {
    118    struct timespec tp;
    119 
    120    clock_gettime(CLOCK_MONOTONIC, &tp);
    121 
    122    return tp.tv_sec + tp.tv_nsec / 1000000000.0;
    123 }
    124 
    125 void
    126 aub_dump_bmp(struct gl_context *ctx)
    127 {
    128    struct gl_framebuffer *fb = ctx->DrawBuffer;
    129 
    130    for (unsigned i = 0; i < fb->_NumColorDrawBuffers; i++) {
    131       struct intel_renderbuffer *irb =
    132 	 intel_renderbuffer(fb->_ColorDrawBuffers[i]);
    133 
    134       if (irb && irb->mt) {
    135 	 enum aub_dump_bmp_format format;
    136 
    137 	 switch (irb->Base.Base.Format) {
    138 	 case MESA_FORMAT_B8G8R8A8_UNORM:
    139 	 case MESA_FORMAT_B8G8R8X8_UNORM:
    140 	    format = AUB_DUMP_BMP_FORMAT_ARGB_8888;
    141 	    break;
    142 	 default:
    143 	    continue;
    144 	 }
    145 
    146          drm_intel_gem_bo_aub_dump_bmp(irb->mt->bo,
    147 				       irb->draw_x,
    148 				       irb->draw_y,
    149 				       irb->Base.Base.Width,
    150 				       irb->Base.Base.Height,
    151 				       format,
    152 				       irb->mt->pitch,
    153 				       0);
    154       }
    155    }
    156 }
    157 
    158 static const __DRItexBufferExtension intelTexBufferExtension = {
    159    .base = { __DRI_TEX_BUFFER, 3 },
    160 
    161    .setTexBuffer        = intelSetTexBuffer,
    162    .setTexBuffer2       = intelSetTexBuffer2,
    163    .releaseTexBuffer    = NULL,
    164 };
    165 
    166 static void
    167 intel_dri2_flush_with_flags(__DRIcontext *cPriv,
    168                             __DRIdrawable *dPriv,
    169                             unsigned flags,
    170                             enum __DRI2throttleReason reason)
    171 {
    172    struct brw_context *brw = cPriv->driverPrivate;
    173 
    174    if (!brw)
    175       return;
    176 
    177    struct gl_context *ctx = &brw->ctx;
    178 
    179    FLUSH_VERTICES(ctx, 0);
    180 
    181    if (flags & __DRI2_FLUSH_DRAWABLE)
    182       intel_resolve_for_dri2_flush(brw, dPriv);
    183 
    184    if (reason == __DRI2_THROTTLE_SWAPBUFFER)
    185       brw->need_swap_throttle = true;
    186    if (reason == __DRI2_THROTTLE_FLUSHFRONT)
    187       brw->need_flush_throttle = true;
    188 
    189    intel_batchbuffer_flush(brw);
    190 
    191    if (INTEL_DEBUG & DEBUG_AUB) {
    192       aub_dump_bmp(ctx);
    193    }
    194 }
    195 
    196 /**
    197  * Provides compatibility with loaders that only support the older (version
    198  * 1-3) flush interface.
    199  *
    200  * That includes libGL up to Mesa 9.0, and the X Server at least up to 1.13.
    201  */
    202 static void
    203 intel_dri2_flush(__DRIdrawable *drawable)
    204 {
    205    intel_dri2_flush_with_flags(drawable->driContextPriv, drawable,
    206                                __DRI2_FLUSH_DRAWABLE,
    207                                __DRI2_THROTTLE_SWAPBUFFER);
    208 }
    209 
    210 static const struct __DRI2flushExtensionRec intelFlushExtension = {
    211     .base = { __DRI2_FLUSH, 4 },
    212 
    213     .flush              = intel_dri2_flush,
    214     .invalidate         = dri2InvalidateDrawable,
    215     .flush_with_flags   = intel_dri2_flush_with_flags,
    216 };
    217 
    218 static struct intel_image_format intel_image_formats[] = {
    219    { __DRI_IMAGE_FOURCC_ARGB8888, __DRI_IMAGE_COMPONENTS_RGBA, 1,
    220      { { 0, 0, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } },
    221 
    222    { __DRI_IMAGE_FOURCC_ABGR8888, __DRI_IMAGE_COMPONENTS_RGBA, 1,
    223      { { 0, 0, 0, __DRI_IMAGE_FORMAT_ABGR8888, 4 } } },
    224 
    225    { __DRI_IMAGE_FOURCC_SARGB8888, __DRI_IMAGE_COMPONENTS_RGBA, 1,
    226      { { 0, 0, 0, __DRI_IMAGE_FORMAT_SARGB8, 4 } } },
    227 
    228    { __DRI_IMAGE_FOURCC_XRGB8888, __DRI_IMAGE_COMPONENTS_RGB, 1,
    229      { { 0, 0, 0, __DRI_IMAGE_FORMAT_XRGB8888, 4 }, } },
    230 
    231    { __DRI_IMAGE_FOURCC_XBGR8888, __DRI_IMAGE_COMPONENTS_RGB, 1,
    232      { { 0, 0, 0, __DRI_IMAGE_FORMAT_XBGR8888, 4 }, } },
    233 
    234    { __DRI_IMAGE_FOURCC_ARGB1555, __DRI_IMAGE_COMPONENTS_RGBA, 1,
    235      { { 0, 0, 0, __DRI_IMAGE_FORMAT_ARGB1555, 2 } } },
    236 
    237    { __DRI_IMAGE_FOURCC_RGB565, __DRI_IMAGE_COMPONENTS_RGB, 1,
    238      { { 0, 0, 0, __DRI_IMAGE_FORMAT_RGB565, 2 } } },
    239 
    240    { __DRI_IMAGE_FOURCC_R8, __DRI_IMAGE_COMPONENTS_R, 1,
    241      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 }, } },
    242 
    243    { __DRI_IMAGE_FOURCC_GR88, __DRI_IMAGE_COMPONENTS_RG, 1,
    244      { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR88, 2 }, } },
    245 
    246    { __DRI_IMAGE_FOURCC_YUV410, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    247      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    248        { 1, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 },
    249        { 2, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 } } },
    250 
    251    { __DRI_IMAGE_FOURCC_YUV411, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    252      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    253        { 1, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    254        { 2, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
    255 
    256    { __DRI_IMAGE_FOURCC_YUV420, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    257      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    258        { 1, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 },
    259        { 2, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 } } },
    260 
    261    { __DRI_IMAGE_FOURCC_YUV422, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    262      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    263        { 1, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    264        { 2, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
    265 
    266    { __DRI_IMAGE_FOURCC_YUV444, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    267      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    268        { 1, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    269        { 2, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
    270 
    271    { __DRI_IMAGE_FOURCC_YVU410, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    272      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    273        { 2, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 },
    274        { 1, 2, 2, __DRI_IMAGE_FORMAT_R8, 1 } } },
    275 
    276    { __DRI_IMAGE_FOURCC_YVU411, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    277      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    278        { 2, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    279        { 1, 2, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
    280 
    281    { __DRI_IMAGE_FOURCC_YVU420, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    282      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    283        { 2, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 },
    284        { 1, 1, 1, __DRI_IMAGE_FORMAT_R8, 1 } } },
    285 
    286    { __DRI_IMAGE_FOURCC_YVU422, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    287      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    288        { 2, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    289        { 1, 1, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
    290 
    291    { __DRI_IMAGE_FOURCC_YVU444, __DRI_IMAGE_COMPONENTS_Y_U_V, 3,
    292      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    293        { 2, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    294        { 1, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 } } },
    295 
    296    { __DRI_IMAGE_FOURCC_NV12, __DRI_IMAGE_COMPONENTS_Y_UV, 2,
    297      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    298        { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88, 2 } } },
    299 
    300    { __DRI_IMAGE_FOURCC_NV16, __DRI_IMAGE_COMPONENTS_Y_UV, 2,
    301      { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8, 1 },
    302        { 1, 1, 0, __DRI_IMAGE_FORMAT_GR88, 2 } } },
    303 
    304    /* For YUYV buffers, we set up two overlapping DRI images and treat
    305     * them as planar buffers in the compositors.  Plane 0 is GR88 and
    306     * samples YU or YV pairs and places Y into the R component, while
    307     * plane 1 is ARGB and samples YUYV clusters and places pairs and
    308     * places U into the G component and V into A.  This lets the
    309     * texture sampler interpolate the Y components correctly when
    310     * sampling from plane 0, and interpolate U and V correctly when
    311     * sampling from plane 1. */
    312    { __DRI_IMAGE_FOURCC_YUYV, __DRI_IMAGE_COMPONENTS_Y_XUXV, 2,
    313      { { 0, 0, 0, __DRI_IMAGE_FORMAT_GR88, 2 },
    314        { 0, 1, 0, __DRI_IMAGE_FORMAT_ARGB8888, 4 } } }
    315 };
    316 
    317 static void
    318 intel_image_warn_if_unaligned(__DRIimage *image, const char *func)
    319 {
    320    uint32_t tiling, swizzle;
    321    drm_intel_bo_get_tiling(image->bo, &tiling, &swizzle);
    322 
    323    if (tiling != I915_TILING_NONE && (image->offset & 0xfff)) {
    324       _mesa_warning(NULL, "%s: offset 0x%08x not on tile boundary",
    325                     func, image->offset);
    326    }
    327 }
    328 
    329 static struct intel_image_format *
    330 intel_image_format_lookup(int fourcc)
    331 {
    332    struct intel_image_format *f = NULL;
    333 
    334    for (unsigned i = 0; i < ARRAY_SIZE(intel_image_formats); i++) {
    335       if (intel_image_formats[i].fourcc == fourcc) {
    336 	 f = &intel_image_formats[i];
    337 	 break;
    338       }
    339    }
    340 
    341    return f;
    342 }
    343 
    344 static boolean intel_lookup_fourcc(int dri_format, int *fourcc)
    345 {
    346    for (unsigned i = 0; i < ARRAY_SIZE(intel_image_formats); i++) {
    347       if (intel_image_formats[i].planes[0].dri_format == dri_format) {
    348          *fourcc = intel_image_formats[i].fourcc;
    349          return true;
    350       }
    351    }
    352    return false;
    353 }
    354 
    355 static __DRIimage *
    356 intel_allocate_image(int dri_format, void *loaderPrivate)
    357 {
    358     __DRIimage *image;
    359 
    360     image = calloc(1, sizeof *image);
    361     if (image == NULL)
    362 	return NULL;
    363 
    364     image->dri_format = dri_format;
    365     image->offset = 0;
    366 
    367     image->format = driImageFormatToGLFormat(dri_format);
    368     if (dri_format != __DRI_IMAGE_FORMAT_NONE &&
    369         image->format == MESA_FORMAT_NONE) {
    370        free(image);
    371        return NULL;
    372     }
    373 
    374     image->internal_format = _mesa_get_format_base_format(image->format);
    375     image->data = loaderPrivate;
    376 
    377     return image;
    378 }
    379 
    380 /**
    381  * Sets up a DRIImage structure to point to a slice out of a miptree.
    382  */
    383 static void
    384 intel_setup_image_from_mipmap_tree(struct brw_context *brw, __DRIimage *image,
    385                                    struct intel_mipmap_tree *mt, GLuint level,
    386                                    GLuint zoffset)
    387 {
    388    intel_miptree_make_shareable(brw, mt);
    389 
    390    intel_miptree_check_level_layer(mt, level, zoffset);
    391 
    392    image->width = minify(mt->physical_width0, level - mt->first_level);
    393    image->height = minify(mt->physical_height0, level - mt->first_level);
    394    image->pitch = mt->pitch;
    395 
    396    image->offset = intel_miptree_get_tile_offsets(mt, level, zoffset,
    397                                                   &image->tile_x,
    398                                                   &image->tile_y);
    399 
    400    drm_intel_bo_unreference(image->bo);
    401    image->bo = mt->bo;
    402    drm_intel_bo_reference(mt->bo);
    403 }
    404 
    405 static __DRIimage *
    406 intel_create_image_from_name(__DRIscreen *dri_screen,
    407 			     int width, int height, int format,
    408 			     int name, int pitch, void *loaderPrivate)
    409 {
    410     struct intel_screen *screen = dri_screen->driverPrivate;
    411     __DRIimage *image;
    412     int cpp;
    413 
    414     image = intel_allocate_image(format, loaderPrivate);
    415     if (image == NULL)
    416        return NULL;
    417 
    418     if (image->format == MESA_FORMAT_NONE)
    419        cpp = 1;
    420     else
    421        cpp = _mesa_get_format_bytes(image->format);
    422 
    423     image->width = width;
    424     image->height = height;
    425     image->pitch = pitch * cpp;
    426     image->bo = drm_intel_bo_gem_create_from_name(screen->bufmgr, "image",
    427                                                   name);
    428     if (!image->bo) {
    429        free(image);
    430        return NULL;
    431     }
    432 
    433     return image;
    434 }
    435 
    436 static __DRIimage *
    437 intel_create_image_from_renderbuffer(__DRIcontext *context,
    438 				     int renderbuffer, void *loaderPrivate)
    439 {
    440    __DRIimage *image;
    441    struct brw_context *brw = context->driverPrivate;
    442    struct gl_context *ctx = &brw->ctx;
    443    struct gl_renderbuffer *rb;
    444    struct intel_renderbuffer *irb;
    445 
    446    rb = _mesa_lookup_renderbuffer(ctx, renderbuffer);
    447    if (!rb) {
    448       _mesa_error(ctx, GL_INVALID_OPERATION, "glRenderbufferExternalMESA");
    449       return NULL;
    450    }
    451 
    452    irb = intel_renderbuffer(rb);
    453    intel_miptree_make_shareable(brw, irb->mt);
    454    image = calloc(1, sizeof *image);
    455    if (image == NULL)
    456       return NULL;
    457 
    458    image->internal_format = rb->InternalFormat;
    459    image->format = rb->Format;
    460    image->offset = 0;
    461    image->data = loaderPrivate;
    462    drm_intel_bo_unreference(image->bo);
    463    image->bo = irb->mt->bo;
    464    drm_intel_bo_reference(irb->mt->bo);
    465    image->width = rb->Width;
    466    image->height = rb->Height;
    467    image->pitch = irb->mt->pitch;
    468    image->dri_format = driGLFormatToImageFormat(image->format);
    469    image->has_depthstencil = irb->mt->stencil_mt? true : false;
    470 
    471    rb->NeedsFinishRenderTexture = true;
    472    return image;
    473 }
    474 
    475 static __DRIimage *
    476 intel_create_image_from_texture(__DRIcontext *context, int target,
    477                                 unsigned texture, int zoffset,
    478                                 int level,
    479                                 unsigned *error,
    480                                 void *loaderPrivate)
    481 {
    482    __DRIimage *image;
    483    struct brw_context *brw = context->driverPrivate;
    484    struct gl_texture_object *obj;
    485    struct intel_texture_object *iobj;
    486    GLuint face = 0;
    487 
    488    obj = _mesa_lookup_texture(&brw->ctx, texture);
    489    if (!obj || obj->Target != target) {
    490       *error = __DRI_IMAGE_ERROR_BAD_PARAMETER;
    491       return NULL;
    492    }
    493 
    494    if (target == GL_TEXTURE_CUBE_MAP)
    495       face = zoffset;
    496 
    497    _mesa_test_texobj_completeness(&brw->ctx, obj);
    498    iobj = intel_texture_object(obj);
    499    if (!obj->_BaseComplete || (level > 0 && !obj->_MipmapComplete)) {
    500       *error = __DRI_IMAGE_ERROR_BAD_PARAMETER;
    501       return NULL;
    502    }
    503 
    504    if (level < obj->BaseLevel || level > obj->_MaxLevel) {
    505       *error = __DRI_IMAGE_ERROR_BAD_MATCH;
    506       return NULL;
    507    }
    508 
    509    if (target == GL_TEXTURE_3D && obj->Image[face][level]->Depth < zoffset) {
    510       *error = __DRI_IMAGE_ERROR_BAD_MATCH;
    511       return NULL;
    512    }
    513    image = calloc(1, sizeof *image);
    514    if (image == NULL) {
    515       *error = __DRI_IMAGE_ERROR_BAD_ALLOC;
    516       return NULL;
    517    }
    518 
    519    image->internal_format = obj->Image[face][level]->InternalFormat;
    520    image->format = obj->Image[face][level]->TexFormat;
    521    image->data = loaderPrivate;
    522    intel_setup_image_from_mipmap_tree(brw, image, iobj->mt, level, zoffset);
    523    image->dri_format = driGLFormatToImageFormat(image->format);
    524    image->has_depthstencil = iobj->mt->stencil_mt? true : false;
    525    if (image->dri_format == MESA_FORMAT_NONE) {
    526       *error = __DRI_IMAGE_ERROR_BAD_PARAMETER;
    527       free(image);
    528       return NULL;
    529    }
    530 
    531    *error = __DRI_IMAGE_ERROR_SUCCESS;
    532    return image;
    533 }
    534 
    535 static void
    536 intel_destroy_image(__DRIimage *image)
    537 {
    538    drm_intel_bo_unreference(image->bo);
    539    free(image);
    540 }
    541 
    542 static __DRIimage *
    543 intel_create_image(__DRIscreen *dri_screen,
    544 		   int width, int height, int format,
    545 		   unsigned int use,
    546 		   void *loaderPrivate)
    547 {
    548    __DRIimage *image;
    549    struct intel_screen *screen = dri_screen->driverPrivate;
    550    uint32_t tiling;
    551    int cpp;
    552    unsigned long pitch;
    553 
    554    tiling = I915_TILING_X;
    555    if (use & __DRI_IMAGE_USE_CURSOR) {
    556       if (width != 64 || height != 64)
    557 	 return NULL;
    558       tiling = I915_TILING_NONE;
    559    }
    560 
    561    if (use & __DRI_IMAGE_USE_LINEAR)
    562       tiling = I915_TILING_NONE;
    563 
    564    image = intel_allocate_image(format, loaderPrivate);
    565    if (image == NULL)
    566       return NULL;
    567 
    568    cpp = _mesa_get_format_bytes(image->format);
    569    image->bo = drm_intel_bo_alloc_tiled(screen->bufmgr, "image",
    570                                         width, height, cpp, &tiling,
    571                                         &pitch, 0);
    572    if (image->bo == NULL) {
    573       free(image);
    574       return NULL;
    575    }
    576    image->width = width;
    577    image->height = height;
    578    image->pitch = pitch;
    579 
    580    return image;
    581 }
    582 
    583 static GLboolean
    584 intel_query_image(__DRIimage *image, int attrib, int *value)
    585 {
    586    switch (attrib) {
    587    case __DRI_IMAGE_ATTRIB_STRIDE:
    588       *value = image->pitch;
    589       return true;
    590    case __DRI_IMAGE_ATTRIB_HANDLE:
    591       *value = image->bo->handle;
    592       return true;
    593    case __DRI_IMAGE_ATTRIB_NAME:
    594       return !drm_intel_bo_flink(image->bo, (uint32_t *) value);
    595    case __DRI_IMAGE_ATTRIB_FORMAT:
    596       *value = image->dri_format;
    597       return true;
    598    case __DRI_IMAGE_ATTRIB_WIDTH:
    599       *value = image->width;
    600       return true;
    601    case __DRI_IMAGE_ATTRIB_HEIGHT:
    602       *value = image->height;
    603       return true;
    604    case __DRI_IMAGE_ATTRIB_COMPONENTS:
    605       if (image->planar_format == NULL)
    606          return false;
    607       *value = image->planar_format->components;
    608       return true;
    609    case __DRI_IMAGE_ATTRIB_FD:
    610       return !drm_intel_bo_gem_export_to_prime(image->bo, value);
    611    case __DRI_IMAGE_ATTRIB_FOURCC:
    612       return intel_lookup_fourcc(image->dri_format, value);
    613    case __DRI_IMAGE_ATTRIB_NUM_PLANES:
    614       *value = 1;
    615       return true;
    616    case __DRI_IMAGE_ATTRIB_OFFSET:
    617       *value = image->offset;
    618       return true;
    619 
    620   default:
    621       return false;
    622    }
    623 }
    624 
    625 static __DRIimage *
    626 intel_dup_image(__DRIimage *orig_image, void *loaderPrivate)
    627 {
    628    __DRIimage *image;
    629 
    630    image = calloc(1, sizeof *image);
    631    if (image == NULL)
    632       return NULL;
    633 
    634    drm_intel_bo_reference(orig_image->bo);
    635    image->bo              = orig_image->bo;
    636    image->internal_format = orig_image->internal_format;
    637    image->planar_format   = orig_image->planar_format;
    638    image->dri_format      = orig_image->dri_format;
    639    image->format          = orig_image->format;
    640    image->offset          = orig_image->offset;
    641    image->width           = orig_image->width;
    642    image->height          = orig_image->height;
    643    image->pitch           = orig_image->pitch;
    644    image->tile_x          = orig_image->tile_x;
    645    image->tile_y          = orig_image->tile_y;
    646    image->has_depthstencil = orig_image->has_depthstencil;
    647    image->data            = loaderPrivate;
    648 
    649    memcpy(image->strides, orig_image->strides, sizeof(image->strides));
    650    memcpy(image->offsets, orig_image->offsets, sizeof(image->offsets));
    651 
    652    return image;
    653 }
    654 
    655 static GLboolean
    656 intel_validate_usage(__DRIimage *image, unsigned int use)
    657 {
    658    if (use & __DRI_IMAGE_USE_CURSOR) {
    659       if (image->width != 64 || image->height != 64)
    660 	 return GL_FALSE;
    661    }
    662 
    663    return GL_TRUE;
    664 }
    665 
    666 static __DRIimage *
    667 intel_create_image_from_names(__DRIscreen *dri_screen,
    668                               int width, int height, int fourcc,
    669                               int *names, int num_names,
    670                               int *strides, int *offsets,
    671                               void *loaderPrivate)
    672 {
    673     struct intel_image_format *f = NULL;
    674     __DRIimage *image;
    675     int i, index;
    676 
    677     if (dri_screen == NULL || names == NULL || num_names != 1)
    678         return NULL;
    679 
    680     f = intel_image_format_lookup(fourcc);
    681     if (f == NULL)
    682         return NULL;
    683 
    684     image = intel_create_image_from_name(dri_screen, width, height,
    685                                          __DRI_IMAGE_FORMAT_NONE,
    686                                          names[0], strides[0],
    687                                          loaderPrivate);
    688 
    689    if (image == NULL)
    690       return NULL;
    691 
    692     image->planar_format = f;
    693     for (i = 0; i < f->nplanes; i++) {
    694         index = f->planes[i].buffer_index;
    695         image->offsets[index] = offsets[index];
    696         image->strides[index] = strides[index];
    697     }
    698 
    699     return image;
    700 }
    701 
    702 static __DRIimage *
    703 intel_create_image_from_fds(__DRIscreen *dri_screen,
    704                             int width, int height, int fourcc,
    705                             int *fds, int num_fds, int *strides, int *offsets,
    706                             void *loaderPrivate)
    707 {
    708    struct intel_screen *screen = dri_screen->driverPrivate;
    709    struct intel_image_format *f;
    710    __DRIimage *image;
    711    int i, index;
    712 
    713    if (fds == NULL || num_fds < 1)
    714       return NULL;
    715 
    716    /* We only support all planes from the same bo */
    717    for (i = 0; i < num_fds; i++)
    718       if (fds[0] != fds[i])
    719          return NULL;
    720 
    721    f = intel_image_format_lookup(fourcc);
    722    if (f == NULL)
    723       return NULL;
    724 
    725    if (f->nplanes == 1)
    726       image = intel_allocate_image(f->planes[0].dri_format, loaderPrivate);
    727    else
    728       image = intel_allocate_image(__DRI_IMAGE_FORMAT_NONE, loaderPrivate);
    729 
    730    if (image == NULL)
    731       return NULL;
    732 
    733    image->width = width;
    734    image->height = height;
    735    image->pitch = strides[0];
    736 
    737    image->planar_format = f;
    738    int size = 0;
    739    for (i = 0; i < f->nplanes; i++) {
    740       index = f->planes[i].buffer_index;
    741       image->offsets[index] = offsets[index];
    742       image->strides[index] = strides[index];
    743 
    744       const int plane_height = height >> f->planes[i].height_shift;
    745       const int end = offsets[index] + plane_height * strides[index];
    746       if (size < end)
    747          size = end;
    748    }
    749 
    750    image->bo = drm_intel_bo_gem_create_from_prime(screen->bufmgr,
    751                                                   fds[0], size);
    752    if (image->bo == NULL) {
    753       free(image);
    754       return NULL;
    755    }
    756 
    757    if (f->nplanes == 1) {
    758       image->offset = image->offsets[0];
    759       intel_image_warn_if_unaligned(image, __func__);
    760    }
    761 
    762    return image;
    763 }
    764 
    765 static __DRIimage *
    766 intel_create_image_from_dma_bufs(__DRIscreen *dri_screen,
    767                                  int width, int height, int fourcc,
    768                                  int *fds, int num_fds,
    769                                  int *strides, int *offsets,
    770                                  enum __DRIYUVColorSpace yuv_color_space,
    771                                  enum __DRISampleRange sample_range,
    772                                  enum __DRIChromaSiting horizontal_siting,
    773                                  enum __DRIChromaSiting vertical_siting,
    774                                  unsigned *error,
    775                                  void *loaderPrivate)
    776 {
    777    __DRIimage *image;
    778    struct intel_image_format *f = intel_image_format_lookup(fourcc);
    779 
    780    if (!f) {
    781       *error = __DRI_IMAGE_ERROR_BAD_MATCH;
    782       return NULL;
    783    }
    784 
    785    image = intel_create_image_from_fds(dri_screen, width, height, fourcc, fds,
    786                                        num_fds, strides, offsets,
    787                                        loaderPrivate);
    788 
    789    /*
    790     * Invalid parameters and any inconsistencies between are assumed to be
    791     * checked by the caller. Therefore besides unsupported formats one can fail
    792     * only in allocation.
    793     */
    794    if (!image) {
    795       *error = __DRI_IMAGE_ERROR_BAD_ALLOC;
    796       return NULL;
    797    }
    798 
    799    image->dma_buf_imported = true;
    800    image->yuv_color_space = yuv_color_space;
    801    image->sample_range = sample_range;
    802    image->horizontal_siting = horizontal_siting;
    803    image->vertical_siting = vertical_siting;
    804 
    805    *error = __DRI_IMAGE_ERROR_SUCCESS;
    806    return image;
    807 }
    808 
    809 static __DRIimage *
    810 intel_from_planar(__DRIimage *parent, int plane, void *loaderPrivate)
    811 {
    812     int width, height, offset, stride, dri_format, index;
    813     struct intel_image_format *f;
    814     __DRIimage *image;
    815 
    816     if (parent == NULL || parent->planar_format == NULL)
    817         return NULL;
    818 
    819     f = parent->planar_format;
    820 
    821     if (plane >= f->nplanes)
    822         return NULL;
    823 
    824     width = parent->width >> f->planes[plane].width_shift;
    825     height = parent->height >> f->planes[plane].height_shift;
    826     dri_format = f->planes[plane].dri_format;
    827     index = f->planes[plane].buffer_index;
    828     offset = parent->offsets[index];
    829     stride = parent->strides[index];
    830 
    831     image = intel_allocate_image(dri_format, loaderPrivate);
    832     if (image == NULL)
    833        return NULL;
    834 
    835     if (offset + height * stride > parent->bo->size) {
    836        _mesa_warning(NULL, "intel_create_sub_image: subimage out of bounds");
    837        free(image);
    838        return NULL;
    839     }
    840 
    841     image->bo = parent->bo;
    842     drm_intel_bo_reference(parent->bo);
    843 
    844     image->width = width;
    845     image->height = height;
    846     image->pitch = stride;
    847     image->offset = offset;
    848 
    849     intel_image_warn_if_unaligned(image, __func__);
    850 
    851     return image;
    852 }
    853 
    854 static const __DRIimageExtension intelImageExtension = {
    855     .base = { __DRI_IMAGE, 13 },
    856 
    857     .createImageFromName                = intel_create_image_from_name,
    858     .createImageFromRenderbuffer        = intel_create_image_from_renderbuffer,
    859     .destroyImage                       = intel_destroy_image,
    860     .createImage                        = intel_create_image,
    861     .queryImage                         = intel_query_image,
    862     .dupImage                           = intel_dup_image,
    863     .validateUsage                      = intel_validate_usage,
    864     .createImageFromNames               = intel_create_image_from_names,
    865     .fromPlanar                         = intel_from_planar,
    866     .createImageFromTexture             = intel_create_image_from_texture,
    867     .createImageFromFds                 = intel_create_image_from_fds,
    868     .createImageFromDmaBufs             = intel_create_image_from_dma_bufs,
    869     .blitImage                          = NULL,
    870     .getCapabilities                    = NULL,
    871     .mapImage                           = NULL,
    872     .unmapImage                         = NULL,
    873 };
    874 
    875 static int
    876 brw_query_renderer_integer(__DRIscreen *dri_screen,
    877                            int param, unsigned int *value)
    878 {
    879    const struct intel_screen *const screen =
    880       (struct intel_screen *) dri_screen->driverPrivate;
    881 
    882    switch (param) {
    883    case __DRI2_RENDERER_VENDOR_ID:
    884       value[0] = 0x8086;
    885       return 0;
    886    case __DRI2_RENDERER_DEVICE_ID:
    887       value[0] = screen->deviceID;
    888       return 0;
    889    case __DRI2_RENDERER_ACCELERATED:
    890       value[0] = 1;
    891       return 0;
    892    case __DRI2_RENDERER_VIDEO_MEMORY: {
    893       /* Once a batch uses more than 75% of the maximum mappable size, we
    894        * assume that there's some fragmentation, and we start doing extra
    895        * flushing, etc.  That's the big cliff apps will care about.
    896        */
    897       size_t aper_size;
    898       size_t mappable_size;
    899 
    900       drm_intel_get_aperture_sizes(dri_screen->fd, &mappable_size, &aper_size);
    901 
    902       const unsigned gpu_mappable_megabytes =
    903          (aper_size / (1024 * 1024)) * 3 / 4;
    904 
    905       const long system_memory_pages = sysconf(_SC_PHYS_PAGES);
    906       const long system_page_size = sysconf(_SC_PAGE_SIZE);
    907 
    908       if (system_memory_pages <= 0 || system_page_size <= 0)
    909          return -1;
    910 
    911       const uint64_t system_memory_bytes = (uint64_t) system_memory_pages
    912          * (uint64_t) system_page_size;
    913 
    914       const unsigned system_memory_megabytes =
    915          (unsigned) (system_memory_bytes / (1024 * 1024));
    916 
    917       value[0] = MIN2(system_memory_megabytes, gpu_mappable_megabytes);
    918       return 0;
    919    }
    920    case __DRI2_RENDERER_UNIFIED_MEMORY_ARCHITECTURE:
    921       value[0] = 1;
    922       return 0;
    923    case __DRI2_RENDERER_HAS_TEXTURE_3D:
    924       value[0] = 1;
    925       return 0;
    926    default:
    927       return driQueryRendererIntegerCommon(dri_screen, param, value);
    928    }
    929 
    930    return -1;
    931 }
    932 
    933 static int
    934 brw_query_renderer_string(__DRIscreen *dri_screen,
    935                           int param, const char **value)
    936 {
    937    const struct intel_screen *screen =
    938       (struct intel_screen *) dri_screen->driverPrivate;
    939 
    940    switch (param) {
    941    case __DRI2_RENDERER_VENDOR_ID:
    942       value[0] = brw_vendor_string;
    943       return 0;
    944    case __DRI2_RENDERER_DEVICE_ID:
    945       value[0] = brw_get_renderer_string(screen);
    946       return 0;
    947    default:
    948       break;
    949    }
    950 
    951    return -1;
    952 }
    953 
    954 static const __DRI2rendererQueryExtension intelRendererQueryExtension = {
    955    .base = { __DRI2_RENDERER_QUERY, 1 },
    956 
    957    .queryInteger = brw_query_renderer_integer,
    958    .queryString = brw_query_renderer_string
    959 };
    960 
    961 static const __DRIrobustnessExtension dri2Robustness = {
    962    .base = { __DRI2_ROBUSTNESS, 1 }
    963 };
    964 
    965 static const __DRIextension *screenExtensions[] = {
    966     &intelTexBufferExtension.base,
    967     &intelFenceExtension.base,
    968     &intelFlushExtension.base,
    969     &intelImageExtension.base,
    970     &intelRendererQueryExtension.base,
    971     &dri2ConfigQueryExtension.base,
    972     NULL
    973 };
    974 
    975 static const __DRIextension *intelRobustScreenExtensions[] = {
    976     &intelTexBufferExtension.base,
    977     &intelFenceExtension.base,
    978     &intelFlushExtension.base,
    979     &intelImageExtension.base,
    980     &intelRendererQueryExtension.base,
    981     &dri2ConfigQueryExtension.base,
    982     &dri2Robustness.base,
    983     NULL
    984 };
    985 
    986 static int
    987 intel_get_param(struct intel_screen *screen, int param, int *value)
    988 {
    989    int ret = 0;
    990    struct drm_i915_getparam gp;
    991 
    992    memset(&gp, 0, sizeof(gp));
    993    gp.param = param;
    994    gp.value = value;
    995 
    996    if (drmIoctl(screen->driScrnPriv->fd, DRM_IOCTL_I915_GETPARAM, &gp) == -1) {
    997       ret = -errno;
    998       if (ret != -EINVAL)
    999          _mesa_warning(NULL, "drm_i915_getparam: %d", ret);
   1000    }
   1001 
   1002    return ret;
   1003 }
   1004 
   1005 static bool
   1006 intel_get_boolean(struct intel_screen *screen, int param)
   1007 {
   1008    int value = 0;
   1009    return (intel_get_param(screen, param, &value) == 0) && value;
   1010 }
   1011 
   1012 static int
   1013 intel_get_integer(struct intel_screen *screen, int param)
   1014 {
   1015    int value = -1;
   1016 
   1017    if (intel_get_param(screen, param, &value) == 0)
   1018       return value;
   1019 
   1020    return -1;
   1021 }
   1022 
   1023 static void
   1024 intelDestroyScreen(__DRIscreen * sPriv)
   1025 {
   1026    struct intel_screen *screen = sPriv->driverPrivate;
   1027 
   1028    dri_bufmgr_destroy(screen->bufmgr);
   1029    driDestroyOptionInfo(&screen->optionCache);
   1030 
   1031    ralloc_free(screen);
   1032    sPriv->driverPrivate = NULL;
   1033 }
   1034 
   1035 
   1036 /**
   1037  * This is called when we need to set up GL rendering to a new X window.
   1038  */
   1039 static GLboolean
   1040 intelCreateBuffer(__DRIscreen *dri_screen,
   1041                   __DRIdrawable * driDrawPriv,
   1042                   const struct gl_config * mesaVis, GLboolean isPixmap)
   1043 {
   1044    struct intel_renderbuffer *rb;
   1045    struct intel_screen *screen = (struct intel_screen *)
   1046       dri_screen->driverPrivate;
   1047    mesa_format rgbFormat;
   1048    unsigned num_samples =
   1049       intel_quantize_num_samples(screen, mesaVis->samples);
   1050    struct gl_framebuffer *fb;
   1051 
   1052    if (isPixmap)
   1053       return false;
   1054 
   1055    fb = CALLOC_STRUCT(gl_framebuffer);
   1056    if (!fb)
   1057       return false;
   1058 
   1059    _mesa_initialize_window_framebuffer(fb, mesaVis);
   1060 
   1061    if (screen->winsys_msaa_samples_override != -1) {
   1062       num_samples = screen->winsys_msaa_samples_override;
   1063       fb->Visual.samples = num_samples;
   1064    }
   1065 
   1066    if (mesaVis->redBits == 5) {
   1067       rgbFormat = mesaVis->redMask == 0x1f ? MESA_FORMAT_R5G6B5_UNORM
   1068                                            : MESA_FORMAT_B5G6R5_UNORM;
   1069    } else if (mesaVis->sRGBCapable) {
   1070       rgbFormat = mesaVis->redMask == 0xff ? MESA_FORMAT_R8G8B8A8_SRGB
   1071                                            : MESA_FORMAT_B8G8R8A8_SRGB;
   1072    } else if (mesaVis->alphaBits == 0) {
   1073       rgbFormat = mesaVis->redMask == 0xff ? MESA_FORMAT_R8G8B8X8_UNORM
   1074                                            : MESA_FORMAT_B8G8R8X8_UNORM;
   1075    } else {
   1076       rgbFormat = mesaVis->redMask == 0xff ? MESA_FORMAT_R8G8B8A8_SRGB
   1077                                            : MESA_FORMAT_B8G8R8A8_SRGB;
   1078       fb->Visual.sRGBCapable = true;
   1079    }
   1080 
   1081    /* setup the hardware-based renderbuffers */
   1082    rb = intel_create_renderbuffer(rgbFormat, num_samples);
   1083    _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base.Base);
   1084 
   1085    if (mesaVis->doubleBufferMode) {
   1086       rb = intel_create_renderbuffer(rgbFormat, num_samples);
   1087       _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base.Base);
   1088    }
   1089 
   1090    /*
   1091     * Assert here that the gl_config has an expected depth/stencil bit
   1092     * combination: one of d24/s8, d16/s0, d0/s0. (See intelInitScreen2(),
   1093     * which constructs the advertised configs.)
   1094     */
   1095    if (mesaVis->depthBits == 24) {
   1096       assert(mesaVis->stencilBits == 8);
   1097 
   1098       if (screen->devinfo.has_hiz_and_separate_stencil) {
   1099          rb = intel_create_private_renderbuffer(MESA_FORMAT_Z24_UNORM_X8_UINT,
   1100                                                 num_samples);
   1101          _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
   1102          rb = intel_create_private_renderbuffer(MESA_FORMAT_S_UINT8,
   1103                                                 num_samples);
   1104          _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base);
   1105       } else {
   1106          /*
   1107           * Use combined depth/stencil. Note that the renderbuffer is
   1108           * attached to two attachment points.
   1109           */
   1110          rb = intel_create_private_renderbuffer(MESA_FORMAT_Z24_UNORM_S8_UINT,
   1111                                                 num_samples);
   1112          _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
   1113          _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &rb->Base.Base);
   1114       }
   1115    }
   1116    else if (mesaVis->depthBits == 16) {
   1117       assert(mesaVis->stencilBits == 0);
   1118       rb = intel_create_private_renderbuffer(MESA_FORMAT_Z_UNORM16,
   1119                                              num_samples);
   1120       _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &rb->Base.Base);
   1121    }
   1122    else {
   1123       assert(mesaVis->depthBits == 0);
   1124       assert(mesaVis->stencilBits == 0);
   1125    }
   1126 
   1127    /* now add any/all software-based renderbuffers we may need */
   1128    _swrast_add_soft_renderbuffers(fb,
   1129                                   false, /* never sw color */
   1130                                   false, /* never sw depth */
   1131                                   false, /* never sw stencil */
   1132                                   mesaVis->accumRedBits > 0,
   1133                                   false, /* never sw alpha */
   1134                                   false  /* never sw aux */ );
   1135    driDrawPriv->driverPrivate = fb;
   1136 
   1137    return true;
   1138 }
   1139 
   1140 static void
   1141 intelDestroyBuffer(__DRIdrawable * driDrawPriv)
   1142 {
   1143     struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
   1144 
   1145     _mesa_reference_framebuffer(&fb, NULL);
   1146 }
   1147 
   1148 static void
   1149 intel_detect_sseu(struct intel_screen *screen)
   1150 {
   1151    assert(screen->devinfo.gen >= 8);
   1152    int ret;
   1153 
   1154    screen->subslice_total = -1;
   1155    screen->eu_total = -1;
   1156 
   1157    ret = intel_get_param(screen, I915_PARAM_SUBSLICE_TOTAL,
   1158                          &screen->subslice_total);
   1159    if (ret < 0 && ret != -EINVAL)
   1160       goto err_out;
   1161 
   1162    ret = intel_get_param(screen,
   1163                          I915_PARAM_EU_TOTAL, &screen->eu_total);
   1164    if (ret < 0 && ret != -EINVAL)
   1165       goto err_out;
   1166 
   1167    /* Without this information, we cannot get the right Braswell brandstrings,
   1168     * and we have to use conservative numbers for GPGPU on many platforms, but
   1169     * otherwise, things will just work.
   1170     */
   1171    if (screen->subslice_total < 1 || screen->eu_total < 1)
   1172       _mesa_warning(NULL,
   1173                     "Kernel 4.1 required to properly query GPU properties.\n");
   1174 
   1175    return;
   1176 
   1177 err_out:
   1178    screen->subslice_total = -1;
   1179    screen->eu_total = -1;
   1180    _mesa_warning(NULL, "Failed to query GPU properties (%s).\n", strerror(-ret));
   1181 }
   1182 
   1183 static bool
   1184 intel_init_bufmgr(struct intel_screen *screen)
   1185 {
   1186    __DRIscreen *dri_screen = screen->driScrnPriv;
   1187 
   1188    screen->no_hw = getenv("INTEL_NO_HW") != NULL;
   1189 
   1190    screen->bufmgr = intel_bufmgr_gem_init(dri_screen->fd, BATCH_SZ);
   1191    if (screen->bufmgr == NULL) {
   1192       fprintf(stderr, "[%s:%u] Error initializing buffer manager.\n",
   1193 	      __func__, __LINE__);
   1194       return false;
   1195    }
   1196 
   1197    drm_intel_bufmgr_gem_enable_fenced_relocs(screen->bufmgr);
   1198 
   1199    if (!intel_get_boolean(screen, I915_PARAM_HAS_RELAXED_DELTA)) {
   1200       fprintf(stderr, "[%s: %u] Kernel 2.6.39 required.\n", __func__, __LINE__);
   1201       return false;
   1202    }
   1203 
   1204    return true;
   1205 }
   1206 
   1207 static bool
   1208 intel_detect_swizzling(struct intel_screen *screen)
   1209 {
   1210    drm_intel_bo *buffer;
   1211    unsigned long flags = 0;
   1212    unsigned long aligned_pitch;
   1213    uint32_t tiling = I915_TILING_X;
   1214    uint32_t swizzle_mode = 0;
   1215 
   1216    buffer = drm_intel_bo_alloc_tiled(screen->bufmgr, "swizzle test",
   1217 				     64, 64, 4,
   1218 				     &tiling, &aligned_pitch, flags);
   1219    if (buffer == NULL)
   1220       return false;
   1221 
   1222    drm_intel_bo_get_tiling(buffer, &tiling, &swizzle_mode);
   1223    drm_intel_bo_unreference(buffer);
   1224 
   1225    if (swizzle_mode == I915_BIT_6_SWIZZLE_NONE)
   1226       return false;
   1227    else
   1228       return true;
   1229 }
   1230 
   1231 static int
   1232 intel_detect_timestamp(struct intel_screen *screen)
   1233 {
   1234    uint64_t dummy = 0, last = 0;
   1235    int upper, lower, loops;
   1236 
   1237    /* On 64bit systems, some old kernels trigger a hw bug resulting in the
   1238     * TIMESTAMP register being shifted and the low 32bits always zero.
   1239     *
   1240     * More recent kernels offer an interface to read the full 36bits
   1241     * everywhere.
   1242     */
   1243    if (drm_intel_reg_read(screen->bufmgr, TIMESTAMP | 1, &dummy) == 0)
   1244       return 3;
   1245 
   1246    /* Determine if we have a 32bit or 64bit kernel by inspecting the
   1247     * upper 32bits for a rapidly changing timestamp.
   1248     */
   1249    if (drm_intel_reg_read(screen->bufmgr, TIMESTAMP, &last))
   1250       return 0;
   1251 
   1252    upper = lower = 0;
   1253    for (loops = 0; loops < 10; loops++) {
   1254       /* The TIMESTAMP should change every 80ns, so several round trips
   1255        * through the kernel should be enough to advance it.
   1256        */
   1257       if (drm_intel_reg_read(screen->bufmgr, TIMESTAMP, &dummy))
   1258          return 0;
   1259 
   1260       upper += (dummy >> 32) != (last >> 32);
   1261       if (upper > 1) /* beware 32bit counter overflow */
   1262          return 2; /* upper dword holds the low 32bits of the timestamp */
   1263 
   1264       lower += (dummy & 0xffffffff) != (last & 0xffffffff);
   1265       if (lower > 1)
   1266          return 1; /* timestamp is unshifted */
   1267 
   1268       last = dummy;
   1269    }
   1270 
   1271    /* No advancement? No timestamp! */
   1272    return 0;
   1273 }
   1274 
   1275  /**
   1276  * Test if we can use MI_LOAD_REGISTER_MEM from an untrusted batchbuffer.
   1277  *
   1278  * Some combinations of hardware and kernel versions allow this feature,
   1279  * while others don't.  Instead of trying to enumerate every case, just
   1280  * try and write a register and see if works.
   1281  */
   1282 static bool
   1283 intel_detect_pipelined_register(struct intel_screen *screen,
   1284                                 int reg, uint32_t expected_value, bool reset)
   1285 {
   1286    drm_intel_bo *results, *bo;
   1287    uint32_t *batch;
   1288    uint32_t offset = 0;
   1289    bool success = false;
   1290 
   1291    /* Create a zero'ed temporary buffer for reading our results */
   1292    results = drm_intel_bo_alloc(screen->bufmgr, "registers", 4096, 0);
   1293    if (results == NULL)
   1294       goto err;
   1295 
   1296    bo = drm_intel_bo_alloc(screen->bufmgr, "batchbuffer", 4096, 0);
   1297    if (bo == NULL)
   1298       goto err_results;
   1299 
   1300    if (drm_intel_bo_map(bo, 1))
   1301       goto err_batch;
   1302 
   1303    batch = bo->virtual;
   1304 
   1305    /* Write the register. */
   1306    *batch++ = MI_LOAD_REGISTER_IMM | (3 - 2);
   1307    *batch++ = reg;
   1308    *batch++ = expected_value;
   1309 
   1310    /* Save the register's value back to the buffer. */
   1311    *batch++ = MI_STORE_REGISTER_MEM | (3 - 2);
   1312    *batch++ = reg;
   1313    drm_intel_bo_emit_reloc(bo, (char *)batch -(char *)bo->virtual,
   1314                            results, offset*sizeof(uint32_t),
   1315                            I915_GEM_DOMAIN_INSTRUCTION,
   1316                            I915_GEM_DOMAIN_INSTRUCTION);
   1317    *batch++ = results->offset + offset*sizeof(uint32_t);
   1318 
   1319    /* And afterwards clear the register */
   1320    if (reset) {
   1321       *batch++ = MI_LOAD_REGISTER_IMM | (3 - 2);
   1322       *batch++ = reg;
   1323       *batch++ = 0;
   1324    }
   1325 
   1326    *batch++ = MI_BATCH_BUFFER_END;
   1327 
   1328    drm_intel_bo_mrb_exec(bo, ALIGN((char *)batch - (char *)bo->virtual, 8),
   1329                          NULL, 0, 0,
   1330                          I915_EXEC_RENDER);
   1331 
   1332    /* Check whether the value got written. */
   1333    if (drm_intel_bo_map(results, false) == 0) {
   1334       success = *((uint32_t *)results->virtual + offset) == expected_value;
   1335       drm_intel_bo_unmap(results);
   1336    }
   1337 
   1338 err_batch:
   1339    drm_intel_bo_unreference(bo);
   1340 err_results:
   1341    drm_intel_bo_unreference(results);
   1342 err:
   1343    return success;
   1344 }
   1345 
   1346 static bool
   1347 intel_detect_pipelined_so(struct intel_screen *screen)
   1348 {
   1349    const struct gen_device_info *devinfo = &screen->devinfo;
   1350 
   1351    /* Supposedly, Broadwell just works. */
   1352    if (devinfo->gen >= 8)
   1353       return true;
   1354 
   1355    if (devinfo->gen <= 6)
   1356       return false;
   1357 
   1358    /* See the big explanation about command parser versions below */
   1359    if (screen->cmd_parser_version >= (devinfo->is_haswell ? 7 : 2))
   1360       return true;
   1361 
   1362    /* We use SO_WRITE_OFFSET0 since you're supposed to write it (unlike the
   1363     * statistics registers), and we already reset it to zero before using it.
   1364     */
   1365    return intel_detect_pipelined_register(screen,
   1366                                           GEN7_SO_WRITE_OFFSET(0),
   1367                                           0x1337d0d0,
   1368                                           false);
   1369 }
   1370 
   1371 /**
   1372  * Return array of MSAA modes supported by the hardware. The array is
   1373  * zero-terminated and sorted in decreasing order.
   1374  */
   1375 const int*
   1376 intel_supported_msaa_modes(const struct intel_screen  *screen)
   1377 {
   1378    static const int gen9_modes[] = {16, 8, 4, 2, 0, -1};
   1379    static const int gen8_modes[] = {8, 4, 2, 0, -1};
   1380    static const int gen7_modes[] = {8, 4, 0, -1};
   1381    static const int gen6_modes[] = {4, 0, -1};
   1382    static const int gen4_modes[] = {0, -1};
   1383 
   1384    if (screen->devinfo.gen >= 9) {
   1385       return gen9_modes;
   1386    } else if (screen->devinfo.gen >= 8) {
   1387       return gen8_modes;
   1388    } else if (screen->devinfo.gen >= 7) {
   1389       return gen7_modes;
   1390    } else if (screen->devinfo.gen == 6) {
   1391       return gen6_modes;
   1392    } else {
   1393       return gen4_modes;
   1394    }
   1395 }
   1396 
   1397 static __DRIconfig**
   1398 intel_screen_make_configs(__DRIscreen *dri_screen)
   1399 {
   1400    static const mesa_format formats[] = {
   1401       MESA_FORMAT_B5G6R5_UNORM,
   1402       MESA_FORMAT_B8G8R8A8_UNORM,
   1403       MESA_FORMAT_B8G8R8X8_UNORM
   1404    };
   1405 
   1406    /* GLX_SWAP_COPY_OML is not supported due to page flipping. */
   1407    static const GLenum back_buffer_modes[] = {
   1408        GLX_SWAP_UNDEFINED_OML, GLX_NONE,
   1409    };
   1410 
   1411    static const uint8_t singlesample_samples[1] = {0};
   1412    static const uint8_t multisample_samples[2]  = {4, 8};
   1413 
   1414    struct intel_screen *screen = dri_screen->driverPrivate;
   1415    const struct gen_device_info *devinfo = &screen->devinfo;
   1416    uint8_t depth_bits[4], stencil_bits[4];
   1417    __DRIconfig **configs = NULL;
   1418 
   1419    /* Generate singlesample configs without accumulation buffer. */
   1420    for (unsigned i = 0; i < ARRAY_SIZE(formats); i++) {
   1421       __DRIconfig **new_configs;
   1422       int num_depth_stencil_bits = 2;
   1423 
   1424       /* Starting with DRI2 protocol version 1.1 we can request a depth/stencil
   1425        * buffer that has a different number of bits per pixel than the color
   1426        * buffer, gen >= 6 supports this.
   1427        */
   1428       depth_bits[0] = 0;
   1429       stencil_bits[0] = 0;
   1430 
   1431       if (formats[i] == MESA_FORMAT_B5G6R5_UNORM) {
   1432          depth_bits[1] = 16;
   1433          stencil_bits[1] = 0;
   1434          if (devinfo->gen >= 6) {
   1435              depth_bits[2] = 24;
   1436              stencil_bits[2] = 8;
   1437              num_depth_stencil_bits = 3;
   1438          }
   1439       } else {
   1440          depth_bits[1] = 24;
   1441          stencil_bits[1] = 8;
   1442       }
   1443 
   1444       new_configs = driCreateConfigs(formats[i],
   1445                                      depth_bits,
   1446                                      stencil_bits,
   1447                                      num_depth_stencil_bits,
   1448                                      back_buffer_modes, 2,
   1449                                      singlesample_samples, 1,
   1450                                      false, false);
   1451       configs = driConcatConfigs(configs, new_configs);
   1452    }
   1453 
   1454    /* Generate the minimum possible set of configs that include an
   1455     * accumulation buffer.
   1456     */
   1457    for (unsigned i = 0; i < ARRAY_SIZE(formats); i++) {
   1458       __DRIconfig **new_configs;
   1459 
   1460       if (formats[i] == MESA_FORMAT_B5G6R5_UNORM) {
   1461          depth_bits[0] = 16;
   1462          stencil_bits[0] = 0;
   1463       } else {
   1464          depth_bits[0] = 24;
   1465          stencil_bits[0] = 8;
   1466       }
   1467 
   1468       new_configs = driCreateConfigs(formats[i],
   1469                                      depth_bits, stencil_bits, 1,
   1470                                      back_buffer_modes, 1,
   1471                                      singlesample_samples, 1,
   1472                                      true, false);
   1473       configs = driConcatConfigs(configs, new_configs);
   1474    }
   1475 
   1476    /* Generate multisample configs.
   1477     *
   1478     * This loop breaks early, and hence is a no-op, on gen < 6.
   1479     *
   1480     * Multisample configs must follow the singlesample configs in order to
   1481     * work around an X server bug present in 1.12. The X server chooses to
   1482     * associate the first listed RGBA888-Z24S8 config, regardless of its
   1483     * sample count, with the 32-bit depth visual used for compositing.
   1484     *
   1485     * Only doublebuffer configs with GLX_SWAP_UNDEFINED_OML behavior are
   1486     * supported.  Singlebuffer configs are not supported because no one wants
   1487     * them.
   1488     */
   1489    for (unsigned i = 0; i < ARRAY_SIZE(formats); i++) {
   1490       if (devinfo->gen < 6)
   1491          break;
   1492 
   1493       __DRIconfig **new_configs;
   1494       const int num_depth_stencil_bits = 2;
   1495       int num_msaa_modes = 0;
   1496 
   1497       depth_bits[0] = 0;
   1498       stencil_bits[0] = 0;
   1499 
   1500       if (formats[i] == MESA_FORMAT_B5G6R5_UNORM) {
   1501          depth_bits[1] = 16;
   1502          stencil_bits[1] = 0;
   1503       } else {
   1504          depth_bits[1] = 24;
   1505          stencil_bits[1] = 8;
   1506       }
   1507 
   1508       if (devinfo->gen >= 7)
   1509          num_msaa_modes = 2;
   1510       else if (devinfo->gen == 6)
   1511          num_msaa_modes = 1;
   1512 
   1513       new_configs = driCreateConfigs(formats[i],
   1514                                      depth_bits,
   1515                                      stencil_bits,
   1516                                      num_depth_stencil_bits,
   1517                                      back_buffer_modes, 1,
   1518                                      multisample_samples,
   1519                                      num_msaa_modes,
   1520                                      false, false);
   1521       configs = driConcatConfigs(configs, new_configs);
   1522    }
   1523 
   1524    if (configs == NULL) {
   1525       fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,
   1526               __LINE__);
   1527       return NULL;
   1528    }
   1529 
   1530    return configs;
   1531 }
   1532 
   1533 static void
   1534 set_max_gl_versions(struct intel_screen *screen)
   1535 {
   1536    __DRIscreen *dri_screen = screen->driScrnPriv;
   1537    const bool has_astc = screen->devinfo.gen >= 9;
   1538 
   1539    switch (screen->devinfo.gen) {
   1540    case 9:
   1541    case 8:
   1542       dri_screen->max_gl_core_version = 45;
   1543       dri_screen->max_gl_compat_version = 30;
   1544       dri_screen->max_gl_es1_version = 11;
   1545       dri_screen->max_gl_es2_version = has_astc ? 32 : 31;
   1546       break;
   1547    case 7:
   1548       dri_screen->max_gl_core_version = 33;
   1549       if (screen->devinfo.is_haswell &&
   1550           can_do_pipelined_register_writes(screen)) {
   1551          dri_screen->max_gl_core_version = 42;
   1552          if (can_do_compute_dispatch(screen))
   1553             dri_screen->max_gl_core_version = 43;
   1554          if (can_do_mi_math_and_lrr(screen))
   1555             dri_screen->max_gl_core_version = 45;
   1556       }
   1557       dri_screen->max_gl_compat_version = 30;
   1558       dri_screen->max_gl_es1_version = 11;
   1559       dri_screen->max_gl_es2_version = screen->devinfo.is_haswell ? 31 : 30;
   1560       break;
   1561    case 6:
   1562       dri_screen->max_gl_core_version = 33;
   1563       dri_screen->max_gl_compat_version = 30;
   1564       dri_screen->max_gl_es1_version = 11;
   1565       dri_screen->max_gl_es2_version = 30;
   1566       break;
   1567    case 5:
   1568    case 4:
   1569       dri_screen->max_gl_core_version = 0;
   1570       dri_screen->max_gl_compat_version = 21;
   1571       dri_screen->max_gl_es1_version = 11;
   1572       dri_screen->max_gl_es2_version = 20;
   1573       break;
   1574    default:
   1575       unreachable("unrecognized intel_screen::gen");
   1576    }
   1577 }
   1578 
   1579 /**
   1580  * Return the revision (generally the revid field of the PCI header) of the
   1581  * graphics device.
   1582  *
   1583  * XXX: This function is useful to keep around even if it is not currently in
   1584  * use. It is necessary for new platforms and revision specific workarounds or
   1585  * features. Please don't remove it so that we know it at least continues to
   1586  * build.
   1587  */
   1588 static __attribute__((__unused__)) int
   1589 brw_get_revision(int fd)
   1590 {
   1591    struct drm_i915_getparam gp;
   1592    int revision;
   1593    int ret;
   1594 
   1595    memset(&gp, 0, sizeof(gp));
   1596    gp.param = I915_PARAM_REVISION;
   1597    gp.value = &revision;
   1598 
   1599    ret = drmCommandWriteRead(fd, DRM_I915_GETPARAM, &gp, sizeof(gp));
   1600    if (ret)
   1601       revision = -1;
   1602 
   1603    return revision;
   1604 }
   1605 
   1606 /* Drop when RS headers get pulled to libdrm */
   1607 #ifndef I915_PARAM_HAS_RESOURCE_STREAMER
   1608 #define I915_PARAM_HAS_RESOURCE_STREAMER 36
   1609 #endif
   1610 
   1611 static void
   1612 shader_debug_log_mesa(void *data, const char *fmt, ...)
   1613 {
   1614    struct brw_context *brw = (struct brw_context *)data;
   1615    va_list args;
   1616 
   1617    va_start(args, fmt);
   1618    GLuint msg_id = 0;
   1619    _mesa_gl_vdebug(&brw->ctx, &msg_id,
   1620                    MESA_DEBUG_SOURCE_SHADER_COMPILER,
   1621                    MESA_DEBUG_TYPE_OTHER,
   1622                    MESA_DEBUG_SEVERITY_NOTIFICATION, fmt, args);
   1623    va_end(args);
   1624 }
   1625 
   1626 static void
   1627 shader_perf_log_mesa(void *data, const char *fmt, ...)
   1628 {
   1629    struct brw_context *brw = (struct brw_context *)data;
   1630 
   1631    va_list args;
   1632    va_start(args, fmt);
   1633 
   1634    if (unlikely(INTEL_DEBUG & DEBUG_PERF)) {
   1635       va_list args_copy;
   1636       va_copy(args_copy, args);
   1637       vfprintf(stderr, fmt, args_copy);
   1638       va_end(args_copy);
   1639    }
   1640 
   1641    if (brw->perf_debug) {
   1642       GLuint msg_id = 0;
   1643       _mesa_gl_vdebug(&brw->ctx, &msg_id,
   1644                       MESA_DEBUG_SOURCE_SHADER_COMPILER,
   1645                       MESA_DEBUG_TYPE_PERFORMANCE,
   1646                       MESA_DEBUG_SEVERITY_MEDIUM, fmt, args);
   1647    }
   1648    va_end(args);
   1649 }
   1650 
   1651 /**
   1652  * This is the driver specific part of the createNewScreen entry point.
   1653  * Called when using DRI2.
   1654  *
   1655  * \return the struct gl_config supported by this driver
   1656  */
   1657 static const
   1658 __DRIconfig **intelInitScreen2(__DRIscreen *dri_screen)
   1659 {
   1660    struct intel_screen *screen;
   1661 
   1662    if (dri_screen->image.loader) {
   1663    } else if (dri_screen->dri2.loader->base.version <= 2 ||
   1664        dri_screen->dri2.loader->getBuffersWithFormat == NULL) {
   1665       fprintf(stderr,
   1666 	      "\nERROR!  DRI2 loader with getBuffersWithFormat() "
   1667 	      "support required\n");
   1668       return false;
   1669    }
   1670 
   1671    /* Allocate the private area */
   1672    screen = rzalloc(NULL, struct intel_screen);
   1673    if (!screen) {
   1674       fprintf(stderr, "\nERROR!  Allocating private area failed\n");
   1675       return false;
   1676    }
   1677    /* parse information in __driConfigOptions */
   1678    driParseOptionInfo(&screen->optionCache, brw_config_options.xml);
   1679 
   1680    screen->driScrnPriv = dri_screen;
   1681    dri_screen->driverPrivate = (void *) screen;
   1682 
   1683    if (!intel_init_bufmgr(screen))
   1684        return false;
   1685 
   1686    screen->deviceID = drm_intel_bufmgr_gem_get_devid(screen->bufmgr);
   1687    if (!gen_get_device_info(screen->deviceID, &screen->devinfo))
   1688       return false;
   1689 
   1690    brw_process_intel_debug_variable();
   1691 
   1692    if (INTEL_DEBUG & DEBUG_BUFMGR)
   1693       dri_bufmgr_set_debug(screen->bufmgr, true);
   1694 
   1695    if ((INTEL_DEBUG & DEBUG_SHADER_TIME) && screen->devinfo.gen < 7) {
   1696       fprintf(stderr,
   1697               "shader_time debugging requires gen7 (Ivybridge) or better.\n");
   1698       INTEL_DEBUG &= ~DEBUG_SHADER_TIME;
   1699    }
   1700 
   1701    if (INTEL_DEBUG & DEBUG_AUB)
   1702       drm_intel_bufmgr_gem_set_aub_dump(screen->bufmgr, true);
   1703 
   1704 #ifndef I915_PARAM_MMAP_GTT_VERSION
   1705 #define I915_PARAM_MMAP_GTT_VERSION 40 /* XXX delete me with new libdrm */
   1706 #endif
   1707    if (intel_get_integer(screen, I915_PARAM_MMAP_GTT_VERSION) >= 1) {
   1708       /* Theorectically unlimited! At least for individual objects...
   1709        *
   1710        * Currently the entire (global) address space for all GTT maps is
   1711        * limited to 64bits. That is all objects on the system that are
   1712        * setup for GTT mmapping must fit within 64bits. An attempt to use
   1713        * one that exceeds the limit with fail in drm_intel_bo_map_gtt().
   1714        *
   1715        * Long before we hit that limit, we will be practically limited by
   1716        * that any single object must fit in physical memory (RAM). The upper
   1717        * limit on the CPU's address space is currently 48bits (Skylake), of
   1718        * which only 39bits can be physical memory. (The GPU itself also has
   1719        * a 48bit addressable virtual space.) We can fit over 32 million
   1720        * objects of the current maximum allocable size before running out
   1721        * of mmap space.
   1722        */
   1723       screen->max_gtt_map_object_size = UINT64_MAX;
   1724    } else {
   1725       /* Estimate the size of the mappable aperture into the GTT.  There's an
   1726        * ioctl to get the whole GTT size, but not one to get the mappable subset.
   1727        * It turns out it's basically always 256MB, though some ancient hardware
   1728        * was smaller.
   1729        */
   1730       uint32_t gtt_size = 256 * 1024 * 1024;
   1731 
   1732       /* We don't want to map two objects such that a memcpy between them would
   1733        * just fault one mapping in and then the other over and over forever.  So
   1734        * we would need to divide the GTT size by 2.  Additionally, some GTT is
   1735        * taken up by things like the framebuffer and the ringbuffer and such, so
   1736        * be more conservative.
   1737        */
   1738       screen->max_gtt_map_object_size = gtt_size / 4;
   1739    }
   1740 
   1741    screen->hw_has_swizzling = intel_detect_swizzling(screen);
   1742    screen->hw_has_timestamp = intel_detect_timestamp(screen);
   1743 
   1744    /* GENs prior to 8 do not support EU/Subslice info */
   1745    if (screen->devinfo.gen >= 8) {
   1746       intel_detect_sseu(screen);
   1747    } else if (screen->devinfo.gen == 7) {
   1748       screen->subslice_total = 1 << (screen->devinfo.gt - 1);
   1749    }
   1750 
   1751    /* Gen7-7.5 kernel requirements / command parser saga:
   1752     *
   1753     * - pre-v3.16:
   1754     *   Haswell and Baytrail cannot use any privileged batchbuffer features.
   1755     *
   1756     *   Ivybridge has aliasing PPGTT on by default, which accidentally marks
   1757     *   all batches secure, allowing them to use any feature with no checking.
   1758     *   This is effectively equivalent to a command parser version of
   1759     *   \infinity - everything is possible.
   1760     *
   1761     *   The command parser does not exist, and querying the version will
   1762     *   return -EINVAL.
   1763     *
   1764     * - v3.16:
   1765     *   The kernel enables the command parser by default, for systems with
   1766     *   aliasing PPGTT enabled (Ivybridge and Haswell).  However, the
   1767     *   hardware checker is still enabled, so Haswell and Baytrail cannot
   1768     *   do anything.
   1769     *
   1770     *   Ivybridge goes from "everything is possible" to "only what the
   1771     *   command parser allows" (if the user boots with i915.cmd_parser=0,
   1772     *   then everything is possible again).  We can only safely use features
   1773     *   allowed by the supported command parser version.
   1774     *
   1775     *   Annoyingly, I915_PARAM_CMD_PARSER_VERSION reports the static version
   1776     *   implemented by the kernel, even if it's turned off.  So, checking
   1777     *   for version > 0 does not mean that you can write registers.  We have
   1778     *   to try it and see.  The version does, however, indicate the age of
   1779     *   the kernel.
   1780     *
   1781     *   Instead of matching the hardware checker's behavior of converting
   1782     *   privileged commands to MI_NOOP, it makes execbuf2 start returning
   1783     *   -EINVAL, making it dangerous to try and use privileged features.
   1784     *
   1785     *   Effective command parser versions:
   1786     *   - Haswell:   0 (reporting 1, writes don't work)
   1787     *   - Baytrail:  0 (reporting 1, writes don't work)
   1788     *   - Ivybridge: 1 (enabled) or infinite (disabled)
   1789     *
   1790     * - v3.17:
   1791     *   Baytrail aliasing PPGTT is enabled, making it like Ivybridge:
   1792     *   effectively version 1 (enabled) or infinite (disabled).
   1793     *
   1794     * - v3.19: f1f55cc0556031c8ee3fe99dae7251e78b9b653b
   1795     *   Command parser v2 supports predicate writes.
   1796     *
   1797     *   - Haswell:   0 (reporting 1, writes don't work)
   1798     *   - Baytrail:  2 (enabled) or infinite (disabled)
   1799     *   - Ivybridge: 2 (enabled) or infinite (disabled)
   1800     *
   1801     *   So version >= 2 is enough to know that Ivybridge and Baytrail
   1802     *   will work.  Haswell still can't do anything.
   1803     *
   1804     * - v4.0: Version 3 happened.  Largely not relevant.
   1805     *
   1806     * - v4.1: 6702cf16e0ba8b0129f5aa1b6609d4e9c70bc13b
   1807     *   L3 config registers are properly saved and restored as part
   1808     *   of the hardware context.  We can approximately detect this point
   1809     *   in time by checking if I915_PARAM_REVISION is recognized - it
   1810     *   landed in a later commit, but in the same release cycle.
   1811     *
   1812     * - v4.2: 245054a1fe33c06ad233e0d58a27ec7b64db9284
   1813     *   Command parser finally gains secure batch promotion.  On Haswell,
   1814     *   the hardware checker gets disabled, which finally allows it to do
   1815     *   privileged commands.
   1816     *
   1817     *   I915_PARAM_CMD_PARSER_VERSION reports 3.  Effective versions:
   1818     *   - Haswell:   3 (enabled) or 0 (disabled)
   1819     *   - Baytrail:  3 (enabled) or infinite (disabled)
   1820     *   - Ivybridge: 3 (enabled) or infinite (disabled)
   1821     *
   1822     *   Unfortunately, detecting this point in time is tricky, because
   1823     *   no version bump happened when this important change occurred.
   1824     *   On Haswell, if we can write any register, then the kernel is at
   1825     *   least this new, and we can start trusting the version number.
   1826     *
   1827     * - v4.4: 2bbe6bbb0dc94fd4ce287bdac9e1bd184e23057b and
   1828     *   Command parser reaches version 4, allowing access to Haswell
   1829     *   atomic scratch and chicken3 registers.  If version >= 4, we know
   1830     *   the kernel is new enough to support privileged features on all
   1831     *   hardware.  However, the user might have disabled it...and the
   1832     *   kernel will still report version 4.  So we still have to guess
   1833     *   and check.
   1834     *
   1835     * - v4.4: 7b9748cb513a6bef4af87b79f0da3ff7e8b56cd8
   1836     *   Command parser v5 whitelists indirect compute shader dispatch
   1837     *   registers, needed for OpenGL 4.3 and later.
   1838     *
   1839     * - v4.8:
   1840     *   Command parser v7 lets us use MI_MATH on Haswell.
   1841     *
   1842     *   Additionally, the kernel begins reporting version 0 when
   1843     *   the command parser is disabled, allowing us to skip the
   1844     *   guess-and-check step on Haswell.  Unfortunately, this also
   1845     *   means that we can no longer use it as an indicator of the
   1846     *   age of the kernel.
   1847     */
   1848    if (intel_get_param(screen, I915_PARAM_CMD_PARSER_VERSION,
   1849                        &screen->cmd_parser_version) < 0) {
   1850       /* Command parser does not exist - getparam is unrecognized */
   1851       screen->cmd_parser_version = 0;
   1852    }
   1853 
   1854    if (!intel_detect_pipelined_so(screen)) {
   1855       /* We can't do anything, so the effective version is 0. */
   1856       screen->cmd_parser_version = 0;
   1857    } else {
   1858       screen->kernel_features |= KERNEL_ALLOWS_SOL_OFFSET_WRITES;
   1859    }
   1860 
   1861    if (screen->devinfo.gen >= 8 || screen->cmd_parser_version >= 2)
   1862       screen->kernel_features |= KERNEL_ALLOWS_PREDICATE_WRITES;
   1863 
   1864    /* Haswell requires command parser version 4 in order to have L3
   1865     * atomic scratch1 and chicken3 bits
   1866     */
   1867    if (screen->devinfo.is_haswell && screen->cmd_parser_version >= 4) {
   1868       screen->kernel_features |=
   1869          KERNEL_ALLOWS_HSW_SCRATCH1_AND_ROW_CHICKEN3;
   1870    }
   1871 
   1872    /* Haswell requires command parser version 6 in order to write to the
   1873     * MI_MATH GPR registers, and version 7 in order to use
   1874     * MI_LOAD_REGISTER_REG (which all users of MI_MATH use).
   1875     */
   1876    if (screen->devinfo.gen >= 8 ||
   1877        (screen->devinfo.is_haswell && screen->cmd_parser_version >= 7)) {
   1878       screen->kernel_features |= KERNEL_ALLOWS_MI_MATH_AND_LRR;
   1879    }
   1880 
   1881    /* Gen7 needs at least command parser version 5 to support compute */
   1882    if (screen->devinfo.gen >= 8 || screen->cmd_parser_version >= 5)
   1883       screen->kernel_features |= KERNEL_ALLOWS_COMPUTE_DISPATCH;
   1884 
   1885    const char *force_msaa = getenv("INTEL_FORCE_MSAA");
   1886    if (force_msaa) {
   1887       screen->winsys_msaa_samples_override =
   1888          intel_quantize_num_samples(screen, atoi(force_msaa));
   1889       printf("Forcing winsys sample count to %d\n",
   1890              screen->winsys_msaa_samples_override);
   1891    } else {
   1892       screen->winsys_msaa_samples_override = -1;
   1893    }
   1894 
   1895    set_max_gl_versions(screen);
   1896 
   1897    /* Notification of GPU resets requires hardware contexts and a kernel new
   1898     * enough to support DRM_IOCTL_I915_GET_RESET_STATS.  If the ioctl is
   1899     * supported, calling it with a context of 0 will either generate EPERM or
   1900     * no error.  If the ioctl is not supported, it always generate EINVAL.
   1901     * Use this to determine whether to advertise the __DRI2_ROBUSTNESS
   1902     * extension to the loader.
   1903     *
   1904     * Don't even try on pre-Gen6, since we don't attempt to use contexts there.
   1905     */
   1906    if (screen->devinfo.gen >= 6) {
   1907       struct drm_i915_reset_stats stats;
   1908       memset(&stats, 0, sizeof(stats));
   1909 
   1910       const int ret = drmIoctl(dri_screen->fd, DRM_IOCTL_I915_GET_RESET_STATS, &stats);
   1911 
   1912       screen->has_context_reset_notification =
   1913          (ret != -1 || errno != EINVAL);
   1914    }
   1915 
   1916    dri_screen->extensions = !screen->has_context_reset_notification
   1917       ? screenExtensions : intelRobustScreenExtensions;
   1918 
   1919    screen->compiler = brw_compiler_create(screen,
   1920                                           &screen->devinfo);
   1921    screen->compiler->shader_debug_log = shader_debug_log_mesa;
   1922    screen->compiler->shader_perf_log = shader_perf_log_mesa;
   1923    screen->program_id = 1;
   1924 
   1925    if (screen->devinfo.has_resource_streamer) {
   1926       screen->has_resource_streamer =
   1927         intel_get_boolean(screen, I915_PARAM_HAS_RESOURCE_STREAMER);
   1928    }
   1929 
   1930    return (const __DRIconfig**) intel_screen_make_configs(dri_screen);
   1931 }
   1932 
   1933 struct intel_buffer {
   1934    __DRIbuffer base;
   1935    drm_intel_bo *bo;
   1936 };
   1937 
   1938 static __DRIbuffer *
   1939 intelAllocateBuffer(__DRIscreen *dri_screen,
   1940 		    unsigned attachment, unsigned format,
   1941 		    int width, int height)
   1942 {
   1943    struct intel_buffer *intelBuffer;
   1944    struct intel_screen *screen = dri_screen->driverPrivate;
   1945 
   1946    assert(attachment == __DRI_BUFFER_FRONT_LEFT ||
   1947           attachment == __DRI_BUFFER_BACK_LEFT);
   1948 
   1949    intelBuffer = calloc(1, sizeof *intelBuffer);
   1950    if (intelBuffer == NULL)
   1951       return NULL;
   1952 
   1953    /* The front and back buffers are color buffers, which are X tiled. */
   1954    uint32_t tiling = I915_TILING_X;
   1955    unsigned long pitch;
   1956    int cpp = format / 8;
   1957    intelBuffer->bo = drm_intel_bo_alloc_tiled(screen->bufmgr,
   1958                                               "intelAllocateBuffer",
   1959                                               width,
   1960                                               height,
   1961                                               cpp,
   1962                                               &tiling, &pitch,
   1963                                               BO_ALLOC_FOR_RENDER);
   1964 
   1965    if (intelBuffer->bo == NULL) {
   1966 	   free(intelBuffer);
   1967 	   return NULL;
   1968    }
   1969 
   1970    drm_intel_bo_flink(intelBuffer->bo, &intelBuffer->base.name);
   1971 
   1972    intelBuffer->base.attachment = attachment;
   1973    intelBuffer->base.cpp = cpp;
   1974    intelBuffer->base.pitch = pitch;
   1975 
   1976    return &intelBuffer->base;
   1977 }
   1978 
   1979 static void
   1980 intelReleaseBuffer(__DRIscreen *dri_screen, __DRIbuffer *buffer)
   1981 {
   1982    struct intel_buffer *intelBuffer = (struct intel_buffer *) buffer;
   1983 
   1984    drm_intel_bo_unreference(intelBuffer->bo);
   1985    free(intelBuffer);
   1986 }
   1987 
   1988 static const struct __DriverAPIRec brw_driver_api = {
   1989    .InitScreen		 = intelInitScreen2,
   1990    .DestroyScreen	 = intelDestroyScreen,
   1991    .CreateContext	 = brwCreateContext,
   1992    .DestroyContext	 = intelDestroyContext,
   1993    .CreateBuffer	 = intelCreateBuffer,
   1994    .DestroyBuffer	 = intelDestroyBuffer,
   1995    .MakeCurrent		 = intelMakeCurrent,
   1996    .UnbindContext	 = intelUnbindContext,
   1997    .AllocateBuffer       = intelAllocateBuffer,
   1998    .ReleaseBuffer        = intelReleaseBuffer
   1999 };
   2000 
   2001 static const struct __DRIDriverVtableExtensionRec brw_vtable = {
   2002    .base = { __DRI_DRIVER_VTABLE, 1 },
   2003    .vtable = &brw_driver_api,
   2004 };
   2005 
   2006 static const __DRIextension *brw_driver_extensions[] = {
   2007     &driCoreExtension.base,
   2008     &driImageDriverExtension.base,
   2009     &driDRI2Extension.base,
   2010     &brw_vtable.base,
   2011     &brw_config_options.base,
   2012     NULL
   2013 };
   2014 
   2015 PUBLIC const __DRIextension **__driDriverGetExtensions_i965(void)
   2016 {
   2017    globalDriverAPI = &brw_driver_api;
   2018 
   2019    return brw_driver_extensions;
   2020 }
   2021