Home | History | Annotate | Download | only in state_tracker
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 VMware, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #include <stdio.h>
     29 #include "main/bufferobj.h"
     30 #include "main/enums.h"
     31 #include "main/fbobject.h"
     32 #include "main/formats.h"
     33 #include "main/format_utils.h"
     34 #include "main/glformats.h"
     35 #include "main/image.h"
     36 #include "main/imports.h"
     37 #include "main/macros.h"
     38 #include "main/mipmap.h"
     39 #include "main/pack.h"
     40 #include "main/pbo.h"
     41 #include "main/pixeltransfer.h"
     42 #include "main/texcompress.h"
     43 #include "main/texcompress_etc.h"
     44 #include "main/texgetimage.h"
     45 #include "main/teximage.h"
     46 #include "main/texobj.h"
     47 #include "main/texstore.h"
     48 
     49 #include "state_tracker/st_debug.h"
     50 #include "state_tracker/st_context.h"
     51 #include "state_tracker/st_cb_bitmap.h"
     52 #include "state_tracker/st_cb_fbo.h"
     53 #include "state_tracker/st_cb_flush.h"
     54 #include "state_tracker/st_cb_texture.h"
     55 #include "state_tracker/st_cb_bufferobjects.h"
     56 #include "state_tracker/st_format.h"
     57 #include "state_tracker/st_pbo.h"
     58 #include "state_tracker/st_texture.h"
     59 #include "state_tracker/st_gen_mipmap.h"
     60 #include "state_tracker/st_atom.h"
     61 #include "state_tracker/st_sampler_view.h"
     62 
     63 #include "pipe/p_context.h"
     64 #include "pipe/p_defines.h"
     65 #include "util/u_inlines.h"
     66 #include "util/u_upload_mgr.h"
     67 #include "pipe/p_shader_tokens.h"
     68 #include "util/u_tile.h"
     69 #include "util/u_format.h"
     70 #include "util/u_surface.h"
     71 #include "util/u_sampler.h"
     72 #include "util/u_math.h"
     73 #include "util/u_box.h"
     74 #include "util/u_simple_shaders.h"
     75 #include "cso_cache/cso_context.h"
     76 #include "tgsi/tgsi_ureg.h"
     77 
     78 #define DBG if (0) printf
     79 
     80 
     81 enum pipe_texture_target
     82 gl_target_to_pipe(GLenum target)
     83 {
     84    switch (target) {
     85    case GL_TEXTURE_1D:
     86    case GL_PROXY_TEXTURE_1D:
     87       return PIPE_TEXTURE_1D;
     88    case GL_TEXTURE_2D:
     89    case GL_PROXY_TEXTURE_2D:
     90    case GL_TEXTURE_EXTERNAL_OES:
     91    case GL_TEXTURE_2D_MULTISAMPLE:
     92    case GL_PROXY_TEXTURE_2D_MULTISAMPLE:
     93       return PIPE_TEXTURE_2D;
     94    case GL_TEXTURE_RECTANGLE_NV:
     95    case GL_PROXY_TEXTURE_RECTANGLE_NV:
     96       return PIPE_TEXTURE_RECT;
     97    case GL_TEXTURE_3D:
     98    case GL_PROXY_TEXTURE_3D:
     99       return PIPE_TEXTURE_3D;
    100    case GL_TEXTURE_CUBE_MAP_ARB:
    101    case GL_PROXY_TEXTURE_CUBE_MAP_ARB:
    102    case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
    103    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
    104    case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
    105    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
    106    case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
    107    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
    108       return PIPE_TEXTURE_CUBE;
    109    case GL_TEXTURE_1D_ARRAY_EXT:
    110    case GL_PROXY_TEXTURE_1D_ARRAY_EXT:
    111       return PIPE_TEXTURE_1D_ARRAY;
    112    case GL_TEXTURE_2D_ARRAY_EXT:
    113    case GL_PROXY_TEXTURE_2D_ARRAY_EXT:
    114    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
    115    case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY:
    116       return PIPE_TEXTURE_2D_ARRAY;
    117    case GL_TEXTURE_BUFFER:
    118       return PIPE_BUFFER;
    119    case GL_TEXTURE_CUBE_MAP_ARRAY:
    120    case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY:
    121       return PIPE_TEXTURE_CUBE_ARRAY;
    122    default:
    123       assert(0);
    124       return 0;
    125    }
    126 }
    127 
    128 
    129 /** called via ctx->Driver.NewTextureImage() */
    130 static struct gl_texture_image *
    131 st_NewTextureImage(struct gl_context * ctx)
    132 {
    133    DBG("%s\n", __func__);
    134    (void) ctx;
    135    return (struct gl_texture_image *) ST_CALLOC_STRUCT(st_texture_image);
    136 }
    137 
    138 
    139 /** called via ctx->Driver.DeleteTextureImage() */
    140 static void
    141 st_DeleteTextureImage(struct gl_context * ctx, struct gl_texture_image *img)
    142 {
    143    /* nothing special (yet) for st_texture_image */
    144    _mesa_delete_texture_image(ctx, img);
    145 }
    146 
    147 
    148 /** called via ctx->Driver.NewTextureObject() */
    149 static struct gl_texture_object *
    150 st_NewTextureObject(struct gl_context * ctx, GLuint name, GLenum target)
    151 {
    152    struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object);
    153 
    154    DBG("%s\n", __func__);
    155    _mesa_initialize_texture_object(ctx, &obj->base, name, target);
    156 
    157    return &obj->base;
    158 }
    159 
    160 /** called via ctx->Driver.DeleteTextureObject() */
    161 static void
    162 st_DeleteTextureObject(struct gl_context *ctx,
    163                        struct gl_texture_object *texObj)
    164 {
    165    struct st_context *st = st_context(ctx);
    166    struct st_texture_object *stObj = st_texture_object(texObj);
    167 
    168    pipe_resource_reference(&stObj->pt, NULL);
    169    st_texture_release_all_sampler_views(st, stObj);
    170    st_texture_free_sampler_views(stObj);
    171    _mesa_delete_texture_object(ctx, texObj);
    172 }
    173 
    174 
    175 /** called via ctx->Driver.FreeTextureImageBuffer() */
    176 static void
    177 st_FreeTextureImageBuffer(struct gl_context *ctx,
    178                           struct gl_texture_image *texImage)
    179 {
    180    struct st_context *st = st_context(ctx);
    181    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
    182    struct st_texture_image *stImage = st_texture_image(texImage);
    183 
    184    DBG("%s\n", __func__);
    185 
    186    if (stImage->pt) {
    187       pipe_resource_reference(&stImage->pt, NULL);
    188    }
    189 
    190    free(stImage->transfer);
    191    stImage->transfer = NULL;
    192    stImage->num_transfers = 0;
    193 
    194    if (stImage->etc_data) {
    195       free(stImage->etc_data);
    196       stImage->etc_data = NULL;
    197    }
    198 
    199    /* if the texture image is being deallocated, the structure of the
    200     * texture is changing so we'll likely need a new sampler view.
    201     */
    202    st_texture_release_all_sampler_views(st, stObj);
    203 }
    204 
    205 bool
    206 st_etc_fallback(struct st_context *st, struct gl_texture_image *texImage)
    207 {
    208    return (_mesa_is_format_etc2(texImage->TexFormat) && !st->has_etc2) ||
    209           (texImage->TexFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1);
    210 }
    211 
    212 static void
    213 etc_fallback_allocate(struct st_context *st, struct st_texture_image *stImage)
    214 {
    215    struct gl_texture_image *texImage = &stImage->base;
    216 
    217    if (!st_etc_fallback(st, texImage))
    218       return;
    219 
    220    if (stImage->etc_data)
    221       free(stImage->etc_data);
    222 
    223    unsigned data_size = _mesa_format_image_size(texImage->TexFormat,
    224                                                 texImage->Width2,
    225                                                 texImage->Height2,
    226                                                 texImage->Depth2);
    227 
    228    stImage->etc_data =
    229       malloc(data_size * _mesa_num_tex_faces(texImage->TexObject->Target));
    230 }
    231 
    232 /** called via ctx->Driver.MapTextureImage() */
    233 static void
    234 st_MapTextureImage(struct gl_context *ctx,
    235                    struct gl_texture_image *texImage,
    236                    GLuint slice, GLuint x, GLuint y, GLuint w, GLuint h,
    237                    GLbitfield mode,
    238                    GLubyte **mapOut, GLint *rowStrideOut)
    239 {
    240    struct st_context *st = st_context(ctx);
    241    struct st_texture_image *stImage = st_texture_image(texImage);
    242    unsigned pipeMode;
    243    GLubyte *map;
    244    struct pipe_transfer *transfer;
    245 
    246    pipeMode = 0x0;
    247    if (mode & GL_MAP_READ_BIT)
    248       pipeMode |= PIPE_TRANSFER_READ;
    249    if (mode & GL_MAP_WRITE_BIT)
    250       pipeMode |= PIPE_TRANSFER_WRITE;
    251    if (mode & GL_MAP_INVALIDATE_RANGE_BIT)
    252       pipeMode |= PIPE_TRANSFER_DISCARD_RANGE;
    253 
    254    map = st_texture_image_map(st, stImage, pipeMode, x, y, slice, w, h, 1,
    255                               &transfer);
    256    if (map) {
    257       if (st_etc_fallback(st, texImage)) {
    258          /* ETC isn't supported by all gallium drivers, where it's represented
    259           * by uncompressed formats. We store the compressed data (as it's
    260           * needed for image copies in OES_copy_image), and decompress as
    261           * necessary in Unmap.
    262           *
    263           * Note: all ETC1/ETC2 formats have 4x4 block sizes.
    264           */
    265          unsigned z = transfer->box.z;
    266          struct st_texture_image_transfer *itransfer = &stImage->transfer[z];
    267 
    268          unsigned bytes = _mesa_get_format_bytes(texImage->TexFormat);
    269          unsigned stride = *rowStrideOut = itransfer->temp_stride =
    270             _mesa_format_row_stride(texImage->TexFormat, texImage->Width2);
    271          *mapOut = itransfer->temp_data =
    272             stImage->etc_data + ((x / 4) * bytes + (y / 4) * stride) +
    273             z * stride * texImage->Height2 / 4;
    274          itransfer->map = map;
    275       }
    276       else {
    277          /* supported mapping */
    278          *mapOut = map;
    279          *rowStrideOut = transfer->stride;
    280       }
    281    }
    282    else {
    283       *mapOut = NULL;
    284       *rowStrideOut = 0;
    285    }
    286 }
    287 
    288 
    289 /** called via ctx->Driver.UnmapTextureImage() */
    290 static void
    291 st_UnmapTextureImage(struct gl_context *ctx,
    292                      struct gl_texture_image *texImage,
    293                      GLuint slice)
    294 {
    295    struct st_context *st = st_context(ctx);
    296    struct st_texture_image *stImage  = st_texture_image(texImage);
    297 
    298    if (st_etc_fallback(st, texImage)) {
    299       /* Decompress the ETC texture to the mapped one. */
    300       unsigned z = slice + stImage->base.Face;
    301       struct st_texture_image_transfer *itransfer = &stImage->transfer[z];
    302       struct pipe_transfer *transfer = itransfer->transfer;
    303 
    304       assert(z == transfer->box.z);
    305 
    306       if (transfer->usage & PIPE_TRANSFER_WRITE) {
    307          if (texImage->TexFormat == MESA_FORMAT_ETC1_RGB8) {
    308             _mesa_etc1_unpack_rgba8888(itransfer->map, transfer->stride,
    309                                        itransfer->temp_data,
    310                                        itransfer->temp_stride,
    311                                        transfer->box.width, transfer->box.height);
    312          }
    313          else {
    314             _mesa_unpack_etc2_format(itransfer->map, transfer->stride,
    315                                      itransfer->temp_data, itransfer->temp_stride,
    316                                      transfer->box.width, transfer->box.height,
    317                                      texImage->TexFormat);
    318          }
    319       }
    320 
    321       itransfer->temp_data = NULL;
    322       itransfer->temp_stride = 0;
    323       itransfer->map = 0;
    324    }
    325 
    326    st_texture_image_unmap(st, stImage, slice);
    327 }
    328 
    329 
    330 /**
    331  * Return default texture resource binding bitmask for the given format.
    332  */
    333 static GLuint
    334 default_bindings(struct st_context *st, enum pipe_format format)
    335 {
    336    struct pipe_screen *screen = st->pipe->screen;
    337    const unsigned target = PIPE_TEXTURE_2D;
    338    unsigned bindings;
    339 
    340    if (util_format_is_depth_or_stencil(format))
    341       bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_DEPTH_STENCIL;
    342    else
    343       bindings = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
    344 
    345    if (screen->is_format_supported(screen, format, target, 0, bindings))
    346       return bindings;
    347    else {
    348       /* Try non-sRGB. */
    349       format = util_format_linear(format);
    350 
    351       if (screen->is_format_supported(screen, format, target, 0, bindings))
    352          return bindings;
    353       else
    354          return PIPE_BIND_SAMPLER_VIEW;
    355    }
    356 }
    357 
    358 
    359 /**
    360  * Given the size of a mipmap image, try to compute the size of the level=0
    361  * mipmap image.
    362  *
    363  * Note that this isn't always accurate for odd-sized, non-POW textures.
    364  * For example, if level=1 and width=40 then the level=0 width may be 80 or 81.
    365  *
    366  * \return GL_TRUE for success, GL_FALSE for failure
    367  */
    368 static GLboolean
    369 guess_base_level_size(GLenum target,
    370                       GLuint width, GLuint height, GLuint depth, GLuint level,
    371                       GLuint *width0, GLuint *height0, GLuint *depth0)
    372 {
    373    assert(width >= 1);
    374    assert(height >= 1);
    375    assert(depth >= 1);
    376 
    377    if (level > 0) {
    378       /* Guess the size of the base level.
    379        * Depending on the image's size, we can't always make a guess here.
    380        */
    381       switch (target) {
    382       case GL_TEXTURE_1D:
    383       case GL_TEXTURE_1D_ARRAY:
    384          width <<= level;
    385          break;
    386 
    387       case GL_TEXTURE_2D:
    388       case GL_TEXTURE_2D_ARRAY:
    389          /* We can't make a good guess here, because the base level dimensions
    390           * can be non-square.
    391           */
    392          if (width == 1 || height == 1) {
    393             return GL_FALSE;
    394          }
    395          width <<= level;
    396          height <<= level;
    397          break;
    398 
    399       case GL_TEXTURE_CUBE_MAP:
    400       case GL_TEXTURE_CUBE_MAP_ARRAY:
    401          width <<= level;
    402          height <<= level;
    403          break;
    404 
    405       case GL_TEXTURE_3D:
    406          /* We can't make a good guess here, because the base level dimensions
    407           * can be non-cube.
    408           */
    409          if (width == 1 || height == 1 || depth == 1) {
    410             return GL_FALSE;
    411          }
    412          width <<= level;
    413          height <<= level;
    414          depth <<= level;
    415          break;
    416 
    417       case GL_TEXTURE_RECTANGLE:
    418          break;
    419 
    420       default:
    421          assert(0);
    422       }
    423    }
    424 
    425    *width0 = width;
    426    *height0 = height;
    427    *depth0 = depth;
    428 
    429    return GL_TRUE;
    430 }
    431 
    432 
    433 /**
    434  * Try to determine whether we should allocate memory for a full texture
    435  * mipmap.  The problem is when we get a glTexImage(level=0) call, we
    436  * can't immediately know if other mipmap levels are coming next.  Here
    437  * we try to guess whether to allocate memory for a mipmap or just the
    438  * 0th level.
    439  *
    440  * If we guess incorrectly here we'll later reallocate the right amount of
    441  * memory either in st_AllocTextureImageBuffer() or st_finalize_texture().
    442  *
    443  * \param stObj  the texture object we're going to allocate memory for.
    444  * \param stImage  describes the incoming image which we need to store.
    445  */
    446 static boolean
    447 allocate_full_mipmap(const struct st_texture_object *stObj,
    448                      const struct st_texture_image *stImage)
    449 {
    450    switch (stObj->base.Target) {
    451    case GL_TEXTURE_RECTANGLE_NV:
    452    case GL_TEXTURE_BUFFER:
    453    case GL_TEXTURE_EXTERNAL_OES:
    454    case GL_TEXTURE_2D_MULTISAMPLE:
    455    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
    456       /* these texture types cannot be mipmapped */
    457       return FALSE;
    458    }
    459 
    460    if (stImage->base.Level > 0 || stObj->base.GenerateMipmap)
    461       return TRUE;
    462 
    463    if (stImage->base._BaseFormat == GL_DEPTH_COMPONENT ||
    464        stImage->base._BaseFormat == GL_DEPTH_STENCIL_EXT)
    465       /* depth/stencil textures are seldom mipmapped */
    466       return FALSE;
    467 
    468    if (stObj->base.BaseLevel == 0 && stObj->base.MaxLevel == 0)
    469       return FALSE;
    470 
    471    if (stObj->base.Sampler.MinFilter == GL_NEAREST ||
    472        stObj->base.Sampler.MinFilter == GL_LINEAR)
    473       /* not a mipmap minification filter */
    474       return FALSE;
    475 
    476    if (stObj->base.Target == GL_TEXTURE_3D)
    477       /* 3D textures are seldom mipmapped */
    478       return FALSE;
    479 
    480    return TRUE;
    481 }
    482 
    483 
    484 /**
    485  * Try to allocate a pipe_resource object for the given st_texture_object.
    486  *
    487  * We use the given st_texture_image as a clue to determine the size of the
    488  * mipmap image at level=0.
    489  *
    490  * \return GL_TRUE for success, GL_FALSE if out of memory.
    491  */
    492 static GLboolean
    493 guess_and_alloc_texture(struct st_context *st,
    494 			struct st_texture_object *stObj,
    495 			const struct st_texture_image *stImage)
    496 {
    497    const struct gl_texture_image *firstImage;
    498    GLuint lastLevel, width, height, depth;
    499    GLuint bindings;
    500    GLuint ptWidth, ptHeight, ptDepth, ptLayers;
    501    enum pipe_format fmt;
    502    bool guessed_box = false;
    503 
    504    DBG("%s\n", __func__);
    505 
    506    assert(!stObj->pt);
    507 
    508    /* If a base level image with compatible size exists, use that as our guess.
    509     */
    510    firstImage = _mesa_base_tex_image(&stObj->base);
    511    if (firstImage &&
    512        firstImage->Width2 > 0 &&
    513        firstImage->Height2 > 0 &&
    514        firstImage->Depth2 > 0 &&
    515        guess_base_level_size(stObj->base.Target,
    516                              firstImage->Width2,
    517                              firstImage->Height2,
    518                              firstImage->Depth2,
    519                              firstImage->Level,
    520                              &width, &height, &depth)) {
    521       if (stImage->base.Width2 == u_minify(width, stImage->base.Level) &&
    522           stImage->base.Height2 == u_minify(height, stImage->base.Level) &&
    523           stImage->base.Depth2 == u_minify(depth, stImage->base.Level))
    524          guessed_box = true;
    525    }
    526 
    527    if (!guessed_box)
    528       guessed_box = guess_base_level_size(stObj->base.Target,
    529                                           stImage->base.Width2,
    530                                           stImage->base.Height2,
    531                                           stImage->base.Depth2,
    532                                           stImage->base.Level,
    533                                           &width, &height, &depth);
    534 
    535    if (!guessed_box) {
    536       /* we can't determine the image size at level=0 */
    537       /* this is not an out of memory error */
    538       return GL_TRUE;
    539    }
    540 
    541    /* At this point, (width x height x depth) is the expected size of
    542     * the level=0 mipmap image.
    543     */
    544 
    545    /* Guess a reasonable value for lastLevel.  With OpenGL we have no
    546     * idea how many mipmap levels will be in a texture until we start
    547     * to render with it.  Make an educated guess here but be prepared
    548     * to re-allocating a texture buffer with space for more (or fewer)
    549     * mipmap levels later.
    550     */
    551    if (allocate_full_mipmap(stObj, stImage)) {
    552       /* alloc space for a full mipmap */
    553       lastLevel = _mesa_get_tex_max_num_levels(stObj->base.Target,
    554                                                width, height, depth) - 1;
    555    }
    556    else {
    557       /* only alloc space for a single mipmap level */
    558       lastLevel = 0;
    559    }
    560 
    561    fmt = st_mesa_format_to_pipe_format(st, stImage->base.TexFormat);
    562 
    563    bindings = default_bindings(st, fmt);
    564 
    565    st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
    566                                    width, height, depth,
    567                                    &ptWidth, &ptHeight, &ptDepth, &ptLayers);
    568 
    569    stObj->pt = st_texture_create(st,
    570                                  gl_target_to_pipe(stObj->base.Target),
    571                                  fmt,
    572                                  lastLevel,
    573                                  ptWidth,
    574                                  ptHeight,
    575                                  ptDepth,
    576                                  ptLayers, 0,
    577                                  bindings);
    578 
    579    stObj->lastLevel = lastLevel;
    580 
    581    DBG("%s returning %d\n", __func__, (stObj->pt != NULL));
    582 
    583    return stObj->pt != NULL;
    584 }
    585 
    586 
    587 /**
    588  * Called via ctx->Driver.AllocTextureImageBuffer().
    589  * If the texture object/buffer already has space for the indicated image,
    590  * we're done.  Otherwise, allocate memory for the new texture image.
    591  */
    592 static GLboolean
    593 st_AllocTextureImageBuffer(struct gl_context *ctx,
    594                            struct gl_texture_image *texImage)
    595 {
    596    struct st_context *st = st_context(ctx);
    597    struct st_texture_image *stImage = st_texture_image(texImage);
    598    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
    599    const GLuint level = texImage->Level;
    600    GLuint width = texImage->Width;
    601    GLuint height = texImage->Height;
    602    GLuint depth = texImage->Depth;
    603 
    604    DBG("%s\n", __func__);
    605 
    606    assert(!stImage->pt); /* xxx this might be wrong */
    607 
    608    etc_fallback_allocate(st, stImage);
    609 
    610    /* Look if the parent texture object has space for this image */
    611    if (stObj->pt &&
    612        level <= stObj->pt->last_level &&
    613        st_texture_match_image(st, stObj->pt, texImage)) {
    614       /* this image will fit in the existing texture object's memory */
    615       pipe_resource_reference(&stImage->pt, stObj->pt);
    616       return GL_TRUE;
    617    }
    618 
    619    /* The parent texture object does not have space for this image */
    620 
    621    pipe_resource_reference(&stObj->pt, NULL);
    622    st_texture_release_all_sampler_views(st, stObj);
    623 
    624    if (!guess_and_alloc_texture(st, stObj, stImage)) {
    625       /* Probably out of memory.
    626        * Try flushing any pending rendering, then retry.
    627        */
    628       st_finish(st);
    629       if (!guess_and_alloc_texture(st, stObj, stImage)) {
    630          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
    631          return GL_FALSE;
    632       }
    633    }
    634 
    635    if (stObj->pt &&
    636        st_texture_match_image(st, stObj->pt, texImage)) {
    637       /* The image will live in the object's mipmap memory */
    638       pipe_resource_reference(&stImage->pt, stObj->pt);
    639       assert(stImage->pt);
    640       return GL_TRUE;
    641    }
    642    else {
    643       /* Create a new, temporary texture/resource/buffer to hold this
    644        * one texture image.  Note that when we later access this image
    645        * (either for mapping or copying) we'll want to always specify
    646        * mipmap level=0, even if the image represents some other mipmap
    647        * level.
    648        */
    649       enum pipe_format format =
    650          st_mesa_format_to_pipe_format(st, texImage->TexFormat);
    651       GLuint bindings = default_bindings(st, format);
    652       GLuint ptWidth, ptHeight, ptDepth, ptLayers;
    653 
    654       st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
    655                                       width, height, depth,
    656                                       &ptWidth, &ptHeight, &ptDepth, &ptLayers);
    657 
    658       stImage->pt = st_texture_create(st,
    659                                       gl_target_to_pipe(stObj->base.Target),
    660                                       format,
    661                                       0, /* lastLevel */
    662                                       ptWidth,
    663                                       ptHeight,
    664                                       ptDepth,
    665                                       ptLayers, 0,
    666                                       bindings);
    667       return stImage->pt != NULL;
    668    }
    669 }
    670 
    671 
    672 /**
    673  * Preparation prior to glTexImage.  Basically check the 'surface_based'
    674  * field and switch to a "normal" tex image if necessary.
    675  */
    676 static void
    677 prep_teximage(struct gl_context *ctx, struct gl_texture_image *texImage,
    678               GLenum format, GLenum type)
    679 {
    680    struct gl_texture_object *texObj = texImage->TexObject;
    681    struct st_texture_object *stObj = st_texture_object(texObj);
    682 
    683    /* switch to "normal" */
    684    if (stObj->surface_based) {
    685       const GLenum target = texObj->Target;
    686       const GLuint level = texImage->Level;
    687       mesa_format texFormat;
    688 
    689       _mesa_clear_texture_object(ctx, texObj);
    690       pipe_resource_reference(&stObj->pt, NULL);
    691 
    692       /* oops, need to init this image again */
    693       texFormat = _mesa_choose_texture_format(ctx, texObj, target, level,
    694                                               texImage->InternalFormat, format,
    695                                               type);
    696 
    697       _mesa_init_teximage_fields(ctx, texImage,
    698                                  texImage->Width, texImage->Height,
    699                                  texImage->Depth, texImage->Border,
    700                                  texImage->InternalFormat, texFormat);
    701 
    702       stObj->surface_based = GL_FALSE;
    703    }
    704 }
    705 
    706 
    707 /**
    708  * Return a writemask for the gallium blit. The parameters can be base
    709  * formats or "format" from glDrawPixels/glTexImage/glGetTexImage.
    710  */
    711 unsigned
    712 st_get_blit_mask(GLenum srcFormat, GLenum dstFormat)
    713 {
    714    switch (dstFormat) {
    715    case GL_DEPTH_STENCIL:
    716       switch (srcFormat) {
    717       case GL_DEPTH_STENCIL:
    718          return PIPE_MASK_ZS;
    719       case GL_DEPTH_COMPONENT:
    720          return PIPE_MASK_Z;
    721       case GL_STENCIL_INDEX:
    722          return PIPE_MASK_S;
    723       default:
    724          assert(0);
    725          return 0;
    726       }
    727 
    728    case GL_DEPTH_COMPONENT:
    729       switch (srcFormat) {
    730       case GL_DEPTH_STENCIL:
    731       case GL_DEPTH_COMPONENT:
    732          return PIPE_MASK_Z;
    733       default:
    734          assert(0);
    735          return 0;
    736       }
    737 
    738    case GL_STENCIL_INDEX:
    739       switch (srcFormat) {
    740       case GL_STENCIL_INDEX:
    741          return PIPE_MASK_S;
    742       default:
    743          assert(0);
    744          return 0;
    745       }
    746 
    747    default:
    748       return PIPE_MASK_RGBA;
    749    }
    750 }
    751 
    752 /**
    753  * Converts format to a format with the same components, types
    754  * and sizes, but with the components in RGBA order.
    755  */
    756 static enum pipe_format
    757 unswizzle_format(enum pipe_format format)
    758 {
    759    switch (format)
    760    {
    761    case PIPE_FORMAT_B8G8R8A8_UNORM:
    762    case PIPE_FORMAT_A8R8G8B8_UNORM:
    763    case PIPE_FORMAT_A8B8G8R8_UNORM:
    764       return PIPE_FORMAT_R8G8B8A8_UNORM;
    765 
    766    case PIPE_FORMAT_B10G10R10A2_UNORM:
    767       return PIPE_FORMAT_R10G10B10A2_UNORM;
    768 
    769    case PIPE_FORMAT_B10G10R10A2_SNORM:
    770       return PIPE_FORMAT_R10G10B10A2_SNORM;
    771 
    772    case PIPE_FORMAT_B10G10R10A2_UINT:
    773       return PIPE_FORMAT_R10G10B10A2_UINT;
    774 
    775    default:
    776       return format;
    777    }
    778 }
    779 
    780 /**
    781  * Converts PIPE_FORMAT_A* to PIPE_FORMAT_R*.
    782  */
    783 static enum pipe_format
    784 alpha_to_red(enum pipe_format format)
    785 {
    786    switch (format)
    787    {
    788    case PIPE_FORMAT_A8_UNORM:
    789       return PIPE_FORMAT_R8_UNORM;
    790    case PIPE_FORMAT_A8_SNORM:
    791       return PIPE_FORMAT_R8_SNORM;
    792    case PIPE_FORMAT_A8_UINT:
    793       return PIPE_FORMAT_R8_UINT;
    794    case PIPE_FORMAT_A8_SINT:
    795       return PIPE_FORMAT_R8_SINT;
    796 
    797    case PIPE_FORMAT_A16_UNORM:
    798       return PIPE_FORMAT_R16_UNORM;
    799    case PIPE_FORMAT_A16_SNORM:
    800       return PIPE_FORMAT_R16_SNORM;
    801    case PIPE_FORMAT_A16_UINT:
    802       return PIPE_FORMAT_R16_UINT;
    803    case PIPE_FORMAT_A16_SINT:
    804       return PIPE_FORMAT_R16_SINT;
    805    case PIPE_FORMAT_A16_FLOAT:
    806       return PIPE_FORMAT_R16_FLOAT;
    807 
    808    case PIPE_FORMAT_A32_UINT:
    809       return PIPE_FORMAT_R32_UINT;
    810    case PIPE_FORMAT_A32_SINT:
    811       return PIPE_FORMAT_R32_SINT;
    812    case PIPE_FORMAT_A32_FLOAT:
    813       return PIPE_FORMAT_R32_FLOAT;
    814 
    815    default:
    816       return format;
    817    }
    818 }
    819 
    820 /**
    821  * Converts PIPE_FORMAT_R*A* to PIPE_FORMAT_R*G*.
    822  */
    823 static enum pipe_format
    824 red_alpha_to_red_green(enum pipe_format format)
    825 {
    826    switch (format)
    827    {
    828    case PIPE_FORMAT_R8A8_UNORM:
    829       return PIPE_FORMAT_R8G8_UNORM;
    830    case PIPE_FORMAT_R8A8_SNORM:
    831       return PIPE_FORMAT_R8G8_SNORM;
    832    case PIPE_FORMAT_R8A8_UINT:
    833       return PIPE_FORMAT_R8G8_UINT;
    834    case PIPE_FORMAT_R8A8_SINT:
    835       return PIPE_FORMAT_R8G8_SINT;
    836 
    837    case PIPE_FORMAT_R16A16_UNORM:
    838       return PIPE_FORMAT_R16G16_UNORM;
    839    case PIPE_FORMAT_R16A16_SNORM:
    840       return PIPE_FORMAT_R16G16_SNORM;
    841    case PIPE_FORMAT_R16A16_UINT:
    842       return PIPE_FORMAT_R16G16_UINT;
    843    case PIPE_FORMAT_R16A16_SINT:
    844       return PIPE_FORMAT_R16G16_SINT;
    845    case PIPE_FORMAT_R16A16_FLOAT:
    846       return PIPE_FORMAT_R16G16_FLOAT;
    847 
    848    case PIPE_FORMAT_R32A32_UINT:
    849       return PIPE_FORMAT_R32G32_UINT;
    850    case PIPE_FORMAT_R32A32_SINT:
    851       return PIPE_FORMAT_R32G32_SINT;
    852    case PIPE_FORMAT_R32A32_FLOAT:
    853       return PIPE_FORMAT_R32G32_FLOAT;
    854 
    855    default:
    856        return format;
    857    }
    858 }
    859 
    860 /**
    861  * Converts PIPE_FORMAT_L*A* to PIPE_FORMAT_R*G*.
    862  */
    863 static enum pipe_format
    864 luminance_alpha_to_red_green(enum pipe_format format)
    865 {
    866    switch (format)
    867    {
    868    case PIPE_FORMAT_L8A8_UNORM:
    869       return PIPE_FORMAT_R8G8_UNORM;
    870    case PIPE_FORMAT_L8A8_SNORM:
    871       return PIPE_FORMAT_R8G8_SNORM;
    872    case PIPE_FORMAT_L8A8_UINT:
    873       return PIPE_FORMAT_R8G8_UINT;
    874    case PIPE_FORMAT_L8A8_SINT:
    875       return PIPE_FORMAT_R8G8_SINT;
    876 
    877    case PIPE_FORMAT_L16A16_UNORM:
    878       return PIPE_FORMAT_R16G16_UNORM;
    879    case PIPE_FORMAT_L16A16_SNORM:
    880       return PIPE_FORMAT_R16G16_SNORM;
    881    case PIPE_FORMAT_L16A16_UINT:
    882       return PIPE_FORMAT_R16G16_UINT;
    883    case PIPE_FORMAT_L16A16_SINT:
    884       return PIPE_FORMAT_R16G16_SINT;
    885    case PIPE_FORMAT_L16A16_FLOAT:
    886       return PIPE_FORMAT_R16G16_FLOAT;
    887 
    888    case PIPE_FORMAT_L32A32_UINT:
    889       return PIPE_FORMAT_R32G32_UINT;
    890    case PIPE_FORMAT_L32A32_SINT:
    891       return PIPE_FORMAT_R32G32_SINT;
    892    case PIPE_FORMAT_L32A32_FLOAT:
    893       return PIPE_FORMAT_R32G32_FLOAT;
    894 
    895    default:
    896        return format;
    897    }
    898 }
    899 
    900 /**
    901  * Returns true if format is a PIPE_FORMAT_A* format, and false otherwise.
    902  */
    903 static bool
    904 format_is_alpha(enum pipe_format format)
    905 {
    906    const struct util_format_description *desc = util_format_description(format);
    907 
    908    if (desc->nr_channels == 1 &&
    909        desc->swizzle[0] == PIPE_SWIZZLE_0 &&
    910        desc->swizzle[1] == PIPE_SWIZZLE_0 &&
    911        desc->swizzle[2] == PIPE_SWIZZLE_0 &&
    912        desc->swizzle[3] == PIPE_SWIZZLE_X)
    913       return true;
    914 
    915    return false;
    916 }
    917 
    918 /**
    919  * Returns true if format is a PIPE_FORMAT_R* format, and false otherwise.
    920  */
    921 static bool
    922 format_is_red(enum pipe_format format)
    923 {
    924    const struct util_format_description *desc = util_format_description(format);
    925 
    926    if (desc->nr_channels == 1 &&
    927        desc->swizzle[0] == PIPE_SWIZZLE_X &&
    928        desc->swizzle[1] == PIPE_SWIZZLE_0 &&
    929        desc->swizzle[2] == PIPE_SWIZZLE_0 &&
    930        desc->swizzle[3] == PIPE_SWIZZLE_1)
    931       return true;
    932 
    933    return false;
    934 }
    935 
    936 
    937 /**
    938  * Returns true if format is a PIPE_FORMAT_L* format, and false otherwise.
    939  */
    940 static bool
    941 format_is_luminance(enum pipe_format format)
    942 {
    943    const struct util_format_description *desc = util_format_description(format);
    944 
    945    if (desc->nr_channels == 1 &&
    946        desc->swizzle[0] == PIPE_SWIZZLE_X &&
    947        desc->swizzle[1] == PIPE_SWIZZLE_X &&
    948        desc->swizzle[2] == PIPE_SWIZZLE_X &&
    949        desc->swizzle[3] == PIPE_SWIZZLE_1)
    950       return true;
    951 
    952    return false;
    953 }
    954 
    955 /**
    956  * Returns true if format is a PIPE_FORMAT_R*A* format, and false otherwise.
    957  */
    958 static bool
    959 format_is_red_alpha(enum pipe_format format)
    960 {
    961    const struct util_format_description *desc = util_format_description(format);
    962 
    963    if (desc->nr_channels == 2 &&
    964        desc->swizzle[0] == PIPE_SWIZZLE_X &&
    965        desc->swizzle[1] == PIPE_SWIZZLE_0 &&
    966        desc->swizzle[2] == PIPE_SWIZZLE_0 &&
    967        desc->swizzle[3] == PIPE_SWIZZLE_Y)
    968       return true;
    969 
    970    return false;
    971 }
    972 
    973 static bool
    974 format_is_swizzled_rgba(enum pipe_format format)
    975 {
    976     const struct util_format_description *desc = util_format_description(format);
    977 
    978     if ((desc->swizzle[0] == TGSI_SWIZZLE_X || desc->swizzle[0] == PIPE_SWIZZLE_0) &&
    979         (desc->swizzle[1] == TGSI_SWIZZLE_Y || desc->swizzle[1] == PIPE_SWIZZLE_0) &&
    980         (desc->swizzle[2] == TGSI_SWIZZLE_Z || desc->swizzle[2] == PIPE_SWIZZLE_0) &&
    981         (desc->swizzle[3] == TGSI_SWIZZLE_W || desc->swizzle[3] == PIPE_SWIZZLE_1))
    982        return false;
    983 
    984     return true;
    985 }
    986 
    987 struct format_table
    988 {
    989    unsigned char swizzle[4];
    990    enum pipe_format format;
    991 };
    992 
    993 static const struct format_table table_8888_unorm[] = {
    994    { { 0, 1, 2, 3 }, PIPE_FORMAT_R8G8B8A8_UNORM },
    995    { { 2, 1, 0, 3 }, PIPE_FORMAT_B8G8R8A8_UNORM },
    996    { { 3, 0, 1, 2 }, PIPE_FORMAT_A8R8G8B8_UNORM },
    997    { { 3, 2, 1, 0 }, PIPE_FORMAT_A8B8G8R8_UNORM }
    998 };
    999 
   1000 static const struct format_table table_1010102_unorm[] = {
   1001    { { 0, 1, 2, 3 }, PIPE_FORMAT_R10G10B10A2_UNORM },
   1002    { { 2, 1, 0, 3 }, PIPE_FORMAT_B10G10R10A2_UNORM }
   1003 };
   1004 
   1005 static const struct format_table table_1010102_snorm[] = {
   1006    { { 0, 1, 2, 3 }, PIPE_FORMAT_R10G10B10A2_SNORM },
   1007    { { 2, 1, 0, 3 }, PIPE_FORMAT_B10G10R10A2_SNORM }
   1008 };
   1009 
   1010 static const struct format_table table_1010102_uint[] = {
   1011    { { 0, 1, 2, 3 }, PIPE_FORMAT_R10G10B10A2_UINT },
   1012    { { 2, 1, 0, 3 }, PIPE_FORMAT_B10G10R10A2_UINT }
   1013 };
   1014 
   1015 static enum pipe_format
   1016 swizzle_format(enum pipe_format format, const int * const swizzle)
   1017 {
   1018    unsigned i;
   1019 
   1020    switch (format) {
   1021    case PIPE_FORMAT_R8G8B8A8_UNORM:
   1022    case PIPE_FORMAT_B8G8R8A8_UNORM:
   1023    case PIPE_FORMAT_A8R8G8B8_UNORM:
   1024    case PIPE_FORMAT_A8B8G8R8_UNORM:
   1025       for (i = 0; i < ARRAY_SIZE(table_8888_unorm); i++) {
   1026          if (swizzle[0] == table_8888_unorm[i].swizzle[0] &&
   1027              swizzle[1] == table_8888_unorm[i].swizzle[1] &&
   1028              swizzle[2] == table_8888_unorm[i].swizzle[2] &&
   1029              swizzle[3] == table_8888_unorm[i].swizzle[3])
   1030             return table_8888_unorm[i].format;
   1031       }
   1032       break;
   1033 
   1034    case PIPE_FORMAT_R10G10B10A2_UNORM:
   1035    case PIPE_FORMAT_B10G10R10A2_UNORM:
   1036       for (i = 0; i < ARRAY_SIZE(table_1010102_unorm); i++) {
   1037          if (swizzle[0] == table_1010102_unorm[i].swizzle[0] &&
   1038              swizzle[1] == table_1010102_unorm[i].swizzle[1] &&
   1039              swizzle[2] == table_1010102_unorm[i].swizzle[2] &&
   1040              swizzle[3] == table_1010102_unorm[i].swizzle[3])
   1041             return table_1010102_unorm[i].format;
   1042       }
   1043       break;
   1044 
   1045    case PIPE_FORMAT_R10G10B10A2_SNORM:
   1046    case PIPE_FORMAT_B10G10R10A2_SNORM:
   1047       for (i = 0; i < ARRAY_SIZE(table_1010102_snorm); i++) {
   1048          if (swizzle[0] == table_1010102_snorm[i].swizzle[0] &&
   1049              swizzle[1] == table_1010102_snorm[i].swizzle[1] &&
   1050              swizzle[2] == table_1010102_snorm[i].swizzle[2] &&
   1051              swizzle[3] == table_1010102_snorm[i].swizzle[3])
   1052             return table_1010102_snorm[i].format;
   1053       }
   1054       break;
   1055 
   1056    case PIPE_FORMAT_R10G10B10A2_UINT:
   1057    case PIPE_FORMAT_B10G10R10A2_UINT:
   1058       for (i = 0; i < ARRAY_SIZE(table_1010102_uint); i++) {
   1059          if (swizzle[0] == table_1010102_uint[i].swizzle[0] &&
   1060              swizzle[1] == table_1010102_uint[i].swizzle[1] &&
   1061              swizzle[2] == table_1010102_uint[i].swizzle[2] &&
   1062              swizzle[3] == table_1010102_uint[i].swizzle[3])
   1063             return table_1010102_uint[i].format;
   1064       }
   1065       break;
   1066 
   1067    default:
   1068       break;
   1069    }
   1070 
   1071    return PIPE_FORMAT_NONE;
   1072 }
   1073 
   1074 static bool
   1075 reinterpret_formats(enum pipe_format *src_format, enum pipe_format *dst_format)
   1076 {
   1077    enum pipe_format src = *src_format;
   1078    enum pipe_format dst = *dst_format;
   1079 
   1080    /* Note: dst_format has already been transformed from luminance/intensity
   1081     *       to red when this function is called.  The source format will never
   1082     *       be an intensity format, because GL_INTENSITY is not a legal value
   1083     *       for the format parameter in glTex(Sub)Image(). */
   1084 
   1085    if (format_is_alpha(src)) {
   1086       if (!format_is_alpha(dst))
   1087          return false;
   1088 
   1089       src = alpha_to_red(src);
   1090       dst = alpha_to_red(dst);
   1091    } else if (format_is_luminance(src)) {
   1092       if (!format_is_red(dst) && !format_is_red_alpha(dst))
   1093          return false;
   1094 
   1095       src = util_format_luminance_to_red(src);
   1096    } else if (util_format_is_luminance_alpha(src)) {
   1097       src = luminance_alpha_to_red_green(src);
   1098 
   1099       if (format_is_red_alpha(dst)) {
   1100          dst = red_alpha_to_red_green(dst);
   1101       } else if (!format_is_red(dst))
   1102          return false;
   1103    } else if (format_is_swizzled_rgba(src)) {
   1104       const struct util_format_description *src_desc = util_format_description(src);
   1105       const struct util_format_description *dst_desc = util_format_description(dst);
   1106       int swizzle[4];
   1107       unsigned i;
   1108 
   1109       /* Make sure the format is an RGBA and not an RGBX format */
   1110       if (src_desc->nr_channels != 4 || src_desc->swizzle[3] == PIPE_SWIZZLE_1)
   1111          return false;
   1112 
   1113       if (dst_desc->nr_channels != 4 || dst_desc->swizzle[3] == PIPE_SWIZZLE_1)
   1114          return false;
   1115 
   1116       for (i = 0; i < 4; i++)
   1117          swizzle[i] = dst_desc->swizzle[src_desc->swizzle[i]];
   1118 
   1119       dst = swizzle_format(dst, swizzle);
   1120       if (dst == PIPE_FORMAT_NONE)
   1121          return false;
   1122 
   1123       src = unswizzle_format(src);
   1124    }
   1125 
   1126    *src_format = src;
   1127    *dst_format = dst;
   1128    return true;
   1129 }
   1130 
   1131 static bool
   1132 try_pbo_upload_common(struct gl_context *ctx,
   1133                       struct pipe_surface *surface,
   1134                       const struct st_pbo_addresses *addr,
   1135                       enum pipe_format src_format)
   1136 {
   1137    struct st_context *st = st_context(ctx);
   1138    struct cso_context *cso = st->cso_context;
   1139    struct pipe_context *pipe = st->pipe;
   1140    bool success = false;
   1141    void *fs;
   1142 
   1143    fs = st_pbo_get_upload_fs(st, src_format, surface->format);
   1144    if (!fs)
   1145       return false;
   1146 
   1147    cso_save_state(cso, (CSO_BIT_FRAGMENT_SAMPLER_VIEWS |
   1148                         CSO_BIT_FRAGMENT_SAMPLERS |
   1149                         CSO_BIT_VERTEX_ELEMENTS |
   1150                         CSO_BIT_AUX_VERTEX_BUFFER_SLOT |
   1151                         CSO_BIT_FRAMEBUFFER |
   1152                         CSO_BIT_VIEWPORT |
   1153                         CSO_BIT_BLEND |
   1154                         CSO_BIT_DEPTH_STENCIL_ALPHA |
   1155                         CSO_BIT_RASTERIZER |
   1156                         CSO_BIT_STREAM_OUTPUTS |
   1157                         CSO_BIT_PAUSE_QUERIES |
   1158                         CSO_BIT_SAMPLE_MASK |
   1159                         CSO_BIT_MIN_SAMPLES |
   1160                         CSO_BIT_RENDER_CONDITION |
   1161                         CSO_BITS_ALL_SHADERS));
   1162    cso_save_constant_buffer_slot0(cso, PIPE_SHADER_FRAGMENT);
   1163 
   1164    cso_set_sample_mask(cso, ~0);
   1165    cso_set_min_samples(cso, 1);
   1166    cso_set_render_condition(cso, NULL, FALSE, 0);
   1167 
   1168    /* Set up the sampler_view */
   1169    {
   1170       struct pipe_sampler_view templ;
   1171       struct pipe_sampler_view *sampler_view;
   1172       struct pipe_sampler_state sampler = {0};
   1173       const struct pipe_sampler_state *samplers[1] = {&sampler};
   1174 
   1175       memset(&templ, 0, sizeof(templ));
   1176       templ.target = PIPE_BUFFER;
   1177       templ.format = src_format;
   1178       templ.u.buf.offset = addr->first_element * addr->bytes_per_pixel;
   1179       templ.u.buf.size = (addr->last_element - addr->first_element + 1) *
   1180                          addr->bytes_per_pixel;
   1181       templ.swizzle_r = PIPE_SWIZZLE_X;
   1182       templ.swizzle_g = PIPE_SWIZZLE_Y;
   1183       templ.swizzle_b = PIPE_SWIZZLE_Z;
   1184       templ.swizzle_a = PIPE_SWIZZLE_W;
   1185 
   1186       sampler_view = pipe->create_sampler_view(pipe, addr->buffer, &templ);
   1187       if (sampler_view == NULL)
   1188          goto fail;
   1189 
   1190       cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1, &sampler_view);
   1191 
   1192       pipe_sampler_view_reference(&sampler_view, NULL);
   1193 
   1194       cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, samplers);
   1195    }
   1196 
   1197    /* Framebuffer_state */
   1198    {
   1199       struct pipe_framebuffer_state fb;
   1200       memset(&fb, 0, sizeof(fb));
   1201       fb.width = surface->width;
   1202       fb.height = surface->height;
   1203       fb.nr_cbufs = 1;
   1204       pipe_surface_reference(&fb.cbufs[0], surface);
   1205 
   1206       cso_set_framebuffer(cso, &fb);
   1207 
   1208       pipe_surface_reference(&fb.cbufs[0], NULL);
   1209    }
   1210 
   1211    cso_set_viewport_dims(cso, surface->width, surface->height, FALSE);
   1212 
   1213    /* Blend state */
   1214    cso_set_blend(cso, &st->pbo.upload_blend);
   1215 
   1216    /* Depth/stencil/alpha state */
   1217    {
   1218       struct pipe_depth_stencil_alpha_state dsa;
   1219       memset(&dsa, 0, sizeof(dsa));
   1220       cso_set_depth_stencil_alpha(cso, &dsa);
   1221    }
   1222 
   1223    /* Set up the fragment shader */
   1224    cso_set_fragment_shader_handle(cso, fs);
   1225 
   1226    success = st_pbo_draw(st, addr, surface->width, surface->height);
   1227 
   1228 fail:
   1229    cso_restore_state(cso);
   1230    cso_restore_constant_buffer_slot0(cso, PIPE_SHADER_FRAGMENT);
   1231 
   1232    return success;
   1233 }
   1234 
   1235 static bool
   1236 try_pbo_upload(struct gl_context *ctx, GLuint dims,
   1237                struct gl_texture_image *texImage,
   1238                GLenum format, GLenum type,
   1239                enum pipe_format dst_format,
   1240                GLint xoffset, GLint yoffset, GLint zoffset,
   1241                GLint width, GLint height, GLint depth,
   1242                const void *pixels,
   1243                const struct gl_pixelstore_attrib *unpack)
   1244 {
   1245    struct st_context *st = st_context(ctx);
   1246    struct st_texture_image *stImage = st_texture_image(texImage);
   1247    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
   1248    struct pipe_resource *texture = stImage->pt;
   1249    struct pipe_context *pipe = st->pipe;
   1250    struct pipe_screen *screen = pipe->screen;
   1251    struct pipe_surface *surface = NULL;
   1252    struct st_pbo_addresses addr;
   1253    enum pipe_format src_format;
   1254    const struct util_format_description *desc;
   1255    GLenum gl_target = texImage->TexObject->Target;
   1256    bool success;
   1257 
   1258    if (!st->pbo.upload_enabled)
   1259       return false;
   1260 
   1261    /* From now on, we need the gallium representation of dimensions. */
   1262    if (gl_target == GL_TEXTURE_1D_ARRAY) {
   1263       depth = height;
   1264       height = 1;
   1265       zoffset = yoffset;
   1266       yoffset = 0;
   1267    }
   1268 
   1269    if (depth != 1 && !st->pbo.layers)
   1270       return false;
   1271 
   1272    /* Choose the source format. Initially, we do so without checking driver
   1273     * support at all because of the remapping we later perform and because
   1274     * at least the Radeon driver actually supports some formats for texture
   1275     * buffers which it doesn't support for regular textures. */
   1276    src_format = st_choose_matching_format(st, 0, format, type, unpack->SwapBytes);
   1277    if (!src_format) {
   1278       return false;
   1279    }
   1280 
   1281    src_format = util_format_linear(src_format);
   1282    desc = util_format_description(src_format);
   1283 
   1284    if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN)
   1285       return false;
   1286 
   1287    if (desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB)
   1288       return false;
   1289 
   1290    if (st->pbo.rgba_only) {
   1291       enum pipe_format orig_dst_format = dst_format;
   1292 
   1293       if (!reinterpret_formats(&src_format, &dst_format)) {
   1294          return false;
   1295       }
   1296 
   1297       if (dst_format != orig_dst_format &&
   1298           !screen->is_format_supported(screen, dst_format, PIPE_TEXTURE_2D, 0,
   1299                                        PIPE_BIND_RENDER_TARGET)) {
   1300          return false;
   1301       }
   1302    }
   1303 
   1304    if (!src_format ||
   1305        !screen->is_format_supported(screen, src_format, PIPE_BUFFER, 0,
   1306                                     PIPE_BIND_SAMPLER_VIEW)) {
   1307       return false;
   1308    }
   1309 
   1310    /* Compute buffer addresses */
   1311    addr.xoffset = xoffset;
   1312    addr.yoffset = yoffset;
   1313    addr.width = width;
   1314    addr.height = height;
   1315    addr.depth = depth;
   1316    addr.bytes_per_pixel = desc->block.bits / 8;
   1317 
   1318    if (!st_pbo_addresses_pixelstore(st, gl_target, dims == 3, unpack, pixels,
   1319                                     &addr))
   1320       return false;
   1321 
   1322    /* Set up the surface */
   1323    {
   1324       unsigned level = stObj->pt != stImage->pt ? 0 : texImage->TexObject->MinLevel + texImage->Level;
   1325       unsigned max_layer = util_max_layer(texture, level);
   1326 
   1327       zoffset += texImage->Face + texImage->TexObject->MinLayer;
   1328 
   1329       struct pipe_surface templ;
   1330       memset(&templ, 0, sizeof(templ));
   1331       templ.format = dst_format;
   1332       templ.u.tex.level = level;
   1333       templ.u.tex.first_layer = MIN2(zoffset, max_layer);
   1334       templ.u.tex.last_layer = MIN2(zoffset + depth - 1, max_layer);
   1335 
   1336       surface = pipe->create_surface(pipe, texture, &templ);
   1337       if (!surface)
   1338          return false;
   1339    }
   1340 
   1341    success = try_pbo_upload_common(ctx, surface, &addr, src_format);
   1342 
   1343    pipe_surface_reference(&surface, NULL);
   1344 
   1345    return success;
   1346 }
   1347 
   1348 static void
   1349 st_TexSubImage(struct gl_context *ctx, GLuint dims,
   1350                struct gl_texture_image *texImage,
   1351                GLint xoffset, GLint yoffset, GLint zoffset,
   1352                GLint width, GLint height, GLint depth,
   1353                GLenum format, GLenum type, const void *pixels,
   1354                const struct gl_pixelstore_attrib *unpack)
   1355 {
   1356    struct st_context *st = st_context(ctx);
   1357    struct st_texture_image *stImage = st_texture_image(texImage);
   1358    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
   1359    struct pipe_context *pipe = st->pipe;
   1360    struct pipe_screen *screen = pipe->screen;
   1361    struct pipe_resource *dst = stImage->pt;
   1362    struct pipe_resource *src = NULL;
   1363    struct pipe_resource src_templ;
   1364    struct pipe_transfer *transfer;
   1365    struct pipe_blit_info blit;
   1366    enum pipe_format src_format, dst_format;
   1367    mesa_format mesa_src_format;
   1368    GLenum gl_target = texImage->TexObject->Target;
   1369    unsigned bind;
   1370    GLubyte *map;
   1371    unsigned dstz = texImage->Face + texImage->TexObject->MinLayer;
   1372    unsigned dst_level = 0;
   1373 
   1374    st_flush_bitmap_cache(st);
   1375    st_invalidate_readpix_cache(st);
   1376 
   1377    if (stObj->pt == stImage->pt)
   1378       dst_level = texImage->TexObject->MinLevel + texImage->Level;
   1379 
   1380    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
   1381           texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
   1382 
   1383    if (!dst)
   1384       goto fallback;
   1385 
   1386    /* Try texture_subdata, which should be the fastest memcpy path. */
   1387    if (pixels &&
   1388        !_mesa_is_bufferobj(unpack->BufferObj) &&
   1389        _mesa_texstore_can_use_memcpy(ctx, texImage->_BaseFormat,
   1390                                      texImage->TexFormat, format, type,
   1391                                      unpack)) {
   1392       struct pipe_box box;
   1393       unsigned stride, layer_stride;
   1394       void *data;
   1395 
   1396       stride = _mesa_image_row_stride(unpack, width, format, type);
   1397       layer_stride = _mesa_image_image_stride(unpack, width, height, format,
   1398                                               type);
   1399       data = _mesa_image_address(dims, unpack, pixels, width, height, format,
   1400                                  type, 0, 0, 0);
   1401 
   1402       /* Convert to Gallium coordinates. */
   1403       if (gl_target == GL_TEXTURE_1D_ARRAY) {
   1404          zoffset = yoffset;
   1405          yoffset = 0;
   1406          depth = height;
   1407          height = 1;
   1408          layer_stride = stride;
   1409       }
   1410 
   1411       u_box_3d(xoffset, yoffset, zoffset + dstz, width, height, depth, &box);
   1412       pipe->texture_subdata(pipe, dst, dst_level, 0,
   1413                             &box, data, stride, layer_stride);
   1414       return;
   1415    }
   1416 
   1417    if (!st->prefer_blit_based_texture_transfer) {
   1418       goto fallback;
   1419    }
   1420 
   1421    /* XXX Fallback for depth-stencil formats due to an incomplete stencil
   1422     * blit implementation in some drivers. */
   1423    if (format == GL_DEPTH_STENCIL) {
   1424       goto fallback;
   1425    }
   1426 
   1427    /* If the base internal format and the texture format don't match,
   1428     * we can't use blit-based TexSubImage. */
   1429    if (texImage->_BaseFormat !=
   1430        _mesa_get_format_base_format(texImage->TexFormat)) {
   1431       goto fallback;
   1432    }
   1433 
   1434 
   1435    /* See if the destination format is supported. */
   1436    if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL)
   1437       bind = PIPE_BIND_DEPTH_STENCIL;
   1438    else
   1439       bind = PIPE_BIND_RENDER_TARGET;
   1440 
   1441    /* For luminance and intensity, only the red channel is stored
   1442     * in the destination. */
   1443    dst_format = util_format_linear(dst->format);
   1444    dst_format = util_format_luminance_to_red(dst_format);
   1445    dst_format = util_format_intensity_to_red(dst_format);
   1446 
   1447    if (!dst_format ||
   1448        !screen->is_format_supported(screen, dst_format, dst->target,
   1449                                     dst->nr_samples, bind)) {
   1450       goto fallback;
   1451    }
   1452 
   1453    if (_mesa_is_bufferobj(unpack->BufferObj)) {
   1454       if (try_pbo_upload(ctx, dims, texImage, format, type, dst_format,
   1455                          xoffset, yoffset, zoffset,
   1456                          width, height, depth, pixels, unpack))
   1457          return;
   1458    }
   1459 
   1460    /* See if the texture format already matches the format and type,
   1461     * in which case the memcpy-based fast path will likely be used and
   1462     * we don't have to blit. */
   1463    if (_mesa_format_matches_format_and_type(texImage->TexFormat, format,
   1464                                             type, unpack->SwapBytes, NULL)) {
   1465       goto fallback;
   1466    }
   1467 
   1468    /* Choose the source format. */
   1469    src_format = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
   1470                                           format, type, unpack->SwapBytes);
   1471    if (!src_format) {
   1472       goto fallback;
   1473    }
   1474 
   1475    mesa_src_format = st_pipe_format_to_mesa_format(src_format);
   1476 
   1477    /* There is no reason to do this if we cannot use memcpy for the temporary
   1478     * source texture at least. This also takes transfer ops into account,
   1479     * etc. */
   1480    if (!_mesa_texstore_can_use_memcpy(ctx,
   1481                              _mesa_get_format_base_format(mesa_src_format),
   1482                              mesa_src_format, format, type, unpack)) {
   1483       goto fallback;
   1484    }
   1485 
   1486    /* TexSubImage only sets a single cubemap face. */
   1487    if (gl_target == GL_TEXTURE_CUBE_MAP) {
   1488       gl_target = GL_TEXTURE_2D;
   1489    }
   1490    /* TexSubImage can specify subsets of cube map array faces
   1491     * so we need to upload via 2D array instead */
   1492    if (gl_target == GL_TEXTURE_CUBE_MAP_ARRAY) {
   1493       gl_target = GL_TEXTURE_2D_ARRAY;
   1494    }
   1495 
   1496    /* Initialize the source texture description. */
   1497    memset(&src_templ, 0, sizeof(src_templ));
   1498    src_templ.target = gl_target_to_pipe(gl_target);
   1499    src_templ.format = src_format;
   1500    src_templ.bind = PIPE_BIND_SAMPLER_VIEW;
   1501    src_templ.usage = PIPE_USAGE_STAGING;
   1502 
   1503    st_gl_texture_dims_to_pipe_dims(gl_target, width, height, depth,
   1504                                    &src_templ.width0, &src_templ.height0,
   1505                                    &src_templ.depth0, &src_templ.array_size);
   1506 
   1507    /* Check for NPOT texture support. */
   1508    if (!screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES) &&
   1509        (!util_is_power_of_two(src_templ.width0) ||
   1510         !util_is_power_of_two(src_templ.height0) ||
   1511         !util_is_power_of_two(src_templ.depth0))) {
   1512       goto fallback;
   1513    }
   1514 
   1515    /* Create the source texture. */
   1516    src = screen->resource_create(screen, &src_templ);
   1517    if (!src) {
   1518       goto fallback;
   1519    }
   1520 
   1521    /* Map source pixels. */
   1522    pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
   1523                                         format, type, pixels, unpack,
   1524                                         "glTexSubImage");
   1525    if (!pixels) {
   1526       /* This is a GL error. */
   1527       pipe_resource_reference(&src, NULL);
   1528       return;
   1529    }
   1530 
   1531    /* From now on, we need the gallium representation of dimensions. */
   1532    if (gl_target == GL_TEXTURE_1D_ARRAY) {
   1533       zoffset = yoffset;
   1534       yoffset = 0;
   1535       depth = height;
   1536       height = 1;
   1537    }
   1538 
   1539    map = pipe_transfer_map_3d(pipe, src, 0, PIPE_TRANSFER_WRITE, 0, 0, 0,
   1540                               width, height, depth, &transfer);
   1541    if (!map) {
   1542       _mesa_unmap_teximage_pbo(ctx, unpack);
   1543       pipe_resource_reference(&src, NULL);
   1544       goto fallback;
   1545    }
   1546 
   1547    /* Upload pixels (just memcpy). */
   1548    {
   1549       const uint bytesPerRow = width * util_format_get_blocksize(src_format);
   1550       GLuint row, slice;
   1551 
   1552       for (slice = 0; slice < (unsigned) depth; slice++) {
   1553          if (gl_target == GL_TEXTURE_1D_ARRAY) {
   1554             /* 1D array textures.
   1555              * We need to convert gallium coords to GL coords.
   1556              */
   1557             void *src = _mesa_image_address2d(unpack, pixels,
   1558                                                 width, depth, format,
   1559                                                 type, slice, 0);
   1560             memcpy(map, src, bytesPerRow);
   1561          }
   1562          else {
   1563             ubyte *slice_map = map;
   1564 
   1565             for (row = 0; row < (unsigned) height; row++) {
   1566                void *src = _mesa_image_address(dims, unpack, pixels,
   1567                                                  width, height, format,
   1568                                                  type, slice, row, 0);
   1569                memcpy(slice_map, src, bytesPerRow);
   1570                slice_map += transfer->stride;
   1571             }
   1572          }
   1573          map += transfer->layer_stride;
   1574       }
   1575    }
   1576 
   1577    pipe_transfer_unmap(pipe, transfer);
   1578    _mesa_unmap_teximage_pbo(ctx, unpack);
   1579 
   1580    /* Blit. */
   1581    memset(&blit, 0, sizeof(blit));
   1582    blit.src.resource = src;
   1583    blit.src.level = 0;
   1584    blit.src.format = src_format;
   1585    blit.dst.resource = dst;
   1586    blit.dst.level = dst_level;
   1587    blit.dst.format = dst_format;
   1588    blit.src.box.x = blit.src.box.y = blit.src.box.z = 0;
   1589    blit.dst.box.x = xoffset;
   1590    blit.dst.box.y = yoffset;
   1591    blit.dst.box.z = zoffset + dstz;
   1592    blit.src.box.width = blit.dst.box.width = width;
   1593    blit.src.box.height = blit.dst.box.height = height;
   1594    blit.src.box.depth = blit.dst.box.depth = depth;
   1595    blit.mask = st_get_blit_mask(format, texImage->_BaseFormat);
   1596    blit.filter = PIPE_TEX_FILTER_NEAREST;
   1597    blit.scissor_enable = FALSE;
   1598 
   1599    st->pipe->blit(st->pipe, &blit);
   1600 
   1601    pipe_resource_reference(&src, NULL);
   1602    return;
   1603 
   1604 fallback:
   1605    _mesa_store_texsubimage(ctx, dims, texImage, xoffset, yoffset, zoffset,
   1606                            width, height, depth, format, type, pixels,
   1607                            unpack);
   1608 }
   1609 
   1610 static void
   1611 st_TexImage(struct gl_context * ctx, GLuint dims,
   1612             struct gl_texture_image *texImage,
   1613             GLenum format, GLenum type, const void *pixels,
   1614             const struct gl_pixelstore_attrib *unpack)
   1615 {
   1616    assert(dims == 1 || dims == 2 || dims == 3);
   1617 
   1618    prep_teximage(ctx, texImage, format, type);
   1619 
   1620    if (texImage->Width == 0 || texImage->Height == 0 || texImage->Depth == 0)
   1621       return;
   1622 
   1623    /* allocate storage for texture data */
   1624    if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) {
   1625       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
   1626       return;
   1627    }
   1628 
   1629    st_TexSubImage(ctx, dims, texImage, 0, 0, 0,
   1630                   texImage->Width, texImage->Height, texImage->Depth,
   1631                   format, type, pixels, unpack);
   1632 }
   1633 
   1634 
   1635 static void
   1636 st_CompressedTexSubImage(struct gl_context *ctx, GLuint dims,
   1637                          struct gl_texture_image *texImage,
   1638                          GLint x, GLint y, GLint z,
   1639                          GLsizei w, GLsizei h, GLsizei d,
   1640                          GLenum format, GLsizei imageSize, const void *data)
   1641 {
   1642    struct st_context *st = st_context(ctx);
   1643    struct st_texture_image *stImage = st_texture_image(texImage);
   1644    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
   1645    struct pipe_resource *texture = stImage->pt;
   1646    struct pipe_context *pipe = st->pipe;
   1647    struct pipe_screen *screen = pipe->screen;
   1648    struct pipe_resource *dst = stImage->pt;
   1649    struct pipe_surface *surface = NULL;
   1650    struct compressed_pixelstore store;
   1651    struct st_pbo_addresses addr;
   1652    enum pipe_format copy_format;
   1653    unsigned bw, bh;
   1654    intptr_t buf_offset;
   1655    bool success = false;
   1656 
   1657    /* Check basic pre-conditions for PBO upload */
   1658    if (!st->prefer_blit_based_texture_transfer) {
   1659       goto fallback;
   1660    }
   1661 
   1662    if (!_mesa_is_bufferobj(ctx->Unpack.BufferObj))
   1663       goto fallback;
   1664 
   1665    if (st_etc_fallback(st, texImage)) {
   1666       /* ETC isn't supported and is represented by uncompressed formats. */
   1667       goto fallback;
   1668    }
   1669 
   1670    if (!dst) {
   1671       goto fallback;
   1672    }
   1673 
   1674    if (!st->pbo.upload_enabled ||
   1675        !screen->get_param(screen, PIPE_CAP_SURFACE_REINTERPRET_BLOCKS)) {
   1676       goto fallback;
   1677    }
   1678 
   1679    /* Choose the pipe format for the upload. */
   1680    addr.bytes_per_pixel = util_format_get_blocksize(dst->format);
   1681    bw = util_format_get_blockwidth(dst->format);
   1682    bh = util_format_get_blockheight(dst->format);
   1683 
   1684    switch (addr.bytes_per_pixel) {
   1685    case 8:
   1686       copy_format = PIPE_FORMAT_R16G16B16A16_UINT;
   1687       break;
   1688    case 16:
   1689       copy_format = PIPE_FORMAT_R32G32B32A32_UINT;
   1690       break;
   1691    default:
   1692       goto fallback;
   1693    }
   1694 
   1695    if (!screen->is_format_supported(screen, copy_format, PIPE_BUFFER, 0,
   1696                                     PIPE_BIND_SAMPLER_VIEW)) {
   1697       goto fallback;
   1698    }
   1699 
   1700    if (!screen->is_format_supported(screen, copy_format, dst->target,
   1701                                     dst->nr_samples, PIPE_BIND_RENDER_TARGET)) {
   1702       goto fallback;
   1703    }
   1704 
   1705    /* Interpret the pixelstore settings. */
   1706    _mesa_compute_compressed_pixelstore(dims, texImage->TexFormat, w, h, d,
   1707                                        &ctx->Unpack, &store);
   1708    assert(store.CopyBytesPerRow % addr.bytes_per_pixel == 0);
   1709    assert(store.SkipBytes % addr.bytes_per_pixel == 0);
   1710 
   1711    /* Compute the offset into the buffer */
   1712    buf_offset = (intptr_t)data + store.SkipBytes;
   1713 
   1714    if (buf_offset % addr.bytes_per_pixel) {
   1715       goto fallback;
   1716    }
   1717 
   1718    buf_offset = buf_offset / addr.bytes_per_pixel;
   1719 
   1720    addr.xoffset = x / bw;
   1721    addr.yoffset = y / bh;
   1722    addr.width = store.CopyBytesPerRow / addr.bytes_per_pixel;
   1723    addr.height = store.CopyRowsPerSlice;
   1724    addr.depth = d;
   1725    addr.pixels_per_row = store.TotalBytesPerRow / addr.bytes_per_pixel;
   1726    addr.image_height = store.TotalRowsPerSlice;
   1727 
   1728    if (!st_pbo_addresses_setup(st, st_buffer_object(ctx->Unpack.BufferObj)->buffer,
   1729                                buf_offset, &addr))
   1730       goto fallback;
   1731 
   1732    /* Set up the surface. */
   1733    {
   1734       unsigned level = stObj->pt != stImage->pt ? 0 : texImage->TexObject->MinLevel + texImage->Level;
   1735       unsigned max_layer = util_max_layer(texture, level);
   1736 
   1737       z += texImage->Face + texImage->TexObject->MinLayer;
   1738 
   1739       struct pipe_surface templ;
   1740       memset(&templ, 0, sizeof(templ));
   1741       templ.format = copy_format;
   1742       templ.u.tex.level = level;
   1743       templ.u.tex.first_layer = MIN2(z, max_layer);
   1744       templ.u.tex.last_layer = MIN2(z + d - 1, max_layer);
   1745 
   1746       surface = pipe->create_surface(pipe, texture, &templ);
   1747       if (!surface)
   1748          goto fallback;
   1749    }
   1750 
   1751    success = try_pbo_upload_common(ctx, surface, &addr, copy_format);
   1752 
   1753    pipe_surface_reference(&surface, NULL);
   1754 
   1755    if (success)
   1756       return;
   1757 
   1758 fallback:
   1759    _mesa_store_compressed_texsubimage(ctx, dims, texImage,
   1760                                       x, y, z, w, h, d,
   1761                                       format, imageSize, data);
   1762 }
   1763 
   1764 static void
   1765 st_CompressedTexImage(struct gl_context *ctx, GLuint dims,
   1766                       struct gl_texture_image *texImage,
   1767                       GLsizei imageSize, const void *data)
   1768 {
   1769    prep_teximage(ctx, texImage, GL_NONE, GL_NONE);
   1770 
   1771    /* only 2D and 3D compressed images are supported at this time */
   1772    if (dims == 1) {
   1773       _mesa_problem(ctx, "Unexpected glCompressedTexImage1D call");
   1774       return;
   1775    }
   1776 
   1777    /* This is pretty simple, because unlike the general texstore path we don't
   1778     * have to worry about the usual image unpacking or image transfer
   1779     * operations.
   1780     */
   1781    assert(texImage);
   1782    assert(texImage->Width > 0);
   1783    assert(texImage->Height > 0);
   1784    assert(texImage->Depth > 0);
   1785 
   1786    /* allocate storage for texture data */
   1787    if (!st_AllocTextureImageBuffer(ctx, texImage)) {
   1788       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage%uD", dims);
   1789       return;
   1790    }
   1791 
   1792    st_CompressedTexSubImage(ctx, dims, texImage,
   1793                             0, 0, 0,
   1794                             texImage->Width, texImage->Height, texImage->Depth,
   1795                             texImage->TexFormat,
   1796                             imageSize, data);
   1797 }
   1798 
   1799 
   1800 
   1801 
   1802 /**
   1803  * Called via ctx->Driver.GetTexSubImage()
   1804  *
   1805  * This uses a blit to copy the texture to a texture format which matches
   1806  * the format and type combo and then a fast read-back is done using memcpy.
   1807  * We can do arbitrary X/Y/Z/W/0/1 swizzling here as long as there is
   1808  * a format which matches the swizzling.
   1809  *
   1810  * If such a format isn't available, it falls back to _mesa_GetTexImage_sw.
   1811  *
   1812  * NOTE: Drivers usually do a blit to convert between tiled and linear
   1813  *       texture layouts during texture uploads/downloads, so the blit
   1814  *       we do here should be free in such cases.
   1815  */
   1816 static void
   1817 st_GetTexSubImage(struct gl_context * ctx,
   1818                   GLint xoffset, GLint yoffset, GLint zoffset,
   1819                   GLsizei width, GLsizei height, GLint depth,
   1820                   GLenum format, GLenum type, void * pixels,
   1821                   struct gl_texture_image *texImage)
   1822 {
   1823    struct st_context *st = st_context(ctx);
   1824    struct pipe_context *pipe = st->pipe;
   1825    struct pipe_screen *screen = pipe->screen;
   1826    struct st_texture_image *stImage = st_texture_image(texImage);
   1827    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
   1828    struct pipe_resource *src = stObj->pt;
   1829    struct pipe_resource *dst = NULL;
   1830    struct pipe_resource dst_templ;
   1831    enum pipe_format dst_format, src_format;
   1832    mesa_format mesa_format;
   1833    GLenum gl_target = texImage->TexObject->Target;
   1834    enum pipe_texture_target pipe_target;
   1835    unsigned dims;
   1836    struct pipe_blit_info blit;
   1837    unsigned bind;
   1838    struct pipe_transfer *tex_xfer;
   1839    ubyte *map = NULL;
   1840    boolean done = FALSE;
   1841 
   1842    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
   1843           texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
   1844 
   1845    st_flush_bitmap_cache(st);
   1846 
   1847    if (!st->prefer_blit_based_texture_transfer &&
   1848        !_mesa_is_format_compressed(texImage->TexFormat)) {
   1849       /* Try to avoid the fallback if we're doing texture decompression here */
   1850       goto fallback;
   1851    }
   1852 
   1853    /* Handle non-finalized textures. */
   1854    if (!stImage->pt || stImage->pt != stObj->pt || !src) {
   1855       goto fallback;
   1856    }
   1857 
   1858    /* XXX Fallback to _mesa_GetTexImage_sw for depth-stencil formats
   1859     * due to an incomplete stencil blit implementation in some drivers. */
   1860    if (format == GL_DEPTH_STENCIL || format == GL_STENCIL_INDEX) {
   1861       goto fallback;
   1862    }
   1863 
   1864    /* If the base internal format and the texture format don't match, we have
   1865     * to fall back to _mesa_GetTexImage_sw. */
   1866    if (texImage->_BaseFormat !=
   1867        _mesa_get_format_base_format(texImage->TexFormat)) {
   1868       goto fallback;
   1869    }
   1870 
   1871    /* See if the texture format already matches the format and type,
   1872     * in which case the memcpy-based fast path will be used. */
   1873    if (_mesa_format_matches_format_and_type(texImage->TexFormat, format,
   1874                                             type, ctx->Pack.SwapBytes, NULL)) {
   1875       goto fallback;
   1876    }
   1877 
   1878    /* Convert the source format to what is expected by GetTexImage
   1879     * and see if it's supported.
   1880     *
   1881     * This only applies to glGetTexImage:
   1882     * - Luminance must be returned as (L,0,0,1).
   1883     * - Luminance alpha must be returned as (L,0,0,A).
   1884     * - Intensity must be returned as (I,0,0,1)
   1885     */
   1886    if (stObj->surface_based)
   1887       src_format = util_format_linear(stObj->surface_format);
   1888    else
   1889       src_format = util_format_linear(src->format);
   1890    src_format = util_format_luminance_to_red(src_format);
   1891    src_format = util_format_intensity_to_red(src_format);
   1892 
   1893    if (!src_format ||
   1894        !screen->is_format_supported(screen, src_format, src->target,
   1895                                     src->nr_samples,
   1896                                     PIPE_BIND_SAMPLER_VIEW)) {
   1897       goto fallback;
   1898    }
   1899 
   1900    if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL)
   1901       bind = PIPE_BIND_DEPTH_STENCIL;
   1902    else
   1903       bind = PIPE_BIND_RENDER_TARGET;
   1904 
   1905    /* GetTexImage only returns a single face for cubemaps. */
   1906    if (gl_target == GL_TEXTURE_CUBE_MAP) {
   1907       gl_target = GL_TEXTURE_2D;
   1908    }
   1909    pipe_target = gl_target_to_pipe(gl_target);
   1910 
   1911    /* Choose the destination format by finding the best match
   1912     * for the format+type combo. */
   1913    dst_format = st_choose_matching_format(st, bind, format, type,
   1914 					  ctx->Pack.SwapBytes);
   1915 
   1916    if (dst_format == PIPE_FORMAT_NONE) {
   1917       GLenum dst_glformat;
   1918 
   1919       /* Fall back to _mesa_GetTexImage_sw except for compressed formats,
   1920        * where decompression with a blit is always preferred. */
   1921       if (!util_format_is_compressed(src->format)) {
   1922          goto fallback;
   1923       }
   1924 
   1925       /* Set the appropriate format for the decompressed texture.
   1926        * Luminance and sRGB formats shouldn't appear here.*/
   1927       switch (src_format) {
   1928       case PIPE_FORMAT_DXT1_RGB:
   1929       case PIPE_FORMAT_DXT1_RGBA:
   1930       case PIPE_FORMAT_DXT3_RGBA:
   1931       case PIPE_FORMAT_DXT5_RGBA:
   1932       case PIPE_FORMAT_RGTC1_UNORM:
   1933       case PIPE_FORMAT_RGTC2_UNORM:
   1934       case PIPE_FORMAT_ETC1_RGB8:
   1935       case PIPE_FORMAT_BPTC_RGBA_UNORM:
   1936          dst_glformat = GL_RGBA8;
   1937          break;
   1938       case PIPE_FORMAT_RGTC1_SNORM:
   1939       case PIPE_FORMAT_RGTC2_SNORM:
   1940          if (!ctx->Extensions.EXT_texture_snorm)
   1941             goto fallback;
   1942          dst_glformat = GL_RGBA8_SNORM;
   1943          break;
   1944       case PIPE_FORMAT_BPTC_RGB_FLOAT:
   1945       case PIPE_FORMAT_BPTC_RGB_UFLOAT:
   1946          if (!ctx->Extensions.ARB_texture_float)
   1947             goto fallback;
   1948          dst_glformat = GL_RGBA32F;
   1949          break;
   1950       default:
   1951          assert(0);
   1952          goto fallback;
   1953       }
   1954 
   1955       dst_format = st_choose_format(st, dst_glformat, format, type,
   1956                                     pipe_target, 0, bind, FALSE);
   1957 
   1958       if (dst_format == PIPE_FORMAT_NONE) {
   1959          /* unable to get an rgba format!?! */
   1960          goto fallback;
   1961       }
   1962    }
   1963 
   1964    /* create the destination texture of size (width X height X depth) */
   1965    memset(&dst_templ, 0, sizeof(dst_templ));
   1966    dst_templ.target = pipe_target;
   1967    dst_templ.format = dst_format;
   1968    dst_templ.bind = bind;
   1969    dst_templ.usage = PIPE_USAGE_STAGING;
   1970 
   1971    st_gl_texture_dims_to_pipe_dims(gl_target, width, height, depth,
   1972                                    &dst_templ.width0, &dst_templ.height0,
   1973                                    &dst_templ.depth0, &dst_templ.array_size);
   1974 
   1975    dst = screen->resource_create(screen, &dst_templ);
   1976    if (!dst) {
   1977       goto fallback;
   1978    }
   1979 
   1980    /* From now on, we need the gallium representation of dimensions. */
   1981    if (gl_target == GL_TEXTURE_1D_ARRAY) {
   1982       zoffset = yoffset;
   1983       yoffset = 0;
   1984       depth = height;
   1985       height = 1;
   1986    }
   1987 
   1988    assert(texImage->Face == 0 ||
   1989           texImage->TexObject->MinLayer == 0 ||
   1990           zoffset == 0);
   1991 
   1992    memset(&blit, 0, sizeof(blit));
   1993    blit.src.resource = src;
   1994    blit.src.level = texImage->Level + texImage->TexObject->MinLevel;
   1995    blit.src.format = src_format;
   1996    blit.dst.resource = dst;
   1997    blit.dst.level = 0;
   1998    blit.dst.format = dst->format;
   1999    blit.src.box.x = xoffset;
   2000    blit.dst.box.x = 0;
   2001    blit.src.box.y = yoffset;
   2002    blit.dst.box.y = 0;
   2003    blit.src.box.z = texImage->Face + texImage->TexObject->MinLayer + zoffset;
   2004    blit.dst.box.z = 0;
   2005    blit.src.box.width = blit.dst.box.width = width;
   2006    blit.src.box.height = blit.dst.box.height = height;
   2007    blit.src.box.depth = blit.dst.box.depth = depth;
   2008    blit.mask = st_get_blit_mask(texImage->_BaseFormat, format);
   2009    blit.filter = PIPE_TEX_FILTER_NEAREST;
   2010    blit.scissor_enable = FALSE;
   2011 
   2012    /* blit/render/decompress */
   2013    st->pipe->blit(st->pipe, &blit);
   2014 
   2015    pixels = _mesa_map_pbo_dest(ctx, &ctx->Pack, pixels);
   2016 
   2017    map = pipe_transfer_map_3d(pipe, dst, 0, PIPE_TRANSFER_READ,
   2018                               0, 0, 0, width, height, depth, &tex_xfer);
   2019    if (!map) {
   2020       goto end;
   2021    }
   2022 
   2023    mesa_format = st_pipe_format_to_mesa_format(dst_format);
   2024    dims = _mesa_get_texture_dimensions(gl_target);
   2025 
   2026    /* copy/pack data into user buffer */
   2027    if (_mesa_format_matches_format_and_type(mesa_format, format, type,
   2028                                             ctx->Pack.SwapBytes, NULL)) {
   2029       /* memcpy */
   2030       const uint bytesPerRow = width * util_format_get_blocksize(dst_format);
   2031       GLuint row, slice;
   2032 
   2033       for (slice = 0; slice < depth; slice++) {
   2034          ubyte *slice_map = map;
   2035 
   2036          for (row = 0; row < height; row++) {
   2037             void *dest = _mesa_image_address(dims, &ctx->Pack, pixels,
   2038                                              width, height, format, type,
   2039                                              slice, row, 0);
   2040 
   2041             memcpy(dest, slice_map, bytesPerRow);
   2042 
   2043             slice_map += tex_xfer->stride;
   2044          }
   2045 
   2046          map += tex_xfer->layer_stride;
   2047       }
   2048    }
   2049    else {
   2050       /* format translation via floats */
   2051       GLuint slice;
   2052       GLfloat *rgba;
   2053       uint32_t dstMesaFormat;
   2054       int dstStride, srcStride;
   2055 
   2056       assert(util_format_is_compressed(src->format));
   2057 
   2058       rgba = malloc(width * height * 4 * sizeof(GLfloat));
   2059       if (!rgba) {
   2060          goto end;
   2061       }
   2062 
   2063       if (ST_DEBUG & DEBUG_FALLBACK)
   2064          debug_printf("%s: fallback format translation\n", __func__);
   2065 
   2066       dstMesaFormat = _mesa_format_from_format_and_type(format, type);
   2067       dstStride = _mesa_image_row_stride(&ctx->Pack, width, format, type);
   2068       srcStride = 4 * width * sizeof(GLfloat);
   2069       for (slice = 0; slice < depth; slice++) {
   2070          void *dest = _mesa_image_address(dims, &ctx->Pack, pixels,
   2071                                           width, height, format, type,
   2072                                           slice, 0, 0);
   2073 
   2074          /* get float[4] rgba row from surface */
   2075          pipe_get_tile_rgba_format(tex_xfer, map, 0, 0, width, height,
   2076                                    dst_format, rgba);
   2077 
   2078          _mesa_format_convert(dest, dstMesaFormat, dstStride,
   2079                               rgba, RGBA32_FLOAT, srcStride,
   2080                               width, height, NULL);
   2081 
   2082          /* Handle byte swapping if required */
   2083          if (ctx->Pack.SwapBytes) {
   2084             _mesa_swap_bytes_2d_image(format, type, &ctx->Pack,
   2085                                       width, height, dest, dest);
   2086          }
   2087 
   2088          map += tex_xfer->layer_stride;
   2089       }
   2090 
   2091       free(rgba);
   2092    }
   2093    done = TRUE;
   2094 
   2095 end:
   2096    if (map)
   2097       pipe_transfer_unmap(pipe, tex_xfer);
   2098 
   2099    _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
   2100    pipe_resource_reference(&dst, NULL);
   2101 
   2102 fallback:
   2103    if (!done) {
   2104       _mesa_GetTexSubImage_sw(ctx, xoffset, yoffset, zoffset,
   2105                               width, height, depth,
   2106                               format, type, pixels, texImage);
   2107    }
   2108 }
   2109 
   2110 
   2111 /**
   2112  * Do a CopyTexSubImage operation using a read transfer from the source,
   2113  * a write transfer to the destination and get_tile()/put_tile() to access
   2114  * the pixels/texels.
   2115  *
   2116  * Note: srcY=0=TOP of renderbuffer
   2117  */
   2118 static void
   2119 fallback_copy_texsubimage(struct gl_context *ctx,
   2120                           struct st_renderbuffer *strb,
   2121                           struct st_texture_image *stImage,
   2122                           GLenum baseFormat,
   2123                           GLint destX, GLint destY, GLint slice,
   2124                           GLint srcX, GLint srcY,
   2125                           GLsizei width, GLsizei height)
   2126 {
   2127    struct st_context *st = st_context(ctx);
   2128    struct pipe_context *pipe = st->pipe;
   2129    struct pipe_transfer *src_trans;
   2130    GLubyte *texDest;
   2131    enum pipe_transfer_usage transfer_usage;
   2132    void *map;
   2133    unsigned dst_width = width;
   2134    unsigned dst_height = height;
   2135    unsigned dst_depth = 1;
   2136    struct pipe_transfer *transfer;
   2137 
   2138    if (ST_DEBUG & DEBUG_FALLBACK)
   2139       debug_printf("%s: fallback processing\n", __func__);
   2140 
   2141    if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
   2142       srcY = strb->Base.Height - srcY - height;
   2143    }
   2144 
   2145    map = pipe_transfer_map(pipe,
   2146                            strb->texture,
   2147                            strb->surface->u.tex.level,
   2148                            strb->surface->u.tex.first_layer,
   2149                            PIPE_TRANSFER_READ,
   2150                            srcX, srcY,
   2151                            width, height, &src_trans);
   2152 
   2153    if ((baseFormat == GL_DEPTH_COMPONENT ||
   2154         baseFormat == GL_DEPTH_STENCIL) &&
   2155        util_format_is_depth_and_stencil(stImage->pt->format))
   2156       transfer_usage = PIPE_TRANSFER_READ_WRITE;
   2157    else
   2158       transfer_usage = PIPE_TRANSFER_WRITE;
   2159 
   2160    texDest = st_texture_image_map(st, stImage, transfer_usage,
   2161                                   destX, destY, slice,
   2162                                   dst_width, dst_height, dst_depth,
   2163                                   &transfer);
   2164 
   2165    if (baseFormat == GL_DEPTH_COMPONENT ||
   2166        baseFormat == GL_DEPTH_STENCIL) {
   2167       const GLboolean scaleOrBias = (ctx->Pixel.DepthScale != 1.0F ||
   2168                                      ctx->Pixel.DepthBias != 0.0F);
   2169       GLint row, yStep;
   2170       uint *data;
   2171 
   2172       /* determine bottom-to-top vs. top-to-bottom order for src buffer */
   2173       if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
   2174          srcY = height - 1;
   2175          yStep = -1;
   2176       }
   2177       else {
   2178          srcY = 0;
   2179          yStep = 1;
   2180       }
   2181 
   2182       data = malloc(width * sizeof(uint));
   2183 
   2184       if (data) {
   2185          /* To avoid a large temp memory allocation, do copy row by row */
   2186          for (row = 0; row < height; row++, srcY += yStep) {
   2187             pipe_get_tile_z(src_trans, map, 0, srcY, width, 1, data);
   2188             if (scaleOrBias) {
   2189                _mesa_scale_and_bias_depth_uint(ctx, width, data);
   2190             }
   2191 
   2192             if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
   2193                pipe_put_tile_z(transfer, texDest + row*transfer->layer_stride,
   2194                                0, 0, width, 1, data);
   2195             }
   2196             else {
   2197                pipe_put_tile_z(transfer, texDest, 0, row, width, 1, data);
   2198             }
   2199          }
   2200       }
   2201       else {
   2202          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage()");
   2203       }
   2204 
   2205       free(data);
   2206    }
   2207    else {
   2208       /* RGBA format */
   2209       GLfloat *tempSrc =
   2210          malloc(width * height * 4 * sizeof(GLfloat));
   2211 
   2212       if (tempSrc && texDest) {
   2213          const GLint dims = 2;
   2214          GLint dstRowStride;
   2215          struct gl_texture_image *texImage = &stImage->base;
   2216          struct gl_pixelstore_attrib unpack = ctx->DefaultPacking;
   2217 
   2218          if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
   2219             unpack.Invert = GL_TRUE;
   2220          }
   2221 
   2222          if (stImage->pt->target == PIPE_TEXTURE_1D_ARRAY) {
   2223             dstRowStride = transfer->layer_stride;
   2224          }
   2225          else {
   2226             dstRowStride = transfer->stride;
   2227          }
   2228 
   2229          /* get float/RGBA image from framebuffer */
   2230          /* XXX this usually involves a lot of int/float conversion.
   2231           * try to avoid that someday.
   2232           */
   2233          pipe_get_tile_rgba_format(src_trans, map, 0, 0, width, height,
   2234                                    util_format_linear(strb->texture->format),
   2235                                    tempSrc);
   2236 
   2237          /* Store into texture memory.
   2238           * Note that this does some special things such as pixel transfer
   2239           * ops and format conversion.  In particular, if the dest tex format
   2240           * is actually RGBA but the user created the texture as GL_RGB we
   2241           * need to fill-in/override the alpha channel with 1.0.
   2242           */
   2243          _mesa_texstore(ctx, dims,
   2244                         texImage->_BaseFormat,
   2245                         texImage->TexFormat,
   2246                         dstRowStride,
   2247                         &texDest,
   2248                         width, height, 1,
   2249                         GL_RGBA, GL_FLOAT, tempSrc, /* src */
   2250                         &unpack);
   2251       }
   2252       else {
   2253          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage");
   2254       }
   2255 
   2256       free(tempSrc);
   2257    }
   2258 
   2259    st_texture_image_unmap(st, stImage, slice);
   2260    pipe->transfer_unmap(pipe, src_trans);
   2261 }
   2262 
   2263 
   2264 /**
   2265  * Do a CopyTex[Sub]Image1/2/3D() using a hardware (blit) path if possible.
   2266  * Note that the region to copy has already been clipped so we know we
   2267  * won't read from outside the source renderbuffer's bounds.
   2268  *
   2269  * Note: srcY=0=Bottom of renderbuffer (GL convention)
   2270  */
   2271 static void
   2272 st_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
   2273                    struct gl_texture_image *texImage,
   2274                    GLint destX, GLint destY, GLint slice,
   2275                    struct gl_renderbuffer *rb,
   2276                    GLint srcX, GLint srcY, GLsizei width, GLsizei height)
   2277 {
   2278    struct st_texture_image *stImage = st_texture_image(texImage);
   2279    struct st_texture_object *stObj = st_texture_object(texImage->TexObject);
   2280    struct st_renderbuffer *strb = st_renderbuffer(rb);
   2281    struct st_context *st = st_context(ctx);
   2282    struct pipe_context *pipe = st->pipe;
   2283    struct pipe_screen *screen = pipe->screen;
   2284    struct pipe_blit_info blit;
   2285    enum pipe_format dst_format;
   2286    GLboolean do_flip = (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP);
   2287    unsigned bind;
   2288    GLint srcY0, srcY1;
   2289 
   2290    st_flush_bitmap_cache(st);
   2291    st_invalidate_readpix_cache(st);
   2292 
   2293    assert(!_mesa_is_format_etc2(texImage->TexFormat) &&
   2294           texImage->TexFormat != MESA_FORMAT_ETC1_RGB8);
   2295 
   2296    if (!strb || !strb->surface || !stImage->pt) {
   2297       debug_printf("%s: null strb or stImage\n", __func__);
   2298       return;
   2299    }
   2300 
   2301    if (_mesa_texstore_needs_transfer_ops(ctx, texImage->_BaseFormat,
   2302                                          texImage->TexFormat)) {
   2303       goto fallback;
   2304    }
   2305 
   2306    /* The base internal format must match the mesa format, so make sure
   2307     * e.g. an RGB internal format is really allocated as RGB and not as RGBA.
   2308     */
   2309    if (texImage->_BaseFormat !=
   2310        _mesa_get_format_base_format(texImage->TexFormat) ||
   2311        rb->_BaseFormat != _mesa_get_format_base_format(rb->Format)) {
   2312       goto fallback;
   2313    }
   2314 
   2315    /* Choose the destination format to match the TexImage behavior. */
   2316    dst_format = util_format_linear(stImage->pt->format);
   2317    dst_format = util_format_luminance_to_red(dst_format);
   2318    dst_format = util_format_intensity_to_red(dst_format);
   2319 
   2320    /* See if the destination format is supported. */
   2321    if (texImage->_BaseFormat == GL_DEPTH_STENCIL ||
   2322        texImage->_BaseFormat == GL_DEPTH_COMPONENT) {
   2323       bind = PIPE_BIND_DEPTH_STENCIL;
   2324    }
   2325    else {
   2326       bind = PIPE_BIND_RENDER_TARGET;
   2327    }
   2328 
   2329    if (!dst_format ||
   2330        !screen->is_format_supported(screen, dst_format, stImage->pt->target,
   2331                                     stImage->pt->nr_samples, bind)) {
   2332       goto fallback;
   2333    }
   2334 
   2335    /* Y flipping for the main framebuffer. */
   2336    if (do_flip) {
   2337       srcY1 = strb->Base.Height - srcY - height;
   2338       srcY0 = srcY1 + height;
   2339    }
   2340    else {
   2341       srcY0 = srcY;
   2342       srcY1 = srcY0 + height;
   2343    }
   2344 
   2345    /* Blit the texture.
   2346     * This supports flipping, format conversions, and downsampling.
   2347     */
   2348    memset(&blit, 0, sizeof(blit));
   2349    blit.src.resource = strb->texture;
   2350    blit.src.format = util_format_linear(strb->surface->format);
   2351    blit.src.level = strb->surface->u.tex.level;
   2352    blit.src.box.x = srcX;
   2353    blit.src.box.y = srcY0;
   2354    blit.src.box.z = strb->surface->u.tex.first_layer;
   2355    blit.src.box.width = width;
   2356    blit.src.box.height = srcY1 - srcY0;
   2357    blit.src.box.depth = 1;
   2358    blit.dst.resource = stImage->pt;
   2359    blit.dst.format = dst_format;
   2360    blit.dst.level = stObj->pt != stImage->pt ? 0 : texImage->Level + texImage->TexObject->MinLevel;
   2361    blit.dst.box.x = destX;
   2362    blit.dst.box.y = destY;
   2363    blit.dst.box.z = stImage->base.Face + slice + texImage->TexObject->MinLayer;
   2364    blit.dst.box.width = width;
   2365    blit.dst.box.height = height;
   2366    blit.dst.box.depth = 1;
   2367    blit.mask = st_get_blit_mask(rb->_BaseFormat, texImage->_BaseFormat);
   2368    blit.filter = PIPE_TEX_FILTER_NEAREST;
   2369    pipe->blit(pipe, &blit);
   2370    return;
   2371 
   2372 fallback:
   2373    /* software fallback */
   2374    fallback_copy_texsubimage(ctx,
   2375                              strb, stImage, texImage->_BaseFormat,
   2376                              destX, destY, slice,
   2377                              srcX, srcY, width, height);
   2378 }
   2379 
   2380 
   2381 /**
   2382  * Copy image data from stImage into the texture object 'stObj' at level
   2383  * 'dstLevel'.
   2384  */
   2385 static void
   2386 copy_image_data_to_texture(struct st_context *st,
   2387 			   struct st_texture_object *stObj,
   2388                            GLuint dstLevel,
   2389 			   struct st_texture_image *stImage)
   2390 {
   2391    /* debug checks */
   2392    {
   2393       const struct gl_texture_image *dstImage =
   2394          stObj->base.Image[stImage->base.Face][dstLevel];
   2395       assert(dstImage);
   2396       assert(dstImage->Width == stImage->base.Width);
   2397       assert(dstImage->Height == stImage->base.Height);
   2398       assert(dstImage->Depth == stImage->base.Depth);
   2399    }
   2400 
   2401    if (stImage->pt) {
   2402       /* Copy potentially with the blitter:
   2403        */
   2404       GLuint src_level;
   2405       if (stImage->pt->last_level == 0)
   2406          src_level = 0;
   2407       else
   2408          src_level = stImage->base.Level;
   2409 
   2410       assert(src_level <= stImage->pt->last_level);
   2411       assert(u_minify(stImage->pt->width0, src_level) == stImage->base.Width);
   2412       assert(stImage->pt->target == PIPE_TEXTURE_1D_ARRAY ||
   2413              u_minify(stImage->pt->height0, src_level) == stImage->base.Height);
   2414       assert(stImage->pt->target == PIPE_TEXTURE_2D_ARRAY ||
   2415              stImage->pt->target == PIPE_TEXTURE_CUBE_ARRAY ||
   2416              u_minify(stImage->pt->depth0, src_level) == stImage->base.Depth);
   2417 
   2418       st_texture_image_copy(st->pipe,
   2419                             stObj->pt, dstLevel,  /* dest texture, level */
   2420                             stImage->pt, src_level, /* src texture, level */
   2421                             stImage->base.Face);
   2422 
   2423       pipe_resource_reference(&stImage->pt, NULL);
   2424    }
   2425    pipe_resource_reference(&stImage->pt, stObj->pt);
   2426 }
   2427 
   2428 
   2429 /**
   2430  * Called during state validation.  When this function is finished,
   2431  * the texture object should be ready for rendering.
   2432  * \return GL_TRUE for success, GL_FALSE for failure (out of mem)
   2433  */
   2434 GLboolean
   2435 st_finalize_texture(struct gl_context *ctx,
   2436 		    struct pipe_context *pipe,
   2437 		    struct gl_texture_object *tObj,
   2438 		    GLuint cubeMapFace)
   2439 {
   2440    struct st_context *st = st_context(ctx);
   2441    struct st_texture_object *stObj = st_texture_object(tObj);
   2442    const GLuint nr_faces = _mesa_num_tex_faces(stObj->base.Target);
   2443    GLuint face;
   2444    const struct st_texture_image *firstImage;
   2445    enum pipe_format firstImageFormat;
   2446    GLuint ptWidth, ptHeight, ptDepth, ptLayers, ptNumSamples;
   2447 
   2448    if (tObj->Immutable)
   2449       return GL_TRUE;
   2450 
   2451    if (_mesa_is_texture_complete(tObj, &tObj->Sampler)) {
   2452       /* The texture is complete and we know exactly how many mipmap levels
   2453        * are present/needed.  This is conditional because we may be called
   2454        * from the st_generate_mipmap() function when the texture object is
   2455        * incomplete.  In that case, we'll have set stObj->lastLevel before
   2456        * we get here.
   2457        */
   2458       if (stObj->base.Sampler.MinFilter == GL_LINEAR ||
   2459           stObj->base.Sampler.MinFilter == GL_NEAREST)
   2460          stObj->lastLevel = stObj->base.BaseLevel;
   2461       else
   2462          stObj->lastLevel = stObj->base._MaxLevel;
   2463    }
   2464 
   2465    if (tObj->Target == GL_TEXTURE_BUFFER) {
   2466       struct st_buffer_object *st_obj = st_buffer_object(tObj->BufferObject);
   2467 
   2468       if (!st_obj) {
   2469          pipe_resource_reference(&stObj->pt, NULL);
   2470          st_texture_release_all_sampler_views(st, stObj);
   2471          return GL_TRUE;
   2472       }
   2473 
   2474       if (st_obj->buffer != stObj->pt) {
   2475          pipe_resource_reference(&stObj->pt, st_obj->buffer);
   2476          st_texture_release_all_sampler_views(st, stObj);
   2477       }
   2478       return GL_TRUE;
   2479 
   2480    }
   2481 
   2482    firstImage = st_texture_image_const(stObj->base.Image[cubeMapFace][stObj->base.BaseLevel]);
   2483    assert(firstImage);
   2484 
   2485    /* If both firstImage and stObj point to a texture which can contain
   2486     * all active images, favour firstImage.  Note that because of the
   2487     * completeness requirement, we know that the image dimensions
   2488     * will match.
   2489     */
   2490    if (firstImage->pt &&
   2491        firstImage->pt != stObj->pt &&
   2492        (!stObj->pt || firstImage->pt->last_level >= stObj->pt->last_level)) {
   2493       pipe_resource_reference(&stObj->pt, firstImage->pt);
   2494       st_texture_release_all_sampler_views(st, stObj);
   2495    }
   2496 
   2497    /* If this texture comes from a window system, there is nothing else to do. */
   2498    if (stObj->surface_based) {
   2499       return GL_TRUE;
   2500    }
   2501 
   2502    /* Find gallium format for the Mesa texture */
   2503    firstImageFormat =
   2504       st_mesa_format_to_pipe_format(st, firstImage->base.TexFormat);
   2505 
   2506    /* Find size of level=0 Gallium mipmap image, plus number of texture layers */
   2507    {
   2508       GLuint width, height, depth;
   2509 
   2510       st_gl_texture_dims_to_pipe_dims(stObj->base.Target,
   2511                                       firstImage->base.Width2,
   2512                                       firstImage->base.Height2,
   2513                                       firstImage->base.Depth2,
   2514                                       &width, &height, &depth, &ptLayers);
   2515 
   2516       /* If we previously allocated a pipe texture and its sizes are
   2517        * compatible, use them.
   2518        */
   2519       if (stObj->pt &&
   2520           u_minify(stObj->pt->width0, firstImage->base.Level) == width &&
   2521           u_minify(stObj->pt->height0, firstImage->base.Level) == height &&
   2522           u_minify(stObj->pt->depth0, firstImage->base.Level) == depth) {
   2523          ptWidth = stObj->pt->width0;
   2524          ptHeight = stObj->pt->height0;
   2525          ptDepth = stObj->pt->depth0;
   2526       } else {
   2527          /* Otherwise, compute a new level=0 size that is compatible with the
   2528           * base level image.
   2529           */
   2530          ptWidth = width > 1 ? width << firstImage->base.Level : 1;
   2531          ptHeight = height > 1 ? height << firstImage->base.Level : 1;
   2532          ptDepth = depth > 1 ? depth << firstImage->base.Level : 1;
   2533 
   2534          /* If the base level image is 1x1x1, we still need to ensure that the
   2535           * resulting pipe texture ends up with the required number of levels
   2536           * in total.
   2537           */
   2538          if (ptWidth == 1 && ptHeight == 1 && ptDepth == 1) {
   2539             ptWidth <<= firstImage->base.Level;
   2540 
   2541             if (stObj->base.Target == GL_TEXTURE_CUBE_MAP ||
   2542                 stObj->base.Target == GL_TEXTURE_CUBE_MAP_ARRAY)
   2543                ptHeight = ptWidth;
   2544          }
   2545       }
   2546 
   2547       ptNumSamples = firstImage->base.NumSamples;
   2548    }
   2549 
   2550    /* If we already have a gallium texture, check that it matches the texture
   2551     * object's format, target, size, num_levels, etc.
   2552     */
   2553    if (stObj->pt) {
   2554       if (stObj->pt->target != gl_target_to_pipe(stObj->base.Target) ||
   2555           stObj->pt->format != firstImageFormat ||
   2556           stObj->pt->last_level < stObj->lastLevel ||
   2557           stObj->pt->width0 != ptWidth ||
   2558           stObj->pt->height0 != ptHeight ||
   2559           stObj->pt->depth0 != ptDepth ||
   2560           stObj->pt->nr_samples != ptNumSamples ||
   2561           stObj->pt->array_size != ptLayers)
   2562       {
   2563          /* The gallium texture does not match the Mesa texture so delete the
   2564           * gallium texture now.  We'll make a new one below.
   2565           */
   2566          pipe_resource_reference(&stObj->pt, NULL);
   2567          st_texture_release_all_sampler_views(st, stObj);
   2568          st->dirty |= ST_NEW_FRAMEBUFFER;
   2569       }
   2570    }
   2571 
   2572    /* May need to create a new gallium texture:
   2573     */
   2574    if (!stObj->pt) {
   2575       GLuint bindings = default_bindings(st, firstImageFormat);
   2576 
   2577       stObj->pt = st_texture_create(st,
   2578                                     gl_target_to_pipe(stObj->base.Target),
   2579                                     firstImageFormat,
   2580                                     stObj->lastLevel,
   2581                                     ptWidth,
   2582                                     ptHeight,
   2583                                     ptDepth,
   2584                                     ptLayers, ptNumSamples,
   2585                                     bindings);
   2586 
   2587       if (!stObj->pt) {
   2588          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
   2589          return GL_FALSE;
   2590       }
   2591    }
   2592 
   2593    /* Pull in any images not in the object's texture:
   2594     */
   2595    for (face = 0; face < nr_faces; face++) {
   2596       GLuint level;
   2597       for (level = stObj->base.BaseLevel; level <= stObj->lastLevel; level++) {
   2598          struct st_texture_image *stImage =
   2599             st_texture_image(stObj->base.Image[face][level]);
   2600 
   2601          /* Need to import images in main memory or held in other textures.
   2602           */
   2603          if (stImage && stObj->pt != stImage->pt) {
   2604             GLuint height;
   2605             GLuint depth;
   2606 
   2607             if (stObj->base.Target != GL_TEXTURE_1D_ARRAY)
   2608                height = u_minify(ptHeight, level);
   2609             else
   2610                height = ptLayers;
   2611 
   2612             if (stObj->base.Target == GL_TEXTURE_3D)
   2613                depth = u_minify(ptDepth, level);
   2614             else if (stObj->base.Target == GL_TEXTURE_CUBE_MAP)
   2615                depth = 1;
   2616             else
   2617                depth = ptLayers;
   2618 
   2619             if (level == 0 ||
   2620                 (stImage->base.Width == u_minify(ptWidth, level) &&
   2621                  stImage->base.Height == height &&
   2622                  stImage->base.Depth == depth)) {
   2623                /* src image fits expected dest mipmap level size */
   2624                copy_image_data_to_texture(st, stObj, level, stImage);
   2625             }
   2626          }
   2627       }
   2628    }
   2629 
   2630    return GL_TRUE;
   2631 }
   2632 
   2633 
   2634 /**
   2635  * Called via ctx->Driver.AllocTextureStorage() to allocate texture memory
   2636  * for a whole mipmap stack.
   2637  */
   2638 static GLboolean
   2639 st_AllocTextureStorage(struct gl_context *ctx,
   2640                        struct gl_texture_object *texObj,
   2641                        GLsizei levels, GLsizei width,
   2642                        GLsizei height, GLsizei depth)
   2643 {
   2644    const GLuint numFaces = _mesa_num_tex_faces(texObj->Target);
   2645    struct gl_texture_image *texImage = texObj->Image[0][0];
   2646    struct st_context *st = st_context(ctx);
   2647    struct st_texture_object *stObj = st_texture_object(texObj);
   2648    struct pipe_screen *screen = st->pipe->screen;
   2649    GLuint ptWidth, ptHeight, ptDepth, ptLayers, bindings;
   2650    enum pipe_format fmt;
   2651    GLint level;
   2652    GLuint num_samples = texImage->NumSamples;
   2653 
   2654    assert(levels > 0);
   2655 
   2656    stObj->lastLevel = levels - 1;
   2657 
   2658    fmt = st_mesa_format_to_pipe_format(st, texImage->TexFormat);
   2659 
   2660    bindings = default_bindings(st, fmt);
   2661 
   2662    /* Raise the sample count if the requested one is unsupported. */
   2663    if (num_samples > 1) {
   2664       boolean found = FALSE;
   2665 
   2666       for (; num_samples <= ctx->Const.MaxSamples; num_samples++) {
   2667          if (screen->is_format_supported(screen, fmt, PIPE_TEXTURE_2D,
   2668                                          num_samples,
   2669                                          PIPE_BIND_SAMPLER_VIEW)) {
   2670             /* Update the sample count in gl_texture_image as well. */
   2671             texImage->NumSamples = num_samples;
   2672             found = TRUE;
   2673             break;
   2674          }
   2675       }
   2676 
   2677       if (!found) {
   2678          return GL_FALSE;
   2679       }
   2680    }
   2681 
   2682    st_gl_texture_dims_to_pipe_dims(texObj->Target,
   2683                                    width, height, depth,
   2684                                    &ptWidth, &ptHeight, &ptDepth, &ptLayers);
   2685 
   2686    stObj->pt = st_texture_create(st,
   2687                                  gl_target_to_pipe(texObj->Target),
   2688                                  fmt,
   2689                                  levels - 1,
   2690                                  ptWidth,
   2691                                  ptHeight,
   2692                                  ptDepth,
   2693                                  ptLayers, num_samples,
   2694                                  bindings);
   2695    if (!stObj->pt)
   2696       return GL_FALSE;
   2697 
   2698    /* Set image resource pointers */
   2699    for (level = 0; level < levels; level++) {
   2700       GLuint face;
   2701       for (face = 0; face < numFaces; face++) {
   2702          struct st_texture_image *stImage =
   2703             st_texture_image(texObj->Image[face][level]);
   2704          pipe_resource_reference(&stImage->pt, stObj->pt);
   2705 
   2706          etc_fallback_allocate(st, stImage);
   2707       }
   2708    }
   2709 
   2710    return GL_TRUE;
   2711 }
   2712 
   2713 
   2714 static GLboolean
   2715 st_TestProxyTexImage(struct gl_context *ctx, GLenum target,
   2716                      GLuint numLevels, GLint level,
   2717                      mesa_format format, GLuint numSamples,
   2718                      GLint width, GLint height, GLint depth)
   2719 {
   2720    struct st_context *st = st_context(ctx);
   2721    struct pipe_context *pipe = st->pipe;
   2722 
   2723    if (width == 0 || height == 0 || depth == 0) {
   2724       /* zero-sized images are legal, and always fit! */
   2725       return GL_TRUE;
   2726    }
   2727 
   2728    if (pipe->screen->can_create_resource) {
   2729       /* Ask the gallium driver if the texture is too large */
   2730       struct gl_texture_object *texObj =
   2731          _mesa_get_current_tex_object(ctx, target);
   2732       struct pipe_resource pt;
   2733 
   2734       /* Setup the pipe_resource object
   2735        */
   2736       memset(&pt, 0, sizeof(pt));
   2737 
   2738       pt.target = gl_target_to_pipe(target);
   2739       pt.format = st_mesa_format_to_pipe_format(st, format);
   2740       pt.nr_samples = numSamples;
   2741 
   2742       st_gl_texture_dims_to_pipe_dims(target,
   2743                                       width, height, depth,
   2744                                       &pt.width0, &pt.height0,
   2745                                       &pt.depth0, &pt.array_size);
   2746 
   2747       if (numLevels > 0) {
   2748          /* For immutable textures we know the final number of mip levels */
   2749          pt.last_level = numLevels - 1;
   2750       }
   2751       else if (level == 0 && (texObj->Sampler.MinFilter == GL_LINEAR ||
   2752                               texObj->Sampler.MinFilter == GL_NEAREST)) {
   2753          /* assume just one mipmap level */
   2754          pt.last_level = 0;
   2755       }
   2756       else {
   2757          /* assume a full set of mipmaps */
   2758          pt.last_level = _mesa_logbase2(MAX3(width, height, depth));
   2759       }
   2760 
   2761       return pipe->screen->can_create_resource(pipe->screen, &pt);
   2762    }
   2763    else {
   2764       /* Use core Mesa fallback */
   2765       return _mesa_test_proxy_teximage(ctx, target, numLevels, level, format,
   2766                                        numSamples, width, height, depth);
   2767    }
   2768 }
   2769 
   2770 static GLboolean
   2771 st_TextureView(struct gl_context *ctx,
   2772                struct gl_texture_object *texObj,
   2773                struct gl_texture_object *origTexObj)
   2774 {
   2775    struct st_context *st = st_context(ctx);
   2776    struct st_texture_object *orig = st_texture_object(origTexObj);
   2777    struct st_texture_object *tex = st_texture_object(texObj);
   2778    struct gl_texture_image *image = texObj->Image[0][0];
   2779 
   2780    const int numFaces = _mesa_num_tex_faces(texObj->Target);
   2781    const int numLevels = texObj->NumLevels;
   2782 
   2783    int face;
   2784    int level;
   2785 
   2786    pipe_resource_reference(&tex->pt, orig->pt);
   2787 
   2788    /* Set image resource pointers */
   2789    for (level = 0; level < numLevels; level++) {
   2790       for (face = 0; face < numFaces; face++) {
   2791          struct st_texture_image *stImage =
   2792             st_texture_image(texObj->Image[face][level]);
   2793          pipe_resource_reference(&stImage->pt, tex->pt);
   2794       }
   2795    }
   2796 
   2797    tex->surface_based = GL_TRUE;
   2798    tex->surface_format =
   2799       st_mesa_format_to_pipe_format(st_context(ctx), image->TexFormat);
   2800 
   2801    tex->lastLevel = numLevels - 1;
   2802 
   2803    /* free texture sampler views.  They need to be recreated when we
   2804     * change the texture view parameters.
   2805     */
   2806    st_texture_release_all_sampler_views(st, tex);
   2807 
   2808    return GL_TRUE;
   2809 }
   2810 
   2811 static void
   2812 st_ClearTexSubImage(struct gl_context *ctx,
   2813                     struct gl_texture_image *texImage,
   2814                     GLint xoffset, GLint yoffset, GLint zoffset,
   2815                     GLsizei width, GLsizei height, GLsizei depth,
   2816                     const void *clearValue)
   2817 {
   2818    static const char zeros[16] = {0};
   2819    struct st_texture_image *stImage = st_texture_image(texImage);
   2820    struct pipe_resource *pt = stImage->pt;
   2821    struct st_context *st = st_context(ctx);
   2822    struct pipe_context *pipe = st->pipe;
   2823    unsigned level = texImage->Level;
   2824    struct pipe_box box;
   2825 
   2826    if (!pt)
   2827       return;
   2828 
   2829    st_flush_bitmap_cache(st);
   2830    st_invalidate_readpix_cache(st);
   2831 
   2832    u_box_3d(xoffset, yoffset, zoffset + texImage->Face,
   2833             width, height, depth, &box);
   2834    if (texImage->TexObject->Immutable) {
   2835       level += texImage->TexObject->MinLevel;
   2836       box.z += texImage->TexObject->MinLayer;
   2837    }
   2838 
   2839    pipe->clear_texture(pipe, pt, level, &box, clearValue ? clearValue : zeros);
   2840 }
   2841 
   2842 
   2843 /**
   2844  * Called via the glTexParam*() function, but only when some texture object
   2845  * state has actually changed.
   2846  */
   2847 static void
   2848 st_TexParameter(struct gl_context *ctx,
   2849                 struct gl_texture_object *texObj, GLenum pname)
   2850 {
   2851    struct st_context *st = st_context(ctx);
   2852    struct st_texture_object *stObj = st_texture_object(texObj);
   2853 
   2854    switch (pname) {
   2855    case GL_TEXTURE_BASE_LEVEL:
   2856    case GL_TEXTURE_MAX_LEVEL:
   2857    case GL_DEPTH_TEXTURE_MODE:
   2858    case GL_DEPTH_STENCIL_TEXTURE_MODE:
   2859    case GL_TEXTURE_SRGB_DECODE_EXT:
   2860    case GL_TEXTURE_SWIZZLE_R:
   2861    case GL_TEXTURE_SWIZZLE_G:
   2862    case GL_TEXTURE_SWIZZLE_B:
   2863    case GL_TEXTURE_SWIZZLE_A:
   2864    case GL_TEXTURE_SWIZZLE_RGBA:
   2865    case GL_TEXTURE_BUFFER_SIZE:
   2866    case GL_TEXTURE_BUFFER_OFFSET:
   2867       /* changing any of these texture parameters means we must create
   2868        * new sampler views.
   2869        */
   2870       st_texture_release_all_sampler_views(st, stObj);
   2871       break;
   2872    default:
   2873       ; /* nothing */
   2874    }
   2875 }
   2876 
   2877 
   2878 void
   2879 st_init_texture_functions(struct dd_function_table *functions)
   2880 {
   2881    functions->ChooseTextureFormat = st_ChooseTextureFormat;
   2882    functions->QueryInternalFormat = st_QueryInternalFormat;
   2883    functions->TexImage = st_TexImage;
   2884    functions->TexSubImage = st_TexSubImage;
   2885    functions->CompressedTexSubImage = st_CompressedTexSubImage;
   2886    functions->CopyTexSubImage = st_CopyTexSubImage;
   2887    functions->GenerateMipmap = st_generate_mipmap;
   2888 
   2889    functions->GetTexSubImage = st_GetTexSubImage;
   2890 
   2891    /* compressed texture functions */
   2892    functions->CompressedTexImage = st_CompressedTexImage;
   2893    functions->GetCompressedTexSubImage = _mesa_GetCompressedTexSubImage_sw;
   2894 
   2895    functions->NewTextureObject = st_NewTextureObject;
   2896    functions->NewTextureImage = st_NewTextureImage;
   2897    functions->DeleteTextureImage = st_DeleteTextureImage;
   2898    functions->DeleteTexture = st_DeleteTextureObject;
   2899    functions->AllocTextureImageBuffer = st_AllocTextureImageBuffer;
   2900    functions->FreeTextureImageBuffer = st_FreeTextureImageBuffer;
   2901    functions->MapTextureImage = st_MapTextureImage;
   2902    functions->UnmapTextureImage = st_UnmapTextureImage;
   2903 
   2904    /* XXX Temporary until we can query pipe's texture sizes */
   2905    functions->TestProxyTexImage = st_TestProxyTexImage;
   2906 
   2907    functions->AllocTextureStorage = st_AllocTextureStorage;
   2908    functions->TextureView = st_TextureView;
   2909    functions->ClearTexSubImage = st_ClearTexSubImage;
   2910 
   2911    functions->TexParameter = st_TexParameter;
   2912 }
   2913