Home | History | Annotate | Download | only in common
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (C) 2009  VMware, Inc.  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 "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     22  * OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 #include "main/glheader.h"
     26 #include "main/mtypes.h"
     27 #include "main/imports.h"
     28 #include "main/arbprogram.h"
     29 #include "main/arrayobj.h"
     30 #include "main/blend.h"
     31 #include "main/condrender.h"
     32 #include "main/depth.h"
     33 #include "main/enable.h"
     34 #include "main/enums.h"
     35 #include "main/fbobject.h"
     36 #include "main/image.h"
     37 #include "main/macros.h"
     38 #include "main/matrix.h"
     39 #include "main/multisample.h"
     40 #include "main/objectlabel.h"
     41 #include "main/readpix.h"
     42 #include "main/scissor.h"
     43 #include "main/shaderapi.h"
     44 #include "main/texobj.h"
     45 #include "main/texenv.h"
     46 #include "main/teximage.h"
     47 #include "main/texparam.h"
     48 #include "main/uniforms.h"
     49 #include "main/varray.h"
     50 #include "main/viewport.h"
     51 #include "swrast/swrast.h"
     52 #include "drivers/common/meta.h"
     53 #include "util/ralloc.h"
     54 
     55 /** Return offset in bytes of the field within a vertex struct */
     56 #define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD))
     57 
     58 static void
     59 setup_glsl_msaa_blit_scaled_shader(struct gl_context *ctx,
     60                                    struct blit_state *blit,
     61                                    struct gl_renderbuffer *src_rb,
     62                                    GLenum target, GLenum filter)
     63 {
     64    GLint loc_src_width, loc_src_height;
     65    int i, samples;
     66    int shader_offset = 0;
     67    void *mem_ctx = ralloc_context(NULL);
     68    char *fs_source;
     69    char *name, *sample_number;
     70    const uint8_t *sample_map;
     71    char *sample_map_str = rzalloc_size(mem_ctx, 1);
     72    char *sample_map_expr = rzalloc_size(mem_ctx, 1);
     73    char *texel_fetch_macro = rzalloc_size(mem_ctx, 1);
     74    const char *sampler_array_suffix = "";
     75    float x_scale, y_scale;
     76    enum blit_msaa_shader shader_index;
     77 
     78    assert(src_rb);
     79    samples = MAX2(src_rb->NumSamples, 1);
     80 
     81    if (samples == 16)
     82       x_scale = 4.0;
     83    else
     84       x_scale = 2.0;
     85    y_scale = samples / x_scale;
     86 
     87    /* We expect only power of 2 samples in source multisample buffer. */
     88    assert(samples > 0 && _mesa_is_pow_two(samples));
     89    while (samples >> (shader_offset + 1)) {
     90       shader_offset++;
     91    }
     92    /* Update the assert if we plan to support more than 16X MSAA. */
     93    assert(shader_offset > 0 && shader_offset <= 4);
     94 
     95    assert(target == GL_TEXTURE_2D_MULTISAMPLE ||
     96           target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
     97 
     98    shader_index = BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_SCALED_RESOLVE +
     99                   shader_offset - 1;
    100 
    101    if (target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) {
    102       shader_index += BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_SCALED_RESOLVE -
    103                       BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_SCALED_RESOLVE;
    104       sampler_array_suffix = "Array";
    105    }
    106 
    107    if (blit->msaa_shaders[shader_index]) {
    108       _mesa_meta_use_program(ctx, blit->msaa_shaders[shader_index]);
    109       /* Update the uniform values. */
    110       loc_src_width =
    111          _mesa_program_resource_location(blit->msaa_shaders[shader_index], GL_UNIFORM, "src_width");
    112       loc_src_height =
    113          _mesa_program_resource_location(blit->msaa_shaders[shader_index], GL_UNIFORM, "src_height");
    114       _mesa_Uniform1f(loc_src_width, src_rb->Width);
    115       _mesa_Uniform1f(loc_src_height, src_rb->Height);
    116       return;
    117    }
    118 
    119    name = ralloc_asprintf(mem_ctx, "vec4 MSAA scaled resolve");
    120 
    121    /* Below switch is used to setup the shader expression, which computes
    122     * sample index and map it to to a sample number on hardware.
    123     */
    124    switch(samples) {
    125    case 2:
    126       sample_number =  "sample_map[int(2 * fract(coord.x))]";
    127       sample_map = ctx->Const.SampleMap2x;
    128       break;
    129    case 4:
    130       sample_number =  "sample_map[int(2 * fract(coord.x) + 4 * fract(coord.y))]";
    131       sample_map = ctx->Const.SampleMap4x;
    132       break;
    133    case 8:
    134       sample_number =  "sample_map[int(2 * fract(coord.x) + 8 * fract(coord.y))]";
    135       sample_map = ctx->Const.SampleMap8x;
    136       break;
    137    case 16:
    138       sample_number =  "sample_map[int(4 * fract(coord.x) + 16 * fract(coord.y))]";
    139       sample_map = ctx->Const.SampleMap16x;
    140       break;
    141    default:
    142       sample_number = NULL;
    143       sample_map = NULL;
    144       _mesa_problem(ctx, "Unsupported sample count %d\n", samples);
    145       unreachable("Unsupported sample count");
    146    }
    147 
    148    /* Create sample map string. */
    149    for (i = 0 ; i < samples - 1; i++) {
    150       ralloc_asprintf_append(&sample_map_str, "%d, ", sample_map[i]);
    151    }
    152    ralloc_asprintf_append(&sample_map_str, "%d", sample_map[samples - 1]);
    153 
    154    /* Create sample map expression using above string. */
    155    ralloc_asprintf_append(&sample_map_expr,
    156                           "   const int sample_map[%d] = int[%d](%s);\n",
    157                           samples, samples, sample_map_str);
    158 
    159    if (target == GL_TEXTURE_2D_MULTISAMPLE) {
    160       ralloc_asprintf_append(&texel_fetch_macro,
    161                              "#define TEXEL_FETCH(coord) texelFetch(texSampler, ivec2(coord), %s);\n",
    162                              sample_number);
    163    } else {
    164       ralloc_asprintf_append(&texel_fetch_macro,
    165                              "#define TEXEL_FETCH(coord) texelFetch(texSampler, ivec3(coord, layer), %s);\n",
    166                              sample_number);
    167    }
    168 
    169    static const char vs_source[] =
    170                                "#version 130\n"
    171                                "#extension GL_ARB_explicit_attrib_location: enable\n"
    172                                "layout(location = 0) in vec2 position;\n"
    173                                "layout(location = 1) in vec3 textureCoords;\n"
    174                                "out vec2 texCoords;\n"
    175                                "flat out int layer;\n"
    176                                "void main()\n"
    177                                "{\n"
    178                                "   texCoords = textureCoords.xy;\n"
    179                                "   layer = int(textureCoords.z);\n"
    180                                "   gl_Position = vec4(position, 0.0, 1.0);\n"
    181                                "}\n"
    182       ;
    183 
    184    fs_source = ralloc_asprintf(mem_ctx,
    185                                "#version 130\n"
    186                                "#extension GL_ARB_texture_multisample : enable\n"
    187                                "uniform sampler2DMS%s texSampler;\n"
    188                                "uniform float src_width, src_height;\n"
    189                                "in vec2 texCoords;\n"
    190                                "flat in int layer;\n"
    191                                "out vec4 out_color;\n"
    192                                "\n"
    193                                "void main()\n"
    194                                "{\n"
    195                                "%s"
    196                                "   vec2 interp;\n"
    197                                "   const vec2 scale = vec2(%ff, %ff);\n"
    198                                "   const vec2 scale_inv = vec2(%ff, %ff);\n"
    199                                "   const vec2 s_0_offset = vec2(%ff, %ff);\n"
    200                                "   vec2 s_0_coord, s_1_coord, s_2_coord, s_3_coord;\n"
    201                                "   vec4 s_0_color, s_1_color, s_2_color, s_3_color;\n"
    202                                "   vec4 x_0_color, x_1_color;\n"
    203                                "   vec2 tex_coord = texCoords - s_0_offset;\n"
    204                                "\n"
    205                                "   tex_coord *= scale;\n"
    206                                "   tex_coord.x = clamp(tex_coord.x, 0.0f, scale.x * src_width - 1.0f);\n"
    207                                "   tex_coord.y = clamp(tex_coord.y, 0.0f, scale.y * src_height - 1.0f);\n"
    208                                "   interp = fract(tex_coord);\n"
    209                                "   tex_coord = ivec2(tex_coord) * scale_inv;\n"
    210                                "\n"
    211                                "   /* Compute the sample coordinates used for filtering. */\n"
    212                                "   s_0_coord = tex_coord;\n"
    213                                "   s_1_coord = tex_coord + vec2(scale_inv.x, 0.0f);\n"
    214                                "   s_2_coord = tex_coord + vec2(0.0f, scale_inv.y);\n"
    215                                "   s_3_coord = tex_coord + vec2(scale_inv.x, scale_inv.y);\n"
    216                                "\n"
    217                                "   /* Fetch sample color values. */\n"
    218                                "%s"
    219                                "   s_0_color = TEXEL_FETCH(s_0_coord)\n"
    220                                "   s_1_color = TEXEL_FETCH(s_1_coord)\n"
    221                                "   s_2_color = TEXEL_FETCH(s_2_coord)\n"
    222                                "   s_3_color = TEXEL_FETCH(s_3_coord)\n"
    223                                "#undef TEXEL_FETCH\n"
    224                                "\n"
    225                                "   /* Do bilinear filtering on sample colors. */\n"
    226                                "   x_0_color = mix(s_0_color, s_1_color, interp.x);\n"
    227                                "   x_1_color = mix(s_2_color, s_3_color, interp.x);\n"
    228                                "   out_color = mix(x_0_color, x_1_color, interp.y);\n"
    229                                "}\n",
    230                                sampler_array_suffix,
    231                                sample_map_expr,
    232                                x_scale, y_scale,
    233                                1.0f / x_scale, 1.0f / y_scale,
    234                                0.5f / x_scale, 0.5f / y_scale,
    235                                texel_fetch_macro);
    236 
    237    _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source, name,
    238                                        &blit->msaa_shaders[shader_index]);
    239    loc_src_width =
    240       _mesa_program_resource_location(blit->msaa_shaders[shader_index], GL_UNIFORM, "src_width");
    241    loc_src_height =
    242       _mesa_program_resource_location(blit->msaa_shaders[shader_index], GL_UNIFORM, "src_height");
    243    _mesa_Uniform1f(loc_src_width, src_rb->Width);
    244    _mesa_Uniform1f(loc_src_height, src_rb->Height);
    245 
    246    ralloc_free(mem_ctx);
    247 }
    248 
    249 static void
    250 setup_glsl_msaa_blit_shader(struct gl_context *ctx,
    251                             struct blit_state *blit,
    252                             const struct gl_framebuffer *drawFb,
    253                             struct gl_renderbuffer *src_rb,
    254                             GLenum target)
    255 {
    256    const char *vs_source;
    257    char *fs_source;
    258    void *mem_ctx;
    259    enum blit_msaa_shader shader_index;
    260    bool dst_is_msaa = false;
    261    GLenum src_datatype;
    262    const char *vec4_prefix;
    263    const char *sampler_array_suffix = "";
    264    char *name;
    265    const char *texcoord_type = "vec2";
    266    int samples;
    267    int shader_offset = 0;
    268 
    269    if (src_rb) {
    270       samples = MAX2(src_rb->NumSamples, 1);
    271       src_datatype = _mesa_get_format_datatype(src_rb->Format);
    272    } else {
    273       /* depth-or-color glCopyTexImage fallback path that passes a NULL rb and
    274        * doesn't handle integer.
    275        */
    276       samples = 1;
    277       src_datatype = GL_UNSIGNED_NORMALIZED;
    278    }
    279 
    280    /* We expect only power of 2 samples in source multisample buffer. */
    281    assert(samples > 0 && _mesa_is_pow_two(samples));
    282    while (samples >> (shader_offset + 1)) {
    283       shader_offset++;
    284    }
    285    /* Update the assert if we plan to support more than 16X MSAA. */
    286    assert(shader_offset >= 0 && shader_offset <= 4);
    287 
    288    if (drawFb->Visual.samples > 1) {
    289       /* If you're calling meta_BlitFramebuffer with the destination
    290        * multisampled, this is the only path that will work -- swrast and
    291        * CopyTexImage won't work on it either.
    292        */
    293       assert(ctx->Extensions.ARB_sample_shading);
    294 
    295       dst_is_msaa = true;
    296 
    297       /* We need shader invocation per sample, not per pixel */
    298       _mesa_set_enable(ctx, GL_MULTISAMPLE, GL_TRUE);
    299       _mesa_set_enable(ctx, GL_SAMPLE_SHADING, GL_TRUE);
    300       _mesa_MinSampleShading(1.0);
    301    }
    302 
    303    switch (target) {
    304    case GL_TEXTURE_2D_MULTISAMPLE:
    305    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
    306       if (src_rb && (src_rb->_BaseFormat == GL_DEPTH_COMPONENT ||
    307           src_rb->_BaseFormat == GL_DEPTH_STENCIL)) {
    308          if (dst_is_msaa)
    309             shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY;
    310          else
    311             shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_RESOLVE;
    312       } else {
    313          if (dst_is_msaa)
    314             shader_index = BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY;
    315          else {
    316             shader_index = BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE +
    317                            shader_offset;
    318          }
    319       }
    320 
    321       if (target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) {
    322          shader_index += (BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE -
    323                           BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE);
    324          sampler_array_suffix = "Array";
    325          texcoord_type = "vec3";
    326       }
    327       break;
    328    default:
    329       _mesa_problem(ctx, "Unknown texture target %s\n",
    330                     _mesa_enum_to_string(target));
    331       shader_index = BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE;
    332    }
    333 
    334    /* We rely on the enum being sorted this way. */
    335    STATIC_ASSERT(BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT ==
    336                  BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE + 5);
    337    STATIC_ASSERT(BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT ==
    338                  BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE + 10);
    339    if (src_datatype == GL_INT) {
    340       shader_index += 5;
    341       vec4_prefix = "i";
    342    } else if (src_datatype == GL_UNSIGNED_INT) {
    343       shader_index += 10;
    344       vec4_prefix = "u";
    345    } else {
    346       vec4_prefix = "";
    347    }
    348 
    349    if (blit->msaa_shaders[shader_index]) {
    350       _mesa_meta_use_program(ctx, blit->msaa_shaders[shader_index]);
    351       return;
    352    }
    353 
    354    mem_ctx = ralloc_context(NULL);
    355 
    356    if (shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_RESOLVE ||
    357        shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_RESOLVE ||
    358        shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_COPY ||
    359        shader_index == BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY) {
    360       char *sample_index;
    361       const char *tex_coords = "texCoords";
    362 
    363       if (dst_is_msaa) {
    364          sample_index = "gl_SampleID";
    365          name = "depth MSAA copy";
    366 
    367          if (ctx->Extensions.ARB_gpu_shader5 && samples >= 16) {
    368             /* See comment below for the color copy */
    369             tex_coords = "interpolateAtOffset(texCoords, vec2(0.0))";
    370          }
    371       } else {
    372          /* From the GL 4.3 spec:
    373           *
    374           *     "If there is a multisample buffer (the value of SAMPLE_BUFFERS
    375           *      is one), then values are obtained from the depth samples in
    376           *      this buffer. It is recommended that the depth value of the
    377           *      centermost sample be used, though implementations may choose
    378           *      any function of the depth sample values at each pixel.
    379           *
    380           * We're slacking and instead of choosing centermost, we've got 0.
    381           */
    382          sample_index = "0";
    383          name = "depth MSAA resolve";
    384       }
    385 
    386       vs_source = ralloc_asprintf(mem_ctx,
    387                                   "#version 130\n"
    388                                   "#extension GL_ARB_explicit_attrib_location: enable\n"
    389                                   "layout(location = 0) in vec2 position;\n"
    390                                   "layout(location = 1) in %s textureCoords;\n"
    391                                   "out %s texCoords;\n"
    392                                   "void main()\n"
    393                                   "{\n"
    394                                   "   texCoords = textureCoords;\n"
    395                                   "   gl_Position = vec4(position, 0.0, 1.0);\n"
    396                                   "}\n",
    397                                   texcoord_type,
    398                                   texcoord_type);
    399       fs_source = ralloc_asprintf(mem_ctx,
    400                                   "#version 130\n"
    401                                   "#extension GL_ARB_texture_multisample : enable\n"
    402                                   "#extension GL_ARB_sample_shading : enable\n"
    403                                   "#extension GL_ARB_gpu_shader5 : enable\n"
    404                                   "uniform sampler2DMS%s texSampler;\n"
    405                                   "in %s texCoords;\n"
    406                                   "out vec4 out_color;\n"
    407                                   "\n"
    408                                   "void main()\n"
    409                                   "{\n"
    410                                   "   gl_FragDepth = texelFetch(texSampler, i%s(%s), %s).r;\n"
    411                                   "}\n",
    412                                   sampler_array_suffix,
    413                                   texcoord_type,
    414                                   texcoord_type,
    415                                   tex_coords,
    416                                   sample_index);
    417    } else {
    418       /* You can create 2D_MULTISAMPLE textures with 0 sample count (meaning 1
    419        * sample).  Yes, this is ridiculous.
    420        */
    421       char *sample_resolve;
    422       const char *merge_function;
    423       name = ralloc_asprintf(mem_ctx, "%svec4 MSAA %s",
    424                              vec4_prefix,
    425                              dst_is_msaa ? "copy" : "resolve");
    426 
    427       if (dst_is_msaa) {
    428          const char *tex_coords;
    429 
    430          if (ctx->Extensions.ARB_gpu_shader5 && samples >= 16) {
    431             /* If interpolateAtOffset is available then it will be used to
    432              * force the interpolation to the center. This is required at
    433              * least on Intel hardware because it is possible to have a sample
    434              * position on the 0 x or y axis which means it will lie exactly
    435              * on the pixel boundary. If we let the hardware interpolate the
    436              * coordinates at one of these positions then it is possible for
    437              * it to jump to a neighboring texel when converting to ints due
    438              * to rounding errors. This is only done for >= 16x MSAA because
    439              * it probably has some overhead. It is more likely that some
    440              * hardware will use one of these problematic positions at 16x
    441              * MSAA because in that case in D3D they are defined to be at
    442              * these positions.
    443              */
    444             tex_coords = "interpolateAtOffset(texCoords, vec2(0.0))";
    445          } else {
    446             tex_coords = "texCoords";
    447          }
    448 
    449          sample_resolve =
    450             ralloc_asprintf(mem_ctx,
    451                             "   out_color = texelFetch(texSampler, "
    452                             "i%s(%s), gl_SampleID);",
    453                             texcoord_type, tex_coords);
    454 
    455          merge_function = "";
    456       } else {
    457          int i;
    458          int step;
    459 
    460          if (src_datatype == GL_INT || src_datatype == GL_UNSIGNED_INT) {
    461             /* From the OpenGL ES 3.2 spec section 16.2.1:
    462              *
    463              *    "If the source formats are integer types or stencil values,
    464              *    a single sample's value is selected for each pixel."
    465              *
    466              * The OpenGL 4.4 spec contains exactly the same language.
    467              *
    468              * We can accomplish this by making the merge function return just
    469              * one of the two samples.  The compiler should do the rest.
    470              */
    471             merge_function = "gvec4 merge(gvec4 a, gvec4 b) { return a; }\n";
    472          } else {
    473             /* The divide will happen at the end for floats. */
    474             merge_function =
    475                "vec4 merge(vec4 a, vec4 b) { return (a + b); }\n";
    476          }
    477 
    478          /* We're assuming power of two samples for this resolution procedure.
    479           *
    480           * To avoid losing any floating point precision if the samples all
    481           * happen to have the same value, we merge pairs of values at a time
    482           * (so the floating point exponent just gets increased), rather than
    483           * doing a naive sum and dividing.
    484           */
    485          assert(_mesa_is_pow_two(samples));
    486          /* Fetch each individual sample. */
    487          sample_resolve = rzalloc_size(mem_ctx, 1);
    488          for (i = 0; i < samples; i++) {
    489             ralloc_asprintf_append(&sample_resolve,
    490                                    "   gvec4 sample_1_%d = texelFetch(texSampler, i%s(texCoords), %d);\n",
    491                                    i, texcoord_type, i);
    492          }
    493          /* Now, merge each pair of samples, then merge each pair of those,
    494           * etc.
    495           */
    496          for (step = 2; step <= samples; step *= 2) {
    497             for (i = 0; i < samples; i += step) {
    498                ralloc_asprintf_append(&sample_resolve,
    499                                       "   gvec4 sample_%d_%d = merge(sample_%d_%d, sample_%d_%d);\n",
    500                                       step, i,
    501                                       step / 2, i,
    502                                       step / 2, i + step / 2);
    503             }
    504          }
    505 
    506          /* Scale the final result. */
    507          if (src_datatype == GL_UNSIGNED_INT || src_datatype == GL_INT) {
    508             ralloc_asprintf_append(&sample_resolve,
    509                                    "   out_color = sample_%d_0;\n",
    510                                    samples);
    511          } else {
    512             ralloc_asprintf_append(&sample_resolve,
    513                                    "   gl_FragColor = sample_%d_0 / %f;\n",
    514                                    samples, (float)samples);
    515          }
    516       }
    517 
    518       vs_source = ralloc_asprintf(mem_ctx,
    519                                   "#version 130\n"
    520                                   "#extension GL_ARB_explicit_attrib_location: enable\n"
    521                                   "layout(location = 0) in vec2 position;\n"
    522                                   "layout(location = 1) in %s textureCoords;\n"
    523                                   "out %s texCoords;\n"
    524                                   "void main()\n"
    525                                   "{\n"
    526                                   "   texCoords = textureCoords;\n"
    527                                   "   gl_Position = vec4(position, 0.0, 1.0);\n"
    528                                   "}\n",
    529                                   texcoord_type,
    530                                   texcoord_type);
    531       fs_source = ralloc_asprintf(mem_ctx,
    532                                   "#version 130\n"
    533                                   "#extension GL_ARB_texture_multisample : enable\n"
    534                                   "#extension GL_ARB_sample_shading : enable\n"
    535                                   "#extension GL_ARB_gpu_shader5 : enable\n"
    536                                   "#define gvec4 %svec4\n"
    537                                   "uniform %ssampler2DMS%s texSampler;\n"
    538                                   "in %s texCoords;\n"
    539                                   "out gvec4 out_color;\n"
    540                                   "\n"
    541                                   "%s" /* merge_function */
    542                                   "void main()\n"
    543                                   "{\n"
    544                                   "%s\n" /* sample_resolve */
    545                                   "}\n",
    546                                   vec4_prefix,
    547                                   vec4_prefix,
    548                                   sampler_array_suffix,
    549                                   texcoord_type,
    550                                   merge_function,
    551                                   sample_resolve);
    552    }
    553 
    554    _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source, name,
    555                                        &blit->msaa_shaders[shader_index]);
    556 
    557    ralloc_free(mem_ctx);
    558 }
    559 
    560 static void
    561 setup_glsl_blit_framebuffer(struct gl_context *ctx,
    562                             struct blit_state *blit,
    563                             const struct gl_framebuffer *drawFb,
    564                             struct gl_renderbuffer *src_rb,
    565                             GLenum target, GLenum filter,
    566                             bool is_scaled_blit,
    567                             bool do_depth)
    568 {
    569    unsigned texcoord_size;
    570    bool is_target_multisample = target == GL_TEXTURE_2D_MULTISAMPLE ||
    571                                 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
    572    bool is_filter_scaled_resolve = filter == GL_SCALED_RESOLVE_FASTEST_EXT ||
    573                                    filter == GL_SCALED_RESOLVE_NICEST_EXT;
    574 
    575    /* target = GL_TEXTURE_RECTANGLE is not supported in GLES 3.0 */
    576    assert(_mesa_is_desktop_gl(ctx) || target == GL_TEXTURE_2D);
    577 
    578    texcoord_size = 2 + (src_rb->Depth > 1 ? 1 : 0);
    579 
    580    _mesa_meta_setup_vertex_objects(ctx, &blit->VAO, &blit->buf_obj, true,
    581                                    2, texcoord_size, 0);
    582 
    583    if (is_target_multisample && is_filter_scaled_resolve && is_scaled_blit) {
    584       setup_glsl_msaa_blit_scaled_shader(ctx, blit, src_rb, target, filter);
    585    } else if (is_target_multisample) {
    586       setup_glsl_msaa_blit_shader(ctx, blit, drawFb, src_rb, target);
    587    } else {
    588       _mesa_meta_setup_blit_shader(ctx, target, do_depth,
    589                                    do_depth ? &blit->shaders_with_depth
    590                                             : &blit->shaders_without_depth);
    591    }
    592 }
    593 
    594 /**
    595  * Try to do a color or depth glBlitFramebuffer using texturing.
    596  *
    597  * We can do this when the src renderbuffer is actually a texture, or when the
    598  * driver exposes BindRenderbufferTexImage().
    599  */
    600 static bool
    601 blitframebuffer_texture(struct gl_context *ctx,
    602                         const struct gl_framebuffer *readFb,
    603                         const struct gl_framebuffer *drawFb,
    604                         GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
    605                         GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
    606                         GLenum filter, GLint flipX, GLint flipY,
    607                         GLboolean glsl_version, GLboolean do_depth)
    608 {
    609    int att_index = do_depth ? BUFFER_DEPTH : readFb->_ColorReadBufferIndex;
    610    const struct gl_renderbuffer_attachment *readAtt =
    611       &readFb->Attachment[att_index];
    612    struct blit_state *blit = &ctx->Meta->Blit;
    613    struct fb_tex_blit_state fb_tex_blit;
    614    const GLint dstX = MIN2(dstX0, dstX1);
    615    const GLint dstY = MIN2(dstY0, dstY1);
    616    const GLint dstW = abs(dstX1 - dstX0);
    617    const GLint dstH = abs(dstY1 - dstY0);
    618    const int srcW = abs(srcX1 - srcX0);
    619    const int srcH = abs(srcY1 - srcY0);
    620    bool scaled_blit = false;
    621    struct gl_texture_object *texObj;
    622    GLuint srcLevel;
    623    GLenum target;
    624    struct gl_renderbuffer *rb = readAtt->Renderbuffer;
    625    struct temp_texture *meta_temp_texture;
    626 
    627    if (rb->NumSamples && !ctx->Extensions.ARB_texture_multisample)
    628       return false;
    629 
    630    _mesa_meta_fb_tex_blit_begin(ctx, &fb_tex_blit);
    631 
    632    if (readAtt->Texture &&
    633        (readAtt->Texture->Target == GL_TEXTURE_2D ||
    634         readAtt->Texture->Target == GL_TEXTURE_RECTANGLE ||
    635         readAtt->Texture->Target == GL_TEXTURE_2D_MULTISAMPLE ||
    636         readAtt->Texture->Target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)) {
    637       /* If there's a texture attached of a type we can handle, then just use
    638        * it directly.
    639        */
    640       srcLevel = readAtt->TextureLevel;
    641       texObj = readAtt->Texture;
    642       target = texObj->Target;
    643    } else if (!readAtt->Texture && ctx->Driver.BindRenderbufferTexImage) {
    644       if (!_mesa_meta_bind_rb_as_tex_image(ctx, rb, &fb_tex_blit.tempTex,
    645                                            &texObj, &target))
    646          return false;
    647 
    648       srcLevel = 0;
    649       if (_mesa_is_winsys_fbo(readFb)) {
    650          GLint temp = srcY0;
    651          srcY0 = rb->Height - srcY1;
    652          srcY1 = rb->Height - temp;
    653          flipY = -flipY;
    654       }
    655    } else {
    656       GLenum tex_base_format;
    657       /* Fall back to doing a CopyTexSubImage to get the destination
    658        * renderbuffer into a texture.
    659        */
    660       if (ctx->Meta->Blit.no_ctsi_fallback)
    661          return false;
    662 
    663       if (rb->NumSamples > 1)
    664          return false;
    665 
    666       if (do_depth) {
    667          meta_temp_texture = _mesa_meta_get_temp_depth_texture(ctx);
    668          tex_base_format = GL_DEPTH_COMPONENT;
    669       } else {
    670          meta_temp_texture = _mesa_meta_get_temp_texture(ctx);
    671          tex_base_format =
    672             _mesa_base_tex_format(ctx, rb->InternalFormat);
    673       }
    674 
    675       srcLevel = 0;
    676       target = meta_temp_texture->Target;
    677       texObj = _mesa_lookup_texture(ctx, meta_temp_texture->TexObj);
    678       if (texObj == NULL) {
    679          return false;
    680       }
    681 
    682       _mesa_meta_setup_copypix_texture(ctx, meta_temp_texture,
    683                                        srcX0, srcY0,
    684                                        srcW, srcH,
    685                                        tex_base_format,
    686                                        filter);
    687 
    688 
    689       srcX0 = 0;
    690       srcY0 = 0;
    691       srcX1 = srcW;
    692       srcY1 = srcH;
    693    }
    694 
    695    fb_tex_blit.baseLevelSave = texObj->BaseLevel;
    696    fb_tex_blit.maxLevelSave = texObj->MaxLevel;
    697    fb_tex_blit.stencilSamplingSave = texObj->StencilSampling;
    698 
    699    scaled_blit = dstW != srcW || dstH != srcH;
    700 
    701    if (glsl_version) {
    702       setup_glsl_blit_framebuffer(ctx, blit, drawFb, rb, target, filter, scaled_blit,
    703                                   do_depth);
    704    }
    705    else {
    706       _mesa_meta_setup_ff_tnl_for_blit(ctx,
    707                                        &ctx->Meta->Blit.VAO,
    708                                        &ctx->Meta->Blit.buf_obj,
    709                                        2);
    710    }
    711 
    712    /*
    713      printf("Blit from texture!\n");
    714      printf("  srcAtt %p  dstAtt %p\n", readAtt, drawAtt);
    715      printf("  srcTex %p  dstText %p\n", texObj, drawAtt->Texture);
    716    */
    717 
    718    fb_tex_blit.samp_obj = _mesa_meta_setup_sampler(ctx, texObj, target, filter,
    719                                                    srcLevel);
    720 
    721    if (ctx->Extensions.EXT_texture_sRGB_decode) {
    722       /* The GL 4.4 spec, section 18.3.1 ("Blitting Pixel Rectangles") says:
    723        *
    724        *    "When values are taken from the read buffer, if FRAMEBUFFER_SRGB
    725        *     is enabled and the value of FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING
    726        *     for the framebuffer attachment corresponding to the read buffer
    727        *     is SRGB (see section 9.2.3), the red, green, and blue components
    728        *     are converted from the non-linear sRGB color space according to
    729        *     equation 3.24.
    730        *
    731        *     When values are written to the draw buffers, blit operations
    732        *     bypass most of the fragment pipeline.  The only fragment
    733        *     operations which affect a blit are the pixel ownership test,
    734        *     the scissor test, and sRGB conversion (see section 17.3.9)."
    735        *
    736        * ES 3.0 contains nearly the exact same text, but omits the part
    737        * about GL_FRAMEBUFFER_SRGB as that doesn't exist in ES.  Mesa
    738        * defaults it to on for ES contexts, so we can safely check it.
    739        */
    740       const bool decode =
    741          ctx->Color.sRGBEnabled &&
    742          _mesa_get_format_color_encoding(rb->Format) == GL_SRGB;
    743 
    744       _mesa_set_sampler_srgb_decode(ctx, fb_tex_blit.samp_obj,
    745                                     decode ? GL_DECODE_EXT
    746                                            : GL_SKIP_DECODE_EXT);
    747    }
    748 
    749    if (!glsl_version) {
    750       _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    751       _mesa_set_enable(ctx, target, GL_TRUE);
    752    }
    753 
    754    /* Prepare vertex data (the VBO was previously created and bound) */
    755    {
    756       struct vertex verts[4];
    757       GLfloat s0, t0, s1, t1;
    758 
    759       if (target == GL_TEXTURE_2D) {
    760          const struct gl_texture_image *texImage
    761             = _mesa_select_tex_image(texObj, target, srcLevel);
    762          s0 = srcX0 / (float) texImage->Width;
    763          s1 = srcX1 / (float) texImage->Width;
    764          t0 = srcY0 / (float) texImage->Height;
    765          t1 = srcY1 / (float) texImage->Height;
    766       }
    767       else {
    768          assert(target == GL_TEXTURE_RECTANGLE_ARB ||
    769                 target == GL_TEXTURE_2D_MULTISAMPLE ||
    770                 target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
    771          s0 = (float) srcX0;
    772          s1 = (float) srcX1;
    773          t0 = (float) srcY0;
    774          t1 = (float) srcY1;
    775       }
    776 
    777       /* Silence valgrind warnings about reading uninitialized stack. */
    778       memset(verts, 0, sizeof(verts));
    779 
    780       /* setup vertex positions */
    781       verts[0].x = -1.0F * flipX;
    782       verts[0].y = -1.0F * flipY;
    783       verts[1].x =  1.0F * flipX;
    784       verts[1].y = -1.0F * flipY;
    785       verts[2].x =  1.0F * flipX;
    786       verts[2].y =  1.0F * flipY;
    787       verts[3].x = -1.0F * flipX;
    788       verts[3].y =  1.0F * flipY;
    789 
    790       verts[0].tex[0] = s0;
    791       verts[0].tex[1] = t0;
    792       verts[0].tex[2] = readAtt->Zoffset;
    793       verts[1].tex[0] = s1;
    794       verts[1].tex[1] = t0;
    795       verts[1].tex[2] = readAtt->Zoffset;
    796       verts[2].tex[0] = s1;
    797       verts[2].tex[1] = t1;
    798       verts[2].tex[2] = readAtt->Zoffset;
    799       verts[3].tex[0] = s0;
    800       verts[3].tex[1] = t1;
    801       verts[3].tex[2] = readAtt->Zoffset;
    802 
    803       _mesa_buffer_sub_data(ctx, blit->buf_obj, 0, sizeof(verts), verts,
    804                             __func__);
    805    }
    806 
    807    /* setup viewport */
    808    _mesa_set_viewport(ctx, 0, dstX, dstY, dstW, dstH);
    809    _mesa_ColorMask(!do_depth, !do_depth, !do_depth, !do_depth);
    810    _mesa_set_enable(ctx, GL_DEPTH_TEST, do_depth);
    811    _mesa_DepthMask(do_depth);
    812    _mesa_DepthFunc(GL_ALWAYS);
    813 
    814    _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
    815    _mesa_meta_fb_tex_blit_end(ctx, target, &fb_tex_blit);
    816 
    817    return true;
    818 }
    819 
    820 void
    821 _mesa_meta_fb_tex_blit_begin(struct gl_context *ctx,
    822                              struct fb_tex_blit_state *blit)
    823 {
    824    /* None of the existing callers preinitialize fb_tex_blit_state to zeros,
    825     * and both use stack variables.  If samp_obj_save is not NULL,
    826     * _mesa_reference_sampler_object will try to dereference it.  Leaving
    827     * random garbage in samp_obj_save can only lead to crashes.
    828     *
    829     * Since the state isn't persistent across calls, we won't catch ref
    830     * counting problems.
    831     */
    832    blit->samp_obj_save = NULL;
    833    _mesa_reference_sampler_object(ctx, &blit->samp_obj_save,
    834                                   ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler);
    835    blit->tempTex = 0;
    836 }
    837 
    838 void
    839 _mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target,
    840                            struct fb_tex_blit_state *blit)
    841 {
    842    struct gl_texture_object *const texObj =
    843       _mesa_get_current_tex_object(ctx, target);
    844 
    845    /* Restore texture object state, the texture binding will
    846     * be restored by _mesa_meta_end().
    847     */
    848    if (target != GL_TEXTURE_RECTANGLE_ARB) {
    849       _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_BASE_LEVEL,
    850                                 &blit->baseLevelSave, false);
    851       _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
    852                                 &blit->maxLevelSave, false);
    853    }
    854 
    855    /* If ARB_stencil_texturing is not supported, the mode won't have changed. */
    856    if (texObj->StencilSampling != blit->stencilSamplingSave) {
    857       /* GLint so the compiler won't complain about type signedness mismatch
    858        * in the call to _mesa_texture_parameteriv below.
    859        */
    860       const GLint param = blit->stencilSamplingSave ?
    861          GL_STENCIL_INDEX : GL_DEPTH_COMPONENT;
    862 
    863       _mesa_texture_parameteriv(ctx, texObj, GL_DEPTH_STENCIL_TEXTURE_MODE,
    864                                 &param, false);
    865    }
    866 
    867    _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit, blit->samp_obj_save);
    868    _mesa_reference_sampler_object(ctx, &blit->samp_obj_save, NULL);
    869    _mesa_reference_sampler_object(ctx, &blit->samp_obj, NULL);
    870 
    871    if (blit->tempTex)
    872       _mesa_DeleteTextures(1, &blit->tempTex);
    873 }
    874 
    875 GLboolean
    876 _mesa_meta_bind_rb_as_tex_image(struct gl_context *ctx,
    877                                 struct gl_renderbuffer *rb,
    878                                 GLuint *tex,
    879                                 struct gl_texture_object **texObj,
    880                                 GLenum *target)
    881 {
    882    struct gl_texture_image *texImage;
    883    GLuint tempTex;
    884 
    885    if (rb->NumSamples > 1)
    886       *target = GL_TEXTURE_2D_MULTISAMPLE;
    887    else
    888       *target = GL_TEXTURE_2D;
    889 
    890    tempTex = 0;
    891    _mesa_GenTextures(1, &tempTex);
    892    if (tempTex == 0)
    893       return false;
    894 
    895    *tex = tempTex;
    896 
    897    _mesa_BindTexture(*target, *tex);
    898    *texObj = _mesa_lookup_texture(ctx, *tex);
    899    texImage = _mesa_get_tex_image(ctx, *texObj, *target, 0);
    900 
    901    if (!ctx->Driver.BindRenderbufferTexImage(ctx, rb, texImage)) {
    902       _mesa_DeleteTextures(1, tex);
    903       return false;
    904    }
    905 
    906    if (ctx->Driver.FinishRenderTexture && !rb->NeedsFinishRenderTexture) {
    907       rb->NeedsFinishRenderTexture = true;
    908       ctx->Driver.FinishRenderTexture(ctx, rb);
    909    }
    910 
    911    return true;
    912 }
    913 
    914 struct gl_sampler_object *
    915 _mesa_meta_setup_sampler(struct gl_context *ctx,
    916                          struct gl_texture_object *texObj,
    917                          GLenum target, GLenum filter, GLuint srcLevel)
    918 {
    919    struct gl_sampler_object *samp_obj;
    920    GLenum tex_filter = (filter == GL_SCALED_RESOLVE_FASTEST_EXT ||
    921                         filter == GL_SCALED_RESOLVE_NICEST_EXT) ?
    922                        GL_NEAREST : filter;
    923 
    924    samp_obj =  ctx->Driver.NewSamplerObject(ctx, 0xDEADBEEF);
    925    if (samp_obj == NULL)
    926       return NULL;
    927 
    928    _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit, samp_obj);
    929    _mesa_set_sampler_filters(ctx, samp_obj, tex_filter, tex_filter);
    930    _mesa_set_sampler_wrap(ctx, samp_obj, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE,
    931                           samp_obj->WrapR);
    932 
    933    /* Prepare src texture state */
    934    _mesa_BindTexture(target, texObj->Name);
    935    if (target != GL_TEXTURE_RECTANGLE_ARB) {
    936       _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_BASE_LEVEL,
    937                                 (GLint *) &srcLevel, false);
    938       _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
    939                                 (GLint *) &srcLevel, false);
    940    }
    941 
    942    return samp_obj;
    943 }
    944 
    945 /**
    946  * Meta implementation of ctx->Driver.BlitFramebuffer() in terms
    947  * of texture mapping and polygon rendering.
    948  */
    949 GLbitfield
    950 _mesa_meta_BlitFramebuffer(struct gl_context *ctx,
    951                            const struct gl_framebuffer *readFb,
    952                            const struct gl_framebuffer *drawFb,
    953                            GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
    954                            GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
    955                            GLbitfield mask, GLenum filter)
    956 {
    957    const GLint dstW = abs(dstX1 - dstX0);
    958    const GLint dstH = abs(dstY1 - dstY0);
    959    const GLint dstFlipX = (dstX1 - dstX0) / dstW;
    960    const GLint dstFlipY = (dstY1 - dstY0) / dstH;
    961 
    962    struct {
    963       GLint srcX0, srcY0, srcX1, srcY1;
    964       GLint dstX0, dstY0, dstX1, dstY1;
    965    } clip = {
    966       srcX0, srcY0, srcX1, srcY1,
    967       dstX0, dstY0, dstX1, dstY1
    968    };
    969 
    970    const GLboolean use_glsl_version = ctx->Extensions.ARB_vertex_shader &&
    971                                       ctx->Extensions.ARB_fragment_shader;
    972 
    973    /* Multisample texture blit support requires texture multisample. */
    974    if (readFb->Visual.samples > 0 &&
    975        !ctx->Extensions.ARB_texture_multisample) {
    976       return mask;
    977    }
    978 
    979    /* Clip a copy of the blit coordinates. If these differ from the input
    980     * coordinates, then we'll set the scissor.
    981     */
    982    if (!_mesa_clip_blit(ctx, readFb, drawFb,
    983                         &clip.srcX0, &clip.srcY0, &clip.srcX1, &clip.srcY1,
    984                         &clip.dstX0, &clip.dstY0, &clip.dstX1, &clip.dstY1)) {
    985       /* clipped/scissored everything away */
    986       return 0;
    987    }
    988 
    989    /* Only scissor and FRAMEBUFFER_SRGB affect blit.  Leave sRGB alone, but
    990     * save restore scissor as we'll set a custom scissor if necessary.
    991     */
    992    _mesa_meta_begin(ctx, MESA_META_ALL &
    993                          ~(MESA_META_DRAW_BUFFERS |
    994                            MESA_META_FRAMEBUFFER_SRGB));
    995 
    996    /* Dithering shouldn't be performed for glBlitFramebuffer */
    997    _mesa_set_enable(ctx, GL_DITHER, GL_FALSE);
    998 
    999    /* If the clipping earlier changed the destination rect at all, then
   1000     * enable the scissor to clip to it.
   1001     */
   1002    if (clip.dstX0 != dstX0 || clip.dstY0 != dstY0 ||
   1003        clip.dstX1 != dstX1 || clip.dstY1 != dstY1) {
   1004       _mesa_set_enable(ctx, GL_SCISSOR_TEST, GL_TRUE);
   1005       _mesa_Scissor(MIN2(clip.dstX0, clip.dstX1),
   1006                     MIN2(clip.dstY0, clip.dstY1),
   1007                     abs(clip.dstX0 - clip.dstX1),
   1008                     abs(clip.dstY0 - clip.dstY1));
   1009    }
   1010 
   1011    /* Try faster, direct texture approach first */
   1012    if (mask & GL_COLOR_BUFFER_BIT) {
   1013       if (blitframebuffer_texture(ctx, readFb, drawFb,
   1014                                   srcX0, srcY0, srcX1, srcY1,
   1015                                   dstX0, dstY0, dstX1, dstY1,
   1016                                   filter, dstFlipX, dstFlipY,
   1017                                   use_glsl_version, false)) {
   1018          mask &= ~GL_COLOR_BUFFER_BIT;
   1019       }
   1020    }
   1021 
   1022    if (mask & GL_DEPTH_BUFFER_BIT && use_glsl_version) {
   1023       if (blitframebuffer_texture(ctx, readFb, drawFb,
   1024                                   srcX0, srcY0, srcX1, srcY1,
   1025                                   dstX0, dstY0, dstX1, dstY1,
   1026                                   filter, dstFlipX, dstFlipY,
   1027                                   use_glsl_version, true)) {
   1028          mask &= ~GL_DEPTH_BUFFER_BIT;
   1029       }
   1030    }
   1031 
   1032    if (mask & GL_STENCIL_BUFFER_BIT) {
   1033       /* XXX can't easily do stencil */
   1034    }
   1035 
   1036    _mesa_meta_end(ctx);
   1037 
   1038    return mask;
   1039 }
   1040 
   1041 void
   1042 _mesa_meta_glsl_blit_cleanup(struct gl_context *ctx, struct blit_state *blit)
   1043 {
   1044    if (blit->VAO) {
   1045       _mesa_DeleteVertexArrays(1, &blit->VAO);
   1046       blit->VAO = 0;
   1047       _mesa_reference_buffer_object(ctx, &blit->buf_obj, NULL);
   1048    }
   1049 
   1050    _mesa_meta_blit_shader_table_cleanup(ctx, &blit->shaders_with_depth);
   1051    _mesa_meta_blit_shader_table_cleanup(ctx, &blit->shaders_without_depth);
   1052 
   1053    _mesa_DeleteTextures(1, &blit->depthTex.TexObj);
   1054    blit->depthTex.TexObj = 0;
   1055 }
   1056 
   1057 void
   1058 _mesa_meta_and_swrast_BlitFramebuffer(struct gl_context *ctx,
   1059                                       struct gl_framebuffer *readFb,
   1060                                       struct gl_framebuffer *drawFb,
   1061                                       GLint srcX0, GLint srcY0,
   1062                                       GLint srcX1, GLint srcY1,
   1063                                       GLint dstX0, GLint dstY0,
   1064                                       GLint dstX1, GLint dstY1,
   1065                                       GLbitfield mask, GLenum filter)
   1066 {
   1067    mask = _mesa_meta_BlitFramebuffer(ctx, readFb, drawFb,
   1068                                      srcX0, srcY0, srcX1, srcY1,
   1069                                      dstX0, dstY0, dstX1, dstY1,
   1070                                      mask, filter);
   1071    if (mask == 0x0)
   1072       return;
   1073 
   1074    _swrast_BlitFramebuffer(ctx, readFb, drawFb,
   1075                            srcX0, srcY0, srcX1, srcY1,
   1076                            dstX0, dstY0, dstX1, dstY1,
   1077                            mask, filter);
   1078 }
   1079