Home | History | Annotate | Download | only in state_tracker
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 VMware, Inc.
      4  * All Rights Reserved.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the
      8  * "Software"), to deal in the Software without restriction, including
      9  * without limitation the rights to use, copy, modify, merge, publish,
     10  * distribute, sub license, and/or sell copies of the Software, and to
     11  * permit persons to whom the Software is furnished to do so, subject to
     12  * the following conditions:
     13  *
     14  * The above copyright notice and this permission notice (including the
     15  * next paragraph) shall be included in all copies or substantial portions
     16  * of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     25  *
     26  **************************************************************************/
     27 
     28 #include "main/imports.h"
     29 #include "main/accum.h"
     30 #include "main/api_exec.h"
     31 #include "main/context.h"
     32 #include "main/samplerobj.h"
     33 #include "main/shaderobj.h"
     34 #include "main/version.h"
     35 #include "main/vtxfmt.h"
     36 #include "main/hash.h"
     37 #include "program/prog_cache.h"
     38 #include "vbo/vbo.h"
     39 #include "glapi/glapi.h"
     40 #include "st_context.h"
     41 #include "st_debug.h"
     42 #include "st_cb_bitmap.h"
     43 #include "st_cb_blit.h"
     44 #include "st_cb_bufferobjects.h"
     45 #include "st_cb_clear.h"
     46 #include "st_cb_compute.h"
     47 #include "st_cb_condrender.h"
     48 #include "st_cb_copyimage.h"
     49 #include "st_cb_drawpixels.h"
     50 #include "st_cb_rasterpos.h"
     51 #include "st_cb_drawtex.h"
     52 #include "st_cb_eglimage.h"
     53 #include "st_cb_fbo.h"
     54 #include "st_cb_feedback.h"
     55 #include "st_cb_msaa.h"
     56 #include "st_cb_perfmon.h"
     57 #include "st_cb_program.h"
     58 #include "st_cb_queryobj.h"
     59 #include "st_cb_readpixels.h"
     60 #include "st_cb_texture.h"
     61 #include "st_cb_xformfb.h"
     62 #include "st_cb_flush.h"
     63 #include "st_cb_syncobj.h"
     64 #include "st_cb_strings.h"
     65 #include "st_cb_texturebarrier.h"
     66 #include "st_cb_viewport.h"
     67 #include "st_atom.h"
     68 #include "st_draw.h"
     69 #include "st_extensions.h"
     70 #include "st_gen_mipmap.h"
     71 #include "st_pbo.h"
     72 #include "st_program.h"
     73 #include "st_sampler_view.h"
     74 #include "st_vdpau.h"
     75 #include "st_texture.h"
     76 #include "pipe/p_context.h"
     77 #include "util/u_inlines.h"
     78 #include "util/u_upload_mgr.h"
     79 #include "cso_cache/cso_context.h"
     80 
     81 
     82 DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE)
     83 
     84 
     85 /**
     86  * Called via ctx->Driver.Enable()
     87  */
     88 static void st_Enable(struct gl_context * ctx, GLenum cap, GLboolean state)
     89 {
     90    struct st_context *st = st_context(ctx);
     91 
     92    switch (cap) {
     93    case GL_DEBUG_OUTPUT:
     94    case GL_DEBUG_OUTPUT_SYNCHRONOUS:
     95       st_update_debug_callback(st);
     96       break;
     97    default:
     98       break;
     99    }
    100 }
    101 
    102 
    103 /**
    104  * Called via ctx->Driver.QueryMemoryInfo()
    105  */
    106 static void
    107 st_query_memory_info(struct gl_context *ctx, struct gl_memory_info *out)
    108 {
    109    struct pipe_screen *screen = st_context(ctx)->pipe->screen;
    110    struct pipe_memory_info info;
    111 
    112    assert(screen->query_memory_info);
    113    if (!screen->query_memory_info)
    114       return;
    115 
    116    screen->query_memory_info(screen, &info);
    117 
    118    out->total_device_memory = info.total_device_memory;
    119    out->avail_device_memory = info.avail_device_memory;
    120    out->total_staging_memory = info.total_staging_memory;
    121    out->avail_staging_memory = info.avail_staging_memory;
    122    out->device_memory_evicted = info.device_memory_evicted;
    123    out->nr_device_memory_evictions = info.nr_device_memory_evictions;
    124 }
    125 
    126 
    127 uint64_t
    128 st_get_active_states(struct gl_context *ctx)
    129 {
    130    struct st_vertex_program *vp =
    131       st_vertex_program(ctx->VertexProgram._Current);
    132    struct st_tessctrl_program *tcp =
    133       st_tessctrl_program(ctx->TessCtrlProgram._Current);
    134    struct st_tesseval_program *tep =
    135       st_tesseval_program(ctx->TessEvalProgram._Current);
    136    struct st_geometry_program *gp =
    137       st_geometry_program(ctx->GeometryProgram._Current);
    138    struct st_fragment_program *fp =
    139       st_fragment_program(ctx->FragmentProgram._Current);
    140    struct st_compute_program *cp =
    141       st_compute_program(ctx->ComputeProgram._Current);
    142    uint64_t active_shader_states = 0;
    143 
    144    if (vp)
    145       active_shader_states |= vp->affected_states;
    146    if (tcp)
    147       active_shader_states |= tcp->affected_states;
    148    if (tep)
    149       active_shader_states |= tep->affected_states;
    150    if (gp)
    151       active_shader_states |= gp->affected_states;
    152    if (fp)
    153       active_shader_states |= fp->affected_states;
    154    if (cp)
    155       active_shader_states |= cp->affected_states;
    156 
    157    /* Mark non-shader-resource shader states as "always active". */
    158    return active_shader_states | ~ST_ALL_SHADER_RESOURCES;
    159 }
    160 
    161 
    162 /**
    163  * Called via ctx->Driver.UpdateState()
    164  */
    165 void st_invalidate_state(struct gl_context * ctx, GLbitfield new_state)
    166 {
    167    struct st_context *st = st_context(ctx);
    168 
    169    if (new_state & _NEW_BUFFERS) {
    170       st->dirty |= ST_NEW_BLEND |
    171                    ST_NEW_DSA |
    172                    ST_NEW_FB_STATE |
    173                    ST_NEW_SAMPLE_MASK |
    174                    ST_NEW_SAMPLE_SHADING |
    175                    ST_NEW_FS_STATE |
    176                    ST_NEW_POLY_STIPPLE |
    177                    ST_NEW_VIEWPORT |
    178                    ST_NEW_RASTERIZER |
    179                    ST_NEW_SCISSOR |
    180                    ST_NEW_WINDOW_RECTANGLES;
    181    } else {
    182       /* These set a subset of flags set by _NEW_BUFFERS, so we only have to
    183        * check them when _NEW_BUFFERS isn't set.
    184        */
    185       if (new_state & (_NEW_DEPTH |
    186                        _NEW_STENCIL))
    187          st->dirty |= ST_NEW_DSA;
    188 
    189       if (new_state & _NEW_PROGRAM)
    190          st->dirty |= ST_NEW_RASTERIZER;
    191 
    192       if (new_state & _NEW_SCISSOR)
    193          st->dirty |= ST_NEW_RASTERIZER |
    194                       ST_NEW_SCISSOR |
    195                       ST_NEW_WINDOW_RECTANGLES;
    196 
    197       if (new_state & _NEW_FOG)
    198          st->dirty |= ST_NEW_FS_STATE;
    199 
    200       if (new_state & _NEW_POLYGONSTIPPLE)
    201          st->dirty |= ST_NEW_POLY_STIPPLE;
    202 
    203       if (new_state & _NEW_VIEWPORT)
    204          st->dirty |= ST_NEW_VIEWPORT;
    205 
    206       if (new_state & _NEW_FRAG_CLAMP) {
    207          if (st->clamp_frag_color_in_shader)
    208             st->dirty |= ST_NEW_FS_STATE;
    209          else
    210             st->dirty |= ST_NEW_RASTERIZER;
    211       }
    212    }
    213 
    214    if (new_state & _NEW_MULTISAMPLE) {
    215       st->dirty |= ST_NEW_BLEND |
    216                    ST_NEW_SAMPLE_MASK |
    217                    ST_NEW_SAMPLE_SHADING |
    218                    ST_NEW_RASTERIZER |
    219                    ST_NEW_FS_STATE;
    220    } else {
    221       /* These set a subset of flags set by _NEW_MULTISAMPLE, so we only
    222        * have to check them when _NEW_MULTISAMPLE isn't set.
    223        */
    224       if (new_state & (_NEW_LIGHT |
    225                        _NEW_LINE |
    226                        _NEW_POINT |
    227                        _NEW_POLYGON |
    228                        _NEW_TRANSFORM))
    229          st->dirty |= ST_NEW_RASTERIZER;
    230    }
    231 
    232    if (new_state & (_NEW_PROJECTION |
    233                     _NEW_TRANSFORM) &&
    234        st_user_clip_planes_enabled(ctx))
    235       st->dirty |= ST_NEW_CLIP_STATE;
    236 
    237    if (new_state & _NEW_COLOR)
    238       st->dirty |= ST_NEW_BLEND |
    239                    ST_NEW_DSA;
    240 
    241    if (new_state & _NEW_PIXEL)
    242       st->dirty |= ST_NEW_PIXEL_TRANSFER;
    243 
    244    if (new_state & _NEW_CURRENT_ATTRIB)
    245       st->dirty |= ST_NEW_VERTEX_ARRAYS;
    246 
    247    /* Update the vertex shader if ctx->Light._ClampVertexColor was changed. */
    248    if (st->clamp_vert_color_in_shader && (new_state & _NEW_LIGHT))
    249       st->dirty |= ST_NEW_VS_STATE;
    250 
    251    /* Which shaders are dirty will be determined manually. */
    252    if (new_state & _NEW_PROGRAM) {
    253       st->gfx_shaders_may_be_dirty = true;
    254       st->compute_shader_may_be_dirty = true;
    255       /* This will mask out unused shader resources. */
    256       st->active_states = st_get_active_states(ctx);
    257    }
    258 
    259    if (new_state & _NEW_TEXTURE) {
    260       st->dirty |= st->active_states &
    261                    (ST_NEW_SAMPLER_VIEWS |
    262                     ST_NEW_SAMPLERS |
    263                     ST_NEW_IMAGE_UNITS);
    264       if (ctx->FragmentProgram._Current &&
    265           ctx->FragmentProgram._Current->ExternalSamplersUsed) {
    266          st->dirty |= ST_NEW_FS_STATE;
    267       }
    268    }
    269 
    270    if (new_state & _NEW_PROGRAM_CONSTANTS)
    271       st->dirty |= st->active_states & ST_NEW_CONSTANTS;
    272 
    273    /* This is the only core Mesa module we depend upon.
    274     * No longer use swrast, swsetup, tnl.
    275     */
    276    _vbo_InvalidateState(ctx, new_state);
    277 }
    278 
    279 
    280 static void
    281 st_destroy_context_priv(struct st_context *st, bool destroy_pipe)
    282 {
    283    uint shader, i;
    284 
    285    st_destroy_atoms( st );
    286    st_destroy_draw( st );
    287    st_destroy_clear(st);
    288    st_destroy_bitmap(st);
    289    st_destroy_drawpix(st);
    290    st_destroy_drawtex(st);
    291    st_destroy_perfmon(st);
    292    st_destroy_pbo_helpers(st);
    293 
    294    for (shader = 0; shader < ARRAY_SIZE(st->state.sampler_views); shader++) {
    295       for (i = 0; i < ARRAY_SIZE(st->state.sampler_views[0]); i++) {
    296          pipe_sampler_view_release(st->pipe,
    297                                    &st->state.sampler_views[shader][i]);
    298       }
    299    }
    300 
    301    u_upload_destroy(st->uploader);
    302    if (st->indexbuf_uploader) {
    303       u_upload_destroy(st->indexbuf_uploader);
    304    }
    305    if (st->constbuf_uploader) {
    306       u_upload_destroy(st->constbuf_uploader);
    307    }
    308 
    309    /* free glDrawPixels cache data */
    310    free(st->drawpix_cache.image);
    311    pipe_resource_reference(&st->drawpix_cache.texture, NULL);
    312 
    313    /* free glReadPixels cache data */
    314    st_invalidate_readpix_cache(st);
    315 
    316    cso_destroy_context(st->cso_context);
    317 
    318    if (st->pipe && destroy_pipe)
    319       st->pipe->destroy(st->pipe);
    320 
    321    free( st );
    322 }
    323 
    324 
    325 static struct st_context *
    326 st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
    327 		const struct st_config_options *options)
    328 {
    329    struct pipe_screen *screen = pipe->screen;
    330    uint i;
    331    struct st_context *st = ST_CALLOC_STRUCT( st_context );
    332 
    333    st->options = *options;
    334 
    335    ctx->st = st;
    336 
    337    st->ctx = ctx;
    338    st->pipe = pipe;
    339 
    340    /* XXX: this is one-off, per-screen init: */
    341    st_debug_init();
    342 
    343    /* state tracker needs the VBO module */
    344    _vbo_CreateContext(ctx);
    345 
    346    st->dirty = ST_ALL_STATES_MASK;
    347 
    348    /* Create upload manager for vertex data for glBitmap, glDrawPixels,
    349     * glClear, etc.
    350     */
    351    st->uploader = u_upload_create(pipe, 65536, PIPE_BIND_VERTEX_BUFFER,
    352                                   PIPE_USAGE_STREAM);
    353 
    354    if (!screen->get_param(screen, PIPE_CAP_USER_INDEX_BUFFERS)) {
    355       st->indexbuf_uploader = u_upload_create(pipe, 128 * 1024,
    356                                               PIPE_BIND_INDEX_BUFFER,
    357                                               PIPE_USAGE_STREAM);
    358    }
    359 
    360    if (!screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS))
    361       st->constbuf_uploader = u_upload_create(pipe, 128 * 1024,
    362                                               PIPE_BIND_CONSTANT_BUFFER,
    363                                               PIPE_USAGE_STREAM);
    364 
    365    st->cso_context = cso_create_context(pipe);
    366 
    367    st_init_atoms( st );
    368    st_init_clear(st);
    369    st_init_draw( st );
    370    st_init_pbo_helpers(st);
    371 
    372    /* Choose texture target for glDrawPixels, glBitmap, renderbuffers */
    373    if (pipe->screen->get_param(pipe->screen, PIPE_CAP_NPOT_TEXTURES))
    374       st->internal_target = PIPE_TEXTURE_2D;
    375    else
    376       st->internal_target = PIPE_TEXTURE_RECT;
    377 
    378    /* Setup vertex element info for 'struct st_util_vertex'.
    379     */
    380    {
    381       const unsigned slot = cso_get_aux_vertex_buffer_slot(st->cso_context);
    382 
    383       /* If this assertion ever fails all state tracker calls to
    384        * cso_get_aux_vertex_buffer_slot() should be audited.  This
    385        * particular call would have to be moved to just before each
    386        * drawing call.
    387        */
    388       assert(slot == 0);
    389 
    390       STATIC_ASSERT(sizeof(struct st_util_vertex) == 9 * sizeof(float));
    391 
    392       memset(&st->util_velems, 0, sizeof(st->util_velems));
    393       st->util_velems[0].src_offset = 0;
    394       st->util_velems[0].vertex_buffer_index = slot;
    395       st->util_velems[0].src_format = PIPE_FORMAT_R32G32B32_FLOAT;
    396       st->util_velems[1].src_offset = 3 * sizeof(float);
    397       st->util_velems[1].vertex_buffer_index = slot;
    398       st->util_velems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
    399       st->util_velems[2].src_offset = 7 * sizeof(float);
    400       st->util_velems[2].vertex_buffer_index = slot;
    401       st->util_velems[2].src_format = PIPE_FORMAT_R32G32_FLOAT;
    402    }
    403 
    404    /* we want all vertex data to be placed in buffer objects */
    405    vbo_use_buffer_objects(ctx);
    406 
    407 
    408    /* make sure that no VBOs are left mapped when we're drawing. */
    409    vbo_always_unmap_buffers(ctx);
    410 
    411    /* Need these flags:
    412     */
    413    ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
    414 
    415    ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
    416 
    417    st->has_stencil_export =
    418       screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT);
    419    st->has_shader_model3 = screen->get_param(screen, PIPE_CAP_SM3);
    420    st->has_etc1 = screen->is_format_supported(screen, PIPE_FORMAT_ETC1_RGB8,
    421                                               PIPE_TEXTURE_2D, 0,
    422                                               PIPE_BIND_SAMPLER_VIEW);
    423    st->has_etc2 = screen->is_format_supported(screen, PIPE_FORMAT_ETC2_RGB8,
    424                                               PIPE_TEXTURE_2D, 0,
    425                                               PIPE_BIND_SAMPLER_VIEW);
    426    st->prefer_blit_based_texture_transfer = screen->get_param(screen,
    427                               PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
    428    st->force_persample_in_shader =
    429       screen->get_param(screen, PIPE_CAP_SAMPLE_SHADING) &&
    430       !screen->get_param(screen, PIPE_CAP_FORCE_PERSAMPLE_INTERP);
    431    st->has_shareable_shaders = screen->get_param(screen,
    432                                                  PIPE_CAP_SHAREABLE_SHADERS);
    433    st->needs_texcoord_semantic =
    434       screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD);
    435    st->apply_texture_swizzle_to_border_color =
    436       !!(screen->get_param(screen, PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK) &
    437          (PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 |
    438           PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600));
    439    st->has_time_elapsed =
    440       screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED);
    441    st->has_half_float_packing =
    442       screen->get_param(screen, PIPE_CAP_TGSI_PACK_HALF_FLOAT);
    443    st->has_multi_draw_indirect =
    444       screen->get_param(screen, PIPE_CAP_MULTI_DRAW_INDIRECT);
    445 
    446    /* GL limits and extensions */
    447    st_init_limits(pipe->screen, &ctx->Const, &ctx->Extensions);
    448    st_init_extensions(pipe->screen, &ctx->Const,
    449                       &ctx->Extensions, &st->options, ctx->Mesa_DXTn);
    450 
    451    if (st_have_perfmon(st)) {
    452       ctx->Extensions.AMD_performance_monitor = GL_TRUE;
    453    }
    454 
    455    /* Enable shader-based fallbacks for ARB_color_buffer_float if needed. */
    456    if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) {
    457       if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) {
    458          st->clamp_vert_color_in_shader = GL_TRUE;
    459       }
    460 
    461       if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) {
    462          st->clamp_frag_color_in_shader = GL_TRUE;
    463       }
    464 
    465       /* For drivers which cannot do color clamping, it's better to just
    466        * disable ARB_color_buffer_float in the core profile, because
    467        * the clamping is deprecated there anyway. */
    468       if (ctx->API == API_OPENGL_CORE &&
    469           (st->clamp_frag_color_in_shader || st->clamp_vert_color_in_shader)) {
    470          st->clamp_vert_color_in_shader = GL_FALSE;
    471          st->clamp_frag_color_in_shader = GL_FALSE;
    472          ctx->Extensions.ARB_color_buffer_float = GL_FALSE;
    473       }
    474    }
    475 
    476    /* called after _mesa_create_context/_mesa_init_point, fix default user
    477     * settable max point size up
    478     */
    479    ctx->Point.MaxSize = MAX2(ctx->Const.MaxPointSize,
    480                              ctx->Const.MaxPointSizeAA);
    481    /* For vertex shaders, make sure not to emit saturate when SM 3.0 is not supported */
    482    ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].EmitNoSat = !st->has_shader_model3;
    483 
    484    if (!ctx->Extensions.ARB_gpu_shader5) {
    485       for (i = 0; i < MESA_SHADER_STAGES; i++)
    486          ctx->Const.ShaderCompilerOptions[i].EmitNoIndirectSampler = true;
    487    }
    488 
    489    /* Set which shader types can be compiled at link time. */
    490    st->shader_has_one_variant[MESA_SHADER_VERTEX] =
    491          st->has_shareable_shaders &&
    492          !st->clamp_vert_color_in_shader;
    493 
    494    st->shader_has_one_variant[MESA_SHADER_FRAGMENT] =
    495          st->has_shareable_shaders &&
    496          !st->clamp_frag_color_in_shader &&
    497          !st->force_persample_in_shader;
    498 
    499    st->shader_has_one_variant[MESA_SHADER_TESS_CTRL] = st->has_shareable_shaders;
    500    st->shader_has_one_variant[MESA_SHADER_TESS_EVAL] = st->has_shareable_shaders;
    501    st->shader_has_one_variant[MESA_SHADER_GEOMETRY] = st->has_shareable_shaders;
    502    st->shader_has_one_variant[MESA_SHADER_COMPUTE] = st->has_shareable_shaders;
    503 
    504    _mesa_compute_version(ctx);
    505 
    506    if (ctx->Version == 0) {
    507       /* This can happen when a core profile was requested, but the driver
    508        * does not support some features of GL 3.1 or later.
    509        */
    510       st_destroy_context_priv(st, false);
    511       return NULL;
    512    }
    513 
    514    _mesa_initialize_dispatch_tables(ctx);
    515    _mesa_initialize_vbo_vtxfmt(ctx);
    516 
    517    return st;
    518 }
    519 
    520 static void st_init_driver_flags(struct gl_driver_flags *f)
    521 {
    522    f->NewArray = ST_NEW_VERTEX_ARRAYS;
    523    f->NewRasterizerDiscard = ST_NEW_RASTERIZER;
    524    f->NewUniformBuffer = ST_NEW_UNIFORM_BUFFER;
    525    f->NewDefaultTessLevels = ST_NEW_TESS_STATE;
    526    f->NewTextureBuffer = ST_NEW_SAMPLER_VIEWS;
    527    f->NewAtomicBuffer = ST_NEW_ATOMIC_BUFFER;
    528    f->NewShaderStorageBuffer = ST_NEW_STORAGE_BUFFER;
    529    f->NewImageUnits = ST_NEW_IMAGE_UNITS;
    530 }
    531 
    532 struct st_context *st_create_context(gl_api api, struct pipe_context *pipe,
    533                                      const struct gl_config *visual,
    534                                      struct st_context *share,
    535                                      const struct st_config_options *options)
    536 {
    537    struct gl_context *ctx;
    538    struct gl_context *shareCtx = share ? share->ctx : NULL;
    539    struct dd_function_table funcs;
    540    struct st_context *st;
    541 
    542    memset(&funcs, 0, sizeof(funcs));
    543    st_init_driver_functions(pipe->screen, &funcs);
    544 
    545    ctx = calloc(1, sizeof(struct gl_context));
    546    if (!ctx)
    547       return NULL;
    548 
    549    if (!_mesa_initialize_context(ctx, api, visual, shareCtx, &funcs)) {
    550       free(ctx);
    551       return NULL;
    552    }
    553 
    554    st_init_driver_flags(&ctx->DriverFlags);
    555 
    556    /* XXX: need a capability bit in gallium to query if the pipe
    557     * driver prefers DP4 or MUL/MAD for vertex transformation.
    558     */
    559    if (debug_get_option_mesa_mvp_dp4())
    560       ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].OptimizeForAOS = GL_TRUE;
    561 
    562    st = st_create_context_priv(ctx, pipe, options);
    563    if (!st) {
    564       _mesa_destroy_context(ctx);
    565    }
    566 
    567    return st;
    568 }
    569 
    570 
    571 /**
    572  * Callback to release the sampler view attached to a texture object.
    573  * Called by _mesa_HashWalk().
    574  */
    575 static void
    576 destroy_tex_sampler_cb(GLuint id, void *data, void *userData)
    577 {
    578    struct gl_texture_object *texObj = (struct gl_texture_object *) data;
    579    struct st_context *st = (struct st_context *) userData;
    580 
    581    st_texture_release_sampler_view(st, st_texture_object(texObj));
    582 }
    583 
    584 void st_destroy_context( struct st_context *st )
    585 {
    586    struct gl_context *ctx = st->ctx;
    587    GLuint i;
    588 
    589    _mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st);
    590 
    591    st_reference_fragprog(st, &st->fp, NULL);
    592    st_reference_geomprog(st, &st->gp, NULL);
    593    st_reference_vertprog(st, &st->vp, NULL);
    594    st_reference_tesscprog(st, &st->tcp, NULL);
    595    st_reference_tesseprog(st, &st->tep, NULL);
    596    st_reference_compprog(st, &st->cp, NULL);
    597 
    598    /* release framebuffer surfaces */
    599    for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
    600       pipe_surface_reference(&st->state.framebuffer.cbufs[i], NULL);
    601    }
    602    pipe_surface_reference(&st->state.framebuffer.zsbuf, NULL);
    603    pipe_sampler_view_reference(&st->pixel_xfer.pixelmap_sampler_view, NULL);
    604    pipe_resource_reference(&st->pixel_xfer.pixelmap_texture, NULL);
    605 
    606    _vbo_DestroyContext(ctx);
    607 
    608    st_destroy_program_variants(st);
    609 
    610    _mesa_free_context_data(ctx);
    611 
    612    /* This will free the st_context too, so 'st' must not be accessed
    613     * afterwards. */
    614    st_destroy_context_priv(st, true);
    615    st = NULL;
    616 
    617    free(ctx);
    618 }
    619 
    620 static void
    621 st_emit_string_marker(struct gl_context *ctx, const GLchar *string, GLsizei len)
    622 {
    623    struct st_context *st = ctx->st;
    624    st->pipe->emit_string_marker(st->pipe, string, len);
    625 }
    626 
    627 void st_init_driver_functions(struct pipe_screen *screen,
    628                               struct dd_function_table *functions)
    629 {
    630    _mesa_init_shader_object_functions(functions);
    631    _mesa_init_sampler_object_functions(functions);
    632 
    633    st_init_blit_functions(functions);
    634    st_init_bufferobject_functions(screen, functions);
    635    st_init_clear_functions(functions);
    636    st_init_bitmap_functions(functions);
    637    st_init_copy_image_functions(functions);
    638    st_init_drawpixels_functions(functions);
    639    st_init_rasterpos_functions(functions);
    640 
    641    st_init_drawtex_functions(functions);
    642 
    643    st_init_eglimage_functions(functions);
    644 
    645    st_init_fbo_functions(functions);
    646    st_init_feedback_functions(functions);
    647    st_init_msaa_functions(functions);
    648    st_init_perfmon_functions(functions);
    649    st_init_program_functions(functions);
    650    st_init_query_functions(functions);
    651    st_init_cond_render_functions(functions);
    652    st_init_readpixels_functions(functions);
    653    st_init_texture_functions(functions);
    654    st_init_texture_barrier_functions(functions);
    655    st_init_flush_functions(screen, functions);
    656    st_init_string_functions(functions);
    657    st_init_viewport_functions(functions);
    658    st_init_compute_functions(functions);
    659 
    660    st_init_xformfb_functions(functions);
    661    st_init_syncobj_functions(functions);
    662 
    663    st_init_vdpau_functions(functions);
    664 
    665    if (screen->get_param(screen, PIPE_CAP_STRING_MARKER))
    666       functions->EmitStringMarker = st_emit_string_marker;
    667 
    668    functions->Enable = st_Enable;
    669    functions->UpdateState = st_invalidate_state;
    670    functions->QueryMemoryInfo = st_query_memory_info;
    671 }
    672