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/glthread.h" 33#include "main/samplerobj.h" 34#include "main/shaderobj.h" 35#include "main/version.h" 36#include "main/vtxfmt.h" 37#include "main/hash.h" 38#include "program/prog_cache.h" 39#include "vbo/vbo.h" 40#include "glapi/glapi.h" 41#include "st_manager.h" 42#include "st_context.h" 43#include "st_debug.h" 44#include "st_cb_bitmap.h" 45#include "st_cb_blit.h" 46#include "st_cb_bufferobjects.h" 47#include "st_cb_clear.h" 48#include "st_cb_compute.h" 49#include "st_cb_condrender.h" 50#include "st_cb_copyimage.h" 51#include "st_cb_drawpixels.h" 52#include "st_cb_rasterpos.h" 53#include "st_cb_drawtex.h" 54#include "st_cb_eglimage.h" 55#include "st_cb_fbo.h" 56#include "st_cb_feedback.h" 57#include "st_cb_memoryobjects.h" 58#include "st_cb_msaa.h" 59#include "st_cb_perfmon.h" 60#include "st_cb_program.h" 61#include "st_cb_queryobj.h" 62#include "st_cb_readpixels.h" 63#include "st_cb_semaphoreobjects.h" 64#include "st_cb_texture.h" 65#include "st_cb_xformfb.h" 66#include "st_cb_flush.h" 67#include "st_cb_syncobj.h" 68#include "st_cb_strings.h" 69#include "st_cb_texturebarrier.h" 70#include "st_cb_viewport.h" 71#include "st_atom.h" 72#include "st_draw.h" 73#include "st_extensions.h" 74#include "st_gen_mipmap.h" 75#include "st_pbo.h" 76#include "st_program.h" 77#include "st_sampler_view.h" 78#include "st_shader_cache.h" 79#include "st_vdpau.h" 80#include "st_texture.h" 81#include "st_util.h" 82#include "pipe/p_context.h" 83#include "util/u_cpu_detect.h" 84#include "util/u_inlines.h" 85#include "util/u_upload_mgr.h" 86#include "util/u_vbuf.h" 87#include "cso_cache/cso_context.h" 88#include "compiler/glsl/glsl_parser_extras.h" 89 90 91DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE) 92 93 94/** 95 * Called via ctx->Driver.Enable() 96 */ 97static void 98st_Enable(struct gl_context *ctx, GLenum cap, GLboolean state) 99{ 100 struct st_context *st = st_context(ctx); 101 102 switch (cap) { 103 case GL_DEBUG_OUTPUT: 104 case GL_DEBUG_OUTPUT_SYNCHRONOUS: 105 st_update_debug_callback(st); 106 break; 107 default: 108 break; 109 } 110} 111 112 113/** 114 * Called via ctx->Driver.QueryMemoryInfo() 115 */ 116static void 117st_query_memory_info(struct gl_context *ctx, struct gl_memory_info *out) 118{ 119 struct pipe_screen *screen = st_context(ctx)->pipe->screen; 120 struct pipe_memory_info info; 121 122 assert(screen->query_memory_info); 123 if (!screen->query_memory_info) 124 return; 125 126 screen->query_memory_info(screen, &info); 127 128 out->total_device_memory = info.total_device_memory; 129 out->avail_device_memory = info.avail_device_memory; 130 out->total_staging_memory = info.total_staging_memory; 131 out->avail_staging_memory = info.avail_staging_memory; 132 out->device_memory_evicted = info.device_memory_evicted; 133 out->nr_device_memory_evictions = info.nr_device_memory_evictions; 134} 135 136 137static uint64_t 138st_get_active_states(struct gl_context *ctx) 139{ 140 struct st_vertex_program *vp = 141 st_vertex_program(ctx->VertexProgram._Current); 142 struct st_common_program *tcp = 143 st_common_program(ctx->TessCtrlProgram._Current); 144 struct st_common_program *tep = 145 st_common_program(ctx->TessEvalProgram._Current); 146 struct st_common_program *gp = 147 st_common_program(ctx->GeometryProgram._Current); 148 struct st_fragment_program *fp = 149 st_fragment_program(ctx->FragmentProgram._Current); 150 struct st_compute_program *cp = 151 st_compute_program(ctx->ComputeProgram._Current); 152 uint64_t active_shader_states = 0; 153 154 if (vp) 155 active_shader_states |= vp->affected_states; 156 if (tcp) 157 active_shader_states |= tcp->affected_states; 158 if (tep) 159 active_shader_states |= tep->affected_states; 160 if (gp) 161 active_shader_states |= gp->affected_states; 162 if (fp) 163 active_shader_states |= fp->affected_states; 164 if (cp) 165 active_shader_states |= cp->affected_states; 166 167 /* Mark non-shader-resource shader states as "always active". */ 168 return active_shader_states | ~ST_ALL_SHADER_RESOURCES; 169} 170 171 172void 173st_invalidate_buffers(struct st_context *st) 174{ 175 st->dirty |= ST_NEW_BLEND | 176 ST_NEW_DSA | 177 ST_NEW_FB_STATE | 178 ST_NEW_SAMPLE_STATE | 179 ST_NEW_SAMPLE_SHADING | 180 ST_NEW_FS_STATE | 181 ST_NEW_POLY_STIPPLE | 182 ST_NEW_VIEWPORT | 183 ST_NEW_RASTERIZER | 184 ST_NEW_SCISSOR | 185 ST_NEW_WINDOW_RECTANGLES; 186} 187 188 189static inline bool 190st_vp_uses_current_values(const struct gl_context *ctx) 191{ 192 const uint64_t inputs = ctx->VertexProgram._Current->info.inputs_read; 193 return _mesa_draw_current_bits(ctx) & inputs; 194} 195 196 197/** 198 * Called via ctx->Driver.UpdateState() 199 */ 200static void 201st_invalidate_state(struct gl_context *ctx) 202{ 203 GLbitfield new_state = ctx->NewState; 204 struct st_context *st = st_context(ctx); 205 206 if (new_state & _NEW_BUFFERS) { 207 st_invalidate_buffers(st); 208 } else { 209 /* These set a subset of flags set by _NEW_BUFFERS, so we only have to 210 * check them when _NEW_BUFFERS isn't set. 211 */ 212 if (new_state & _NEW_PROGRAM) 213 st->dirty |= ST_NEW_RASTERIZER; 214 215 if (new_state & _NEW_FOG) 216 st->dirty |= ST_NEW_FS_STATE; 217 218 if (new_state & _NEW_FRAG_CLAMP) { 219 if (st->clamp_frag_color_in_shader) 220 st->dirty |= ST_NEW_FS_STATE; 221 else 222 st->dirty |= ST_NEW_RASTERIZER; 223 } 224 } 225 226 if (new_state & (_NEW_LIGHT | 227 _NEW_POINT)) 228 st->dirty |= ST_NEW_RASTERIZER; 229 230 if (new_state & _NEW_PROJECTION && 231 st_user_clip_planes_enabled(ctx)) 232 st->dirty |= ST_NEW_CLIP_STATE; 233 234 if (new_state & _NEW_PIXEL) 235 st->dirty |= ST_NEW_PIXEL_TRANSFER; 236 237 if (new_state & _NEW_CURRENT_ATTRIB && st_vp_uses_current_values(ctx)) 238 st->dirty |= ST_NEW_VERTEX_ARRAYS; 239 240 /* Update the vertex shader if ctx->Light._ClampVertexColor was changed. */ 241 if (st->clamp_vert_color_in_shader && (new_state & _NEW_LIGHT)) 242 st->dirty |= ST_NEW_VS_STATE; 243 244 /* Which shaders are dirty will be determined manually. */ 245 if (new_state & _NEW_PROGRAM) { 246 st->gfx_shaders_may_be_dirty = true; 247 st->compute_shader_may_be_dirty = true; 248 /* This will mask out unused shader resources. */ 249 st->active_states = st_get_active_states(ctx); 250 } 251 252 if (new_state & _NEW_TEXTURE_OBJECT) { 253 st->dirty |= st->active_states & 254 (ST_NEW_SAMPLER_VIEWS | 255 ST_NEW_SAMPLERS | 256 ST_NEW_IMAGE_UNITS); 257 if (ctx->FragmentProgram._Current && 258 ctx->FragmentProgram._Current->ExternalSamplersUsed) { 259 st->dirty |= ST_NEW_FS_STATE; 260 } 261 } 262} 263 264 265/* 266 * In some circumstances (such as running google-chrome) the state 267 * tracker may try to delete a resource view from a context different 268 * than when it was created. We don't want to do that. 269 * 270 * In that situation, st_texture_release_all_sampler_views() calls this 271 * function to transfer the sampler view reference to this context (expected 272 * to be the context which created the view.) 273 */ 274void 275st_save_zombie_sampler_view(struct st_context *st, 276 struct pipe_sampler_view *view) 277{ 278 struct st_zombie_sampler_view_node *entry; 279 280 assert(view->context == st->pipe); 281 282 entry = MALLOC_STRUCT(st_zombie_sampler_view_node); 283 if (!entry) 284 return; 285 286 entry->view = view; 287 288 /* We need a mutex since this function may be called from one thread 289 * while free_zombie_resource_views() is called from another. 290 */ 291 mtx_lock(&st->zombie_sampler_views.mutex); 292 LIST_ADDTAIL(&entry->node, &st->zombie_sampler_views.list.node); 293 mtx_unlock(&st->zombie_sampler_views.mutex); 294} 295 296 297/* 298 * Since OpenGL shaders may be shared among contexts, we can wind up 299 * with variants of a shader created with different contexts. 300 * When we go to destroy a gallium shader, we want to free it with the 301 * same context that it was created with, unless the driver reports 302 * PIPE_CAP_SHAREABLE_SHADERS = TRUE. 303 */ 304void 305st_save_zombie_shader(struct st_context *st, 306 enum pipe_shader_type type, 307 struct pipe_shader_state *shader) 308{ 309 struct st_zombie_shader_node *entry; 310 311 /* we shouldn't be here if the driver supports shareable shaders */ 312 assert(!st->has_shareable_shaders); 313 314 entry = MALLOC_STRUCT(st_zombie_shader_node); 315 if (!entry) 316 return; 317 318 entry->shader = shader; 319 entry->type = type; 320 321 /* We need a mutex since this function may be called from one thread 322 * while free_zombie_shaders() is called from another. 323 */ 324 mtx_lock(&st->zombie_shaders.mutex); 325 LIST_ADDTAIL(&entry->node, &st->zombie_shaders.list.node); 326 mtx_unlock(&st->zombie_shaders.mutex); 327} 328 329 330/* 331 * Free any zombie sampler views that may be attached to this context. 332 */ 333static void 334free_zombie_sampler_views(struct st_context *st) 335{ 336 struct st_zombie_sampler_view_node *entry, *next; 337 338 if (LIST_IS_EMPTY(&st->zombie_sampler_views.list.node)) { 339 return; 340 } 341 342 mtx_lock(&st->zombie_sampler_views.mutex); 343 344 LIST_FOR_EACH_ENTRY_SAFE(entry, next, 345 &st->zombie_sampler_views.list.node, node) { 346 LIST_DEL(&entry->node); // remove this entry from the list 347 348 assert(entry->view->context == st->pipe); 349 pipe_sampler_view_reference(&entry->view, NULL); 350 351 free(entry); 352 } 353 354 assert(LIST_IS_EMPTY(&st->zombie_sampler_views.list.node)); 355 356 mtx_unlock(&st->zombie_sampler_views.mutex); 357} 358 359 360/* 361 * Free any zombie shaders that may be attached to this context. 362 */ 363static void 364free_zombie_shaders(struct st_context *st) 365{ 366 struct st_zombie_shader_node *entry, *next; 367 368 if (LIST_IS_EMPTY(&st->zombie_shaders.list.node)) { 369 return; 370 } 371 372 mtx_lock(&st->zombie_shaders.mutex); 373 374 LIST_FOR_EACH_ENTRY_SAFE(entry, next, 375 &st->zombie_shaders.list.node, node) { 376 LIST_DEL(&entry->node); // remove this entry from the list 377 378 switch (entry->type) { 379 case PIPE_SHADER_VERTEX: 380 cso_delete_vertex_shader(st->cso_context, entry->shader); 381 break; 382 case PIPE_SHADER_FRAGMENT: 383 cso_delete_fragment_shader(st->cso_context, entry->shader); 384 break; 385 case PIPE_SHADER_GEOMETRY: 386 cso_delete_geometry_shader(st->cso_context, entry->shader); 387 break; 388 case PIPE_SHADER_TESS_CTRL: 389 cso_delete_tessctrl_shader(st->cso_context, entry->shader); 390 break; 391 case PIPE_SHADER_TESS_EVAL: 392 cso_delete_tesseval_shader(st->cso_context, entry->shader); 393 break; 394 case PIPE_SHADER_COMPUTE: 395 cso_delete_compute_shader(st->cso_context, entry->shader); 396 break; 397 default: 398 unreachable("invalid shader type in free_zombie_shaders()"); 399 } 400 free(entry); 401 } 402 403 assert(LIST_IS_EMPTY(&st->zombie_shaders.list.node)); 404 405 mtx_unlock(&st->zombie_shaders.mutex); 406} 407 408 409/* 410 * This function is called periodically to free any zombie objects 411 * which are attached to this context. 412 */ 413void 414st_context_free_zombie_objects(struct st_context *st) 415{ 416 free_zombie_sampler_views(st); 417 free_zombie_shaders(st); 418} 419 420 421static void 422st_destroy_context_priv(struct st_context *st, bool destroy_pipe) 423{ 424 uint i; 425 426 st_destroy_atoms(st); 427 st_destroy_draw(st); 428 st_destroy_clear(st); 429 st_destroy_bitmap(st); 430 st_destroy_drawpix(st); 431 st_destroy_drawtex(st); 432 st_destroy_perfmon(st); 433 st_destroy_pbo_helpers(st); 434 st_destroy_bound_texture_handles(st); 435 st_destroy_bound_image_handles(st); 436 437 for (i = 0; i < ARRAY_SIZE(st->state.frag_sampler_views); i++) { 438 pipe_sampler_view_reference(&st->state.frag_sampler_views[i], NULL); 439 } 440 441 /* free glReadPixels cache data */ 442 st_invalidate_readpix_cache(st); 443 util_throttle_deinit(st->pipe->screen, &st->throttle); 444 445 cso_destroy_context(st->cso_context); 446 447 if (st->pipe && destroy_pipe) 448 st->pipe->destroy(st->pipe); 449 450 free(st); 451} 452 453 454static void 455st_init_driver_flags(struct st_context *st) 456{ 457 struct gl_driver_flags *f = &st->ctx->DriverFlags; 458 459 f->NewArray = ST_NEW_VERTEX_ARRAYS; 460 f->NewRasterizerDiscard = ST_NEW_RASTERIZER; 461 f->NewTileRasterOrder = ST_NEW_RASTERIZER; 462 f->NewUniformBuffer = ST_NEW_UNIFORM_BUFFER; 463 f->NewDefaultTessLevels = ST_NEW_TESS_STATE; 464 465 /* Shader resources */ 466 f->NewTextureBuffer = ST_NEW_SAMPLER_VIEWS; 467 if (st->has_hw_atomics) 468 f->NewAtomicBuffer = ST_NEW_HW_ATOMICS | ST_NEW_CS_ATOMICS; 469 else 470 f->NewAtomicBuffer = ST_NEW_ATOMIC_BUFFER; 471 f->NewShaderStorageBuffer = ST_NEW_STORAGE_BUFFER; 472 f->NewImageUnits = ST_NEW_IMAGE_UNITS; 473 474 f->NewShaderConstants[MESA_SHADER_VERTEX] = ST_NEW_VS_CONSTANTS; 475 f->NewShaderConstants[MESA_SHADER_TESS_CTRL] = ST_NEW_TCS_CONSTANTS; 476 f->NewShaderConstants[MESA_SHADER_TESS_EVAL] = ST_NEW_TES_CONSTANTS; 477 f->NewShaderConstants[MESA_SHADER_GEOMETRY] = ST_NEW_GS_CONSTANTS; 478 f->NewShaderConstants[MESA_SHADER_FRAGMENT] = ST_NEW_FS_CONSTANTS; 479 f->NewShaderConstants[MESA_SHADER_COMPUTE] = ST_NEW_CS_CONSTANTS; 480 481 f->NewWindowRectangles = ST_NEW_WINDOW_RECTANGLES; 482 f->NewFramebufferSRGB = ST_NEW_FB_STATE; 483 f->NewScissorRect = ST_NEW_SCISSOR; 484 f->NewScissorTest = ST_NEW_SCISSOR | ST_NEW_RASTERIZER; 485 f->NewAlphaTest = ST_NEW_DSA; 486 f->NewBlend = ST_NEW_BLEND; 487 f->NewBlendColor = ST_NEW_BLEND_COLOR; 488 f->NewColorMask = ST_NEW_BLEND; 489 f->NewDepth = ST_NEW_DSA; 490 f->NewLogicOp = ST_NEW_BLEND; 491 f->NewStencil = ST_NEW_DSA; 492 f->NewMultisampleEnable = ST_NEW_BLEND | ST_NEW_RASTERIZER | 493 ST_NEW_SAMPLE_STATE | ST_NEW_SAMPLE_SHADING; 494 f->NewSampleAlphaToXEnable = ST_NEW_BLEND; 495 f->NewSampleMask = ST_NEW_SAMPLE_STATE; 496 f->NewSampleLocations = ST_NEW_SAMPLE_STATE; 497 f->NewSampleShading = ST_NEW_SAMPLE_SHADING; 498 499 /* This depends on what the gallium driver wants. */ 500 if (st->force_persample_in_shader) { 501 f->NewMultisampleEnable |= ST_NEW_FS_STATE; 502 f->NewSampleShading |= ST_NEW_FS_STATE; 503 } else { 504 f->NewSampleShading |= ST_NEW_RASTERIZER; 505 } 506 507 f->NewClipControl = ST_NEW_VIEWPORT | ST_NEW_RASTERIZER; 508 f->NewClipPlane = ST_NEW_CLIP_STATE; 509 f->NewClipPlaneEnable = ST_NEW_RASTERIZER; 510 f->NewDepthClamp = ST_NEW_RASTERIZER; 511 f->NewLineState = ST_NEW_RASTERIZER; 512 f->NewPolygonState = ST_NEW_RASTERIZER; 513 f->NewPolygonStipple = ST_NEW_POLY_STIPPLE; 514 f->NewViewport = ST_NEW_VIEWPORT; 515 f->NewNvConservativeRasterization = ST_NEW_RASTERIZER; 516 f->NewNvConservativeRasterizationParams = ST_NEW_RASTERIZER; 517 f->NewIntelConservativeRasterization = ST_NEW_RASTERIZER; 518} 519 520 521static struct st_context * 522st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, 523 const struct st_config_options *options, bool no_error) 524{ 525 struct pipe_screen *screen = pipe->screen; 526 uint i; 527 struct st_context *st = ST_CALLOC_STRUCT( st_context); 528 529 st->options = *options; 530 531 ctx->st = st; 532 533 st->ctx = ctx; 534 st->pipe = pipe; 535 536 /* state tracker needs the VBO module */ 537 _vbo_CreateContext(ctx); 538 539 st->dirty = ST_ALL_STATES_MASK; 540 541 st->can_bind_const_buffer_as_vertex = 542 screen->get_param(screen, PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX); 543 544 /* st/mesa always uploads zero-stride vertex attribs, and other user 545 * vertex buffers are only possible with a compatibility profile. 546 * So tell the u_vbuf module that user VBOs are not possible with the Core 547 * profile, so that u_vbuf is bypassed completely if there is nothing else 548 * to do. 549 */ 550 unsigned vbuf_flags = 551 ctx->API == API_OPENGL_CORE ? U_VBUF_FLAG_NO_USER_VBOS : 0; 552 st->cso_context = cso_create_context(pipe, vbuf_flags); 553 554 st_init_atoms(st); 555 st_init_clear(st); 556 st_init_pbo_helpers(st); 557 558 /* Choose texture target for glDrawPixels, glBitmap, renderbuffers */ 559 if (pipe->screen->get_param(pipe->screen, PIPE_CAP_NPOT_TEXTURES)) 560 st->internal_target = PIPE_TEXTURE_2D; 561 else 562 st->internal_target = PIPE_TEXTURE_RECT; 563 564 /* Setup vertex element info for 'struct st_util_vertex'. 565 */ 566 { 567 STATIC_ASSERT(sizeof(struct st_util_vertex) == 9 * sizeof(float)); 568 569 memset(&st->util_velems, 0, sizeof(st->util_velems)); 570 st->util_velems[0].src_offset = 0; 571 st->util_velems[0].vertex_buffer_index = 0; 572 st->util_velems[0].src_format = PIPE_FORMAT_R32G32B32_FLOAT; 573 st->util_velems[1].src_offset = 3 * sizeof(float); 574 st->util_velems[1].vertex_buffer_index = 0; 575 st->util_velems[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 576 st->util_velems[2].src_offset = 7 * sizeof(float); 577 st->util_velems[2].vertex_buffer_index = 0; 578 st->util_velems[2].src_format = PIPE_FORMAT_R32G32_FLOAT; 579 } 580 581 /* we want all vertex data to be placed in buffer objects */ 582 vbo_use_buffer_objects(ctx); 583 584 585 /* make sure that no VBOs are left mapped when we're drawing. */ 586 vbo_always_unmap_buffers(ctx); 587 588 /* Need these flags: 589 */ 590 ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; 591 592 ctx->VertexProgram._MaintainTnlProgram = GL_TRUE; 593 594 if (no_error) 595 ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR; 596 597 ctx->Const.PackedDriverUniformStorage = 598 screen->get_param(screen, PIPE_CAP_PACKED_UNIFORMS); 599 600 st->has_stencil_export = 601 screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT); 602 st->has_shader_model3 = screen->get_param(screen, PIPE_CAP_SM3); 603 st->has_etc1 = screen->is_format_supported(screen, PIPE_FORMAT_ETC1_RGB8, 604 PIPE_TEXTURE_2D, 0, 0, 605 PIPE_BIND_SAMPLER_VIEW); 606 st->has_etc2 = screen->is_format_supported(screen, PIPE_FORMAT_ETC2_RGB8, 607 PIPE_TEXTURE_2D, 0, 0, 608 PIPE_BIND_SAMPLER_VIEW); 609 st->has_astc_2d_ldr = 610 screen->is_format_supported(screen, PIPE_FORMAT_ASTC_4x4_SRGB, 611 PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_SAMPLER_VIEW); 612 st->prefer_blit_based_texture_transfer = screen->get_param(screen, 613 PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER); 614 st->force_persample_in_shader = 615 screen->get_param(screen, PIPE_CAP_SAMPLE_SHADING) && 616 !screen->get_param(screen, PIPE_CAP_FORCE_PERSAMPLE_INTERP); 617 st->has_shareable_shaders = screen->get_param(screen, 618 PIPE_CAP_SHAREABLE_SHADERS); 619 st->needs_texcoord_semantic = 620 screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD); 621 st->apply_texture_swizzle_to_border_color = 622 !!(screen->get_param(screen, PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK) & 623 (PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 | 624 PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_R600)); 625 st->has_time_elapsed = 626 screen->get_param(screen, PIPE_CAP_QUERY_TIME_ELAPSED); 627 st->has_half_float_packing = 628 screen->get_param(screen, PIPE_CAP_TGSI_PACK_HALF_FLOAT); 629 st->has_multi_draw_indirect = 630 screen->get_param(screen, PIPE_CAP_MULTI_DRAW_INDIRECT); 631 st->has_single_pipe_stat = 632 screen->get_param(screen, PIPE_CAP_QUERY_PIPELINE_STATISTICS_SINGLE); 633 st->has_indep_blend_func = 634 screen->get_param(screen, PIPE_CAP_INDEP_BLEND_FUNC); 635 st->needs_rgb_dst_alpha_override = 636 screen->get_param(screen, PIPE_CAP_RGB_OVERRIDE_DST_ALPHA_BLEND); 637 638 st->has_hw_atomics = 639 screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, 640 PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS) 641 ? true : false; 642 643 util_throttle_init(&st->throttle, 644 screen->get_param(screen, 645 PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET)); 646 647 /* GL limits and extensions */ 648 st_init_limits(pipe->screen, &ctx->Const, &ctx->Extensions); 649 st_init_extensions(pipe->screen, &ctx->Const, 650 &ctx->Extensions, &st->options, ctx->API); 651 652 if (st_have_perfmon(st)) { 653 ctx->Extensions.AMD_performance_monitor = GL_TRUE; 654 } 655 656 /* Enable shader-based fallbacks for ARB_color_buffer_float if needed. */ 657 if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) { 658 if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) { 659 st->clamp_vert_color_in_shader = GL_TRUE; 660 } 661 662 if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) { 663 st->clamp_frag_color_in_shader = GL_TRUE; 664 } 665 666 /* For drivers which cannot do color clamping, it's better to just 667 * disable ARB_color_buffer_float in the core profile, because 668 * the clamping is deprecated there anyway. */ 669 if (ctx->API == API_OPENGL_CORE && 670 (st->clamp_frag_color_in_shader || st->clamp_vert_color_in_shader)) { 671 st->clamp_vert_color_in_shader = GL_FALSE; 672 st->clamp_frag_color_in_shader = GL_FALSE; 673 ctx->Extensions.ARB_color_buffer_float = GL_FALSE; 674 } 675 } 676 677 /* called after _mesa_create_context/_mesa_init_point, fix default user 678 * settable max point size up 679 */ 680 ctx->Point.MaxSize = MAX2(ctx->Const.MaxPointSize, 681 ctx->Const.MaxPointSizeAA); 682 /* For vertex shaders, make sure not to emit saturate when SM 3.0 683 * is not supported 684 */ 685 ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].EmitNoSat = 686 !st->has_shader_model3; 687 688 if (!ctx->Extensions.ARB_gpu_shader5) { 689 for (i = 0; i < MESA_SHADER_STAGES; i++) 690 ctx->Const.ShaderCompilerOptions[i].EmitNoIndirectSampler = true; 691 } 692 693 /* Set which shader types can be compiled at link time. */ 694 st->shader_has_one_variant[MESA_SHADER_VERTEX] = 695 st->has_shareable_shaders && 696 !st->clamp_vert_color_in_shader; 697 698 st->shader_has_one_variant[MESA_SHADER_FRAGMENT] = 699 st->has_shareable_shaders && 700 !st->clamp_frag_color_in_shader && 701 !st->force_persample_in_shader; 702 703 st->shader_has_one_variant[MESA_SHADER_TESS_CTRL] = st->has_shareable_shaders; 704 st->shader_has_one_variant[MESA_SHADER_TESS_EVAL] = st->has_shareable_shaders; 705 st->shader_has_one_variant[MESA_SHADER_GEOMETRY] = st->has_shareable_shaders; 706 st->shader_has_one_variant[MESA_SHADER_COMPUTE] = st->has_shareable_shaders; 707 708 st->bitmap.cache.empty = true; 709 710 _mesa_override_extensions(ctx); 711 _mesa_compute_version(ctx); 712 713 if (ctx->Version == 0) { 714 /* This can happen when a core profile was requested, but the driver 715 * does not support some features of GL 3.1 or later. 716 */ 717 st_destroy_context_priv(st, false); 718 return NULL; 719 } 720 721 _mesa_initialize_dispatch_tables(ctx); 722 _mesa_initialize_vbo_vtxfmt(ctx); 723 st_init_driver_flags(st); 724 725 /* Initialize context's winsys buffers list */ 726 LIST_INITHEAD(&st->winsys_buffers); 727 728 LIST_INITHEAD(&st->zombie_sampler_views.list.node); 729 mtx_init(&st->zombie_sampler_views.mutex, mtx_plain); 730 LIST_INITHEAD(&st->zombie_shaders.list.node); 731 mtx_init(&st->zombie_shaders.mutex, mtx_plain); 732 733 return st; 734} 735 736 737static void 738st_emit_string_marker(struct gl_context *ctx, const GLchar *string, GLsizei len) 739{ 740 struct st_context *st = ctx->st; 741 st->pipe->emit_string_marker(st->pipe, string, len); 742} 743 744 745static void 746st_set_background_context(struct gl_context *ctx, 747 struct util_queue_monitoring *queue_info) 748{ 749 struct st_context *st = ctx->st; 750 struct st_manager *smapi = 751 (struct st_manager *) st->iface.st_context_private; 752 753 assert(smapi->set_background_context); 754 smapi->set_background_context(&st->iface, queue_info); 755} 756 757 758static void 759st_get_device_uuid(struct gl_context *ctx, char *uuid) 760{ 761 struct pipe_screen *screen = st_context(ctx)->pipe->screen; 762 763 assert(GL_UUID_SIZE_EXT >= PIPE_UUID_SIZE); 764 memset(uuid, 0, GL_UUID_SIZE_EXT); 765 screen->get_device_uuid(screen, uuid); 766} 767 768 769static void 770st_get_driver_uuid(struct gl_context *ctx, char *uuid) 771{ 772 struct pipe_screen *screen = st_context(ctx)->pipe->screen; 773 774 assert(GL_UUID_SIZE_EXT >= PIPE_UUID_SIZE); 775 memset(uuid, 0, GL_UUID_SIZE_EXT); 776 screen->get_driver_uuid(screen, uuid); 777} 778 779 780static void 781st_init_driver_functions(struct pipe_screen *screen, 782 struct dd_function_table *functions) 783{ 784 _mesa_init_sampler_object_functions(functions); 785 786 st_init_draw_functions(functions); 787 st_init_blit_functions(functions); 788 st_init_bufferobject_functions(screen, functions); 789 st_init_clear_functions(functions); 790 st_init_bitmap_functions(functions); 791 st_init_copy_image_functions(functions); 792 st_init_drawpixels_functions(functions); 793 st_init_rasterpos_functions(functions); 794 795 st_init_drawtex_functions(functions); 796 797 st_init_eglimage_functions(functions); 798 799 st_init_fbo_functions(functions); 800 st_init_feedback_functions(functions); 801 st_init_memoryobject_functions(functions); 802 st_init_msaa_functions(functions); 803 st_init_perfmon_functions(functions); 804 st_init_program_functions(functions); 805 st_init_query_functions(functions); 806 st_init_cond_render_functions(functions); 807 st_init_readpixels_functions(functions); 808 st_init_semaphoreobject_functions(functions); 809 st_init_texture_functions(functions); 810 st_init_texture_barrier_functions(functions); 811 st_init_flush_functions(screen, functions); 812 st_init_string_functions(functions); 813 st_init_viewport_functions(functions); 814 st_init_compute_functions(functions); 815 816 st_init_xformfb_functions(functions); 817 st_init_syncobj_functions(functions); 818 819 st_init_vdpau_functions(functions); 820 821 if (screen->get_param(screen, PIPE_CAP_STRING_MARKER)) 822 functions->EmitStringMarker = st_emit_string_marker; 823 824 functions->Enable = st_Enable; 825 functions->UpdateState = st_invalidate_state; 826 functions->QueryMemoryInfo = st_query_memory_info; 827 functions->SetBackgroundContext = st_set_background_context; 828 functions->GetDriverUuid = st_get_driver_uuid; 829 functions->GetDeviceUuid = st_get_device_uuid; 830 831 /* GL_ARB_get_program_binary */ 832 functions->GetProgramBinaryDriverSHA1 = st_get_program_binary_driver_sha1; 833 834 enum pipe_shader_ir preferred_ir = (enum pipe_shader_ir) 835 screen->get_shader_param(screen, PIPE_SHADER_VERTEX, 836 PIPE_SHADER_CAP_PREFERRED_IR); 837 if (preferred_ir == PIPE_SHADER_IR_NIR) { 838 functions->ShaderCacheSerializeDriverBlob = st_serialise_nir_program; 839 functions->ProgramBinarySerializeDriverBlob = 840 st_serialise_nir_program_binary; 841 functions->ProgramBinaryDeserializeDriverBlob = 842 st_deserialise_nir_program; 843 } else { 844 functions->ShaderCacheSerializeDriverBlob = st_serialise_tgsi_program; 845 functions->ProgramBinarySerializeDriverBlob = 846 st_serialise_tgsi_program_binary; 847 functions->ProgramBinaryDeserializeDriverBlob = 848 st_deserialise_tgsi_program; 849 } 850} 851 852 853struct st_context * 854st_create_context(gl_api api, struct pipe_context *pipe, 855 const struct gl_config *visual, 856 struct st_context *share, 857 const struct st_config_options *options, 858 bool no_error) 859{ 860 struct gl_context *ctx; 861 struct gl_context *shareCtx = share ? share->ctx : NULL; 862 struct dd_function_table funcs; 863 struct st_context *st; 864 865 util_cpu_detect(); 866 867 memset(&funcs, 0, sizeof(funcs)); 868 st_init_driver_functions(pipe->screen, &funcs); 869 870 ctx = calloc(1, sizeof(struct gl_context)); 871 if (!ctx) 872 return NULL; 873 874 if (!_mesa_initialize_context(ctx, api, visual, shareCtx, &funcs)) { 875 free(ctx); 876 return NULL; 877 } 878 879 st_debug_init(); 880 881 if (pipe->screen->get_disk_shader_cache && 882 !(ST_DEBUG & DEBUG_TGSI)) 883 ctx->Cache = pipe->screen->get_disk_shader_cache(pipe->screen); 884 885 /* XXX: need a capability bit in gallium to query if the pipe 886 * driver prefers DP4 or MUL/MAD for vertex transformation. 887 */ 888 if (debug_get_option_mesa_mvp_dp4()) 889 ctx->Const.ShaderCompilerOptions[MESA_SHADER_VERTEX].OptimizeForAOS = GL_TRUE; 890 891 st = st_create_context_priv(ctx, pipe, options, no_error); 892 if (!st) { 893 _mesa_destroy_context(ctx); 894 } 895 896 return st; 897} 898 899 900/** 901 * When we destroy a context, we must examine all texture objects to 902 * find/release any sampler views created by that context. 903 * 904 * This callback is called per-texture object. It releases all the 905 * texture's sampler views which belong to the context. 906 */ 907static void 908destroy_tex_sampler_cb(GLuint id, void *data, void *userData) 909{ 910 struct gl_texture_object *texObj = (struct gl_texture_object *) data; 911 struct st_context *st = (struct st_context *) userData; 912 913 st_texture_release_context_sampler_view(st, st_texture_object(texObj)); 914} 915 916static void 917destroy_framebuffer_attachment_sampler_cb(GLuint id, void *data, void *userData) 918{ 919 struct gl_framebuffer* glfb = (struct gl_framebuffer*) data; 920 struct st_context *st = (struct st_context *) userData; 921 922 for (unsigned i = 0; i < BUFFER_COUNT; i++) { 923 struct gl_renderbuffer_attachment *att = &glfb->Attachment[i]; 924 if (att->Texture) { 925 st_texture_release_context_sampler_view(st, st_texture_object(att->Texture)); 926 } 927 } 928} 929 930void 931st_destroy_context(struct st_context *st) 932{ 933 struct gl_context *ctx = st->ctx; 934 struct st_framebuffer *stfb, *next; 935 struct gl_framebuffer *save_drawbuffer; 936 struct gl_framebuffer *save_readbuffer; 937 938 /* Save the current context and draw/read buffers*/ 939 GET_CURRENT_CONTEXT(save_ctx); 940 if (save_ctx) { 941 save_drawbuffer = save_ctx->WinSysDrawBuffer; 942 save_readbuffer = save_ctx->WinSysReadBuffer; 943 } else { 944 save_drawbuffer = save_readbuffer = NULL; 945 } 946 947 /* 948 * We need to bind the context we're deleting so that 949 * _mesa_reference_texobj_() uses this context when deleting textures. 950 * Similarly for framebuffer objects, etc. 951 */ 952 _mesa_make_current(ctx, NULL, NULL); 953 954 /* This must be called first so that glthread has a chance to finish */ 955 _mesa_glthread_destroy(ctx); 956 957 _mesa_HashWalk(ctx->Shared->TexObjects, destroy_tex_sampler_cb, st); 958 959 /* For the fallback textures, free any sampler views belonging to this 960 * context. 961 */ 962 for (unsigned i = 0; i < NUM_TEXTURE_TARGETS; i++) { 963 struct st_texture_object *stObj = 964 st_texture_object(ctx->Shared->FallbackTex[i]); 965 if (stObj) { 966 st_texture_release_context_sampler_view(st, stObj); 967 } 968 } 969 970 st_context_free_zombie_objects(st); 971 972 mtx_destroy(&st->zombie_sampler_views.mutex); 973 mtx_destroy(&st->zombie_shaders.mutex); 974 975 st_reference_fragprog(st, &st->fp, NULL); 976 st_reference_prog(st, &st->gp, NULL); 977 st_reference_vertprog(st, &st->vp, NULL); 978 st_reference_prog(st, &st->tcp, NULL); 979 st_reference_prog(st, &st->tep, NULL); 980 st_reference_compprog(st, &st->cp, NULL); 981 982 /* release framebuffer in the winsys buffers list */ 983 LIST_FOR_EACH_ENTRY_SAFE_REV(stfb, next, &st->winsys_buffers, head) { 984 st_framebuffer_reference(&stfb, NULL); 985 } 986 987 _mesa_HashWalk(ctx->Shared->FrameBuffers, destroy_framebuffer_attachment_sampler_cb, st); 988 989 pipe_sampler_view_reference(&st->pixel_xfer.pixelmap_sampler_view, NULL); 990 pipe_resource_reference(&st->pixel_xfer.pixelmap_texture, NULL); 991 992 _vbo_DestroyContext(ctx); 993 994 st_destroy_program_variants(st); 995 996 _mesa_free_context_data(ctx, false); 997 998 /* This will free the st_context too, so 'st' must not be accessed 999 * afterwards. */ 1000 st_destroy_context_priv(st, true); 1001 st = NULL; 1002 1003 /* This must be called after st_destroy_context_priv() to avoid a race 1004 * condition between any shader compiler threads and context destruction. 1005 */ 1006 _mesa_destroy_shader_compiler_types(); 1007 1008 free(ctx); 1009 1010 if (save_ctx == ctx) { 1011 /* unbind the context we just deleted */ 1012 _mesa_make_current(NULL, NULL, NULL); 1013 } else { 1014 /* Restore the current context and draw/read buffers (may be NULL) */ 1015 _mesa_make_current(save_ctx, save_drawbuffer, save_readbuffer); 1016 } 1017} 1018