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 /**
     26  * Meta operations.  Some GL operations can be expressed in terms of
     27  * other GL operations.  For example, glBlitFramebuffer() can be done
     28  * with texture mapping and glClear() can be done with polygon rendering.
     29  *
     30  * \author Brian Paul
     31  */
     32 
     33 
     34 #include "main/glheader.h"
     35 #include "main/mtypes.h"
     36 #include "main/imports.h"
     37 #include "main/arbprogram.h"
     38 #include "main/arrayobj.h"
     39 #include "main/blend.h"
     40 #include "main/blit.h"
     41 #include "main/bufferobj.h"
     42 #include "main/buffers.h"
     43 #include "main/clear.h"
     44 #include "main/condrender.h"
     45 #include "main/depth.h"
     46 #include "main/enable.h"
     47 #include "main/fbobject.h"
     48 #include "main/feedback.h"
     49 #include "main/formats.h"
     50 #include "main/format_unpack.h"
     51 #include "main/framebuffer.h"
     52 #include "main/glformats.h"
     53 #include "main/image.h"
     54 #include "main/macros.h"
     55 #include "main/matrix.h"
     56 #include "main/mipmap.h"
     57 #include "main/multisample.h"
     58 #include "main/objectlabel.h"
     59 #include "main/pipelineobj.h"
     60 #include "main/pixel.h"
     61 #include "main/pbo.h"
     62 #include "main/polygon.h"
     63 #include "main/queryobj.h"
     64 #include "main/readpix.h"
     65 #include "main/renderbuffer.h"
     66 #include "main/scissor.h"
     67 #include "main/shaderapi.h"
     68 #include "main/shaderobj.h"
     69 #include "main/state.h"
     70 #include "main/stencil.h"
     71 #include "main/texobj.h"
     72 #include "main/texenv.h"
     73 #include "main/texgetimage.h"
     74 #include "main/teximage.h"
     75 #include "main/texparam.h"
     76 #include "main/texstate.h"
     77 #include "main/texstore.h"
     78 #include "main/transformfeedback.h"
     79 #include "main/uniforms.h"
     80 #include "main/varray.h"
     81 #include "main/viewport.h"
     82 #include "main/samplerobj.h"
     83 #include "program/program.h"
     84 #include "swrast/swrast.h"
     85 #include "drivers/common/meta.h"
     86 #include "main/enums.h"
     87 #include "main/glformats.h"
     88 #include "util/bitscan.h"
     89 #include "util/ralloc.h"
     90 
     91 /** Return offset in bytes of the field within a vertex struct */
     92 #define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD))
     93 
     94 static void
     95 meta_clear(struct gl_context *ctx, GLbitfield buffers, bool glsl);
     96 
     97 static struct blit_shader *
     98 choose_blit_shader(GLenum target, struct blit_shader_table *table);
     99 
    100 static void cleanup_temp_texture(struct temp_texture *tex);
    101 static void meta_glsl_clear_cleanup(struct gl_context *ctx,
    102                                     struct clear_state *clear);
    103 static void meta_decompress_cleanup(struct gl_context *ctx,
    104                                     struct decompress_state *decompress);
    105 static void meta_drawpix_cleanup(struct gl_context *ctx,
    106                                  struct drawpix_state *drawpix);
    107 
    108 void
    109 _mesa_meta_framebuffer_texture_image(struct gl_context *ctx,
    110                                      struct gl_framebuffer *fb,
    111                                      GLenum attachment,
    112                                      struct gl_texture_image *texImage,
    113                                      GLuint layer)
    114 {
    115    struct gl_texture_object *texObj = texImage->TexObject;
    116    int level = texImage->Level;
    117    const GLenum texTarget = texObj->Target == GL_TEXTURE_CUBE_MAP
    118       ? GL_TEXTURE_CUBE_MAP_POSITIVE_X + texImage->Face
    119       : texObj->Target;
    120 
    121    _mesa_framebuffer_texture(ctx, fb, attachment, texObj, texTarget,
    122                              level, layer, false, __func__);
    123 }
    124 
    125 static struct gl_shader *
    126 meta_compile_shader_with_debug(struct gl_context *ctx, gl_shader_stage stage,
    127                                const GLcharARB *source)
    128 {
    129    const GLuint name = ~0;
    130    struct gl_shader *sh;
    131 
    132    sh = _mesa_new_shader(name, stage);
    133    sh->Source = strdup(source);
    134    sh->CompileStatus = false;
    135    _mesa_compile_shader(ctx, sh);
    136 
    137    if (!sh->CompileStatus) {
    138       if (sh->InfoLog) {
    139          _mesa_problem(ctx,
    140                        "meta program compile failed:\n%s\nsource:\n%s\n",
    141                        sh->InfoLog, source);
    142       }
    143 
    144       _mesa_reference_shader(ctx, &sh, NULL);
    145    }
    146 
    147    return sh;
    148 }
    149 
    150 void
    151 _mesa_meta_link_program_with_debug(struct gl_context *ctx,
    152                                    struct gl_shader_program *sh_prog)
    153 {
    154    _mesa_link_program(ctx, sh_prog);
    155 
    156    if (!sh_prog->data->LinkStatus) {
    157       _mesa_problem(ctx, "meta program link failed:\n%s",
    158                     sh_prog->data->InfoLog);
    159    }
    160 }
    161 
    162 void
    163 _mesa_meta_use_program(struct gl_context *ctx,
    164                        struct gl_shader_program *sh_prog)
    165 {
    166    /* Attach shader state to the binding point */
    167    _mesa_reference_pipeline_object(ctx, &ctx->_Shader, &ctx->Shader);
    168 
    169    /* Update the program */
    170    _mesa_use_program(ctx, sh_prog);
    171 }
    172 
    173 void
    174 _mesa_meta_compile_and_link_program(struct gl_context *ctx,
    175                                     const char *vs_source,
    176                                     const char *fs_source,
    177                                     const char *name,
    178                                     struct gl_shader_program **out_sh_prog)
    179 {
    180    struct gl_shader_program *sh_prog;
    181    const GLuint id = ~0;
    182 
    183    sh_prog = _mesa_new_shader_program(id);
    184    sh_prog->Label = strdup(name);
    185    sh_prog->NumShaders = 2;
    186    sh_prog->Shaders = malloc(2 * sizeof(struct gl_shader *));
    187    sh_prog->Shaders[0] =
    188       meta_compile_shader_with_debug(ctx, MESA_SHADER_VERTEX, vs_source);
    189    sh_prog->Shaders[1] =
    190       meta_compile_shader_with_debug(ctx, MESA_SHADER_FRAGMENT, fs_source);
    191 
    192    _mesa_meta_link_program_with_debug(ctx, sh_prog);
    193 
    194    _mesa_meta_use_program(ctx, sh_prog);
    195 
    196    *out_sh_prog = sh_prog;
    197 }
    198 
    199 /**
    200  * Generate a generic shader to blit from a texture to a framebuffer
    201  *
    202  * \param ctx       Current GL context
    203  * \param texTarget Texture target that will be the source of the blit
    204  *
    205  * \returns a handle to a shader program on success or zero on failure.
    206  */
    207 void
    208 _mesa_meta_setup_blit_shader(struct gl_context *ctx,
    209                              GLenum target,
    210                              bool do_depth,
    211                              struct blit_shader_table *table)
    212 {
    213    char *vs_source, *fs_source;
    214    struct blit_shader *shader = choose_blit_shader(target, table);
    215    const char *fs_input, *vs_preprocess, *fs_preprocess;
    216    void *mem_ctx;
    217 
    218    if (ctx->Const.GLSLVersion < 130) {
    219       vs_preprocess = "";
    220       fs_preprocess = "#extension GL_EXT_texture_array : enable";
    221       fs_input = "varying";
    222    } else {
    223       vs_preprocess = "#version 130";
    224       fs_preprocess = "#version 130";
    225       fs_input = "in";
    226       shader->func = "texture";
    227    }
    228 
    229    assert(shader != NULL);
    230 
    231    if (shader->shader_prog != NULL) {
    232       _mesa_meta_use_program(ctx, shader->shader_prog);
    233       return;
    234    }
    235 
    236    mem_ctx = ralloc_context(NULL);
    237 
    238    vs_source = ralloc_asprintf(mem_ctx,
    239                 "%s\n"
    240                 "#extension GL_ARB_explicit_attrib_location: enable\n"
    241                 "layout(location = 0) in vec2 position;\n"
    242                 "layout(location = 1) in vec4 textureCoords;\n"
    243                 "out vec4 texCoords;\n"
    244                 "void main()\n"
    245                 "{\n"
    246                 "   texCoords = textureCoords;\n"
    247                 "   gl_Position = vec4(position, 0.0, 1.0);\n"
    248                 "}\n",
    249                 vs_preprocess);
    250 
    251    fs_source = ralloc_asprintf(mem_ctx,
    252                 "%s\n"
    253                 "#extension GL_ARB_texture_cube_map_array: enable\n"
    254                 "uniform %s texSampler;\n"
    255                 "%s vec4 texCoords;\n"
    256                 "void main()\n"
    257                 "{\n"
    258                 "   gl_FragColor = %s(texSampler, %s);\n"
    259                 "%s"
    260                 "}\n",
    261                 fs_preprocess, shader->type, fs_input,
    262                 shader->func, shader->texcoords,
    263                 do_depth ?  "   gl_FragDepth = gl_FragColor.x;\n" : "");
    264 
    265    _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source,
    266                                        ralloc_asprintf(mem_ctx, "%s blit",
    267                                                        shader->type),
    268                                        &shader->shader_prog);
    269    ralloc_free(mem_ctx);
    270 }
    271 
    272 /**
    273  * Configure vertex buffer and vertex array objects for tests
    274  *
    275  * Regardless of whether a new VAO is created, the object referenced by \c VAO
    276  * will be bound into the GL state vector when this function terminates.  The
    277  * object referenced by \c VBO will \b not be bound.
    278  *
    279  * \param VAO       Storage for vertex array object handle.  If 0, a new VAO
    280  *                  will be created.
    281  * \param buf_obj   Storage for vertex buffer object pointer.  If \c NULL, a new VBO
    282  *                  will be created.  The new VBO will have storage for 4
    283  *                  \c vertex structures.
    284  * \param use_generic_attributes  Should generic attributes 0 and 1 be used,
    285  *                  or should traditional, fixed-function color and texture
    286  *                  coordinate be used?
    287  * \param vertex_size  Number of components for attribute 0 / vertex.
    288  * \param texcoord_size  Number of components for attribute 1 / texture
    289  *                  coordinate.  If this is 0, attribute 1 will not be set or
    290  *                  enabled.
    291  * \param color_size  Number of components for attribute 1 / primary color.
    292  *                  If this is 0, attribute 1 will not be set or enabled.
    293  *
    294  * \note If \c use_generic_attributes is \c true, \c color_size must be zero.
    295  * Use \c texcoord_size instead.
    296  */
    297 void
    298 _mesa_meta_setup_vertex_objects(struct gl_context *ctx,
    299                                 GLuint *VAO, struct gl_buffer_object **buf_obj,
    300                                 bool use_generic_attributes,
    301                                 unsigned vertex_size, unsigned texcoord_size,
    302                                 unsigned color_size)
    303 {
    304    if (*VAO == 0) {
    305       struct gl_vertex_array_object *array_obj;
    306       assert(*buf_obj == NULL);
    307 
    308       /* create vertex array object */
    309       _mesa_GenVertexArrays(1, VAO);
    310       _mesa_BindVertexArray(*VAO);
    311 
    312       array_obj = _mesa_lookup_vao(ctx, *VAO);
    313       assert(array_obj != NULL);
    314 
    315       /* create vertex array buffer */
    316       *buf_obj = ctx->Driver.NewBufferObject(ctx, 0xDEADBEEF);
    317       if (*buf_obj == NULL)
    318          return;
    319 
    320       _mesa_buffer_data(ctx, *buf_obj, GL_NONE, 4 * sizeof(struct vertex), NULL,
    321                         GL_DYNAMIC_DRAW, __func__);
    322 
    323       /* setup vertex arrays */
    324       if (use_generic_attributes) {
    325          assert(color_size == 0);
    326 
    327          _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_GENERIC(0),
    328                                    vertex_size, GL_FLOAT, GL_RGBA, GL_FALSE,
    329                                    GL_FALSE, GL_FALSE,
    330                                    offsetof(struct vertex, x), true);
    331          _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_GENERIC(0),
    332                                   *buf_obj, 0, sizeof(struct vertex));
    333          _mesa_enable_vertex_array_attrib(ctx, array_obj,
    334                                           VERT_ATTRIB_GENERIC(0));
    335          if (texcoord_size > 0) {
    336             _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_GENERIC(1),
    337                                       texcoord_size, GL_FLOAT, GL_RGBA,
    338                                       GL_FALSE, GL_FALSE, GL_FALSE,
    339                                       offsetof(struct vertex, tex), false);
    340             _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_GENERIC(1),
    341                                      *buf_obj, 0, sizeof(struct vertex));
    342             _mesa_enable_vertex_array_attrib(ctx, array_obj,
    343                                              VERT_ATTRIB_GENERIC(1));
    344          }
    345       } else {
    346          _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_POS,
    347                                    vertex_size, GL_FLOAT, GL_RGBA, GL_FALSE,
    348                                    GL_FALSE, GL_FALSE,
    349                                    offsetof(struct vertex, x), true);
    350          _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_POS,
    351                                   *buf_obj, 0, sizeof(struct vertex));
    352          _mesa_enable_vertex_array_attrib(ctx, array_obj, VERT_ATTRIB_POS);
    353 
    354          if (texcoord_size > 0) {
    355             _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_TEX(0),
    356                                       vertex_size, GL_FLOAT, GL_RGBA, GL_FALSE,
    357                                       GL_FALSE, GL_FALSE,
    358                                       offsetof(struct vertex, tex), false);
    359             _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_TEX(0),
    360                                      *buf_obj, 0, sizeof(struct vertex));
    361             _mesa_enable_vertex_array_attrib(ctx, array_obj, VERT_ATTRIB_TEX(0));
    362          }
    363 
    364          if (color_size > 0) {
    365             _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_COLOR0,
    366                                       vertex_size, GL_FLOAT, GL_RGBA, GL_FALSE,
    367                                       GL_FALSE, GL_FALSE,
    368                                       offsetof(struct vertex, r), false);
    369             _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_COLOR0,
    370                                      *buf_obj, 0, sizeof(struct vertex));
    371             _mesa_enable_vertex_array_attrib(ctx, array_obj, VERT_ATTRIB_COLOR0);
    372          }
    373       }
    374    } else {
    375       _mesa_BindVertexArray(*VAO);
    376    }
    377 }
    378 
    379 /**
    380  * Initialize meta-ops for a context.
    381  * To be called once during context creation.
    382  */
    383 void
    384 _mesa_meta_init(struct gl_context *ctx)
    385 {
    386    assert(!ctx->Meta);
    387 
    388    ctx->Meta = CALLOC_STRUCT(gl_meta_state);
    389 }
    390 
    391 /**
    392  * Free context meta-op state.
    393  * To be called once during context destruction.
    394  */
    395 void
    396 _mesa_meta_free(struct gl_context *ctx)
    397 {
    398    GET_CURRENT_CONTEXT(old_context);
    399    _mesa_make_current(ctx, NULL, NULL);
    400    _mesa_meta_glsl_blit_cleanup(ctx, &ctx->Meta->Blit);
    401    meta_glsl_clear_cleanup(ctx, &ctx->Meta->Clear);
    402    _mesa_meta_glsl_generate_mipmap_cleanup(ctx, &ctx->Meta->Mipmap);
    403    cleanup_temp_texture(&ctx->Meta->TempTex);
    404    meta_decompress_cleanup(ctx, &ctx->Meta->Decompress);
    405    meta_drawpix_cleanup(ctx, &ctx->Meta->DrawPix);
    406    if (old_context)
    407       _mesa_make_current(old_context, old_context->WinSysDrawBuffer, old_context->WinSysReadBuffer);
    408    else
    409       _mesa_make_current(NULL, NULL, NULL);
    410    free(ctx->Meta);
    411    ctx->Meta = NULL;
    412 }
    413 
    414 
    415 /**
    416  * Enter meta state.  This is like a light-weight version of glPushAttrib
    417  * but it also resets most GL state back to default values.
    418  *
    419  * \param state  bitmask of MESA_META_* flags indicating which attribute groups
    420  *               to save and reset to their defaults
    421  */
    422 void
    423 _mesa_meta_begin(struct gl_context *ctx, GLbitfield state)
    424 {
    425    struct save_state *save;
    426 
    427    /* hope MAX_META_OPS_DEPTH is large enough */
    428    assert(ctx->Meta->SaveStackDepth < MAX_META_OPS_DEPTH);
    429 
    430    save = &ctx->Meta->Save[ctx->Meta->SaveStackDepth++];
    431    memset(save, 0, sizeof(*save));
    432    save->SavedState = state;
    433 
    434    /* We always push into desktop GL mode and pop out at the end.  No sense in
    435     * writing our shaders varying based on the user's context choice, when
    436     * Mesa can handle either.
    437     */
    438    save->API = ctx->API;
    439    ctx->API = API_OPENGL_COMPAT;
    440 
    441    /* Mesa's extension helper functions use the current context's API to look up
    442     * the version required by an extension as a step in determining whether or
    443     * not it has been advertised. Since meta aims to only be restricted by the
    444     * driver capability (and not by whether or not an extension has been
    445     * advertised), set the helper functions' Version variable to a value that
    446     * will make the checks on the context API and version unconditionally pass.
    447     */
    448    save->ExtensionsVersion = ctx->Extensions.Version;
    449    ctx->Extensions.Version = ~0;
    450 
    451    /* Pausing transform feedback needs to be done early, or else we won't be
    452     * able to change other state.
    453     */
    454    save->TransformFeedbackNeedsResume =
    455       _mesa_is_xfb_active_and_unpaused(ctx);
    456    if (save->TransformFeedbackNeedsResume)
    457       _mesa_PauseTransformFeedback();
    458 
    459    /* After saving the current occlusion object, call EndQuery so that no
    460     * occlusion querying will be active during the meta-operation.
    461     */
    462    if (state & MESA_META_OCCLUSION_QUERY) {
    463       save->CurrentOcclusionObject = ctx->Query.CurrentOcclusionObject;
    464       if (save->CurrentOcclusionObject)
    465          _mesa_EndQuery(save->CurrentOcclusionObject->Target);
    466    }
    467 
    468    if (state & MESA_META_ALPHA_TEST) {
    469       save->AlphaEnabled = ctx->Color.AlphaEnabled;
    470       save->AlphaFunc = ctx->Color.AlphaFunc;
    471       save->AlphaRef = ctx->Color.AlphaRef;
    472       if (ctx->Color.AlphaEnabled)
    473          _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_FALSE);
    474    }
    475 
    476    if (state & MESA_META_BLEND) {
    477       save->BlendEnabled = ctx->Color.BlendEnabled;
    478       if (ctx->Color.BlendEnabled) {
    479          if (ctx->Extensions.EXT_draw_buffers2) {
    480             GLuint i;
    481             for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
    482                _mesa_set_enablei(ctx, GL_BLEND, i, GL_FALSE);
    483             }
    484          }
    485          else {
    486             _mesa_set_enable(ctx, GL_BLEND, GL_FALSE);
    487          }
    488       }
    489       save->ColorLogicOpEnabled = ctx->Color.ColorLogicOpEnabled;
    490       if (ctx->Color.ColorLogicOpEnabled)
    491          _mesa_set_enable(ctx, GL_COLOR_LOGIC_OP, GL_FALSE);
    492    }
    493 
    494    if (state & MESA_META_DITHER) {
    495       save->DitherFlag = ctx->Color.DitherFlag;
    496       _mesa_set_enable(ctx, GL_DITHER, GL_TRUE);
    497    }
    498 
    499    if (state & MESA_META_COLOR_MASK) {
    500       memcpy(save->ColorMask, ctx->Color.ColorMask,
    501              sizeof(ctx->Color.ColorMask));
    502    }
    503 
    504    if (state & MESA_META_DEPTH_TEST) {
    505       save->Depth = ctx->Depth; /* struct copy */
    506       if (ctx->Depth.Test)
    507          _mesa_set_enable(ctx, GL_DEPTH_TEST, GL_FALSE);
    508    }
    509 
    510    if (state & MESA_META_FOG) {
    511       save->Fog = ctx->Fog.Enabled;
    512       if (ctx->Fog.Enabled)
    513          _mesa_set_enable(ctx, GL_FOG, GL_FALSE);
    514    }
    515 
    516    if (state & MESA_META_PIXEL_STORE) {
    517       save->Pack = ctx->Pack;
    518       save->Unpack = ctx->Unpack;
    519       ctx->Pack = ctx->DefaultPacking;
    520       ctx->Unpack = ctx->DefaultPacking;
    521    }
    522 
    523    if (state & MESA_META_PIXEL_TRANSFER) {
    524       save->RedScale = ctx->Pixel.RedScale;
    525       save->RedBias = ctx->Pixel.RedBias;
    526       save->GreenScale = ctx->Pixel.GreenScale;
    527       save->GreenBias = ctx->Pixel.GreenBias;
    528       save->BlueScale = ctx->Pixel.BlueScale;
    529       save->BlueBias = ctx->Pixel.BlueBias;
    530       save->AlphaScale = ctx->Pixel.AlphaScale;
    531       save->AlphaBias = ctx->Pixel.AlphaBias;
    532       save->MapColorFlag = ctx->Pixel.MapColorFlag;
    533       ctx->Pixel.RedScale = 1.0F;
    534       ctx->Pixel.RedBias = 0.0F;
    535       ctx->Pixel.GreenScale = 1.0F;
    536       ctx->Pixel.GreenBias = 0.0F;
    537       ctx->Pixel.BlueScale = 1.0F;
    538       ctx->Pixel.BlueBias = 0.0F;
    539       ctx->Pixel.AlphaScale = 1.0F;
    540       ctx->Pixel.AlphaBias = 0.0F;
    541       ctx->Pixel.MapColorFlag = GL_FALSE;
    542       /* XXX more state */
    543       ctx->NewState |=_NEW_PIXEL;
    544    }
    545 
    546    if (state & MESA_META_RASTERIZATION) {
    547       save->FrontPolygonMode = ctx->Polygon.FrontMode;
    548       save->BackPolygonMode = ctx->Polygon.BackMode;
    549       save->PolygonOffset = ctx->Polygon.OffsetFill;
    550       save->PolygonSmooth = ctx->Polygon.SmoothFlag;
    551       save->PolygonStipple = ctx->Polygon.StippleFlag;
    552       save->PolygonCull = ctx->Polygon.CullFlag;
    553       _mesa_PolygonMode(GL_FRONT_AND_BACK, GL_FILL);
    554       _mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL, GL_FALSE);
    555       _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, GL_FALSE);
    556       _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, GL_FALSE);
    557       _mesa_set_enable(ctx, GL_CULL_FACE, GL_FALSE);
    558    }
    559 
    560    if (state & MESA_META_SCISSOR) {
    561       save->Scissor = ctx->Scissor; /* struct copy */
    562       _mesa_set_enable(ctx, GL_SCISSOR_TEST, GL_FALSE);
    563    }
    564 
    565    if (state & MESA_META_SHADER) {
    566       int i;
    567 
    568       if (ctx->Extensions.ARB_vertex_program) {
    569          save->VertexProgramEnabled = ctx->VertexProgram.Enabled;
    570          _mesa_reference_program(ctx, &save->VertexProgram,
    571                                  ctx->VertexProgram.Current);
    572          _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB, GL_FALSE);
    573       }
    574 
    575       if (ctx->Extensions.ARB_fragment_program) {
    576          save->FragmentProgramEnabled = ctx->FragmentProgram.Enabled;
    577          _mesa_reference_program(ctx, &save->FragmentProgram,
    578                                  ctx->FragmentProgram.Current);
    579          _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB, GL_FALSE);
    580       }
    581 
    582       if (ctx->Extensions.ATI_fragment_shader) {
    583          save->ATIFragmentShaderEnabled = ctx->ATIFragmentShader.Enabled;
    584          _mesa_set_enable(ctx, GL_FRAGMENT_SHADER_ATI, GL_FALSE);
    585       }
    586 
    587       if (ctx->Pipeline.Current) {
    588          _mesa_reference_pipeline_object(ctx, &save->Pipeline,
    589                                          ctx->Pipeline.Current);
    590          _mesa_BindProgramPipeline(0);
    591       }
    592 
    593       /* Save the shader state from ctx->Shader (instead of ctx->_Shader) so
    594        * that we don't have to worry about the current pipeline state.
    595        */
    596       for (i = 0; i < MESA_SHADER_STAGES; i++) {
    597          _mesa_reference_shader_program(ctx, &save->Shader[i],
    598                                         ctx->Shader.CurrentProgram[i]);
    599       }
    600       _mesa_reference_shader_program(ctx, &save->ActiveShader,
    601                                      ctx->Shader.ActiveProgram);
    602 
    603       _mesa_UseProgram(0);
    604    }
    605 
    606    if (state & MESA_META_STENCIL_TEST) {
    607       save->Stencil = ctx->Stencil; /* struct copy */
    608       if (ctx->Stencil.Enabled)
    609          _mesa_set_enable(ctx, GL_STENCIL_TEST, GL_FALSE);
    610       /* NOTE: other stencil state not reset */
    611    }
    612 
    613    if (state & MESA_META_TEXTURE) {
    614       GLuint u, tgt;
    615 
    616       save->ActiveUnit = ctx->Texture.CurrentUnit;
    617       save->EnvMode = ctx->Texture.Unit[0].EnvMode;
    618 
    619       /* Disable all texture units */
    620       for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
    621          save->TexEnabled[u] = ctx->Texture.Unit[u].Enabled;
    622          save->TexGenEnabled[u] = ctx->Texture.Unit[u].TexGenEnabled;
    623          if (ctx->Texture.Unit[u].Enabled ||
    624              ctx->Texture.Unit[u].TexGenEnabled) {
    625             _mesa_ActiveTexture(GL_TEXTURE0 + u);
    626             _mesa_set_enable(ctx, GL_TEXTURE_2D, GL_FALSE);
    627             if (ctx->Extensions.ARB_texture_cube_map)
    628                _mesa_set_enable(ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE);
    629 
    630             _mesa_set_enable(ctx, GL_TEXTURE_1D, GL_FALSE);
    631             _mesa_set_enable(ctx, GL_TEXTURE_3D, GL_FALSE);
    632             if (ctx->Extensions.NV_texture_rectangle)
    633                _mesa_set_enable(ctx, GL_TEXTURE_RECTANGLE, GL_FALSE);
    634             _mesa_set_enable(ctx, GL_TEXTURE_GEN_S, GL_FALSE);
    635             _mesa_set_enable(ctx, GL_TEXTURE_GEN_T, GL_FALSE);
    636             _mesa_set_enable(ctx, GL_TEXTURE_GEN_R, GL_FALSE);
    637             _mesa_set_enable(ctx, GL_TEXTURE_GEN_Q, GL_FALSE);
    638          }
    639       }
    640 
    641       /* save current texture objects for unit[0] only */
    642       for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {
    643          _mesa_reference_texobj(&save->CurrentTexture[tgt],
    644                                 ctx->Texture.Unit[0].CurrentTex[tgt]);
    645       }
    646 
    647       /* set defaults for unit[0] */
    648       _mesa_ActiveTexture(GL_TEXTURE0);
    649       _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    650    }
    651 
    652    if (state & MESA_META_TRANSFORM) {
    653       GLuint activeTexture = ctx->Texture.CurrentUnit;
    654       memcpy(save->ModelviewMatrix, ctx->ModelviewMatrixStack.Top->m,
    655              16 * sizeof(GLfloat));
    656       memcpy(save->ProjectionMatrix, ctx->ProjectionMatrixStack.Top->m,
    657              16 * sizeof(GLfloat));
    658       memcpy(save->TextureMatrix, ctx->TextureMatrixStack[0].Top->m,
    659              16 * sizeof(GLfloat));
    660       save->MatrixMode = ctx->Transform.MatrixMode;
    661       /* set 1:1 vertex:pixel coordinate transform */
    662       _mesa_ActiveTexture(GL_TEXTURE0);
    663       _mesa_MatrixMode(GL_TEXTURE);
    664       _mesa_LoadIdentity();
    665       _mesa_ActiveTexture(GL_TEXTURE0 + activeTexture);
    666       _mesa_MatrixMode(GL_MODELVIEW);
    667       _mesa_LoadIdentity();
    668       _mesa_MatrixMode(GL_PROJECTION);
    669       _mesa_LoadIdentity();
    670 
    671       /* glOrtho with width = 0 or height = 0 generates GL_INVALID_VALUE.
    672        * This can occur when there is no draw buffer.
    673        */
    674       if (ctx->DrawBuffer->Width != 0 && ctx->DrawBuffer->Height != 0)
    675          _mesa_Ortho(0.0, ctx->DrawBuffer->Width,
    676                      0.0, ctx->DrawBuffer->Height,
    677                      -1.0, 1.0);
    678 
    679       if (ctx->Extensions.ARB_clip_control) {
    680          save->ClipOrigin = ctx->Transform.ClipOrigin;
    681          save->ClipDepthMode = ctx->Transform.ClipDepthMode;
    682          _mesa_ClipControl(GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE);
    683       }
    684    }
    685 
    686    if (state & MESA_META_CLIP) {
    687       GLbitfield mask;
    688       save->ClipPlanesEnabled = ctx->Transform.ClipPlanesEnabled;
    689       mask = ctx->Transform.ClipPlanesEnabled;
    690       while (mask) {
    691          const int i = u_bit_scan(&mask);
    692          _mesa_set_enable(ctx, GL_CLIP_PLANE0 + i, GL_FALSE);
    693       }
    694    }
    695 
    696    if (state & MESA_META_VERTEX) {
    697       /* save vertex array object state */
    698       _mesa_reference_vao(ctx, &save->VAO,
    699                                    ctx->Array.VAO);
    700       /* set some default state? */
    701    }
    702 
    703    if (state & MESA_META_VIEWPORT) {
    704       /* save viewport state */
    705       save->ViewportX = ctx->ViewportArray[0].X;
    706       save->ViewportY = ctx->ViewportArray[0].Y;
    707       save->ViewportW = ctx->ViewportArray[0].Width;
    708       save->ViewportH = ctx->ViewportArray[0].Height;
    709       /* set viewport to match window size */
    710       if (ctx->ViewportArray[0].X != 0 ||
    711           ctx->ViewportArray[0].Y != 0 ||
    712           ctx->ViewportArray[0].Width != (float) ctx->DrawBuffer->Width ||
    713           ctx->ViewportArray[0].Height != (float) ctx->DrawBuffer->Height) {
    714          _mesa_set_viewport(ctx, 0, 0, 0,
    715                             ctx->DrawBuffer->Width, ctx->DrawBuffer->Height);
    716       }
    717       /* save depth range state */
    718       save->DepthNear = ctx->ViewportArray[0].Near;
    719       save->DepthFar = ctx->ViewportArray[0].Far;
    720       /* set depth range to default */
    721       _mesa_set_depth_range(ctx, 0, 0.0, 1.0);
    722    }
    723 
    724    if (state & MESA_META_CLAMP_FRAGMENT_COLOR) {
    725       save->ClampFragmentColor = ctx->Color.ClampFragmentColor;
    726 
    727       /* Generally in here we want to do clamping according to whether
    728        * it's for the pixel path (ClampFragmentColor is GL_TRUE),
    729        * regardless of the internal implementation of the metaops.
    730        */
    731       if (ctx->Color.ClampFragmentColor != GL_TRUE &&
    732           ctx->Extensions.ARB_color_buffer_float)
    733          _mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
    734    }
    735 
    736    if (state & MESA_META_CLAMP_VERTEX_COLOR) {
    737       save->ClampVertexColor = ctx->Light.ClampVertexColor;
    738 
    739       /* Generally in here we never want vertex color clamping --
    740        * result clamping is only dependent on fragment clamping.
    741        */
    742       if (ctx->Extensions.ARB_color_buffer_float)
    743          _mesa_ClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE);
    744    }
    745 
    746    if (state & MESA_META_CONDITIONAL_RENDER) {
    747       save->CondRenderQuery = ctx->Query.CondRenderQuery;
    748       save->CondRenderMode = ctx->Query.CondRenderMode;
    749 
    750       if (ctx->Query.CondRenderQuery)
    751          _mesa_EndConditionalRender();
    752    }
    753 
    754    if (state & MESA_META_SELECT_FEEDBACK) {
    755       save->RenderMode = ctx->RenderMode;
    756       if (ctx->RenderMode == GL_SELECT) {
    757          save->Select = ctx->Select; /* struct copy */
    758          _mesa_RenderMode(GL_RENDER);
    759       } else if (ctx->RenderMode == GL_FEEDBACK) {
    760          save->Feedback = ctx->Feedback; /* struct copy */
    761          _mesa_RenderMode(GL_RENDER);
    762       }
    763    }
    764 
    765    if (state & MESA_META_MULTISAMPLE) {
    766       save->Multisample = ctx->Multisample; /* struct copy */
    767 
    768       if (ctx->Multisample.Enabled)
    769          _mesa_set_multisample(ctx, GL_FALSE);
    770       if (ctx->Multisample.SampleCoverage)
    771          _mesa_set_enable(ctx, GL_SAMPLE_COVERAGE, GL_FALSE);
    772       if (ctx->Multisample.SampleAlphaToCoverage)
    773          _mesa_set_enable(ctx, GL_SAMPLE_ALPHA_TO_COVERAGE, GL_FALSE);
    774       if (ctx->Multisample.SampleAlphaToOne)
    775          _mesa_set_enable(ctx, GL_SAMPLE_ALPHA_TO_ONE, GL_FALSE);
    776       if (ctx->Multisample.SampleShading)
    777          _mesa_set_enable(ctx, GL_SAMPLE_SHADING, GL_FALSE);
    778       if (ctx->Multisample.SampleMask)
    779          _mesa_set_enable(ctx, GL_SAMPLE_MASK, GL_FALSE);
    780    }
    781 
    782    if (state & MESA_META_FRAMEBUFFER_SRGB) {
    783       save->sRGBEnabled = ctx->Color.sRGBEnabled;
    784       if (ctx->Color.sRGBEnabled)
    785          _mesa_set_framebuffer_srgb(ctx, GL_FALSE);
    786    }
    787 
    788    if (state & MESA_META_DRAW_BUFFERS) {
    789       struct gl_framebuffer *fb = ctx->DrawBuffer;
    790       memcpy(save->ColorDrawBuffers, fb->ColorDrawBuffer,
    791              sizeof(save->ColorDrawBuffers));
    792    }
    793 
    794    /* misc */
    795    {
    796       save->Lighting = ctx->Light.Enabled;
    797       if (ctx->Light.Enabled)
    798          _mesa_set_enable(ctx, GL_LIGHTING, GL_FALSE);
    799       save->RasterDiscard = ctx->RasterDiscard;
    800       if (ctx->RasterDiscard)
    801          _mesa_set_enable(ctx, GL_RASTERIZER_DISCARD, GL_FALSE);
    802 
    803       _mesa_reference_framebuffer(&save->DrawBuffer, ctx->DrawBuffer);
    804       _mesa_reference_framebuffer(&save->ReadBuffer, ctx->ReadBuffer);
    805    }
    806 }
    807 
    808 
    809 /**
    810  * Leave meta state.  This is like a light-weight version of glPopAttrib().
    811  */
    812 void
    813 _mesa_meta_end(struct gl_context *ctx)
    814 {
    815    assert(ctx->Meta->SaveStackDepth > 0);
    816 
    817    struct save_state *save = &ctx->Meta->Save[ctx->Meta->SaveStackDepth - 1];
    818    const GLbitfield state = save->SavedState;
    819    int i;
    820 
    821    /* Grab the result of the old occlusion query before starting it again. The
    822     * old result is added to the result of the new query so the driver will
    823     * continue adding where it left off. */
    824    if (state & MESA_META_OCCLUSION_QUERY) {
    825       if (save->CurrentOcclusionObject) {
    826          struct gl_query_object *q = save->CurrentOcclusionObject;
    827          GLuint64EXT result;
    828          if (!q->Ready)
    829             ctx->Driver.WaitQuery(ctx, q);
    830          result = q->Result;
    831          _mesa_BeginQuery(q->Target, q->Id);
    832          ctx->Query.CurrentOcclusionObject->Result += result;
    833       }
    834    }
    835 
    836    if (state & MESA_META_ALPHA_TEST) {
    837       if (ctx->Color.AlphaEnabled != save->AlphaEnabled)
    838          _mesa_set_enable(ctx, GL_ALPHA_TEST, save->AlphaEnabled);
    839       _mesa_AlphaFunc(save->AlphaFunc, save->AlphaRef);
    840    }
    841 
    842    if (state & MESA_META_BLEND) {
    843       if (ctx->Color.BlendEnabled != save->BlendEnabled) {
    844          if (ctx->Extensions.EXT_draw_buffers2) {
    845             GLuint i;
    846             for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
    847                _mesa_set_enablei(ctx, GL_BLEND, i, (save->BlendEnabled >> i) & 1);
    848             }
    849          }
    850          else {
    851             _mesa_set_enable(ctx, GL_BLEND, (save->BlendEnabled & 1));
    852          }
    853       }
    854       if (ctx->Color.ColorLogicOpEnabled != save->ColorLogicOpEnabled)
    855          _mesa_set_enable(ctx, GL_COLOR_LOGIC_OP, save->ColorLogicOpEnabled);
    856    }
    857 
    858    if (state & MESA_META_DITHER)
    859       _mesa_set_enable(ctx, GL_DITHER, save->DitherFlag);
    860 
    861    if (state & MESA_META_COLOR_MASK) {
    862       GLuint i;
    863       for (i = 0; i < ctx->Const.MaxDrawBuffers; i++) {
    864          if (!TEST_EQ_4V(ctx->Color.ColorMask[i], save->ColorMask[i])) {
    865             if (i == 0) {
    866                _mesa_ColorMask(save->ColorMask[i][0], save->ColorMask[i][1],
    867                                save->ColorMask[i][2], save->ColorMask[i][3]);
    868             }
    869             else {
    870                _mesa_ColorMaski(i,
    871                                       save->ColorMask[i][0],
    872                                       save->ColorMask[i][1],
    873                                       save->ColorMask[i][2],
    874                                       save->ColorMask[i][3]);
    875             }
    876          }
    877       }
    878    }
    879 
    880    if (state & MESA_META_DEPTH_TEST) {
    881       if (ctx->Depth.Test != save->Depth.Test)
    882          _mesa_set_enable(ctx, GL_DEPTH_TEST, save->Depth.Test);
    883       _mesa_DepthFunc(save->Depth.Func);
    884       _mesa_DepthMask(save->Depth.Mask);
    885    }
    886 
    887    if (state & MESA_META_FOG) {
    888       _mesa_set_enable(ctx, GL_FOG, save->Fog);
    889    }
    890 
    891    if (state & MESA_META_PIXEL_STORE) {
    892       ctx->Pack = save->Pack;
    893       ctx->Unpack = save->Unpack;
    894    }
    895 
    896    if (state & MESA_META_PIXEL_TRANSFER) {
    897       ctx->Pixel.RedScale = save->RedScale;
    898       ctx->Pixel.RedBias = save->RedBias;
    899       ctx->Pixel.GreenScale = save->GreenScale;
    900       ctx->Pixel.GreenBias = save->GreenBias;
    901       ctx->Pixel.BlueScale = save->BlueScale;
    902       ctx->Pixel.BlueBias = save->BlueBias;
    903       ctx->Pixel.AlphaScale = save->AlphaScale;
    904       ctx->Pixel.AlphaBias = save->AlphaBias;
    905       ctx->Pixel.MapColorFlag = save->MapColorFlag;
    906       /* XXX more state */
    907       ctx->NewState |=_NEW_PIXEL;
    908    }
    909 
    910    if (state & MESA_META_RASTERIZATION) {
    911       _mesa_PolygonMode(GL_FRONT, save->FrontPolygonMode);
    912       _mesa_PolygonMode(GL_BACK, save->BackPolygonMode);
    913       _mesa_set_enable(ctx, GL_POLYGON_STIPPLE, save->PolygonStipple);
    914       _mesa_set_enable(ctx, GL_POLYGON_SMOOTH, save->PolygonSmooth);
    915       _mesa_set_enable(ctx, GL_POLYGON_OFFSET_FILL, save->PolygonOffset);
    916       _mesa_set_enable(ctx, GL_CULL_FACE, save->PolygonCull);
    917    }
    918 
    919    if (state & MESA_META_SCISSOR) {
    920       unsigned i;
    921 
    922       for (i = 0; i < ctx->Const.MaxViewports; i++) {
    923          _mesa_set_scissor(ctx, i,
    924                            save->Scissor.ScissorArray[i].X,
    925                            save->Scissor.ScissorArray[i].Y,
    926                            save->Scissor.ScissorArray[i].Width,
    927                            save->Scissor.ScissorArray[i].Height);
    928          _mesa_set_enablei(ctx, GL_SCISSOR_TEST, i,
    929                            (save->Scissor.EnableFlags >> i) & 1);
    930       }
    931    }
    932 
    933    if (state & MESA_META_SHADER) {
    934       static const GLenum targets[] = {
    935          GL_VERTEX_SHADER,
    936          GL_TESS_CONTROL_SHADER,
    937          GL_TESS_EVALUATION_SHADER,
    938          GL_GEOMETRY_SHADER,
    939          GL_FRAGMENT_SHADER,
    940          GL_COMPUTE_SHADER,
    941       };
    942       STATIC_ASSERT(MESA_SHADER_STAGES == ARRAY_SIZE(targets));
    943 
    944       bool any_shader;
    945 
    946       if (ctx->Extensions.ARB_vertex_program) {
    947          _mesa_set_enable(ctx, GL_VERTEX_PROGRAM_ARB,
    948                           save->VertexProgramEnabled);
    949          _mesa_reference_program(ctx, &ctx->VertexProgram.Current,
    950                                  save->VertexProgram);
    951          _mesa_reference_program(ctx, &save->VertexProgram, NULL);
    952       }
    953 
    954       if (ctx->Extensions.ARB_fragment_program) {
    955          _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB,
    956                           save->FragmentProgramEnabled);
    957          _mesa_reference_program(ctx, &ctx->FragmentProgram.Current,
    958                                  save->FragmentProgram);
    959          _mesa_reference_program(ctx, &save->FragmentProgram, NULL);
    960       }
    961 
    962       if (ctx->Extensions.ATI_fragment_shader) {
    963          _mesa_set_enable(ctx, GL_FRAGMENT_SHADER_ATI,
    964                           save->ATIFragmentShaderEnabled);
    965       }
    966 
    967       any_shader = false;
    968       for (i = 0; i < MESA_SHADER_STAGES; i++) {
    969          /* It is safe to call _mesa_use_shader_program even if the extension
    970           * necessary for that program state is not supported.  In that case,
    971           * the saved program object must be NULL and the currently bound
    972           * program object must be NULL.  _mesa_use_shader_program is a no-op
    973           * in that case.
    974           */
    975          _mesa_use_shader_program(ctx, targets[i],
    976                                   save->Shader[i],
    977                                   &ctx->Shader);
    978 
    979          /* Do this *before* killing the reference. :)
    980           */
    981          if (save->Shader[i] != NULL)
    982             any_shader = true;
    983 
    984          _mesa_reference_shader_program(ctx, &save->Shader[i], NULL);
    985       }
    986 
    987       _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram,
    988                                      save->ActiveShader);
    989       _mesa_reference_shader_program(ctx, &save->ActiveShader, NULL);
    990 
    991       /* If there were any stages set with programs, use ctx->Shader as the
    992        * current shader state.  Otherwise, use Pipeline.Default.  The pipeline
    993        * hasn't been restored yet, and that may modify ctx->_Shader further.
    994        */
    995       if (any_shader)
    996          _mesa_reference_pipeline_object(ctx, &ctx->_Shader,
    997                                          &ctx->Shader);
    998       else
    999          _mesa_reference_pipeline_object(ctx, &ctx->_Shader,
   1000                                          ctx->Pipeline.Default);
   1001 
   1002       if (save->Pipeline) {
   1003          _mesa_bind_pipeline(ctx, save->Pipeline);
   1004 
   1005          _mesa_reference_pipeline_object(ctx, &save->Pipeline, NULL);
   1006       }
   1007    }
   1008 
   1009    if (state & MESA_META_STENCIL_TEST) {
   1010       const struct gl_stencil_attrib *stencil = &save->Stencil;
   1011 
   1012       _mesa_set_enable(ctx, GL_STENCIL_TEST, stencil->Enabled);
   1013       _mesa_ClearStencil(stencil->Clear);
   1014       if (ctx->Extensions.EXT_stencil_two_side) {
   1015          _mesa_set_enable(ctx, GL_STENCIL_TEST_TWO_SIDE_EXT,
   1016                           stencil->TestTwoSide);
   1017          _mesa_ActiveStencilFaceEXT(stencil->ActiveFace
   1018                                     ? GL_BACK : GL_FRONT);
   1019       }
   1020       /* front state */
   1021       _mesa_StencilFuncSeparate(GL_FRONT,
   1022                                 stencil->Function[0],
   1023                                 stencil->Ref[0],
   1024                                 stencil->ValueMask[0]);
   1025       _mesa_StencilMaskSeparate(GL_FRONT, stencil->WriteMask[0]);
   1026       _mesa_StencilOpSeparate(GL_FRONT, stencil->FailFunc[0],
   1027                               stencil->ZFailFunc[0],
   1028                               stencil->ZPassFunc[0]);
   1029       /* back state */
   1030       _mesa_StencilFuncSeparate(GL_BACK,
   1031                                 stencil->Function[1],
   1032                                 stencil->Ref[1],
   1033                                 stencil->ValueMask[1]);
   1034       _mesa_StencilMaskSeparate(GL_BACK, stencil->WriteMask[1]);
   1035       _mesa_StencilOpSeparate(GL_BACK, stencil->FailFunc[1],
   1036                               stencil->ZFailFunc[1],
   1037                               stencil->ZPassFunc[1]);
   1038    }
   1039 
   1040    if (state & MESA_META_TEXTURE) {
   1041       GLuint u, tgt;
   1042 
   1043       assert(ctx->Texture.CurrentUnit == 0);
   1044 
   1045       /* restore texenv for unit[0] */
   1046       _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, save->EnvMode);
   1047 
   1048       /* restore texture objects for unit[0] only */
   1049       for (tgt = 0; tgt < NUM_TEXTURE_TARGETS; tgt++) {
   1050          if (ctx->Texture.Unit[0].CurrentTex[tgt] != save->CurrentTexture[tgt]) {
   1051             FLUSH_VERTICES(ctx, _NEW_TEXTURE);
   1052             _mesa_reference_texobj(&ctx->Texture.Unit[0].CurrentTex[tgt],
   1053                                    save->CurrentTexture[tgt]);
   1054          }
   1055          _mesa_reference_texobj(&save->CurrentTexture[tgt], NULL);
   1056       }
   1057 
   1058       /* Restore fixed function texture enables, texgen */
   1059       for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
   1060          if (ctx->Texture.Unit[u].Enabled != save->TexEnabled[u]) {
   1061             FLUSH_VERTICES(ctx, _NEW_TEXTURE);
   1062             ctx->Texture.Unit[u].Enabled = save->TexEnabled[u];
   1063          }
   1064 
   1065          if (ctx->Texture.Unit[u].TexGenEnabled != save->TexGenEnabled[u]) {
   1066             FLUSH_VERTICES(ctx, _NEW_TEXTURE);
   1067             ctx->Texture.Unit[u].TexGenEnabled = save->TexGenEnabled[u];
   1068          }
   1069       }
   1070 
   1071       /* restore current unit state */
   1072       _mesa_ActiveTexture(GL_TEXTURE0 + save->ActiveUnit);
   1073    }
   1074 
   1075    if (state & MESA_META_TRANSFORM) {
   1076       GLuint activeTexture = ctx->Texture.CurrentUnit;
   1077       _mesa_ActiveTexture(GL_TEXTURE0);
   1078       _mesa_MatrixMode(GL_TEXTURE);
   1079       _mesa_LoadMatrixf(save->TextureMatrix);
   1080       _mesa_ActiveTexture(GL_TEXTURE0 + activeTexture);
   1081 
   1082       _mesa_MatrixMode(GL_MODELVIEW);
   1083       _mesa_LoadMatrixf(save->ModelviewMatrix);
   1084 
   1085       _mesa_MatrixMode(GL_PROJECTION);
   1086       _mesa_LoadMatrixf(save->ProjectionMatrix);
   1087 
   1088       _mesa_MatrixMode(save->MatrixMode);
   1089 
   1090       if (ctx->Extensions.ARB_clip_control)
   1091          _mesa_ClipControl(save->ClipOrigin, save->ClipDepthMode);
   1092    }
   1093 
   1094    if (state & MESA_META_CLIP) {
   1095       GLbitfield mask = save->ClipPlanesEnabled;
   1096       while (mask) {
   1097          const int i = u_bit_scan(&mask);
   1098          _mesa_set_enable(ctx, GL_CLIP_PLANE0 + i, GL_TRUE);
   1099       }
   1100    }
   1101 
   1102    if (state & MESA_META_VERTEX) {
   1103       /* restore vertex array object */
   1104       _mesa_BindVertexArray(save->VAO->Name);
   1105       _mesa_reference_vao(ctx, &save->VAO, NULL);
   1106    }
   1107 
   1108    if (state & MESA_META_VIEWPORT) {
   1109       if (save->ViewportX != ctx->ViewportArray[0].X ||
   1110           save->ViewportY != ctx->ViewportArray[0].Y ||
   1111           save->ViewportW != ctx->ViewportArray[0].Width ||
   1112           save->ViewportH != ctx->ViewportArray[0].Height) {
   1113          _mesa_set_viewport(ctx, 0, save->ViewportX, save->ViewportY,
   1114                             save->ViewportW, save->ViewportH);
   1115       }
   1116       _mesa_set_depth_range(ctx, 0, save->DepthNear, save->DepthFar);
   1117    }
   1118 
   1119    if (state & MESA_META_CLAMP_FRAGMENT_COLOR &&
   1120        ctx->Extensions.ARB_color_buffer_float) {
   1121       _mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, save->ClampFragmentColor);
   1122    }
   1123 
   1124    if (state & MESA_META_CLAMP_VERTEX_COLOR &&
   1125        ctx->Extensions.ARB_color_buffer_float) {
   1126       _mesa_ClampColor(GL_CLAMP_VERTEX_COLOR, save->ClampVertexColor);
   1127    }
   1128 
   1129    if (state & MESA_META_CONDITIONAL_RENDER) {
   1130       if (save->CondRenderQuery)
   1131          _mesa_BeginConditionalRender(save->CondRenderQuery->Id,
   1132                                       save->CondRenderMode);
   1133    }
   1134 
   1135    if (state & MESA_META_SELECT_FEEDBACK) {
   1136       if (save->RenderMode == GL_SELECT) {
   1137          _mesa_RenderMode(GL_SELECT);
   1138          ctx->Select = save->Select;
   1139       } else if (save->RenderMode == GL_FEEDBACK) {
   1140          _mesa_RenderMode(GL_FEEDBACK);
   1141          ctx->Feedback = save->Feedback;
   1142       }
   1143    }
   1144 
   1145    if (state & MESA_META_MULTISAMPLE) {
   1146       struct gl_multisample_attrib *ctx_ms = &ctx->Multisample;
   1147       struct gl_multisample_attrib *save_ms = &save->Multisample;
   1148 
   1149       if (ctx_ms->Enabled != save_ms->Enabled)
   1150          _mesa_set_multisample(ctx, save_ms->Enabled);
   1151       if (ctx_ms->SampleCoverage != save_ms->SampleCoverage)
   1152          _mesa_set_enable(ctx, GL_SAMPLE_COVERAGE, save_ms->SampleCoverage);
   1153       if (ctx_ms->SampleAlphaToCoverage != save_ms->SampleAlphaToCoverage)
   1154          _mesa_set_enable(ctx, GL_SAMPLE_ALPHA_TO_COVERAGE, save_ms->SampleAlphaToCoverage);
   1155       if (ctx_ms->SampleAlphaToOne != save_ms->SampleAlphaToOne)
   1156          _mesa_set_enable(ctx, GL_SAMPLE_ALPHA_TO_ONE, save_ms->SampleAlphaToOne);
   1157       if (ctx_ms->SampleCoverageValue != save_ms->SampleCoverageValue ||
   1158           ctx_ms->SampleCoverageInvert != save_ms->SampleCoverageInvert) {
   1159          _mesa_SampleCoverage(save_ms->SampleCoverageValue,
   1160                               save_ms->SampleCoverageInvert);
   1161       }
   1162       if (ctx_ms->SampleShading != save_ms->SampleShading)
   1163          _mesa_set_enable(ctx, GL_SAMPLE_SHADING, save_ms->SampleShading);
   1164       if (ctx_ms->SampleMask != save_ms->SampleMask)
   1165          _mesa_set_enable(ctx, GL_SAMPLE_MASK, save_ms->SampleMask);
   1166       if (ctx_ms->SampleMaskValue != save_ms->SampleMaskValue)
   1167          _mesa_SampleMaski(0, save_ms->SampleMaskValue);
   1168       if (ctx_ms->MinSampleShadingValue != save_ms->MinSampleShadingValue)
   1169          _mesa_MinSampleShading(save_ms->MinSampleShadingValue);
   1170    }
   1171 
   1172    if (state & MESA_META_FRAMEBUFFER_SRGB) {
   1173       if (ctx->Color.sRGBEnabled != save->sRGBEnabled)
   1174          _mesa_set_framebuffer_srgb(ctx, save->sRGBEnabled);
   1175    }
   1176 
   1177    /* misc */
   1178    if (save->Lighting) {
   1179       _mesa_set_enable(ctx, GL_LIGHTING, GL_TRUE);
   1180    }
   1181    if (save->RasterDiscard) {
   1182       _mesa_set_enable(ctx, GL_RASTERIZER_DISCARD, GL_TRUE);
   1183    }
   1184    if (save->TransformFeedbackNeedsResume)
   1185       _mesa_ResumeTransformFeedback();
   1186 
   1187    _mesa_bind_framebuffers(ctx, save->DrawBuffer, save->ReadBuffer);
   1188    _mesa_reference_framebuffer(&save->DrawBuffer, NULL);
   1189    _mesa_reference_framebuffer(&save->ReadBuffer, NULL);
   1190 
   1191    if (state & MESA_META_DRAW_BUFFERS) {
   1192       _mesa_drawbuffers(ctx, ctx->DrawBuffer, ctx->Const.MaxDrawBuffers,
   1193                         save->ColorDrawBuffers, NULL);
   1194    }
   1195 
   1196    ctx->Meta->SaveStackDepth--;
   1197 
   1198    ctx->API = save->API;
   1199    ctx->Extensions.Version = save->ExtensionsVersion;
   1200 }
   1201 
   1202 
   1203 /**
   1204  * Convert Z from a normalized value in the range [0, 1] to an object-space
   1205  * Z coordinate in [-1, +1] so that drawing at the new Z position with the
   1206  * default/identity ortho projection results in the original Z value.
   1207  * Used by the meta-Clear, Draw/CopyPixels and Bitmap functions where the Z
   1208  * value comes from the clear value or raster position.
   1209  */
   1210 static inline GLfloat
   1211 invert_z(GLfloat normZ)
   1212 {
   1213    GLfloat objZ = 1.0f - 2.0f * normZ;
   1214    return objZ;
   1215 }
   1216 
   1217 
   1218 /**
   1219  * One-time init for a temp_texture object.
   1220  * Choose tex target, compute max tex size, etc.
   1221  */
   1222 static void
   1223 init_temp_texture(struct gl_context *ctx, struct temp_texture *tex)
   1224 {
   1225    /* prefer texture rectangle */
   1226    if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.NV_texture_rectangle) {
   1227       tex->Target = GL_TEXTURE_RECTANGLE;
   1228       tex->MaxSize = ctx->Const.MaxTextureRectSize;
   1229       tex->NPOT = GL_TRUE;
   1230    }
   1231    else {
   1232       /* use 2D texture, NPOT if possible */
   1233       tex->Target = GL_TEXTURE_2D;
   1234       tex->MaxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
   1235       tex->NPOT = ctx->Extensions.ARB_texture_non_power_of_two;
   1236    }
   1237    tex->MinSize = 16;  /* 16 x 16 at least */
   1238    assert(tex->MaxSize > 0);
   1239 
   1240    _mesa_GenTextures(1, &tex->TexObj);
   1241 }
   1242 
   1243 static void
   1244 cleanup_temp_texture(struct temp_texture *tex)
   1245 {
   1246    if (!tex->TexObj)
   1247      return;
   1248    _mesa_DeleteTextures(1, &tex->TexObj);
   1249    tex->TexObj = 0;
   1250 }
   1251 
   1252 
   1253 /**
   1254  * Return pointer to temp_texture info for non-bitmap ops.
   1255  * This does some one-time init if needed.
   1256  */
   1257 struct temp_texture *
   1258 _mesa_meta_get_temp_texture(struct gl_context *ctx)
   1259 {
   1260    struct temp_texture *tex = &ctx->Meta->TempTex;
   1261 
   1262    if (!tex->TexObj) {
   1263       init_temp_texture(ctx, tex);
   1264    }
   1265 
   1266    return tex;
   1267 }
   1268 
   1269 
   1270 /**
   1271  * Return pointer to temp_texture info for _mesa_meta_bitmap().
   1272  * We use a separate texture for bitmaps to reduce texture
   1273  * allocation/deallocation.
   1274  */
   1275 static struct temp_texture *
   1276 get_bitmap_temp_texture(struct gl_context *ctx)
   1277 {
   1278    struct temp_texture *tex = &ctx->Meta->Bitmap.Tex;
   1279 
   1280    if (!tex->TexObj) {
   1281       init_temp_texture(ctx, tex);
   1282    }
   1283 
   1284    return tex;
   1285 }
   1286 
   1287 /**
   1288  * Return pointer to depth temp_texture.
   1289  * This does some one-time init if needed.
   1290  */
   1291 struct temp_texture *
   1292 _mesa_meta_get_temp_depth_texture(struct gl_context *ctx)
   1293 {
   1294    struct temp_texture *tex = &ctx->Meta->Blit.depthTex;
   1295 
   1296    if (!tex->TexObj) {
   1297       init_temp_texture(ctx, tex);
   1298    }
   1299 
   1300    return tex;
   1301 }
   1302 
   1303 /**
   1304  * Compute the width/height of texture needed to draw an image of the
   1305  * given size.  Return a flag indicating whether the current texture
   1306  * can be re-used (glTexSubImage2D) or if a new texture needs to be
   1307  * allocated (glTexImage2D).
   1308  * Also, compute s/t texcoords for drawing.
   1309  *
   1310  * \return GL_TRUE if new texture is needed, GL_FALSE otherwise
   1311  */
   1312 GLboolean
   1313 _mesa_meta_alloc_texture(struct temp_texture *tex,
   1314                          GLsizei width, GLsizei height, GLenum intFormat)
   1315 {
   1316    GLboolean newTex = GL_FALSE;
   1317 
   1318    assert(width <= tex->MaxSize);
   1319    assert(height <= tex->MaxSize);
   1320 
   1321    if (width > tex->Width ||
   1322        height > tex->Height ||
   1323        intFormat != tex->IntFormat) {
   1324       /* alloc new texture (larger or different format) */
   1325 
   1326       if (tex->NPOT) {
   1327          /* use non-power of two size */
   1328          tex->Width = MAX2(tex->MinSize, width);
   1329          tex->Height = MAX2(tex->MinSize, height);
   1330       }
   1331       else {
   1332          /* find power of two size */
   1333          GLsizei w, h;
   1334          w = h = tex->MinSize;
   1335          while (w < width)
   1336             w *= 2;
   1337          while (h < height)
   1338             h *= 2;
   1339          tex->Width = w;
   1340          tex->Height = h;
   1341       }
   1342 
   1343       tex->IntFormat = intFormat;
   1344 
   1345       newTex = GL_TRUE;
   1346    }
   1347 
   1348    /* compute texcoords */
   1349    if (tex->Target == GL_TEXTURE_RECTANGLE) {
   1350       tex->Sright = (GLfloat) width;
   1351       tex->Ttop = (GLfloat) height;
   1352    }
   1353    else {
   1354       tex->Sright = (GLfloat) width / tex->Width;
   1355       tex->Ttop = (GLfloat) height / tex->Height;
   1356    }
   1357 
   1358    return newTex;
   1359 }
   1360 
   1361 
   1362 /**
   1363  * Setup/load texture for glCopyPixels or glBlitFramebuffer.
   1364  */
   1365 void
   1366 _mesa_meta_setup_copypix_texture(struct gl_context *ctx,
   1367                                  struct temp_texture *tex,
   1368                                  GLint srcX, GLint srcY,
   1369                                  GLsizei width, GLsizei height,
   1370                                  GLenum intFormat,
   1371                                  GLenum filter)
   1372 {
   1373    bool newTex;
   1374 
   1375    _mesa_BindTexture(tex->Target, tex->TexObj);
   1376    _mesa_TexParameteri(tex->Target, GL_TEXTURE_MIN_FILTER, filter);
   1377    _mesa_TexParameteri(tex->Target, GL_TEXTURE_MAG_FILTER, filter);
   1378    _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
   1379 
   1380    newTex = _mesa_meta_alloc_texture(tex, width, height, intFormat);
   1381 
   1382    /* copy framebuffer image to texture */
   1383    if (newTex) {
   1384       /* create new tex image */
   1385       if (tex->Width == width && tex->Height == height) {
   1386          /* create new tex with framebuffer data */
   1387          _mesa_CopyTexImage2D(tex->Target, 0, tex->IntFormat,
   1388                               srcX, srcY, width, height, 0);
   1389       }
   1390       else {
   1391          /* create empty texture */
   1392          _mesa_TexImage2D(tex->Target, 0, tex->IntFormat,
   1393                           tex->Width, tex->Height, 0,
   1394                           intFormat, GL_UNSIGNED_BYTE, NULL);
   1395          /* load image */
   1396          _mesa_CopyTexSubImage2D(tex->Target, 0,
   1397                                  0, 0, srcX, srcY, width, height);
   1398       }
   1399    }
   1400    else {
   1401       /* replace existing tex image */
   1402       _mesa_CopyTexSubImage2D(tex->Target, 0,
   1403                               0, 0, srcX, srcY, width, height);
   1404    }
   1405 }
   1406 
   1407 
   1408 /**
   1409  * Setup/load texture for glDrawPixels.
   1410  */
   1411 void
   1412 _mesa_meta_setup_drawpix_texture(struct gl_context *ctx,
   1413                                  struct temp_texture *tex,
   1414                                  GLboolean newTex,
   1415                                  GLsizei width, GLsizei height,
   1416                                  GLenum format, GLenum type,
   1417                                  const GLvoid *pixels)
   1418 {
   1419    _mesa_BindTexture(tex->Target, tex->TexObj);
   1420    _mesa_TexParameteri(tex->Target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   1421    _mesa_TexParameteri(tex->Target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   1422    _mesa_TexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
   1423 
   1424    /* copy pixel data to texture */
   1425    if (newTex) {
   1426       /* create new tex image */
   1427       if (tex->Width == width && tex->Height == height) {
   1428          /* create new tex and load image data */
   1429          _mesa_TexImage2D(tex->Target, 0, tex->IntFormat,
   1430                           tex->Width, tex->Height, 0, format, type, pixels);
   1431       }
   1432       else {
   1433          struct gl_buffer_object *save_unpack_obj = NULL;
   1434 
   1435          _mesa_reference_buffer_object(ctx, &save_unpack_obj,
   1436                                        ctx->Unpack.BufferObj);
   1437          _mesa_BindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
   1438          /* create empty texture */
   1439          _mesa_TexImage2D(tex->Target, 0, tex->IntFormat,
   1440                           tex->Width, tex->Height, 0, format, type, NULL);
   1441          if (save_unpack_obj != NULL)
   1442             _mesa_BindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB,
   1443                              save_unpack_obj->Name);
   1444          /* load image */
   1445          _mesa_TexSubImage2D(tex->Target, 0,
   1446                              0, 0, width, height, format, type, pixels);
   1447       }
   1448    }
   1449    else {
   1450       /* replace existing tex image */
   1451       _mesa_TexSubImage2D(tex->Target, 0,
   1452                           0, 0, width, height, format, type, pixels);
   1453    }
   1454 }
   1455 
   1456 void
   1457 _mesa_meta_setup_ff_tnl_for_blit(struct gl_context *ctx,
   1458                                  GLuint *VAO, struct gl_buffer_object **buf_obj,
   1459                                  unsigned texcoord_size)
   1460 {
   1461    _mesa_meta_setup_vertex_objects(ctx, VAO, buf_obj, false, 2, texcoord_size,
   1462                                    0);
   1463 
   1464    /* setup projection matrix */
   1465    _mesa_MatrixMode(GL_PROJECTION);
   1466    _mesa_LoadIdentity();
   1467 }
   1468 
   1469 /**
   1470  * Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.
   1471  */
   1472 void
   1473 _mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers)
   1474 {
   1475    meta_clear(ctx, buffers, false);
   1476 }
   1477 
   1478 void
   1479 _mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers)
   1480 {
   1481    meta_clear(ctx, buffers, true);
   1482 }
   1483 
   1484 static void
   1485 meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear)
   1486 {
   1487    const char *vs_source =
   1488       "#extension GL_AMD_vertex_shader_layer : enable\n"
   1489       "#extension GL_ARB_draw_instanced : enable\n"
   1490       "#extension GL_ARB_explicit_attrib_location :enable\n"
   1491       "layout(location = 0) in vec4 position;\n"
   1492       "void main()\n"
   1493       "{\n"
   1494       "#ifdef GL_AMD_vertex_shader_layer\n"
   1495       "   gl_Layer = gl_InstanceID;\n"
   1496       "#endif\n"
   1497       "   gl_Position = position;\n"
   1498       "}\n";
   1499    const char *fs_source =
   1500       "#extension GL_ARB_explicit_attrib_location :enable\n"
   1501       "#extension GL_ARB_explicit_uniform_location :enable\n"
   1502       "layout(location = 0) uniform vec4 color;\n"
   1503       "void main()\n"
   1504       "{\n"
   1505       "   gl_FragColor = color;\n"
   1506       "}\n";
   1507    bool has_integer_textures;
   1508 
   1509    _mesa_meta_setup_vertex_objects(ctx, &clear->VAO, &clear->buf_obj, true,
   1510                                    3, 0, 0);
   1511 
   1512    if (clear->ShaderProg != 0)
   1513       return;
   1514 
   1515    _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source, "meta clear",
   1516                                        &clear->ShaderProg);
   1517 
   1518    has_integer_textures = _mesa_is_gles3(ctx) ||
   1519       (_mesa_is_desktop_gl(ctx) && ctx->Const.GLSLVersion >= 130);
   1520 
   1521    if (has_integer_textures) {
   1522       void *shader_source_mem_ctx = ralloc_context(NULL);
   1523       const char *vs_int_source =
   1524          ralloc_asprintf(shader_source_mem_ctx,
   1525                          "#version 130\n"
   1526                          "#extension GL_AMD_vertex_shader_layer : enable\n"
   1527                          "#extension GL_ARB_draw_instanced : enable\n"
   1528                          "#extension GL_ARB_explicit_attrib_location :enable\n"
   1529                          "layout(location = 0) in vec4 position;\n"
   1530                          "void main()\n"
   1531                          "{\n"
   1532                          "#ifdef GL_AMD_vertex_shader_layer\n"
   1533                          "   gl_Layer = gl_InstanceID;\n"
   1534                          "#endif\n"
   1535                          "   gl_Position = position;\n"
   1536                          "}\n");
   1537       const char *fs_int_source =
   1538          ralloc_asprintf(shader_source_mem_ctx,
   1539                          "#version 130\n"
   1540                          "#extension GL_ARB_explicit_attrib_location :enable\n"
   1541                          "#extension GL_ARB_explicit_uniform_location :enable\n"
   1542                          "layout(location = 0) uniform ivec4 color;\n"
   1543                          "out ivec4 out_color;\n"
   1544                          "\n"
   1545                          "void main()\n"
   1546                          "{\n"
   1547                          "   out_color = color;\n"
   1548                          "}\n");
   1549 
   1550       _mesa_meta_compile_and_link_program(ctx, vs_int_source, fs_int_source,
   1551                                           "integer clear",
   1552                                           &clear->IntegerShaderProg);
   1553       ralloc_free(shader_source_mem_ctx);
   1554 
   1555       /* Note that user-defined out attributes get automatically assigned
   1556        * locations starting from 0, so we don't need to explicitly
   1557        * BindFragDataLocation to 0.
   1558        */
   1559    }
   1560 }
   1561 
   1562 static void
   1563 meta_glsl_clear_cleanup(struct gl_context *ctx, struct clear_state *clear)
   1564 {
   1565    if (clear->VAO == 0)
   1566       return;
   1567    _mesa_DeleteVertexArrays(1, &clear->VAO);
   1568    clear->VAO = 0;
   1569    _mesa_reference_buffer_object(ctx, &clear->buf_obj, NULL);
   1570    _mesa_reference_shader_program(ctx, &clear->ShaderProg, NULL);
   1571 
   1572    if (clear->IntegerShaderProg) {
   1573       _mesa_reference_shader_program(ctx, &clear->IntegerShaderProg, NULL);
   1574    }
   1575 }
   1576 
   1577 /**
   1578  * Given a bitfield of BUFFER_BIT_x draw buffers, call glDrawBuffers to
   1579  * set GL to only draw to those buffers.
   1580  *
   1581  * Since the bitfield has no associated order, the assignment of draw buffer
   1582  * indices to color attachment indices is rather arbitrary.
   1583  */
   1584 void
   1585 _mesa_meta_drawbuffers_from_bitfield(GLbitfield bits)
   1586 {
   1587    GLenum enums[MAX_DRAW_BUFFERS];
   1588    int i = 0;
   1589    int n;
   1590 
   1591    /* This function is only legal for color buffer bitfields. */
   1592    assert((bits & ~BUFFER_BITS_COLOR) == 0);
   1593 
   1594    /* Make sure we don't overflow any arrays. */
   1595    assert(_mesa_bitcount(bits) <= MAX_DRAW_BUFFERS);
   1596 
   1597    enums[0] = GL_NONE;
   1598 
   1599    if (bits & BUFFER_BIT_FRONT_LEFT)
   1600       enums[i++] = GL_FRONT_LEFT;
   1601 
   1602    if (bits & BUFFER_BIT_FRONT_RIGHT)
   1603       enums[i++] = GL_FRONT_RIGHT;
   1604 
   1605    if (bits & BUFFER_BIT_BACK_LEFT)
   1606       enums[i++] = GL_BACK_LEFT;
   1607 
   1608    if (bits & BUFFER_BIT_BACK_RIGHT)
   1609       enums[i++] = GL_BACK_RIGHT;
   1610 
   1611    for (n = 0; n < MAX_COLOR_ATTACHMENTS; n++) {
   1612       if (bits & (1 << (BUFFER_COLOR0 + n)))
   1613          enums[i++] = GL_COLOR_ATTACHMENT0 + n;
   1614    }
   1615 
   1616    _mesa_DrawBuffers(i, enums);
   1617 }
   1618 
   1619 /**
   1620  * Return if all of the color channels are masked.
   1621  */
   1622 static inline GLboolean
   1623 is_color_disabled(struct gl_context *ctx, int i)
   1624 {
   1625    return !ctx->Color.ColorMask[i][0] &&
   1626           !ctx->Color.ColorMask[i][1] &&
   1627           !ctx->Color.ColorMask[i][2] &&
   1628           !ctx->Color.ColorMask[i][3];
   1629 }
   1630 
   1631 /**
   1632  * Given a bitfield of BUFFER_BIT_x draw buffers, call glDrawBuffers to
   1633  * set GL to only draw to those buffers.  Also, update color masks to
   1634  * reflect the new draw buffer ordering.
   1635  */
   1636 static void
   1637 _mesa_meta_drawbuffers_and_colormask(struct gl_context *ctx, GLbitfield mask)
   1638 {
   1639    GLenum enums[MAX_DRAW_BUFFERS];
   1640    GLubyte colormask[MAX_DRAW_BUFFERS][4];
   1641    int num_bufs = 0;
   1642 
   1643    /* This function is only legal for color buffer bitfields. */
   1644    assert((mask & ~BUFFER_BITS_COLOR) == 0);
   1645 
   1646    /* Make sure we don't overflow any arrays. */
   1647    assert(_mesa_bitcount(mask) <= MAX_DRAW_BUFFERS);
   1648 
   1649    enums[0] = GL_NONE;
   1650 
   1651    for (int i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
   1652       int b = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
   1653       int colormask_idx = ctx->Extensions.EXT_draw_buffers2 ? i : 0;
   1654 
   1655       if (b < 0 || !(mask & (1 << b)) || is_color_disabled(ctx, colormask_idx))
   1656          continue;
   1657 
   1658       switch (b) {
   1659       case BUFFER_FRONT_LEFT:
   1660          enums[num_bufs] = GL_FRONT_LEFT;
   1661          break;
   1662       case BUFFER_FRONT_RIGHT:
   1663          enums[num_bufs] = GL_FRONT_RIGHT;
   1664          break;
   1665       case BUFFER_BACK_LEFT:
   1666          enums[num_bufs] = GL_BACK_LEFT;
   1667          break;
   1668       case BUFFER_BACK_RIGHT:
   1669          enums[num_bufs] = GL_BACK_RIGHT;
   1670          break;
   1671       default:
   1672          assert(b >= BUFFER_COLOR0 && b <= BUFFER_COLOR7);
   1673          enums[num_bufs] = GL_COLOR_ATTACHMENT0 + (b - BUFFER_COLOR0);
   1674          break;
   1675       }
   1676 
   1677       for (int k = 0; k < 4; k++)
   1678          colormask[num_bufs][k] = ctx->Color.ColorMask[colormask_idx][k];
   1679 
   1680       num_bufs++;
   1681    }
   1682 
   1683    _mesa_DrawBuffers(num_bufs, enums);
   1684 
   1685    for (int i = 0; i < num_bufs; i++) {
   1686       _mesa_ColorMaski(i, colormask[i][0], colormask[i][1],
   1687                           colormask[i][2], colormask[i][3]);
   1688    }
   1689 }
   1690 
   1691 
   1692 /**
   1693  * Meta implementation of ctx->Driver.Clear() in terms of polygon rendering.
   1694  */
   1695 static void
   1696 meta_clear(struct gl_context *ctx, GLbitfield buffers, bool glsl)
   1697 {
   1698    struct clear_state *clear = &ctx->Meta->Clear;
   1699    GLbitfield metaSave;
   1700    const GLuint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
   1701    struct gl_framebuffer *fb = ctx->DrawBuffer;
   1702    float x0, y0, x1, y1, z;
   1703    struct vertex verts[4];
   1704    int i;
   1705 
   1706    metaSave = (MESA_META_ALPHA_TEST |
   1707                MESA_META_BLEND |
   1708                MESA_META_COLOR_MASK |
   1709                MESA_META_DEPTH_TEST |
   1710                MESA_META_RASTERIZATION |
   1711                MESA_META_SHADER |
   1712                MESA_META_STENCIL_TEST |
   1713                MESA_META_VERTEX |
   1714                MESA_META_VIEWPORT |
   1715                MESA_META_CLIP |
   1716                MESA_META_CLAMP_FRAGMENT_COLOR |
   1717                MESA_META_MULTISAMPLE |
   1718                MESA_META_OCCLUSION_QUERY);
   1719 
   1720    if (!glsl) {
   1721       metaSave |= MESA_META_FOG |
   1722                   MESA_META_PIXEL_TRANSFER |
   1723                   MESA_META_TRANSFORM |
   1724                   MESA_META_TEXTURE |
   1725                   MESA_META_CLAMP_VERTEX_COLOR |
   1726                   MESA_META_SELECT_FEEDBACK;
   1727    }
   1728 
   1729    if (buffers & BUFFER_BITS_COLOR) {
   1730       metaSave |= MESA_META_DRAW_BUFFERS;
   1731    }
   1732 
   1733    _mesa_meta_begin(ctx, metaSave);
   1734 
   1735    if (glsl) {
   1736       meta_glsl_clear_init(ctx, clear);
   1737 
   1738       x0 = ((float) fb->_Xmin / fb->Width)  * 2.0f - 1.0f;
   1739       y0 = ((float) fb->_Ymin / fb->Height) * 2.0f - 1.0f;
   1740       x1 = ((float) fb->_Xmax / fb->Width)  * 2.0f - 1.0f;
   1741       y1 = ((float) fb->_Ymax / fb->Height) * 2.0f - 1.0f;
   1742       z = -invert_z(ctx->Depth.Clear);
   1743    } else {
   1744       _mesa_meta_setup_vertex_objects(ctx, &clear->VAO, &clear->buf_obj, false,
   1745                                       3, 0, 4);
   1746 
   1747       x0 = (float) fb->_Xmin;
   1748       y0 = (float) fb->_Ymin;
   1749       x1 = (float) fb->_Xmax;
   1750       y1 = (float) fb->_Ymax;
   1751       z = invert_z(ctx->Depth.Clear);
   1752    }
   1753 
   1754    if (fb->_IntegerBuffers) {
   1755       assert(glsl);
   1756       _mesa_meta_use_program(ctx, clear->IntegerShaderProg);
   1757       _mesa_Uniform4iv(0, 1, ctx->Color.ClearColor.i);
   1758    } else if (glsl) {
   1759       _mesa_meta_use_program(ctx, clear->ShaderProg);
   1760       _mesa_Uniform4fv(0, 1, ctx->Color.ClearColor.f);
   1761    }
   1762 
   1763    /* GL_COLOR_BUFFER_BIT */
   1764    if (buffers & BUFFER_BITS_COLOR) {
   1765       /* Only draw to the buffers we were asked to clear. */
   1766       _mesa_meta_drawbuffers_and_colormask(ctx, buffers & BUFFER_BITS_COLOR);
   1767 
   1768       /* leave colormask state as-is */
   1769 
   1770       /* Clears never have the color clamped. */
   1771       if (ctx->Extensions.ARB_color_buffer_float)
   1772          _mesa_ClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE);
   1773    }
   1774    else {
   1775       _mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
   1776    }
   1777 
   1778    /* GL_DEPTH_BUFFER_BIT */
   1779    if (buffers & BUFFER_BIT_DEPTH) {
   1780       _mesa_set_enable(ctx, GL_DEPTH_TEST, GL_TRUE);
   1781       _mesa_DepthFunc(GL_ALWAYS);
   1782       _mesa_DepthMask(GL_TRUE);
   1783    }
   1784    else {
   1785       assert(!ctx->Depth.Test);
   1786    }
   1787 
   1788    /* GL_STENCIL_BUFFER_BIT */
   1789    if (buffers & BUFFER_BIT_STENCIL) {
   1790       _mesa_set_enable(ctx, GL_STENCIL_TEST, GL_TRUE);
   1791       _mesa_StencilOpSeparate(GL_FRONT_AND_BACK,
   1792                               GL_REPLACE, GL_REPLACE, GL_REPLACE);
   1793       _mesa_StencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS,
   1794                                 ctx->Stencil.Clear & stencilMax,
   1795                                 ctx->Stencil.WriteMask[0]);
   1796    }
   1797    else {
   1798       assert(!ctx->Stencil.Enabled);
   1799    }
   1800 
   1801    /* vertex positions */
   1802    verts[0].x = x0;
   1803    verts[0].y = y0;
   1804    verts[0].z = z;
   1805    verts[1].x = x1;
   1806    verts[1].y = y0;
   1807    verts[1].z = z;
   1808    verts[2].x = x1;
   1809    verts[2].y = y1;
   1810    verts[2].z = z;
   1811    verts[3].x = x0;
   1812    verts[3].y = y1;
   1813    verts[3].z = z;
   1814 
   1815    if (!glsl) {
   1816       for (i = 0; i < 4; i++) {
   1817          verts[i].r = ctx->Color.ClearColor.f[0];
   1818          verts[i].g = ctx->Color.ClearColor.f[1];
   1819          verts[i].b = ctx->Color.ClearColor.f[2];
   1820          verts[i].a = ctx->Color.ClearColor.f[3];
   1821       }
   1822    }
   1823 
   1824    /* upload new vertex data */
   1825    _mesa_buffer_data(ctx, clear->buf_obj, GL_NONE, sizeof(verts), verts,
   1826                      GL_DYNAMIC_DRAW, __func__);
   1827 
   1828    /* draw quad(s) */
   1829    if (fb->MaxNumLayers > 0) {
   1830       _mesa_DrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, fb->MaxNumLayers);
   1831    } else {
   1832       _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   1833    }
   1834 
   1835    _mesa_meta_end(ctx);
   1836 }
   1837 
   1838 /**
   1839  * Meta implementation of ctx->Driver.CopyPixels() in terms
   1840  * of texture mapping and polygon rendering and GLSL shaders.
   1841  */
   1842 void
   1843 _mesa_meta_CopyPixels(struct gl_context *ctx, GLint srcX, GLint srcY,
   1844                       GLsizei width, GLsizei height,
   1845                       GLint dstX, GLint dstY, GLenum type)
   1846 {
   1847    struct copypix_state *copypix = &ctx->Meta->CopyPix;
   1848    struct temp_texture *tex = _mesa_meta_get_temp_texture(ctx);
   1849    struct vertex verts[4];
   1850 
   1851    if (type != GL_COLOR ||
   1852        ctx->_ImageTransferState ||
   1853        ctx->Fog.Enabled ||
   1854        width > tex->MaxSize ||
   1855        height > tex->MaxSize) {
   1856       /* XXX avoid this fallback */
   1857       _swrast_CopyPixels(ctx, srcX, srcY, width, height, dstX, dstY, type);
   1858       return;
   1859    }
   1860 
   1861    /* Most GL state applies to glCopyPixels, but a there's a few things
   1862     * we need to override:
   1863     */
   1864    _mesa_meta_begin(ctx, (MESA_META_RASTERIZATION |
   1865                           MESA_META_SHADER |
   1866                           MESA_META_TEXTURE |
   1867                           MESA_META_TRANSFORM |
   1868                           MESA_META_CLIP |
   1869                           MESA_META_VERTEX |
   1870                           MESA_META_VIEWPORT));
   1871 
   1872    _mesa_meta_setup_vertex_objects(ctx, &copypix->VAO, &copypix->buf_obj, false,
   1873                                    3, 2, 0);
   1874 
   1875    /* Silence valgrind warnings about reading uninitialized stack. */
   1876    memset(verts, 0, sizeof(verts));
   1877 
   1878    /* Alloc/setup texture */
   1879    _mesa_meta_setup_copypix_texture(ctx, tex, srcX, srcY, width, height,
   1880                                     GL_RGBA, GL_NEAREST);
   1881 
   1882    /* vertex positions, texcoords (after texture allocation!) */
   1883    {
   1884       const GLfloat dstX0 = (GLfloat) dstX;
   1885       const GLfloat dstY0 = (GLfloat) dstY;
   1886       const GLfloat dstX1 = dstX + width * ctx->Pixel.ZoomX;
   1887       const GLfloat dstY1 = dstY + height * ctx->Pixel.ZoomY;
   1888       const GLfloat z = invert_z(ctx->Current.RasterPos[2]);
   1889 
   1890       verts[0].x = dstX0;
   1891       verts[0].y = dstY0;
   1892       verts[0].z = z;
   1893       verts[0].tex[0] = 0.0F;
   1894       verts[0].tex[1] = 0.0F;
   1895       verts[1].x = dstX1;
   1896       verts[1].y = dstY0;
   1897       verts[1].z = z;
   1898       verts[1].tex[0] = tex->Sright;
   1899       verts[1].tex[1] = 0.0F;
   1900       verts[2].x = dstX1;
   1901       verts[2].y = dstY1;
   1902       verts[2].z = z;
   1903       verts[2].tex[0] = tex->Sright;
   1904       verts[2].tex[1] = tex->Ttop;
   1905       verts[3].x = dstX0;
   1906       verts[3].y = dstY1;
   1907       verts[3].z = z;
   1908       verts[3].tex[0] = 0.0F;
   1909       verts[3].tex[1] = tex->Ttop;
   1910 
   1911       /* upload new vertex data */
   1912       _mesa_buffer_sub_data(ctx, copypix->buf_obj, 0, sizeof(verts), verts,
   1913                             __func__);
   1914    }
   1915 
   1916    _mesa_set_enable(ctx, tex->Target, GL_TRUE);
   1917 
   1918    /* draw textured quad */
   1919    _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   1920 
   1921    _mesa_set_enable(ctx, tex->Target, GL_FALSE);
   1922 
   1923    _mesa_meta_end(ctx);
   1924 }
   1925 
   1926 static void
   1927 meta_drawpix_cleanup(struct gl_context *ctx, struct drawpix_state *drawpix)
   1928 {
   1929    if (drawpix->VAO != 0) {
   1930       _mesa_DeleteVertexArrays(1, &drawpix->VAO);
   1931       drawpix->VAO = 0;
   1932 
   1933       _mesa_reference_buffer_object(ctx, &drawpix->buf_obj, NULL);
   1934    }
   1935 
   1936    if (drawpix->StencilFP != 0) {
   1937       _mesa_DeleteProgramsARB(1, &drawpix->StencilFP);
   1938       drawpix->StencilFP = 0;
   1939    }
   1940 
   1941    if (drawpix->DepthFP != 0) {
   1942       _mesa_DeleteProgramsARB(1, &drawpix->DepthFP);
   1943       drawpix->DepthFP = 0;
   1944    }
   1945 }
   1946 
   1947 /**
   1948  * When the glDrawPixels() image size is greater than the max rectangle
   1949  * texture size we use this function to break the glDrawPixels() image
   1950  * into tiles which fit into the max texture size.
   1951  */
   1952 static void
   1953 tiled_draw_pixels(struct gl_context *ctx,
   1954                   GLint tileSize,
   1955                   GLint x, GLint y, GLsizei width, GLsizei height,
   1956                   GLenum format, GLenum type,
   1957                   const struct gl_pixelstore_attrib *unpack,
   1958                   const GLvoid *pixels)
   1959 {
   1960    struct gl_pixelstore_attrib tileUnpack = *unpack;
   1961    GLint i, j;
   1962 
   1963    if (tileUnpack.RowLength == 0)
   1964       tileUnpack.RowLength = width;
   1965 
   1966    for (i = 0; i < width; i += tileSize) {
   1967       const GLint tileWidth = MIN2(tileSize, width - i);
   1968       const GLint tileX = (GLint) (x + i * ctx->Pixel.ZoomX);
   1969 
   1970       tileUnpack.SkipPixels = unpack->SkipPixels + i;
   1971 
   1972       for (j = 0; j < height; j += tileSize) {
   1973          const GLint tileHeight = MIN2(tileSize, height - j);
   1974          const GLint tileY = (GLint) (y + j * ctx->Pixel.ZoomY);
   1975 
   1976          tileUnpack.SkipRows = unpack->SkipRows + j;
   1977 
   1978          _mesa_meta_DrawPixels(ctx, tileX, tileY, tileWidth, tileHeight,
   1979                                format, type, &tileUnpack, pixels);
   1980       }
   1981    }
   1982 }
   1983 
   1984 
   1985 /**
   1986  * One-time init for drawing stencil pixels.
   1987  */
   1988 static void
   1989 init_draw_stencil_pixels(struct gl_context *ctx)
   1990 {
   1991    /* This program is run eight times, once for each stencil bit.
   1992     * The stencil values to draw are found in an 8-bit alpha texture.
   1993     * We read the texture/stencil value and test if bit 'b' is set.
   1994     * If the bit is not set, use KIL to kill the fragment.
   1995     * Finally, we use the stencil test to update the stencil buffer.
   1996     *
   1997     * The basic algorithm for checking if a bit is set is:
   1998     *   if (is_odd(value / (1 << bit)))
   1999     *      result is one (or non-zero).
   2000     *   else
   2001     *      result is zero.
   2002     * The program parameter contains three values:
   2003     *   parm.x = 255 / (1 << bit)
   2004     *   parm.y = 0.5
   2005     *   parm.z = 0.0
   2006     */
   2007    static const char *program =
   2008       "!!ARBfp1.0\n"
   2009       "PARAM parm = program.local[0]; \n"
   2010       "TEMP t; \n"
   2011       "TEX t, fragment.texcoord[0], texture[0], %s; \n"   /* NOTE %s here! */
   2012       "# t = t * 255 / bit \n"
   2013       "MUL t.x, t.a, parm.x; \n"
   2014       "# t = (int) t \n"
   2015       "FRC t.y, t.x; \n"
   2016       "SUB t.x, t.x, t.y; \n"
   2017       "# t = t * 0.5 \n"
   2018       "MUL t.x, t.x, parm.y; \n"
   2019       "# t = fract(t.x) \n"
   2020       "FRC t.x, t.x; # if t.x != 0, then the bit is set \n"
   2021       "# t.x = (t.x == 0 ? 1 : 0) \n"
   2022       "SGE t.x, -t.x, parm.z; \n"
   2023       "KIL -t.x; \n"
   2024       "# for debug only \n"
   2025       "#MOV result.color, t.x; \n"
   2026       "END \n";
   2027    char program2[1000];
   2028    struct drawpix_state *drawpix = &ctx->Meta->DrawPix;
   2029    struct temp_texture *tex = _mesa_meta_get_temp_texture(ctx);
   2030    const char *texTarget;
   2031 
   2032    assert(drawpix->StencilFP == 0);
   2033 
   2034    /* replace %s with "RECT" or "2D" */
   2035    assert(strlen(program) + 4 < sizeof(program2));
   2036    if (tex->Target == GL_TEXTURE_RECTANGLE)
   2037       texTarget = "RECT";
   2038    else
   2039       texTarget = "2D";
   2040    _mesa_snprintf(program2, sizeof(program2), program, texTarget);
   2041 
   2042    _mesa_GenProgramsARB(1, &drawpix->StencilFP);
   2043    _mesa_BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, drawpix->StencilFP);
   2044    _mesa_ProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
   2045                           strlen(program2), (const GLubyte *) program2);
   2046 }
   2047 
   2048 
   2049 /**
   2050  * One-time init for drawing depth pixels.
   2051  */
   2052 static void
   2053 init_draw_depth_pixels(struct gl_context *ctx)
   2054 {
   2055    static const char *program =
   2056       "!!ARBfp1.0\n"
   2057       "PARAM color = program.local[0]; \n"
   2058       "TEX result.depth, fragment.texcoord[0], texture[0], %s; \n"
   2059       "MOV result.color, color; \n"
   2060       "END \n";
   2061    char program2[200];
   2062    struct drawpix_state *drawpix = &ctx->Meta->DrawPix;
   2063    struct temp_texture *tex = _mesa_meta_get_temp_texture(ctx);
   2064    const char *texTarget;
   2065 
   2066    assert(drawpix->DepthFP == 0);
   2067 
   2068    /* replace %s with "RECT" or "2D" */
   2069    assert(strlen(program) + 4 < sizeof(program2));
   2070    if (tex->Target == GL_TEXTURE_RECTANGLE)
   2071       texTarget = "RECT";
   2072    else
   2073       texTarget = "2D";
   2074    _mesa_snprintf(program2, sizeof(program2), program, texTarget);
   2075 
   2076    _mesa_GenProgramsARB(1, &drawpix->DepthFP);
   2077    _mesa_BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, drawpix->DepthFP);
   2078    _mesa_ProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
   2079                           strlen(program2), (const GLubyte *) program2);
   2080 }
   2081 
   2082 
   2083 /**
   2084  * Meta implementation of ctx->Driver.DrawPixels() in terms
   2085  * of texture mapping and polygon rendering.
   2086  */
   2087 void
   2088 _mesa_meta_DrawPixels(struct gl_context *ctx,
   2089                       GLint x, GLint y, GLsizei width, GLsizei height,
   2090                       GLenum format, GLenum type,
   2091                       const struct gl_pixelstore_attrib *unpack,
   2092                       const GLvoid *pixels)
   2093 {
   2094    struct drawpix_state *drawpix = &ctx->Meta->DrawPix;
   2095    struct temp_texture *tex = _mesa_meta_get_temp_texture(ctx);
   2096    const struct gl_pixelstore_attrib unpackSave = ctx->Unpack;
   2097    const GLuint origStencilMask = ctx->Stencil.WriteMask[0];
   2098    struct vertex verts[4];
   2099    GLenum texIntFormat;
   2100    GLboolean fallback, newTex;
   2101    GLbitfield metaExtraSave = 0x0;
   2102 
   2103    /*
   2104     * Determine if we can do the glDrawPixels with texture mapping.
   2105     */
   2106    fallback = GL_FALSE;
   2107    if (ctx->Fog.Enabled) {
   2108       fallback = GL_TRUE;
   2109    }
   2110 
   2111    if (_mesa_is_color_format(format)) {
   2112       /* use more compact format when possible */
   2113       /* XXX disable special case for GL_LUMINANCE for now to work around
   2114        * apparent i965 driver bug (see bug #23670).
   2115        */
   2116       if (/*format == GL_LUMINANCE ||*/ format == GL_LUMINANCE_ALPHA)
   2117          texIntFormat = format;
   2118       else
   2119          texIntFormat = GL_RGBA;
   2120 
   2121       /* If we're not supposed to clamp the resulting color, then just
   2122        * promote our texture to fully float.  We could do better by
   2123        * just going for the matching set of channels, in floating
   2124        * point.
   2125        */
   2126       if (ctx->Color.ClampFragmentColor != GL_TRUE &&
   2127           ctx->Extensions.ARB_texture_float)
   2128          texIntFormat = GL_RGBA32F;
   2129    }
   2130    else if (_mesa_is_stencil_format(format)) {
   2131       if (ctx->Extensions.ARB_fragment_program &&
   2132           ctx->Pixel.IndexShift == 0 &&
   2133           ctx->Pixel.IndexOffset == 0 &&
   2134           type == GL_UNSIGNED_BYTE) {
   2135          /* We'll store stencil as alpha.  This only works for GLubyte
   2136           * image data because of how incoming values are mapped to alpha
   2137           * in [0,1].
   2138           */
   2139          texIntFormat = GL_ALPHA;
   2140          metaExtraSave = (MESA_META_COLOR_MASK |
   2141                           MESA_META_DEPTH_TEST |
   2142                           MESA_META_PIXEL_TRANSFER |
   2143                           MESA_META_SHADER |
   2144                           MESA_META_STENCIL_TEST);
   2145       }
   2146       else {
   2147          fallback = GL_TRUE;
   2148       }
   2149    }
   2150    else if (_mesa_is_depth_format(format)) {
   2151       if (ctx->Extensions.ARB_depth_texture &&
   2152           ctx->Extensions.ARB_fragment_program) {
   2153          texIntFormat = GL_DEPTH_COMPONENT;
   2154          metaExtraSave = (MESA_META_SHADER);
   2155       }
   2156       else {
   2157          fallback = GL_TRUE;
   2158       }
   2159    }
   2160    else {
   2161       fallback = GL_TRUE;
   2162    }
   2163 
   2164    if (fallback) {
   2165       _swrast_DrawPixels(ctx, x, y, width, height,
   2166                          format, type, unpack, pixels);
   2167       return;
   2168    }
   2169 
   2170    /*
   2171     * Check image size against max texture size, draw as tiles if needed.
   2172     */
   2173    if (width > tex->MaxSize || height > tex->MaxSize) {
   2174       tiled_draw_pixels(ctx, tex->MaxSize, x, y, width, height,
   2175                         format, type, unpack, pixels);
   2176       return;
   2177    }
   2178 
   2179    /* Most GL state applies to glDrawPixels (like blending, stencil, etc),
   2180     * but a there's a few things we need to override:
   2181     */
   2182    _mesa_meta_begin(ctx, (MESA_META_RASTERIZATION |
   2183                           MESA_META_SHADER |
   2184                           MESA_META_TEXTURE |
   2185                           MESA_META_TRANSFORM |
   2186                           MESA_META_CLIP |
   2187                           MESA_META_VERTEX |
   2188                           MESA_META_VIEWPORT |
   2189                           metaExtraSave));
   2190 
   2191    newTex = _mesa_meta_alloc_texture(tex, width, height, texIntFormat);
   2192 
   2193    _mesa_meta_setup_vertex_objects(ctx, &drawpix->VAO, &drawpix->buf_obj, false,
   2194                                    3, 2, 0);
   2195 
   2196    /* Silence valgrind warnings about reading uninitialized stack. */
   2197    memset(verts, 0, sizeof(verts));
   2198 
   2199    /* vertex positions, texcoords (after texture allocation!) */
   2200    {
   2201       const GLfloat x0 = (GLfloat) x;
   2202       const GLfloat y0 = (GLfloat) y;
   2203       const GLfloat x1 = x + width * ctx->Pixel.ZoomX;
   2204       const GLfloat y1 = y + height * ctx->Pixel.ZoomY;
   2205       const GLfloat z = invert_z(ctx->Current.RasterPos[2]);
   2206 
   2207       verts[0].x = x0;
   2208       verts[0].y = y0;
   2209       verts[0].z = z;
   2210       verts[0].tex[0] = 0.0F;
   2211       verts[0].tex[1] = 0.0F;
   2212       verts[1].x = x1;
   2213       verts[1].y = y0;
   2214       verts[1].z = z;
   2215       verts[1].tex[0] = tex->Sright;
   2216       verts[1].tex[1] = 0.0F;
   2217       verts[2].x = x1;
   2218       verts[2].y = y1;
   2219       verts[2].z = z;
   2220       verts[2].tex[0] = tex->Sright;
   2221       verts[2].tex[1] = tex->Ttop;
   2222       verts[3].x = x0;
   2223       verts[3].y = y1;
   2224       verts[3].z = z;
   2225       verts[3].tex[0] = 0.0F;
   2226       verts[3].tex[1] = tex->Ttop;
   2227    }
   2228 
   2229    /* upload new vertex data */
   2230    _mesa_buffer_data(ctx, drawpix->buf_obj, GL_NONE, sizeof(verts), verts,
   2231                      GL_DYNAMIC_DRAW, __func__);
   2232 
   2233    /* set given unpack params */
   2234    ctx->Unpack = *unpack;
   2235 
   2236    _mesa_set_enable(ctx, tex->Target, GL_TRUE);
   2237 
   2238    if (_mesa_is_stencil_format(format)) {
   2239       /* Drawing stencil */
   2240       GLint bit;
   2241 
   2242       if (!drawpix->StencilFP)
   2243          init_draw_stencil_pixels(ctx);
   2244 
   2245       _mesa_meta_setup_drawpix_texture(ctx, tex, newTex, width, height,
   2246                                        GL_ALPHA, type, pixels);
   2247 
   2248       _mesa_ColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
   2249 
   2250       _mesa_set_enable(ctx, GL_STENCIL_TEST, GL_TRUE);
   2251 
   2252       /* set all stencil bits to 0 */
   2253       _mesa_StencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
   2254       _mesa_StencilFunc(GL_ALWAYS, 0, 255);
   2255       _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   2256 
   2257       /* set stencil bits to 1 where needed */
   2258       _mesa_StencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
   2259 
   2260       _mesa_BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, drawpix->StencilFP);
   2261       _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB, GL_TRUE);
   2262 
   2263       for (bit = 0; bit < ctx->DrawBuffer->Visual.stencilBits; bit++) {
   2264          const GLuint mask = 1 << bit;
   2265          if (mask & origStencilMask) {
   2266             _mesa_StencilFunc(GL_ALWAYS, mask, mask);
   2267             _mesa_StencilMask(mask);
   2268 
   2269             _mesa_ProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0,
   2270                                              255.0f / mask, 0.5f, 0.0f, 0.0f);
   2271 
   2272             _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   2273          }
   2274       }
   2275    }
   2276    else if (_mesa_is_depth_format(format)) {
   2277       /* Drawing depth */
   2278       if (!drawpix->DepthFP)
   2279          init_draw_depth_pixels(ctx);
   2280 
   2281       _mesa_BindProgramARB(GL_FRAGMENT_PROGRAM_ARB, drawpix->DepthFP);
   2282       _mesa_set_enable(ctx, GL_FRAGMENT_PROGRAM_ARB, GL_TRUE);
   2283 
   2284       /* polygon color = current raster color */
   2285       _mesa_ProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0,
   2286                                         ctx->Current.RasterColor);
   2287 
   2288       _mesa_meta_setup_drawpix_texture(ctx, tex, newTex, width, height,
   2289                                        format, type, pixels);
   2290 
   2291       _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   2292    }
   2293    else {
   2294       /* Drawing RGBA */
   2295       _mesa_meta_setup_drawpix_texture(ctx, tex, newTex, width, height,
   2296                                        format, type, pixels);
   2297       _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   2298    }
   2299 
   2300    _mesa_set_enable(ctx, tex->Target, GL_FALSE);
   2301 
   2302    /* restore unpack params */
   2303    ctx->Unpack = unpackSave;
   2304 
   2305    _mesa_meta_end(ctx);
   2306 }
   2307 
   2308 static GLboolean
   2309 alpha_test_raster_color(struct gl_context *ctx)
   2310 {
   2311    GLfloat alpha = ctx->Current.RasterColor[ACOMP];
   2312    GLfloat ref = ctx->Color.AlphaRef;
   2313 
   2314    switch (ctx->Color.AlphaFunc) {
   2315       case GL_NEVER:
   2316          return GL_FALSE;
   2317       case GL_LESS:
   2318          return alpha < ref;
   2319       case GL_EQUAL:
   2320          return alpha == ref;
   2321       case GL_LEQUAL:
   2322          return alpha <= ref;
   2323       case GL_GREATER:
   2324          return alpha > ref;
   2325       case GL_NOTEQUAL:
   2326          return alpha != ref;
   2327       case GL_GEQUAL:
   2328          return alpha >= ref;
   2329       case GL_ALWAYS:
   2330          return GL_TRUE;
   2331       default:
   2332          assert(0);
   2333          return GL_FALSE;
   2334    }
   2335 }
   2336 
   2337 /**
   2338  * Do glBitmap with a alpha texture quad.  Use the alpha test to cull
   2339  * the 'off' bits.  A bitmap cache as in the gallium/mesa state
   2340  * tracker would improve performance a lot.
   2341  */
   2342 void
   2343 _mesa_meta_Bitmap(struct gl_context *ctx,
   2344                   GLint x, GLint y, GLsizei width, GLsizei height,
   2345                   const struct gl_pixelstore_attrib *unpack,
   2346                   const GLubyte *bitmap1)
   2347 {
   2348    struct bitmap_state *bitmap = &ctx->Meta->Bitmap;
   2349    struct temp_texture *tex = get_bitmap_temp_texture(ctx);
   2350    const GLenum texIntFormat = GL_ALPHA;
   2351    const struct gl_pixelstore_attrib unpackSave = *unpack;
   2352    GLubyte fg, bg;
   2353    struct vertex verts[4];
   2354    GLboolean newTex;
   2355    GLubyte *bitmap8;
   2356 
   2357    /*
   2358     * Check if swrast fallback is needed.
   2359     */
   2360    if (ctx->_ImageTransferState ||
   2361        ctx->FragmentProgram._Enabled ||
   2362        ctx->Fog.Enabled ||
   2363        ctx->Texture._MaxEnabledTexImageUnit != -1 ||
   2364        width > tex->MaxSize ||
   2365        height > tex->MaxSize) {
   2366       _swrast_Bitmap(ctx, x, y, width, height, unpack, bitmap1);
   2367       return;
   2368    }
   2369 
   2370    if (ctx->Color.AlphaEnabled && !alpha_test_raster_color(ctx))
   2371       return;
   2372 
   2373    /* Most GL state applies to glBitmap (like blending, stencil, etc),
   2374     * but a there's a few things we need to override:
   2375     */
   2376    _mesa_meta_begin(ctx, (MESA_META_ALPHA_TEST |
   2377                           MESA_META_PIXEL_STORE |
   2378                           MESA_META_RASTERIZATION |
   2379                           MESA_META_SHADER |
   2380                           MESA_META_TEXTURE |
   2381                           MESA_META_TRANSFORM |
   2382                           MESA_META_CLIP |
   2383                           MESA_META_VERTEX |
   2384                           MESA_META_VIEWPORT));
   2385 
   2386    _mesa_meta_setup_vertex_objects(ctx, &bitmap->VAO, &bitmap->buf_obj, false,
   2387                                    3, 2, 4);
   2388 
   2389    newTex = _mesa_meta_alloc_texture(tex, width, height, texIntFormat);
   2390 
   2391    /* Silence valgrind warnings about reading uninitialized stack. */
   2392    memset(verts, 0, sizeof(verts));
   2393 
   2394    /* vertex positions, texcoords, colors (after texture allocation!) */
   2395    {
   2396       const GLfloat x0 = (GLfloat) x;
   2397       const GLfloat y0 = (GLfloat) y;
   2398       const GLfloat x1 = (GLfloat) (x + width);
   2399       const GLfloat y1 = (GLfloat) (y + height);
   2400       const GLfloat z = invert_z(ctx->Current.RasterPos[2]);
   2401       GLuint i;
   2402 
   2403       verts[0].x = x0;
   2404       verts[0].y = y0;
   2405       verts[0].z = z;
   2406       verts[0].tex[0] = 0.0F;
   2407       verts[0].tex[1] = 0.0F;
   2408       verts[1].x = x1;
   2409       verts[1].y = y0;
   2410       verts[1].z = z;
   2411       verts[1].tex[0] = tex->Sright;
   2412       verts[1].tex[1] = 0.0F;
   2413       verts[2].x = x1;
   2414       verts[2].y = y1;
   2415       verts[2].z = z;
   2416       verts[2].tex[0] = tex->Sright;
   2417       verts[2].tex[1] = tex->Ttop;
   2418       verts[3].x = x0;
   2419       verts[3].y = y1;
   2420       verts[3].z = z;
   2421       verts[3].tex[0] = 0.0F;
   2422       verts[3].tex[1] = tex->Ttop;
   2423 
   2424       for (i = 0; i < 4; i++) {
   2425          verts[i].r = ctx->Current.RasterColor[0];
   2426          verts[i].g = ctx->Current.RasterColor[1];
   2427          verts[i].b = ctx->Current.RasterColor[2];
   2428          verts[i].a = ctx->Current.RasterColor[3];
   2429       }
   2430 
   2431       /* upload new vertex data */
   2432       _mesa_buffer_sub_data(ctx, bitmap->buf_obj, 0, sizeof(verts), verts,
   2433                             __func__);
   2434    }
   2435 
   2436    /* choose different foreground/background alpha values */
   2437    CLAMPED_FLOAT_TO_UBYTE(fg, ctx->Current.RasterColor[ACOMP]);
   2438    bg = (fg > 127 ? 0 : 255);
   2439 
   2440    bitmap1 = _mesa_map_pbo_source(ctx, &unpackSave, bitmap1);
   2441    if (!bitmap1) {
   2442       _mesa_meta_end(ctx);
   2443       return;
   2444    }
   2445 
   2446    bitmap8 = malloc(width * height);
   2447    if (bitmap8) {
   2448       memset(bitmap8, bg, width * height);
   2449       _mesa_expand_bitmap(width, height, &unpackSave, bitmap1,
   2450                           bitmap8, width, fg);
   2451 
   2452       _mesa_set_enable(ctx, tex->Target, GL_TRUE);
   2453 
   2454       _mesa_set_enable(ctx, GL_ALPHA_TEST, GL_TRUE);
   2455       _mesa_AlphaFunc(GL_NOTEQUAL, UBYTE_TO_FLOAT(bg));
   2456 
   2457       _mesa_meta_setup_drawpix_texture(ctx, tex, newTex, width, height,
   2458                                        GL_ALPHA, GL_UNSIGNED_BYTE, bitmap8);
   2459 
   2460       _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   2461 
   2462       _mesa_set_enable(ctx, tex->Target, GL_FALSE);
   2463 
   2464       free(bitmap8);
   2465    }
   2466 
   2467    _mesa_unmap_pbo_source(ctx, &unpackSave);
   2468 
   2469    _mesa_meta_end(ctx);
   2470 }
   2471 
   2472 /**
   2473  * Compute the texture coordinates for the four vertices of a quad for
   2474  * drawing a 2D texture image or slice of a cube/3D texture.  The offset
   2475  * and width, height specify a sub-region of the 2D image.
   2476  *
   2477  * \param faceTarget  GL_TEXTURE_1D/2D/3D or cube face name
   2478  * \param slice  slice of a 1D/2D array texture or 3D texture
   2479  * \param xoffset  X position of sub texture
   2480  * \param yoffset  Y position of sub texture
   2481  * \param width  width of the sub texture image
   2482  * \param height  height of the sub texture image
   2483  * \param total_width  total width of the texture image
   2484  * \param total_height  total height of the texture image
   2485  * \param total_depth  total depth of the texture image
   2486  * \param coords0/1/2/3  returns the computed texcoords
   2487  */
   2488 void
   2489 _mesa_meta_setup_texture_coords(GLenum faceTarget,
   2490                                 GLint slice,
   2491                                 GLint xoffset,
   2492                                 GLint yoffset,
   2493                                 GLint width,
   2494                                 GLint height,
   2495                                 GLint total_width,
   2496                                 GLint total_height,
   2497                                 GLint total_depth,
   2498                                 GLfloat coords0[4],
   2499                                 GLfloat coords1[4],
   2500                                 GLfloat coords2[4],
   2501                                 GLfloat coords3[4])
   2502 {
   2503    float st[4][2];
   2504    GLuint i;
   2505    const float s0 = (float) xoffset / (float) total_width;
   2506    const float s1 = (float) (xoffset + width) / (float) total_width;
   2507    const float t0 = (float) yoffset / (float) total_height;
   2508    const float t1 = (float) (yoffset + height) / (float) total_height;
   2509    GLfloat r;
   2510 
   2511    /* setup the reference texcoords */
   2512    st[0][0] = s0;
   2513    st[0][1] = t0;
   2514    st[1][0] = s1;
   2515    st[1][1] = t0;
   2516    st[2][0] = s1;
   2517    st[2][1] = t1;
   2518    st[3][0] = s0;
   2519    st[3][1] = t1;
   2520 
   2521    if (faceTarget == GL_TEXTURE_CUBE_MAP_ARRAY)
   2522       faceTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + slice % 6;
   2523 
   2524    /* Currently all texture targets want the W component to be 1.0.
   2525     */
   2526    coords0[3] = 1.0F;
   2527    coords1[3] = 1.0F;
   2528    coords2[3] = 1.0F;
   2529    coords3[3] = 1.0F;
   2530 
   2531    switch (faceTarget) {
   2532    case GL_TEXTURE_1D:
   2533    case GL_TEXTURE_2D:
   2534    case GL_TEXTURE_3D:
   2535    case GL_TEXTURE_2D_ARRAY:
   2536       if (faceTarget == GL_TEXTURE_3D) {
   2537          assert(slice < total_depth);
   2538          assert(total_depth >= 1);
   2539          r = (slice + 0.5f) / total_depth;
   2540       }
   2541       else if (faceTarget == GL_TEXTURE_2D_ARRAY)
   2542          r = (float) slice;
   2543       else
   2544          r = 0.0F;
   2545       coords0[0] = st[0][0]; /* s */
   2546       coords0[1] = st[0][1]; /* t */
   2547       coords0[2] = r; /* r */
   2548       coords1[0] = st[1][0];
   2549       coords1[1] = st[1][1];
   2550       coords1[2] = r;
   2551       coords2[0] = st[2][0];
   2552       coords2[1] = st[2][1];
   2553       coords2[2] = r;
   2554       coords3[0] = st[3][0];
   2555       coords3[1] = st[3][1];
   2556       coords3[2] = r;
   2557       break;
   2558    case GL_TEXTURE_RECTANGLE_ARB:
   2559       coords0[0] = (float) xoffset; /* s */
   2560       coords0[1] = (float) yoffset; /* t */
   2561       coords0[2] = 0.0F; /* r */
   2562       coords1[0] = (float) (xoffset + width);
   2563       coords1[1] = (float) yoffset;
   2564       coords1[2] = 0.0F;
   2565       coords2[0] = (float) (xoffset + width);
   2566       coords2[1] = (float) (yoffset + height);
   2567       coords2[2] = 0.0F;
   2568       coords3[0] = (float) xoffset;
   2569       coords3[1] = (float) (yoffset + height);
   2570       coords3[2] = 0.0F;
   2571       break;
   2572    case GL_TEXTURE_1D_ARRAY:
   2573       coords0[0] = st[0][0]; /* s */
   2574       coords0[1] = (float) slice; /* t */
   2575       coords0[2] = 0.0F; /* r */
   2576       coords1[0] = st[1][0];
   2577       coords1[1] = (float) slice;
   2578       coords1[2] = 0.0F;
   2579       coords2[0] = st[2][0];
   2580       coords2[1] = (float) slice;
   2581       coords2[2] = 0.0F;
   2582       coords3[0] = st[3][0];
   2583       coords3[1] = (float) slice;
   2584       coords3[2] = 0.0F;
   2585       break;
   2586 
   2587    case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
   2588    case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
   2589    case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
   2590    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
   2591    case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
   2592    case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
   2593       /* loop over quad verts */
   2594       for (i = 0; i < 4; i++) {
   2595          /* Compute sc = +/-scale and tc = +/-scale.
   2596           * Not +/-1 to avoid cube face selection ambiguity near the edges,
   2597           * though that can still sometimes happen with this scale factor...
   2598           */
   2599          const GLfloat scale = 0.9999f;
   2600          const GLfloat sc = (2.0f * st[i][0] - 1.0f) * scale;
   2601          const GLfloat tc = (2.0f * st[i][1] - 1.0f) * scale;
   2602          GLfloat *coord;
   2603 
   2604          switch (i) {
   2605          case 0:
   2606             coord = coords0;
   2607             break;
   2608          case 1:
   2609             coord = coords1;
   2610             break;
   2611          case 2:
   2612             coord = coords2;
   2613             break;
   2614          case 3:
   2615             coord = coords3;
   2616             break;
   2617          default:
   2618             unreachable("not reached");
   2619          }
   2620 
   2621          coord[3] = (float) (slice / 6);
   2622 
   2623          switch (faceTarget) {
   2624          case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
   2625             coord[0] = 1.0f;
   2626             coord[1] = -tc;
   2627             coord[2] = -sc;
   2628             break;
   2629          case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
   2630             coord[0] = -1.0f;
   2631             coord[1] = -tc;
   2632             coord[2] = sc;
   2633             break;
   2634          case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
   2635             coord[0] = sc;
   2636             coord[1] = 1.0f;
   2637             coord[2] = tc;
   2638             break;
   2639          case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
   2640             coord[0] = sc;
   2641             coord[1] = -1.0f;
   2642             coord[2] = -tc;
   2643             break;
   2644          case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
   2645             coord[0] = sc;
   2646             coord[1] = -tc;
   2647             coord[2] = 1.0f;
   2648             break;
   2649          case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
   2650             coord[0] = -sc;
   2651             coord[1] = -tc;
   2652             coord[2] = -1.0f;
   2653             break;
   2654          default:
   2655             assert(0);
   2656          }
   2657       }
   2658       break;
   2659    default:
   2660       assert(!"unexpected target in _mesa_meta_setup_texture_coords()");
   2661    }
   2662 }
   2663 
   2664 static struct blit_shader *
   2665 choose_blit_shader(GLenum target, struct blit_shader_table *table)
   2666 {
   2667    switch(target) {
   2668    case GL_TEXTURE_1D:
   2669       table->sampler_1d.type = "sampler1D";
   2670       table->sampler_1d.func = "texture1D";
   2671       table->sampler_1d.texcoords = "texCoords.x";
   2672       return &table->sampler_1d;
   2673    case GL_TEXTURE_2D:
   2674       table->sampler_2d.type = "sampler2D";
   2675       table->sampler_2d.func = "texture2D";
   2676       table->sampler_2d.texcoords = "texCoords.xy";
   2677       return &table->sampler_2d;
   2678    case GL_TEXTURE_RECTANGLE:
   2679       table->sampler_rect.type = "sampler2DRect";
   2680       table->sampler_rect.func = "texture2DRect";
   2681       table->sampler_rect.texcoords = "texCoords.xy";
   2682       return &table->sampler_rect;
   2683    case GL_TEXTURE_3D:
   2684       /* Code for mipmap generation with 3D textures is not used yet.
   2685        * It's a sw fallback.
   2686        */
   2687       table->sampler_3d.type = "sampler3D";
   2688       table->sampler_3d.func = "texture3D";
   2689       table->sampler_3d.texcoords = "texCoords.xyz";
   2690       return &table->sampler_3d;
   2691    case GL_TEXTURE_CUBE_MAP:
   2692       table->sampler_cubemap.type = "samplerCube";
   2693       table->sampler_cubemap.func = "textureCube";
   2694       table->sampler_cubemap.texcoords = "texCoords.xyz";
   2695       return &table->sampler_cubemap;
   2696    case GL_TEXTURE_1D_ARRAY:
   2697       table->sampler_1d_array.type = "sampler1DArray";
   2698       table->sampler_1d_array.func = "texture1DArray";
   2699       table->sampler_1d_array.texcoords = "texCoords.xy";
   2700       return &table->sampler_1d_array;
   2701    case GL_TEXTURE_2D_ARRAY:
   2702       table->sampler_2d_array.type = "sampler2DArray";
   2703       table->sampler_2d_array.func = "texture2DArray";
   2704       table->sampler_2d_array.texcoords = "texCoords.xyz";
   2705       return &table->sampler_2d_array;
   2706    case GL_TEXTURE_CUBE_MAP_ARRAY:
   2707       table->sampler_cubemap_array.type = "samplerCubeArray";
   2708       table->sampler_cubemap_array.func = "textureCubeArray";
   2709       table->sampler_cubemap_array.texcoords = "texCoords.xyzw";
   2710       return &table->sampler_cubemap_array;
   2711    default:
   2712       _mesa_problem(NULL, "Unexpected texture target 0x%x in"
   2713                     " setup_texture_sampler()\n", target);
   2714       return NULL;
   2715    }
   2716 }
   2717 
   2718 void
   2719 _mesa_meta_blit_shader_table_cleanup(struct gl_context *ctx,
   2720                                      struct blit_shader_table *table)
   2721 {
   2722    _mesa_reference_shader_program(ctx, &table->sampler_1d.shader_prog, NULL);
   2723    _mesa_reference_shader_program(ctx, &table->sampler_2d.shader_prog, NULL);
   2724    _mesa_reference_shader_program(ctx, &table->sampler_3d.shader_prog, NULL);
   2725    _mesa_reference_shader_program(ctx, &table->sampler_rect.shader_prog, NULL);
   2726    _mesa_reference_shader_program(ctx, &table->sampler_cubemap.shader_prog, NULL);
   2727    _mesa_reference_shader_program(ctx, &table->sampler_1d_array.shader_prog, NULL);
   2728    _mesa_reference_shader_program(ctx, &table->sampler_2d_array.shader_prog, NULL);
   2729    _mesa_reference_shader_program(ctx, &table->sampler_cubemap_array.shader_prog, NULL);
   2730 }
   2731 
   2732 /**
   2733  * Determine the GL data type to use for the temporary image read with
   2734  * ReadPixels() and passed to Tex[Sub]Image().
   2735  */
   2736 static GLenum
   2737 get_temp_image_type(struct gl_context *ctx, mesa_format format)
   2738 {
   2739    const GLenum baseFormat = _mesa_get_format_base_format(format);
   2740    const GLenum datatype = _mesa_get_format_datatype(format);
   2741    const GLint format_red_bits = _mesa_get_format_bits(format, GL_RED_BITS);
   2742 
   2743    switch (baseFormat) {
   2744    case GL_RGBA:
   2745    case GL_RGB:
   2746    case GL_RG:
   2747    case GL_RED:
   2748    case GL_ALPHA:
   2749    case GL_LUMINANCE:
   2750    case GL_LUMINANCE_ALPHA:
   2751    case GL_INTENSITY:
   2752       if (datatype == GL_INT || datatype == GL_UNSIGNED_INT) {
   2753          return datatype;
   2754       } else if (format_red_bits <= 8) {
   2755          return GL_UNSIGNED_BYTE;
   2756       } else if (format_red_bits <= 16) {
   2757          return GL_UNSIGNED_SHORT;
   2758       }
   2759       return GL_FLOAT;
   2760    case GL_DEPTH_COMPONENT:
   2761       if (datatype == GL_FLOAT)
   2762          return GL_FLOAT;
   2763       else
   2764          return GL_UNSIGNED_INT;
   2765    case GL_DEPTH_STENCIL:
   2766       if (datatype == GL_FLOAT)
   2767          return GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
   2768       else
   2769          return GL_UNSIGNED_INT_24_8;
   2770    default:
   2771       _mesa_problem(ctx, "Unexpected format %d in get_temp_image_type()",
   2772                     baseFormat);
   2773       return 0;
   2774    }
   2775 }
   2776 
   2777 /**
   2778  * Attempts to wrap the destination texture in an FBO and use
   2779  * glBlitFramebuffer() to implement glCopyTexSubImage().
   2780  */
   2781 static bool
   2782 copytexsubimage_using_blit_framebuffer(struct gl_context *ctx, GLuint dims,
   2783                                        struct gl_texture_image *texImage,
   2784                                        GLint xoffset,
   2785                                        GLint yoffset,
   2786                                        GLint zoffset,
   2787                                        struct gl_renderbuffer *rb,
   2788                                        GLint x, GLint y,
   2789                                        GLsizei width, GLsizei height)
   2790 {
   2791    struct gl_framebuffer *drawFb;
   2792    bool success = false;
   2793    GLbitfield mask;
   2794    GLenum status;
   2795 
   2796    if (!ctx->Extensions.ARB_framebuffer_object)
   2797       return false;
   2798 
   2799    drawFb = ctx->Driver.NewFramebuffer(ctx, 0xDEADBEEF);
   2800    if (drawFb == NULL)
   2801       return false;
   2802 
   2803    _mesa_meta_begin(ctx, MESA_META_ALL & ~MESA_META_DRAW_BUFFERS);
   2804    _mesa_bind_framebuffers(ctx, drawFb, ctx->ReadBuffer);
   2805 
   2806    if (rb->_BaseFormat == GL_DEPTH_STENCIL ||
   2807        rb->_BaseFormat == GL_DEPTH_COMPONENT) {
   2808       _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
   2809                                            GL_DEPTH_ATTACHMENT,
   2810                                            texImage, zoffset);
   2811       mask = GL_DEPTH_BUFFER_BIT;
   2812 
   2813       if (rb->_BaseFormat == GL_DEPTH_STENCIL &&
   2814           texImage->_BaseFormat == GL_DEPTH_STENCIL) {
   2815          _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
   2816                                               GL_STENCIL_ATTACHMENT,
   2817                                               texImage, zoffset);
   2818          mask |= GL_STENCIL_BUFFER_BIT;
   2819       }
   2820       _mesa_DrawBuffer(GL_NONE);
   2821    } else {
   2822       _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
   2823                                            GL_COLOR_ATTACHMENT0,
   2824                                            texImage, zoffset);
   2825       mask = GL_COLOR_BUFFER_BIT;
   2826       _mesa_DrawBuffer(GL_COLOR_ATTACHMENT0);
   2827    }
   2828 
   2829    status = _mesa_check_framebuffer_status(ctx, ctx->DrawBuffer);
   2830    if (status != GL_FRAMEBUFFER_COMPLETE)
   2831       goto out;
   2832 
   2833    ctx->Meta->Blit.no_ctsi_fallback = true;
   2834 
   2835    /* Since we've bound a new draw framebuffer, we need to update
   2836     * its derived state -- _Xmin, etc -- for BlitFramebuffer's clipping to
   2837     * be correct.
   2838     */
   2839    _mesa_update_state(ctx);
   2840 
   2841    /* We skip the core BlitFramebuffer checks for format consistency, which
   2842     * are too strict for CopyTexImage.  We know meta will be fine with format
   2843     * changes.
   2844     */
   2845    mask = _mesa_meta_BlitFramebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer,
   2846                                      x, y,
   2847                                      x + width, y + height,
   2848                                      xoffset, yoffset,
   2849                                      xoffset + width, yoffset + height,
   2850                                      mask, GL_NEAREST);
   2851    ctx->Meta->Blit.no_ctsi_fallback = false;
   2852    success = mask == 0x0;
   2853 
   2854  out:
   2855    _mesa_reference_framebuffer(&drawFb, NULL);
   2856    _mesa_meta_end(ctx);
   2857    return success;
   2858 }
   2859 
   2860 /**
   2861  * Helper for _mesa_meta_CopyTexSubImage1/2/3D() functions.
   2862  * Have to be careful with locking and meta state for pixel transfer.
   2863  */
   2864 void
   2865 _mesa_meta_CopyTexSubImage(struct gl_context *ctx, GLuint dims,
   2866                            struct gl_texture_image *texImage,
   2867                            GLint xoffset, GLint yoffset, GLint zoffset,
   2868                            struct gl_renderbuffer *rb,
   2869                            GLint x, GLint y,
   2870                            GLsizei width, GLsizei height)
   2871 {
   2872    GLenum format, type;
   2873    GLint bpp;
   2874    void *buf;
   2875 
   2876    if (copytexsubimage_using_blit_framebuffer(ctx, dims,
   2877                                               texImage,
   2878                                               xoffset, yoffset, zoffset,
   2879                                               rb,
   2880                                               x, y,
   2881                                               width, height)) {
   2882       return;
   2883    }
   2884 
   2885    /* Choose format/type for temporary image buffer */
   2886    format = _mesa_get_format_base_format(texImage->TexFormat);
   2887    if (format == GL_LUMINANCE ||
   2888        format == GL_LUMINANCE_ALPHA ||
   2889        format == GL_INTENSITY) {
   2890       /* We don't want to use GL_LUMINANCE, GL_INTENSITY, etc. for the
   2891        * temp image buffer because glReadPixels will do L=R+G+B which is
   2892        * not what we want (should be L=R).
   2893        */
   2894       format = GL_RGBA;
   2895    }
   2896 
   2897    type = get_temp_image_type(ctx, texImage->TexFormat);
   2898    if (_mesa_is_format_integer_color(texImage->TexFormat)) {
   2899       format = _mesa_base_format_to_integer_format(format);
   2900    }
   2901    bpp = _mesa_bytes_per_pixel(format, type);
   2902    if (bpp <= 0) {
   2903       _mesa_problem(ctx, "Bad bpp in _mesa_meta_CopyTexSubImage()");
   2904       return;
   2905    }
   2906 
   2907    /*
   2908     * Alloc image buffer (XXX could use a PBO)
   2909     */
   2910    buf = malloc(width * height * bpp);
   2911    if (!buf) {
   2912       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexSubImage%uD", dims);
   2913       return;
   2914    }
   2915 
   2916    /*
   2917     * Read image from framebuffer (disable pixel transfer ops)
   2918     */
   2919    _mesa_meta_begin(ctx, MESA_META_PIXEL_STORE | MESA_META_PIXEL_TRANSFER);
   2920    ctx->Driver.ReadPixels(ctx, x, y, width, height,
   2921                           format, type, &ctx->Pack, buf);
   2922    _mesa_meta_end(ctx);
   2923 
   2924    _mesa_update_state(ctx); /* to update pixel transfer state */
   2925 
   2926    /*
   2927     * Store texture data (with pixel transfer ops)
   2928     */
   2929    _mesa_meta_begin(ctx, MESA_META_PIXEL_STORE);
   2930 
   2931    if (texImage->TexObject->Target == GL_TEXTURE_1D_ARRAY) {
   2932       assert(yoffset == 0);
   2933       ctx->Driver.TexSubImage(ctx, dims, texImage,
   2934                               xoffset, zoffset, 0, width, 1, 1,
   2935                               format, type, buf, &ctx->Unpack);
   2936    } else {
   2937       ctx->Driver.TexSubImage(ctx, dims, texImage,
   2938                               xoffset, yoffset, zoffset, width, height, 1,
   2939                               format, type, buf, &ctx->Unpack);
   2940    }
   2941 
   2942    _mesa_meta_end(ctx);
   2943 
   2944    free(buf);
   2945 }
   2946 
   2947 static void
   2948 meta_decompress_fbo_cleanup(struct decompress_fbo_state *decompress_fbo)
   2949 {
   2950    if (decompress_fbo->fb != NULL) {
   2951       _mesa_reference_framebuffer(&decompress_fbo->fb, NULL);
   2952       _mesa_reference_renderbuffer(&decompress_fbo->rb, NULL);
   2953    }
   2954 
   2955    memset(decompress_fbo, 0, sizeof(*decompress_fbo));
   2956 }
   2957 
   2958 static void
   2959 meta_decompress_cleanup(struct gl_context *ctx,
   2960                         struct decompress_state *decompress)
   2961 {
   2962    meta_decompress_fbo_cleanup(&decompress->byteFBO);
   2963    meta_decompress_fbo_cleanup(&decompress->floatFBO);
   2964 
   2965    if (decompress->VAO != 0) {
   2966       _mesa_DeleteVertexArrays(1, &decompress->VAO);
   2967       _mesa_reference_buffer_object(ctx, &decompress->buf_obj, NULL);
   2968    }
   2969 
   2970    _mesa_reference_sampler_object(ctx, &decompress->samp_obj, NULL);
   2971 
   2972    memset(decompress, 0, sizeof(*decompress));
   2973 }
   2974 
   2975 /**
   2976  * Decompress a texture image by drawing a quad with the compressed
   2977  * texture and reading the pixels out of the color buffer.
   2978  * \param slice  which slice of a 3D texture or layer of a 1D/2D texture
   2979  * \param destFormat  format, ala glReadPixels
   2980  * \param destType  type, ala glReadPixels
   2981  * \param dest  destination buffer
   2982  * \param destRowLength  dest image rowLength (ala GL_PACK_ROW_LENGTH)
   2983  */
   2984 static bool
   2985 decompress_texture_image(struct gl_context *ctx,
   2986                          struct gl_texture_image *texImage,
   2987                          GLuint slice,
   2988                          GLint xoffset, GLint yoffset,
   2989                          GLsizei width, GLsizei height,
   2990                          GLenum destFormat, GLenum destType,
   2991                          GLvoid *dest)
   2992 {
   2993    struct decompress_state *decompress = &ctx->Meta->Decompress;
   2994    struct decompress_fbo_state *decompress_fbo;
   2995    struct gl_texture_object *texObj = texImage->TexObject;
   2996    const GLenum target = texObj->Target;
   2997    GLenum rbFormat;
   2998    GLenum faceTarget;
   2999    struct vertex verts[4];
   3000    struct gl_sampler_object *samp_obj_save = NULL;
   3001    GLenum status;
   3002    const bool use_glsl_version = ctx->Extensions.ARB_vertex_shader &&
   3003                                       ctx->Extensions.ARB_fragment_shader;
   3004 
   3005    switch (_mesa_get_format_datatype(texImage->TexFormat)) {
   3006    case GL_FLOAT:
   3007       decompress_fbo = &decompress->floatFBO;
   3008       rbFormat = GL_RGBA32F;
   3009       break;
   3010    case GL_UNSIGNED_NORMALIZED:
   3011       decompress_fbo = &decompress->byteFBO;
   3012       rbFormat = GL_RGBA;
   3013       break;
   3014    default:
   3015       return false;
   3016    }
   3017 
   3018    if (slice > 0) {
   3019       assert(target == GL_TEXTURE_3D ||
   3020              target == GL_TEXTURE_2D_ARRAY ||
   3021              target == GL_TEXTURE_CUBE_MAP_ARRAY);
   3022    }
   3023 
   3024    switch (target) {
   3025    case GL_TEXTURE_1D:
   3026    case GL_TEXTURE_1D_ARRAY:
   3027       assert(!"No compressed 1D textures.");
   3028       return false;
   3029 
   3030    case GL_TEXTURE_CUBE_MAP_ARRAY:
   3031       faceTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + (slice % 6);
   3032       break;
   3033 
   3034    case GL_TEXTURE_CUBE_MAP:
   3035       faceTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X + texImage->Face;
   3036       break;
   3037 
   3038    default:
   3039       faceTarget = target;
   3040       break;
   3041    }
   3042 
   3043    _mesa_meta_begin(ctx, MESA_META_ALL & ~(MESA_META_PIXEL_STORE |
   3044                                            MESA_META_DRAW_BUFFERS));
   3045    _mesa_ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
   3046 
   3047    _mesa_reference_sampler_object(ctx, &samp_obj_save,
   3048                                   ctx->Texture.Unit[ctx->Texture.CurrentUnit].Sampler);
   3049 
   3050    /* Create/bind FBO/renderbuffer */
   3051    if (decompress_fbo->fb == NULL) {
   3052       decompress_fbo->rb = ctx->Driver.NewRenderbuffer(ctx, 0xDEADBEEF);
   3053       if (decompress_fbo->rb == NULL) {
   3054          _mesa_meta_end(ctx);
   3055          return false;
   3056       }
   3057 
   3058       decompress_fbo->rb->RefCount = 1;
   3059 
   3060       decompress_fbo->fb = ctx->Driver.NewFramebuffer(ctx, 0xDEADBEEF);
   3061       if (decompress_fbo->fb == NULL) {
   3062          _mesa_meta_end(ctx);
   3063          return false;
   3064       }
   3065 
   3066       _mesa_bind_framebuffers(ctx, decompress_fbo->fb, decompress_fbo->fb);
   3067       _mesa_framebuffer_renderbuffer(ctx, ctx->DrawBuffer, GL_COLOR_ATTACHMENT0,
   3068                                      decompress_fbo->rb);
   3069    }
   3070    else {
   3071       _mesa_bind_framebuffers(ctx, decompress_fbo->fb, decompress_fbo->fb);
   3072    }
   3073 
   3074    /* alloc dest surface */
   3075    if (width > decompress_fbo->Width || height > decompress_fbo->Height) {
   3076       _mesa_renderbuffer_storage(ctx, decompress_fbo->rb, rbFormat,
   3077                                  width, height, 0);
   3078       status = _mesa_check_framebuffer_status(ctx, ctx->DrawBuffer);
   3079       if (status != GL_FRAMEBUFFER_COMPLETE) {
   3080          /* If the framebuffer isn't complete then we'll leave
   3081           * decompress_fbo->Width as zero so that it will fail again next time
   3082           * too */
   3083          _mesa_meta_end(ctx);
   3084          return false;
   3085       }
   3086       decompress_fbo->Width = width;
   3087       decompress_fbo->Height = height;
   3088    }
   3089 
   3090    if (use_glsl_version) {
   3091       _mesa_meta_setup_vertex_objects(ctx, &decompress->VAO,
   3092                                       &decompress->buf_obj, true,
   3093                                       2, 4, 0);
   3094 
   3095       _mesa_meta_setup_blit_shader(ctx, target, false, &decompress->shaders);
   3096    } else {
   3097       _mesa_meta_setup_ff_tnl_for_blit(ctx, &decompress->VAO,
   3098                                        &decompress->buf_obj, 3);
   3099    }
   3100 
   3101    if (decompress->samp_obj == NULL) {
   3102       decompress->samp_obj =  ctx->Driver.NewSamplerObject(ctx, 0xDEADBEEF);
   3103       if (decompress->samp_obj == NULL) {
   3104          _mesa_meta_end(ctx);
   3105 
   3106          /* This is a bit lazy.  Flag out of memory, and then don't bother to
   3107           * clean up.  Once out of memory is flagged, the only realistic next
   3108           * move is to destroy the context.  That will trigger all the right
   3109           * clean up.
   3110           *
   3111           * Returning true prevents other GetTexImage methods from attempting
   3112           * anything since they will likely fail too.
   3113           */
   3114          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage");
   3115          return true;
   3116       }
   3117 
   3118       /* nearest filtering */
   3119       _mesa_set_sampler_filters(ctx, decompress->samp_obj, GL_NEAREST, GL_NEAREST);
   3120 
   3121       /* We don't want to encode or decode sRGB values; treat them as linear. */
   3122       _mesa_set_sampler_srgb_decode(ctx, decompress->samp_obj, GL_SKIP_DECODE_EXT);
   3123    }
   3124 
   3125    _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit, decompress->samp_obj);
   3126 
   3127    /* Silence valgrind warnings about reading uninitialized stack. */
   3128    memset(verts, 0, sizeof(verts));
   3129 
   3130    _mesa_meta_setup_texture_coords(faceTarget, slice,
   3131                                    xoffset, yoffset, width, height,
   3132                                    texImage->Width, texImage->Height,
   3133                                    texImage->Depth,
   3134                                    verts[0].tex,
   3135                                    verts[1].tex,
   3136                                    verts[2].tex,
   3137                                    verts[3].tex);
   3138 
   3139    /* setup vertex positions */
   3140    verts[0].x = -1.0F;
   3141    verts[0].y = -1.0F;
   3142    verts[1].x =  1.0F;
   3143    verts[1].y = -1.0F;
   3144    verts[2].x =  1.0F;
   3145    verts[2].y =  1.0F;
   3146    verts[3].x = -1.0F;
   3147    verts[3].y =  1.0F;
   3148 
   3149    _mesa_set_viewport(ctx, 0, 0, 0, width, height);
   3150 
   3151    /* upload new vertex data */
   3152    _mesa_buffer_sub_data(ctx, decompress->buf_obj, 0, sizeof(verts), verts,
   3153                          __func__);
   3154 
   3155    /* setup texture state */
   3156    _mesa_BindTexture(target, texObj->Name);
   3157 
   3158    if (!use_glsl_version)
   3159       _mesa_set_enable(ctx, target, GL_TRUE);
   3160 
   3161    {
   3162       /* save texture object state */
   3163       const GLint baseLevelSave = texObj->BaseLevel;
   3164       const GLint maxLevelSave = texObj->MaxLevel;
   3165 
   3166       /* restrict sampling to the texture level of interest */
   3167       if (target != GL_TEXTURE_RECTANGLE_ARB) {
   3168          _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_BASE_LEVEL,
   3169                                    (GLint *) &texImage->Level, false);
   3170          _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
   3171                                    (GLint *) &texImage->Level, false);
   3172       }
   3173 
   3174       /* render quad w/ texture into renderbuffer */
   3175       _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   3176 
   3177       /* Restore texture object state, the texture binding will
   3178        * be restored by _mesa_meta_end().
   3179        */
   3180       if (target != GL_TEXTURE_RECTANGLE_ARB) {
   3181          _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_BASE_LEVEL,
   3182                                    &baseLevelSave, false);
   3183          _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
   3184                                    &maxLevelSave, false);
   3185       }
   3186 
   3187    }
   3188 
   3189    /* read pixels from renderbuffer */
   3190    {
   3191       GLenum baseTexFormat = texImage->_BaseFormat;
   3192       GLenum destBaseFormat = _mesa_unpack_format_to_base_format(destFormat);
   3193 
   3194       /* The pixel transfer state will be set to default values at this point
   3195        * (see MESA_META_PIXEL_TRANSFER) so pixel transfer ops are effectively
   3196        * turned off (as required by glGetTexImage) but we need to handle some
   3197        * special cases.  In particular, single-channel texture values are
   3198        * returned as red and two-channel texture values are returned as
   3199        * red/alpha.
   3200        */
   3201       if (_mesa_need_luminance_to_rgb_conversion(baseTexFormat,
   3202                                                  destBaseFormat) ||
   3203           /* If we're reading back an RGB(A) texture (using glGetTexImage) as
   3204            * luminance then we need to return L=tex(R).
   3205            */
   3206           _mesa_need_rgb_to_luminance_conversion(baseTexFormat,
   3207                                                  destBaseFormat)) {
   3208          /* Green and blue must be zero */
   3209          _mesa_PixelTransferf(GL_GREEN_SCALE, 0.0f);
   3210          _mesa_PixelTransferf(GL_BLUE_SCALE, 0.0f);
   3211       }
   3212 
   3213       _mesa_ReadPixels(0, 0, width, height, destFormat, destType, dest);
   3214    }
   3215 
   3216    /* disable texture unit */
   3217    if (!use_glsl_version)
   3218       _mesa_set_enable(ctx, target, GL_FALSE);
   3219 
   3220    _mesa_bind_sampler(ctx, ctx->Texture.CurrentUnit, samp_obj_save);
   3221    _mesa_reference_sampler_object(ctx, &samp_obj_save, NULL);
   3222 
   3223    _mesa_meta_end(ctx);
   3224 
   3225    return true;
   3226 }
   3227 
   3228 
   3229 /**
   3230  * This is just a wrapper around _mesa_get_tex_image() and
   3231  * decompress_texture_image().  Meta functions should not be directly called
   3232  * from core Mesa.
   3233  */
   3234 void
   3235 _mesa_meta_GetTexSubImage(struct gl_context *ctx,
   3236                           GLint xoffset, GLint yoffset, GLint zoffset,
   3237                           GLsizei width, GLsizei height, GLsizei depth,
   3238                           GLenum format, GLenum type, GLvoid *pixels,
   3239                           struct gl_texture_image *texImage)
   3240 {
   3241    if (_mesa_is_format_compressed(texImage->TexFormat)) {
   3242       GLuint slice;
   3243       bool result = true;
   3244 
   3245       for (slice = 0; slice < depth; slice++) {
   3246          void *dst;
   3247          /* Section 8.11.4 (Texture Image Queries) of the GL 4.5 spec says:
   3248           *
   3249           *    "For three-dimensional, two-dimensional array, cube map array,
   3250           *     and cube map textures pixel storage operations are applied as
   3251           *     if the image were two-dimensional, except that the additional
   3252           *     pixel storage state values PACK_IMAGE_HEIGHT and
   3253           *     PACK_SKIP_IMAGES are applied. The correspondence of texels to
   3254           *     memory locations is as defined for TexImage3D in section 8.5."
   3255           */
   3256          switch (texImage->TexObject->Target) {
   3257          case GL_TEXTURE_3D:
   3258          case GL_TEXTURE_2D_ARRAY:
   3259          case GL_TEXTURE_CUBE_MAP:
   3260          case GL_TEXTURE_CUBE_MAP_ARRAY: {
   3261             /* Setup pixel packing.  SkipPixels and SkipRows will be applied
   3262              * in the decompress_texture_image() function's call to
   3263              * glReadPixels but we need to compute the dest slice's address
   3264              * here (according to SkipImages and ImageHeight).
   3265              */
   3266             struct gl_pixelstore_attrib packing = ctx->Pack;
   3267             packing.SkipPixels = 0;
   3268             packing.SkipRows = 0;
   3269             dst = _mesa_image_address3d(&packing, pixels, width, height,
   3270                                         format, type, slice, 0, 0);
   3271             break;
   3272          }
   3273          default:
   3274             dst = pixels;
   3275             break;
   3276          }
   3277          result = decompress_texture_image(ctx, texImage, slice,
   3278                                            xoffset, yoffset, width, height,
   3279                                            format, type, dst);
   3280          if (!result)
   3281             break;
   3282       }
   3283 
   3284       if (result)
   3285          return;
   3286    }
   3287 
   3288    _mesa_GetTexSubImage_sw(ctx, xoffset, yoffset, zoffset,
   3289                            width, height, depth, format, type, pixels, texImage);
   3290 }
   3291 
   3292 
   3293 /**
   3294  * Meta implementation of ctx->Driver.DrawTex() in terms
   3295  * of polygon rendering.
   3296  */
   3297 void
   3298 _mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
   3299                    GLfloat width, GLfloat height)
   3300 {
   3301    struct drawtex_state *drawtex = &ctx->Meta->DrawTex;
   3302    struct vertex {
   3303       GLfloat x, y, z, st[MAX_TEXTURE_UNITS][2];
   3304    };
   3305    struct vertex verts[4];
   3306    GLuint i;
   3307 
   3308    _mesa_meta_begin(ctx, (MESA_META_RASTERIZATION |
   3309                           MESA_META_SHADER |
   3310                           MESA_META_TRANSFORM |
   3311                           MESA_META_VERTEX |
   3312                           MESA_META_VIEWPORT));
   3313 
   3314    if (drawtex->VAO == 0) {
   3315       /* one-time setup */
   3316       struct gl_vertex_array_object *array_obj;
   3317 
   3318       /* create vertex array object */
   3319       _mesa_GenVertexArrays(1, &drawtex->VAO);
   3320       _mesa_BindVertexArray(drawtex->VAO);
   3321 
   3322       array_obj = _mesa_lookup_vao(ctx, drawtex->VAO);
   3323       assert(array_obj != NULL);
   3324 
   3325       /* create vertex array buffer */
   3326       drawtex->buf_obj = ctx->Driver.NewBufferObject(ctx, 0xDEADBEEF);
   3327       if (drawtex->buf_obj == NULL)
   3328          return;
   3329 
   3330       _mesa_buffer_data(ctx, drawtex->buf_obj, GL_NONE, sizeof(verts), verts,
   3331                         GL_DYNAMIC_DRAW, __func__);
   3332 
   3333       /* setup vertex arrays */
   3334       _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_POS,
   3335                                 3, GL_FLOAT, GL_RGBA, GL_FALSE,
   3336                                 GL_FALSE, GL_FALSE,
   3337                                 offsetof(struct vertex, x), true);
   3338       _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_POS,
   3339                                drawtex->buf_obj, 0, sizeof(struct vertex));
   3340       _mesa_enable_vertex_array_attrib(ctx, array_obj, VERT_ATTRIB_POS);
   3341 
   3342 
   3343       for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
   3344          _mesa_update_array_format(ctx, array_obj, VERT_ATTRIB_TEX(i),
   3345                                    2, GL_FLOAT, GL_RGBA, GL_FALSE,
   3346                                    GL_FALSE, GL_FALSE,
   3347                                    offsetof(struct vertex, st[i]), true);
   3348          _mesa_bind_vertex_buffer(ctx, array_obj, VERT_ATTRIB_TEX(i),
   3349                                   drawtex->buf_obj, 0, sizeof(struct vertex));
   3350          _mesa_enable_vertex_array_attrib(ctx, array_obj, VERT_ATTRIB_TEX(i));
   3351       }
   3352    }
   3353    else {
   3354       _mesa_BindVertexArray(drawtex->VAO);
   3355    }
   3356 
   3357    /* vertex positions, texcoords */
   3358    {
   3359       const GLfloat x1 = x + width;
   3360       const GLfloat y1 = y + height;
   3361 
   3362       z = CLAMP(z, 0.0f, 1.0f);
   3363       z = invert_z(z);
   3364 
   3365       verts[0].x = x;
   3366       verts[0].y = y;
   3367       verts[0].z = z;
   3368 
   3369       verts[1].x = x1;
   3370       verts[1].y = y;
   3371       verts[1].z = z;
   3372 
   3373       verts[2].x = x1;
   3374       verts[2].y = y1;
   3375       verts[2].z = z;
   3376 
   3377       verts[3].x = x;
   3378       verts[3].y = y1;
   3379       verts[3].z = z;
   3380 
   3381       for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
   3382          const struct gl_texture_object *texObj;
   3383          const struct gl_texture_image *texImage;
   3384          GLfloat s, t, s1, t1;
   3385          GLuint tw, th;
   3386 
   3387          if (!ctx->Texture.Unit[i]._Current) {
   3388             GLuint j;
   3389             for (j = 0; j < 4; j++) {
   3390                verts[j].st[i][0] = 0.0f;
   3391                verts[j].st[i][1] = 0.0f;
   3392             }
   3393             continue;
   3394          }
   3395 
   3396          texObj = ctx->Texture.Unit[i]._Current;
   3397          texImage = texObj->Image[0][texObj->BaseLevel];
   3398          tw = texImage->Width2;
   3399          th = texImage->Height2;
   3400 
   3401          s = (GLfloat) texObj->CropRect[0] / tw;
   3402          t = (GLfloat) texObj->CropRect[1] / th;
   3403          s1 = (GLfloat) (texObj->CropRect[0] + texObj->CropRect[2]) / tw;
   3404          t1 = (GLfloat) (texObj->CropRect[1] + texObj->CropRect[3]) / th;
   3405 
   3406          verts[0].st[i][0] = s;
   3407          verts[0].st[i][1] = t;
   3408 
   3409          verts[1].st[i][0] = s1;
   3410          verts[1].st[i][1] = t;
   3411 
   3412          verts[2].st[i][0] = s1;
   3413          verts[2].st[i][1] = t1;
   3414 
   3415          verts[3].st[i][0] = s;
   3416          verts[3].st[i][1] = t1;
   3417       }
   3418 
   3419       _mesa_buffer_sub_data(ctx, drawtex->buf_obj, 0, sizeof(verts), verts,
   3420                             __func__);
   3421    }
   3422 
   3423    _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
   3424 
   3425    _mesa_meta_end(ctx);
   3426 }
   3427 
   3428 static bool
   3429 cleartexsubimage_color(struct gl_context *ctx,
   3430                        struct gl_texture_image *texImage,
   3431                        const GLvoid *clearValue,
   3432                        GLint zoffset)
   3433 {
   3434    mesa_format format;
   3435    union gl_color_union colorValue;
   3436    GLenum datatype;
   3437    GLenum status;
   3438 
   3439    _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
   3440                                         GL_COLOR_ATTACHMENT0,
   3441                                         texImage, zoffset);
   3442 
   3443    status = _mesa_check_framebuffer_status(ctx, ctx->DrawBuffer);
   3444    if (status != GL_FRAMEBUFFER_COMPLETE)
   3445       return false;
   3446 
   3447    /* We don't want to apply an sRGB conversion so override the format */
   3448    format = _mesa_get_srgb_format_linear(texImage->TexFormat);
   3449    datatype = _mesa_get_format_datatype(format);
   3450 
   3451    switch (datatype) {
   3452    case GL_UNSIGNED_INT:
   3453    case GL_INT:
   3454       if (clearValue)
   3455          _mesa_unpack_uint_rgba_row(format, 1, clearValue,
   3456                                     (GLuint (*)[4]) colorValue.ui);
   3457       else
   3458          memset(&colorValue, 0, sizeof colorValue);
   3459       if (datatype == GL_INT)
   3460          _mesa_ClearBufferiv(GL_COLOR, 0, colorValue.i);
   3461       else
   3462          _mesa_ClearBufferuiv(GL_COLOR, 0, colorValue.ui);
   3463       break;
   3464    default:
   3465       if (clearValue)
   3466          _mesa_unpack_rgba_row(format, 1, clearValue,
   3467                                (GLfloat (*)[4]) colorValue.f);
   3468       else
   3469          memset(&colorValue, 0, sizeof colorValue);
   3470       _mesa_ClearBufferfv(GL_COLOR, 0, colorValue.f);
   3471       break;
   3472    }
   3473 
   3474    return true;
   3475 }
   3476 
   3477 static bool
   3478 cleartexsubimage_depth_stencil(struct gl_context *ctx,
   3479                                struct gl_texture_image *texImage,
   3480                                const GLvoid *clearValue,
   3481                                GLint zoffset)
   3482 {
   3483    GLint stencilValue;
   3484    GLfloat depthValue;
   3485    GLenum status;
   3486 
   3487    _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
   3488                                         GL_DEPTH_ATTACHMENT,
   3489                                         texImage, zoffset);
   3490 
   3491    if (texImage->_BaseFormat == GL_DEPTH_STENCIL)
   3492       _mesa_meta_framebuffer_texture_image(ctx, ctx->DrawBuffer,
   3493                                            GL_STENCIL_ATTACHMENT,
   3494                                            texImage, zoffset);
   3495 
   3496    status = _mesa_check_framebuffer_status(ctx, ctx->DrawBuffer);
   3497    if (status != GL_FRAMEBUFFER_COMPLETE)
   3498       return false;
   3499 
   3500    if (clearValue) {
   3501       GLuint depthStencilValue[2];
   3502 
   3503       /* Convert the clearValue from whatever format it's in to a floating
   3504        * point value for the depth and an integer value for the stencil index
   3505        */
   3506       _mesa_unpack_float_32_uint_24_8_depth_stencil_row(texImage->TexFormat,
   3507                                                         1, /* n */
   3508                                                         clearValue,
   3509                                                         depthStencilValue);
   3510       /* We need a memcpy here instead of a cast because we need to
   3511        * reinterpret the bytes as a float rather than converting it
   3512        */
   3513       memcpy(&depthValue, depthStencilValue, sizeof depthValue);
   3514       stencilValue = depthStencilValue[1] & 0xff;
   3515    } else {
   3516       depthValue = 0.0f;
   3517       stencilValue = 0;
   3518    }
   3519 
   3520    if (texImage->_BaseFormat == GL_DEPTH_STENCIL)
   3521       _mesa_ClearBufferfi(GL_DEPTH_STENCIL, 0, depthValue, stencilValue);
   3522    else
   3523       _mesa_ClearBufferfv(GL_DEPTH, 0, &depthValue);
   3524 
   3525    return true;
   3526 }
   3527 
   3528 static bool
   3529 cleartexsubimage_for_zoffset(struct gl_context *ctx,
   3530                              struct gl_texture_image *texImage,
   3531                              GLint zoffset,
   3532                              const GLvoid *clearValue)
   3533 {
   3534    struct gl_framebuffer *drawFb;
   3535    bool success;
   3536 
   3537    drawFb = ctx->Driver.NewFramebuffer(ctx, 0xDEADBEEF);
   3538    if (drawFb == NULL)
   3539       return false;
   3540 
   3541    _mesa_bind_framebuffers(ctx, drawFb, ctx->ReadBuffer);
   3542 
   3543    switch(texImage->_BaseFormat) {
   3544    case GL_DEPTH_STENCIL:
   3545    case GL_DEPTH_COMPONENT:
   3546       success = cleartexsubimage_depth_stencil(ctx, texImage,
   3547                                                clearValue, zoffset);
   3548       break;
   3549    default:
   3550       success = cleartexsubimage_color(ctx, texImage, clearValue, zoffset);
   3551       break;
   3552    }
   3553 
   3554    _mesa_reference_framebuffer(&drawFb, NULL);
   3555 
   3556    return success;
   3557 }
   3558 
   3559 static bool
   3560 cleartexsubimage_using_fbo(struct gl_context *ctx,
   3561                            struct gl_texture_image *texImage,
   3562                            GLint xoffset, GLint yoffset, GLint zoffset,
   3563                            GLsizei width, GLsizei height, GLsizei depth,
   3564                            const GLvoid *clearValue)
   3565 {
   3566    bool success = true;
   3567    GLint z;
   3568 
   3569    _mesa_meta_begin(ctx,
   3570                     MESA_META_SCISSOR |
   3571                     MESA_META_COLOR_MASK |
   3572                     MESA_META_DITHER |
   3573                     MESA_META_FRAMEBUFFER_SRGB);
   3574 
   3575    _mesa_ColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
   3576    _mesa_set_enable(ctx, GL_DITHER, GL_FALSE);
   3577 
   3578    _mesa_set_enable(ctx, GL_SCISSOR_TEST, GL_TRUE);
   3579    _mesa_Scissor(xoffset, yoffset, width, height);
   3580 
   3581    for (z = zoffset; z < zoffset + depth; z++) {
   3582       if (!cleartexsubimage_for_zoffset(ctx, texImage, z, clearValue)) {
   3583          success = false;
   3584          break;
   3585       }
   3586    }
   3587 
   3588    _mesa_meta_end(ctx);
   3589 
   3590    return success;
   3591 }
   3592 
   3593 extern void
   3594 _mesa_meta_ClearTexSubImage(struct gl_context *ctx,
   3595                             struct gl_texture_image *texImage,
   3596                             GLint xoffset, GLint yoffset, GLint zoffset,
   3597                             GLsizei width, GLsizei height, GLsizei depth,
   3598                             const GLvoid *clearValue)
   3599 {
   3600    bool res;
   3601 
   3602    res = cleartexsubimage_using_fbo(ctx, texImage,
   3603                                     xoffset, yoffset, zoffset,
   3604                                     width, height, depth,
   3605                                     clearValue);
   3606 
   3607    if (res)
   3608       return;
   3609 
   3610    _mesa_warning(ctx,
   3611                  "Falling back to mapping the texture in "
   3612                  "glClearTexSubImage\n");
   3613 
   3614    _mesa_store_cleartexsubimage(ctx, texImage,
   3615                                 xoffset, yoffset, zoffset,
   3616                                 width, height, depth,
   3617                                 clearValue);
   3618 }
   3619