1 /* 2 Copyright 2003 VMware, Inc. 3 Copyright (C) Intel Corp. 2006. All Rights Reserved. 4 Intel funded Tungsten Graphics to 5 develop this 3D driver. 6 7 Permission is hereby granted, free of charge, to any person obtaining 8 a copy of this software and associated documentation files (the 9 "Software"), to deal in the Software without restriction, including 10 without limitation the rights to use, copy, modify, merge, publish, 11 distribute, sublicense, and/or sell copies of the Software, and to 12 permit persons to whom the Software is furnished to do so, subject to 13 the following conditions: 14 15 The above copyright notice and this permission notice (including the 16 next paragraph) shall be included in all copies or substantial 17 portions of the Software. 18 19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 23 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 27 **********************************************************************/ 28 /* 29 * Authors: 30 * Keith Whitwell <keithw (at) vmware.com> 31 */ 32 33 34 #include "compiler/nir/nir.h" 35 #include "main/api_exec.h" 36 #include "main/context.h" 37 #include "main/fbobject.h" 38 #include "main/extensions.h" 39 #include "main/imports.h" 40 #include "main/macros.h" 41 #include "main/points.h" 42 #include "main/version.h" 43 #include "main/vtxfmt.h" 44 #include "main/texobj.h" 45 #include "main/framebuffer.h" 46 47 #include "vbo/vbo_context.h" 48 49 #include "drivers/common/driverfuncs.h" 50 #include "drivers/common/meta.h" 51 #include "utils.h" 52 53 #include "brw_context.h" 54 #include "brw_defines.h" 55 #include "brw_blorp.h" 56 #include "brw_compiler.h" 57 #include "brw_draw.h" 58 #include "brw_state.h" 59 60 #include "intel_batchbuffer.h" 61 #include "intel_buffer_objects.h" 62 #include "intel_buffers.h" 63 #include "intel_fbo.h" 64 #include "intel_mipmap_tree.h" 65 #include "intel_pixel.h" 66 #include "intel_image.h" 67 #include "intel_tex.h" 68 #include "intel_tex_obj.h" 69 70 #include "swrast_setup/swrast_setup.h" 71 #include "tnl/tnl.h" 72 #include "tnl/t_pipeline.h" 73 #include "util/ralloc.h" 74 #include "util/debug.h" 75 #include "isl/isl.h" 76 77 /*************************************** 78 * Mesa's Driver Functions 79 ***************************************/ 80 81 const char *const brw_vendor_string = "Intel Open Source Technology Center"; 82 83 static const char * 84 get_bsw_model(const struct intel_screen *screen) 85 { 86 switch (screen->eu_total) { 87 case 16: 88 return "405"; 89 case 12: 90 return "400"; 91 default: 92 return " "; 93 } 94 } 95 96 const char * 97 brw_get_renderer_string(const struct intel_screen *screen) 98 { 99 const char *chipset; 100 static char buffer[128]; 101 char *bsw = NULL; 102 103 switch (screen->deviceID) { 104 #undef CHIPSET 105 #define CHIPSET(id, symbol, str) case id: chipset = str; break; 106 #include "pci_ids/i965_pci_ids.h" 107 default: 108 chipset = "Unknown Intel Chipset"; 109 break; 110 } 111 112 /* Braswell branding is funny, so we have to fix it up here */ 113 if (screen->deviceID == 0x22B1) { 114 bsw = strdup(chipset); 115 char *needle = strstr(bsw, "XXX"); 116 if (needle) { 117 memcpy(needle, get_bsw_model(screen), 3); 118 chipset = bsw; 119 } 120 } 121 122 (void) driGetRendererString(buffer, chipset, 0); 123 free(bsw); 124 return buffer; 125 } 126 127 static const GLubyte * 128 intel_get_string(struct gl_context * ctx, GLenum name) 129 { 130 const struct brw_context *const brw = brw_context(ctx); 131 132 switch (name) { 133 case GL_VENDOR: 134 return (GLubyte *) brw_vendor_string; 135 136 case GL_RENDERER: 137 return 138 (GLubyte *) brw_get_renderer_string(brw->screen); 139 140 default: 141 return NULL; 142 } 143 } 144 145 static void 146 intel_viewport(struct gl_context *ctx) 147 { 148 struct brw_context *brw = brw_context(ctx); 149 __DRIcontext *driContext = brw->driContext; 150 151 if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) { 152 if (driContext->driDrawablePriv) 153 dri2InvalidateDrawable(driContext->driDrawablePriv); 154 if (driContext->driReadablePriv) 155 dri2InvalidateDrawable(driContext->driReadablePriv); 156 } 157 } 158 159 static void 160 intel_update_framebuffer(struct gl_context *ctx, 161 struct gl_framebuffer *fb) 162 { 163 struct brw_context *brw = brw_context(ctx); 164 165 /* Quantize the derived default number of samples 166 */ 167 fb->DefaultGeometry._NumSamples = 168 intel_quantize_num_samples(brw->screen, 169 fb->DefaultGeometry.NumSamples); 170 } 171 172 static bool 173 intel_disable_rb_aux_buffer(struct brw_context *brw, const drm_intel_bo *bo) 174 { 175 const struct gl_framebuffer *fb = brw->ctx.DrawBuffer; 176 bool found = false; 177 178 for (unsigned i = 0; i < fb->_NumColorDrawBuffers; i++) { 179 const struct intel_renderbuffer *irb = 180 intel_renderbuffer(fb->_ColorDrawBuffers[i]); 181 182 if (irb && irb->mt->bo == bo) { 183 found = brw->draw_aux_buffer_disabled[i] = true; 184 } 185 } 186 187 return found; 188 } 189 190 /* On Gen9 color buffers may be compressed by the hardware (lossless 191 * compression). There are, however, format restrictions and care needs to be 192 * taken that the sampler engine is capable for re-interpreting a buffer with 193 * format different the buffer was originally written with. 194 * 195 * For example, SRGB formats are not compressible and the sampler engine isn't 196 * capable of treating RGBA_UNORM as SRGB_ALPHA. In such a case the underlying 197 * color buffer needs to be resolved so that the sampling surface can be 198 * sampled as non-compressed (i.e., without the auxiliary MCS buffer being 199 * set). 200 */ 201 static bool 202 intel_texture_view_requires_resolve(struct brw_context *brw, 203 struct intel_texture_object *intel_tex) 204 { 205 if (brw->gen < 9 || 206 !intel_miptree_is_lossless_compressed(brw, intel_tex->mt)) 207 return false; 208 209 const uint32_t brw_format = brw_format_for_mesa_format(intel_tex->_Format); 210 211 if (isl_format_supports_lossless_compression(&brw->screen->devinfo, 212 brw_format)) 213 return false; 214 215 perf_debug("Incompatible sampling format (%s) for rbc (%s)\n", 216 _mesa_get_format_name(intel_tex->_Format), 217 _mesa_get_format_name(intel_tex->mt->format)); 218 219 if (intel_disable_rb_aux_buffer(brw, intel_tex->mt->bo)) 220 perf_debug("Sampling renderbuffer with non-compressible format - " 221 "turning off compression"); 222 223 return true; 224 } 225 226 static void 227 intel_update_state(struct gl_context * ctx, GLuint new_state) 228 { 229 struct brw_context *brw = brw_context(ctx); 230 struct intel_texture_object *tex_obj; 231 struct intel_renderbuffer *depth_irb; 232 233 if (ctx->swrast_context) 234 _swrast_InvalidateState(ctx, new_state); 235 _vbo_InvalidateState(ctx, new_state); 236 237 brw->NewGLState |= new_state; 238 239 _mesa_unlock_context_textures(ctx); 240 241 /* Resolve the depth buffer's HiZ buffer. */ 242 depth_irb = intel_get_renderbuffer(ctx->DrawBuffer, BUFFER_DEPTH); 243 if (depth_irb) 244 intel_renderbuffer_resolve_hiz(brw, depth_irb); 245 246 memset(brw->draw_aux_buffer_disabled, 0, 247 sizeof(brw->draw_aux_buffer_disabled)); 248 249 /* Resolve depth buffer and render cache of each enabled texture. */ 250 int maxEnabledUnit = ctx->Texture._MaxEnabledTexImageUnit; 251 for (int i = 0; i <= maxEnabledUnit; i++) { 252 if (!ctx->Texture.Unit[i]._Current) 253 continue; 254 tex_obj = intel_texture_object(ctx->Texture.Unit[i]._Current); 255 if (!tex_obj || !tex_obj->mt) 256 continue; 257 if (intel_miptree_sample_with_hiz(brw, tex_obj->mt)) 258 intel_miptree_all_slices_resolve_hiz(brw, tex_obj->mt); 259 else 260 intel_miptree_all_slices_resolve_depth(brw, tex_obj->mt); 261 /* Sampling engine understands lossless compression and resolving 262 * those surfaces should be skipped for performance reasons. 263 */ 264 const int flags = intel_texture_view_requires_resolve(brw, tex_obj) ? 265 0 : INTEL_MIPTREE_IGNORE_CCS_E; 266 intel_miptree_all_slices_resolve_color(brw, tex_obj->mt, flags); 267 brw_render_cache_set_check_flush(brw, tex_obj->mt->bo); 268 269 if (tex_obj->base.StencilSampling || 270 tex_obj->mt->format == MESA_FORMAT_S_UINT8) { 271 intel_update_r8stencil(brw, tex_obj->mt); 272 } 273 } 274 275 /* Resolve color for each active shader image. */ 276 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { 277 const struct gl_linked_shader *shader = 278 ctx->_Shader->CurrentProgram[i] ? 279 ctx->_Shader->CurrentProgram[i]->_LinkedShaders[i] : NULL; 280 281 if (unlikely(shader && shader->Program->info.num_images)) { 282 for (unsigned j = 0; j < shader->Program->info.num_images; j++) { 283 struct gl_image_unit *u = 284 &ctx->ImageUnits[shader->Program->sh.ImageUnits[j]]; 285 tex_obj = intel_texture_object(u->TexObj); 286 287 if (tex_obj && tex_obj->mt) { 288 /* Access to images is implemented using indirect messages 289 * against data port. Normal render target write understands 290 * lossless compression but unfortunately the typed/untyped 291 * read/write interface doesn't. Therefore even lossless 292 * compressed surfaces need to be resolved prior to accessing 293 * them. Hence skip setting INTEL_MIPTREE_IGNORE_CCS_E. 294 */ 295 intel_miptree_all_slices_resolve_color(brw, tex_obj->mt, 0); 296 297 if (intel_miptree_is_lossless_compressed(brw, tex_obj->mt) && 298 intel_disable_rb_aux_buffer(brw, tex_obj->mt->bo)) { 299 perf_debug("Using renderbuffer as shader image - turning " 300 "off lossless compression"); 301 } 302 303 brw_render_cache_set_check_flush(brw, tex_obj->mt->bo); 304 } 305 } 306 } 307 } 308 309 /* Resolve color buffers for non-coherent framebuffer fetch. */ 310 if (!ctx->Extensions.MESA_shader_framebuffer_fetch && 311 ctx->FragmentProgram._Current && 312 ctx->FragmentProgram._Current->info.outputs_read) { 313 const struct gl_framebuffer *fb = ctx->DrawBuffer; 314 315 for (unsigned i = 0; i < fb->_NumColorDrawBuffers; i++) { 316 const struct intel_renderbuffer *irb = 317 intel_renderbuffer(fb->_ColorDrawBuffers[i]); 318 319 if (irb && 320 intel_miptree_resolve_color( 321 brw, irb->mt, irb->mt_level, irb->mt_layer, irb->layer_count, 322 INTEL_MIPTREE_IGNORE_CCS_E)) 323 brw_render_cache_set_check_flush(brw, irb->mt->bo); 324 } 325 } 326 327 /* If FRAMEBUFFER_SRGB is used on Gen9+ then we need to resolve any of the 328 * single-sampled color renderbuffers because the CCS buffer isn't 329 * supported for SRGB formats. This only matters if FRAMEBUFFER_SRGB is 330 * enabled because otherwise the surface state will be programmed with the 331 * linear equivalent format anyway. 332 */ 333 if (brw->gen >= 9 && ctx->Color.sRGBEnabled) { 334 struct gl_framebuffer *fb = ctx->DrawBuffer; 335 for (int i = 0; i < fb->_NumColorDrawBuffers; i++) { 336 struct gl_renderbuffer *rb = fb->_ColorDrawBuffers[i]; 337 338 if (rb == NULL) 339 continue; 340 341 struct intel_renderbuffer *irb = intel_renderbuffer(rb); 342 struct intel_mipmap_tree *mt = irb->mt; 343 344 if (mt == NULL || 345 mt->num_samples > 1 || 346 _mesa_get_srgb_format_linear(mt->format) == mt->format) 347 continue; 348 349 /* Lossless compression is not supported for SRGB formats, it 350 * should be impossible to get here with such surfaces. 351 */ 352 assert(!intel_miptree_is_lossless_compressed(brw, mt)); 353 intel_miptree_all_slices_resolve_color(brw, mt, 0); 354 brw_render_cache_set_check_flush(brw, mt->bo); 355 } 356 } 357 358 _mesa_lock_context_textures(ctx); 359 360 if (new_state & _NEW_BUFFERS) { 361 intel_update_framebuffer(ctx, ctx->DrawBuffer); 362 if (ctx->DrawBuffer != ctx->ReadBuffer) 363 intel_update_framebuffer(ctx, ctx->ReadBuffer); 364 } 365 } 366 367 #define flushFront(screen) ((screen)->image.loader ? (screen)->image.loader->flushFrontBuffer : (screen)->dri2.loader->flushFrontBuffer) 368 369 static void 370 intel_flush_front(struct gl_context *ctx) 371 { 372 struct brw_context *brw = brw_context(ctx); 373 __DRIcontext *driContext = brw->driContext; 374 __DRIdrawable *driDrawable = driContext->driDrawablePriv; 375 __DRIscreen *const dri_screen = brw->screen->driScrnPriv; 376 377 if (brw->front_buffer_dirty && _mesa_is_winsys_fbo(ctx->DrawBuffer)) { 378 if (flushFront(dri_screen) && driDrawable && 379 driDrawable->loaderPrivate) { 380 381 /* Resolve before flushing FAKE_FRONT_LEFT to FRONT_LEFT. 382 * 383 * This potentially resolves both front and back buffer. It 384 * is unnecessary to resolve the back, but harms nothing except 385 * performance. And no one cares about front-buffer render 386 * performance. 387 */ 388 intel_resolve_for_dri2_flush(brw, driDrawable); 389 intel_batchbuffer_flush(brw); 390 391 flushFront(dri_screen)(driDrawable, driDrawable->loaderPrivate); 392 393 /* We set the dirty bit in intel_prepare_render() if we're 394 * front buffer rendering once we get there. 395 */ 396 brw->front_buffer_dirty = false; 397 } 398 } 399 } 400 401 static void 402 intel_glFlush(struct gl_context *ctx) 403 { 404 struct brw_context *brw = brw_context(ctx); 405 406 intel_batchbuffer_flush(brw); 407 intel_flush_front(ctx); 408 409 brw->need_flush_throttle = true; 410 } 411 412 static void 413 intel_finish(struct gl_context * ctx) 414 { 415 struct brw_context *brw = brw_context(ctx); 416 417 intel_glFlush(ctx); 418 419 if (brw->batch.last_bo) 420 drm_intel_bo_wait_rendering(brw->batch.last_bo); 421 } 422 423 static void 424 brw_init_driver_functions(struct brw_context *brw, 425 struct dd_function_table *functions) 426 { 427 _mesa_init_driver_functions(functions); 428 429 /* GLX uses DRI2 invalidate events to handle window resizing. 430 * Unfortunately, EGL does not - libEGL is written in XCB (not Xlib), 431 * which doesn't provide a mechanism for snooping the event queues. 432 * 433 * So EGL still relies on viewport hacks to handle window resizing. 434 * This should go away with DRI3000. 435 */ 436 if (!brw->driContext->driScreenPriv->dri2.useInvalidate) 437 functions->Viewport = intel_viewport; 438 439 functions->Flush = intel_glFlush; 440 functions->Finish = intel_finish; 441 functions->GetString = intel_get_string; 442 functions->UpdateState = intel_update_state; 443 444 intelInitTextureFuncs(functions); 445 intelInitTextureImageFuncs(functions); 446 intelInitTextureSubImageFuncs(functions); 447 intelInitTextureCopyImageFuncs(functions); 448 intelInitCopyImageFuncs(functions); 449 intelInitClearFuncs(functions); 450 intelInitBufferFuncs(functions); 451 intelInitPixelFuncs(functions); 452 intelInitBufferObjectFuncs(functions); 453 brw_init_syncobj_functions(functions); 454 brw_init_object_purgeable_functions(functions); 455 456 brwInitFragProgFuncs( functions ); 457 brw_init_common_queryobj_functions(functions); 458 if (brw->gen >= 8 || brw->is_haswell) 459 hsw_init_queryobj_functions(functions); 460 else if (brw->gen >= 6) 461 gen6_init_queryobj_functions(functions); 462 else 463 gen4_init_queryobj_functions(functions); 464 brw_init_compute_functions(functions); 465 if (brw->gen >= 7) 466 brw_init_conditional_render_functions(functions); 467 468 functions->QueryInternalFormat = brw_query_internal_format; 469 470 functions->NewTransformFeedback = brw_new_transform_feedback; 471 functions->DeleteTransformFeedback = brw_delete_transform_feedback; 472 if (can_do_mi_math_and_lrr(brw->screen)) { 473 functions->BeginTransformFeedback = hsw_begin_transform_feedback; 474 functions->EndTransformFeedback = hsw_end_transform_feedback; 475 functions->PauseTransformFeedback = hsw_pause_transform_feedback; 476 functions->ResumeTransformFeedback = hsw_resume_transform_feedback; 477 } else if (brw->gen >= 7) { 478 functions->BeginTransformFeedback = gen7_begin_transform_feedback; 479 functions->EndTransformFeedback = gen7_end_transform_feedback; 480 functions->PauseTransformFeedback = gen7_pause_transform_feedback; 481 functions->ResumeTransformFeedback = gen7_resume_transform_feedback; 482 functions->GetTransformFeedbackVertexCount = 483 brw_get_transform_feedback_vertex_count; 484 } else { 485 functions->BeginTransformFeedback = brw_begin_transform_feedback; 486 functions->EndTransformFeedback = brw_end_transform_feedback; 487 } 488 489 if (brw->gen >= 6) 490 functions->GetSamplePosition = gen6_get_sample_position; 491 } 492 493 static void 494 brw_initialize_context_constants(struct brw_context *brw) 495 { 496 struct gl_context *ctx = &brw->ctx; 497 const struct brw_compiler *compiler = brw->screen->compiler; 498 499 const bool stage_exists[MESA_SHADER_STAGES] = { 500 [MESA_SHADER_VERTEX] = true, 501 [MESA_SHADER_TESS_CTRL] = brw->gen >= 7, 502 [MESA_SHADER_TESS_EVAL] = brw->gen >= 7, 503 [MESA_SHADER_GEOMETRY] = brw->gen >= 6, 504 [MESA_SHADER_FRAGMENT] = true, 505 [MESA_SHADER_COMPUTE] = 506 ((ctx->API == API_OPENGL_COMPAT || ctx->API == API_OPENGL_CORE) && 507 ctx->Const.MaxComputeWorkGroupSize[0] >= 1024) || 508 (ctx->API == API_OPENGLES2 && 509 ctx->Const.MaxComputeWorkGroupSize[0] >= 128) || 510 _mesa_extension_override_enables.ARB_compute_shader, 511 }; 512 513 unsigned num_stages = 0; 514 for (int i = 0; i < MESA_SHADER_STAGES; i++) { 515 if (stage_exists[i]) 516 num_stages++; 517 } 518 519 unsigned max_samplers = 520 brw->gen >= 8 || brw->is_haswell ? BRW_MAX_TEX_UNIT : 16; 521 522 ctx->Const.MaxDualSourceDrawBuffers = 1; 523 ctx->Const.MaxDrawBuffers = BRW_MAX_DRAW_BUFFERS; 524 ctx->Const.MaxCombinedShaderOutputResources = 525 MAX_IMAGE_UNITS + BRW_MAX_DRAW_BUFFERS; 526 527 ctx->Const.QueryCounterBits.Timestamp = 36; 528 529 ctx->Const.MaxTextureCoordUnits = 8; /* Mesa limit */ 530 ctx->Const.MaxImageUnits = MAX_IMAGE_UNITS; 531 if (brw->gen >= 7) { 532 ctx->Const.MaxRenderbufferSize = 16384; 533 ctx->Const.MaxTextureLevels = MIN2(15 /* 16384 */, MAX_TEXTURE_LEVELS); 534 ctx->Const.MaxCubeTextureLevels = 15; /* 16384 */ 535 } else { 536 ctx->Const.MaxRenderbufferSize = 8192; 537 ctx->Const.MaxTextureLevels = MIN2(14 /* 8192 */, MAX_TEXTURE_LEVELS); 538 ctx->Const.MaxCubeTextureLevels = 14; /* 8192 */ 539 } 540 ctx->Const.Max3DTextureLevels = 12; /* 2048 */ 541 ctx->Const.MaxArrayTextureLayers = brw->gen >= 7 ? 2048 : 512; 542 ctx->Const.MaxTextureMbytes = 1536; 543 ctx->Const.MaxTextureRectSize = 1 << 12; 544 ctx->Const.MaxTextureMaxAnisotropy = 16.0; 545 ctx->Const.MaxTextureLodBias = 15.0; 546 ctx->Const.StripTextureBorder = true; 547 if (brw->gen >= 7) { 548 ctx->Const.MaxProgramTextureGatherComponents = 4; 549 ctx->Const.MinProgramTextureGatherOffset = -32; 550 ctx->Const.MaxProgramTextureGatherOffset = 31; 551 } else if (brw->gen == 6) { 552 ctx->Const.MaxProgramTextureGatherComponents = 1; 553 ctx->Const.MinProgramTextureGatherOffset = -8; 554 ctx->Const.MaxProgramTextureGatherOffset = 7; 555 } 556 557 ctx->Const.MaxUniformBlockSize = 65536; 558 559 for (int i = 0; i < MESA_SHADER_STAGES; i++) { 560 struct gl_program_constants *prog = &ctx->Const.Program[i]; 561 562 if (!stage_exists[i]) 563 continue; 564 565 prog->MaxTextureImageUnits = max_samplers; 566 567 prog->MaxUniformBlocks = BRW_MAX_UBO; 568 prog->MaxCombinedUniformComponents = 569 prog->MaxUniformComponents + 570 ctx->Const.MaxUniformBlockSize / 4 * prog->MaxUniformBlocks; 571 572 prog->MaxAtomicCounters = MAX_ATOMIC_COUNTERS; 573 prog->MaxAtomicBuffers = BRW_MAX_ABO; 574 prog->MaxImageUniforms = compiler->scalar_stage[i] ? BRW_MAX_IMAGES : 0; 575 prog->MaxShaderStorageBlocks = BRW_MAX_SSBO; 576 } 577 578 ctx->Const.MaxTextureUnits = 579 MIN2(ctx->Const.MaxTextureCoordUnits, 580 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits); 581 582 ctx->Const.MaxUniformBufferBindings = num_stages * BRW_MAX_UBO; 583 ctx->Const.MaxCombinedUniformBlocks = num_stages * BRW_MAX_UBO; 584 ctx->Const.MaxCombinedAtomicBuffers = num_stages * BRW_MAX_ABO; 585 ctx->Const.MaxCombinedShaderStorageBlocks = num_stages * BRW_MAX_SSBO; 586 ctx->Const.MaxShaderStorageBufferBindings = num_stages * BRW_MAX_SSBO; 587 ctx->Const.MaxCombinedTextureImageUnits = num_stages * max_samplers; 588 ctx->Const.MaxCombinedImageUniforms = num_stages * BRW_MAX_IMAGES; 589 590 591 /* Hardware only supports a limited number of transform feedback buffers. 592 * So we need to override the Mesa default (which is based only on software 593 * limits). 594 */ 595 ctx->Const.MaxTransformFeedbackBuffers = BRW_MAX_SOL_BUFFERS; 596 597 /* On Gen6, in the worst case, we use up one binding table entry per 598 * transform feedback component (see comments above the definition of 599 * BRW_MAX_SOL_BINDINGS, in brw_context.h), so we need to advertise a value 600 * for MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS equal to 601 * BRW_MAX_SOL_BINDINGS. 602 * 603 * In "separate components" mode, we need to divide this value by 604 * BRW_MAX_SOL_BUFFERS, so that the total number of binding table entries 605 * used up by all buffers will not exceed BRW_MAX_SOL_BINDINGS. 606 */ 607 ctx->Const.MaxTransformFeedbackInterleavedComponents = BRW_MAX_SOL_BINDINGS; 608 ctx->Const.MaxTransformFeedbackSeparateComponents = 609 BRW_MAX_SOL_BINDINGS / BRW_MAX_SOL_BUFFERS; 610 611 ctx->Const.AlwaysUseGetTransformFeedbackVertexCount = 612 !can_do_mi_math_and_lrr(brw->screen); 613 614 int max_samples; 615 const int *msaa_modes = intel_supported_msaa_modes(brw->screen); 616 const int clamp_max_samples = 617 driQueryOptioni(&brw->optionCache, "clamp_max_samples"); 618 619 if (clamp_max_samples < 0) { 620 max_samples = msaa_modes[0]; 621 } else { 622 /* Select the largest supported MSAA mode that does not exceed 623 * clamp_max_samples. 624 */ 625 max_samples = 0; 626 for (int i = 0; msaa_modes[i] != 0; ++i) { 627 if (msaa_modes[i] <= clamp_max_samples) { 628 max_samples = msaa_modes[i]; 629 break; 630 } 631 } 632 } 633 634 ctx->Const.MaxSamples = max_samples; 635 ctx->Const.MaxColorTextureSamples = max_samples; 636 ctx->Const.MaxDepthTextureSamples = max_samples; 637 ctx->Const.MaxIntegerSamples = max_samples; 638 ctx->Const.MaxImageSamples = 0; 639 640 /* gen6_set_sample_maps() sets SampleMap{2,4,8}x variables which are used 641 * to map indices of rectangular grid to sample numbers within a pixel. 642 * These variables are used by GL_EXT_framebuffer_multisample_blit_scaled 643 * extension implementation. For more details see the comment above 644 * gen6_set_sample_maps() definition. 645 */ 646 gen6_set_sample_maps(ctx); 647 648 ctx->Const.MinLineWidth = 1.0; 649 ctx->Const.MinLineWidthAA = 1.0; 650 if (brw->gen >= 6) { 651 ctx->Const.MaxLineWidth = 7.375; 652 ctx->Const.MaxLineWidthAA = 7.375; 653 ctx->Const.LineWidthGranularity = 0.125; 654 } else { 655 ctx->Const.MaxLineWidth = 7.0; 656 ctx->Const.MaxLineWidthAA = 7.0; 657 ctx->Const.LineWidthGranularity = 0.5; 658 } 659 660 /* For non-antialiased lines, we have to round the line width to the 661 * nearest whole number. Make sure that we don't advertise a line 662 * width that, when rounded, will be beyond the actual hardware 663 * maximum. 664 */ 665 assert(roundf(ctx->Const.MaxLineWidth) <= ctx->Const.MaxLineWidth); 666 667 ctx->Const.MinPointSize = 1.0; 668 ctx->Const.MinPointSizeAA = 1.0; 669 ctx->Const.MaxPointSize = 255.0; 670 ctx->Const.MaxPointSizeAA = 255.0; 671 ctx->Const.PointSizeGranularity = 1.0; 672 673 if (brw->gen >= 5 || brw->is_g4x) 674 ctx->Const.MaxClipPlanes = 8; 675 676 ctx->Const.GLSLTessLevelsAsInputs = true; 677 ctx->Const.LowerTCSPatchVerticesIn = brw->gen >= 8; 678 ctx->Const.LowerTESPatchVerticesIn = true; 679 ctx->Const.PrimitiveRestartForPatches = true; 680 681 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeInstructions = 16 * 1024; 682 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAluInstructions = 0; 683 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTexInstructions = 0; 684 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTexIndirections = 0; 685 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeAluInstructions = 0; 686 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeTexInstructions = 0; 687 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeTexIndirections = 0; 688 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeAttribs = 16; 689 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeTemps = 256; 690 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeAddressRegs = 1; 691 ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeParameters = 1024; 692 ctx->Const.Program[MESA_SHADER_VERTEX].MaxEnvParams = 693 MIN2(ctx->Const.Program[MESA_SHADER_VERTEX].MaxNativeParameters, 694 ctx->Const.Program[MESA_SHADER_VERTEX].MaxEnvParams); 695 696 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeInstructions = 1024; 697 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeAluInstructions = 1024; 698 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeTexInstructions = 1024; 699 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeTexIndirections = 1024; 700 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeAttribs = 12; 701 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeTemps = 256; 702 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeAddressRegs = 0; 703 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeParameters = 1024; 704 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxEnvParams = 705 MIN2(ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxNativeParameters, 706 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxEnvParams); 707 708 /* Fragment shaders use real, 32-bit twos-complement integers for all 709 * integer types. 710 */ 711 ctx->Const.Program[MESA_SHADER_FRAGMENT].LowInt.RangeMin = 31; 712 ctx->Const.Program[MESA_SHADER_FRAGMENT].LowInt.RangeMax = 30; 713 ctx->Const.Program[MESA_SHADER_FRAGMENT].LowInt.Precision = 0; 714 ctx->Const.Program[MESA_SHADER_FRAGMENT].HighInt = ctx->Const.Program[MESA_SHADER_FRAGMENT].LowInt; 715 ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt = ctx->Const.Program[MESA_SHADER_FRAGMENT].LowInt; 716 717 ctx->Const.Program[MESA_SHADER_VERTEX].LowInt.RangeMin = 31; 718 ctx->Const.Program[MESA_SHADER_VERTEX].LowInt.RangeMax = 30; 719 ctx->Const.Program[MESA_SHADER_VERTEX].LowInt.Precision = 0; 720 ctx->Const.Program[MESA_SHADER_VERTEX].HighInt = ctx->Const.Program[MESA_SHADER_VERTEX].LowInt; 721 ctx->Const.Program[MESA_SHADER_VERTEX].MediumInt = ctx->Const.Program[MESA_SHADER_VERTEX].LowInt; 722 723 /* Gen6 converts quads to polygon in beginning of 3D pipeline, 724 * but we're not sure how it's actually done for vertex order, 725 * that affect provoking vertex decision. Always use last vertex 726 * convention for quad primitive which works as expected for now. 727 */ 728 if (brw->gen >= 6) 729 ctx->Const.QuadsFollowProvokingVertexConvention = false; 730 731 ctx->Const.NativeIntegers = true; 732 ctx->Const.VertexID_is_zero_based = true; 733 734 /* Regarding the CMP instruction, the Ivybridge PRM says: 735 * 736 * "For each enabled channel 0b or 1b is assigned to the appropriate flag 737 * bit and 0/all zeros or all ones (e.g, byte 0xFF, word 0xFFFF, DWord 738 * 0xFFFFFFFF) is assigned to dst." 739 * 740 * but PRMs for earlier generations say 741 * 742 * "In dword format, one GRF may store up to 8 results. When the register 743 * is used later as a vector of Booleans, as only LSB at each channel 744 * contains meaning [sic] data, software should make sure all higher bits 745 * are masked out (e.g. by 'and-ing' an [sic] 0x01 constant)." 746 * 747 * We select the representation of a true boolean uniform to be ~0, and fix 748 * the results of Gen <= 5 CMP instruction's with -(result & 1). 749 */ 750 ctx->Const.UniformBooleanTrue = ~0; 751 752 /* From the gen4 PRM, volume 4 page 127: 753 * 754 * "For SURFTYPE_BUFFER non-rendertarget surfaces, this field specifies 755 * the base address of the first element of the surface, computed in 756 * software by adding the surface base address to the byte offset of 757 * the element in the buffer." 758 * 759 * However, unaligned accesses are slower, so enforce buffer alignment. 760 */ 761 ctx->Const.UniformBufferOffsetAlignment = 16; 762 763 /* ShaderStorageBufferOffsetAlignment should be a cacheline (64 bytes) so 764 * that we can safely have the CPU and GPU writing the same SSBO on 765 * non-cachecoherent systems (our Atom CPUs). With UBOs, the GPU never 766 * writes, so there's no problem. For an SSBO, the GPU and the CPU can 767 * be updating disjoint regions of the buffer simultaneously and that will 768 * break if the regions overlap the same cacheline. 769 */ 770 ctx->Const.ShaderStorageBufferOffsetAlignment = 64; 771 ctx->Const.TextureBufferOffsetAlignment = 16; 772 ctx->Const.MaxTextureBufferSize = 128 * 1024 * 1024; 773 774 if (brw->gen >= 6) { 775 ctx->Const.MaxVarying = 32; 776 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 128; 777 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents = 64; 778 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents = 128; 779 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 128; 780 ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxInputComponents = 128; 781 ctx->Const.Program[MESA_SHADER_TESS_CTRL].MaxOutputComponents = 128; 782 ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxInputComponents = 128; 783 ctx->Const.Program[MESA_SHADER_TESS_EVAL].MaxOutputComponents = 128; 784 } 785 786 /* We want the GLSL compiler to emit code that uses condition codes */ 787 for (int i = 0; i < MESA_SHADER_STAGES; i++) { 788 ctx->Const.ShaderCompilerOptions[i] = 789 brw->screen->compiler->glsl_compiler_options[i]; 790 } 791 792 if (brw->gen >= 7) { 793 ctx->Const.MaxViewportWidth = 32768; 794 ctx->Const.MaxViewportHeight = 32768; 795 } 796 797 /* ARB_viewport_array, OES_viewport_array */ 798 if (brw->gen >= 6) { 799 ctx->Const.MaxViewports = GEN6_NUM_VIEWPORTS; 800 ctx->Const.ViewportSubpixelBits = 0; 801 802 /* Cast to float before negating because MaxViewportWidth is unsigned. 803 */ 804 ctx->Const.ViewportBounds.Min = -(float)ctx->Const.MaxViewportWidth; 805 ctx->Const.ViewportBounds.Max = ctx->Const.MaxViewportWidth; 806 } 807 808 /* ARB_gpu_shader5 */ 809 if (brw->gen >= 7) 810 ctx->Const.MaxVertexStreams = MIN2(4, MAX_VERTEX_STREAMS); 811 812 /* ARB_framebuffer_no_attachments */ 813 ctx->Const.MaxFramebufferWidth = 16384; 814 ctx->Const.MaxFramebufferHeight = 16384; 815 ctx->Const.MaxFramebufferLayers = ctx->Const.MaxArrayTextureLayers; 816 ctx->Const.MaxFramebufferSamples = max_samples; 817 818 /* OES_primitive_bounding_box */ 819 ctx->Const.NoPrimitiveBoundingBoxOutput = true; 820 } 821 822 static void 823 brw_initialize_cs_context_constants(struct brw_context *brw) 824 { 825 struct gl_context *ctx = &brw->ctx; 826 const struct intel_screen *screen = brw->screen; 827 struct gen_device_info *devinfo = &brw->screen->devinfo; 828 829 /* FINISHME: Do this for all platforms that the kernel supports */ 830 if (brw->is_cherryview && 831 screen->subslice_total > 0 && screen->eu_total > 0) { 832 /* Logical CS threads = EUs per subslice * 7 threads per EU */ 833 uint32_t max_cs_threads = screen->eu_total / screen->subslice_total * 7; 834 835 /* Fuse configurations may give more threads than expected, never less. */ 836 if (max_cs_threads > devinfo->max_cs_threads) 837 devinfo->max_cs_threads = max_cs_threads; 838 } 839 840 /* Maximum number of scalar compute shader invocations that can be run in 841 * parallel in the same subslice assuming SIMD32 dispatch. 842 * 843 * We don't advertise more than 64 threads, because we are limited to 64 by 844 * our usage of thread_width_max in the gpgpu walker command. This only 845 * currently impacts Haswell, which otherwise might be able to advertise 70 846 * threads. With SIMD32 and 64 threads, Haswell still provides twice the 847 * required the number of invocation needed for ARB_compute_shader. 848 */ 849 const unsigned max_threads = MIN2(64, devinfo->max_cs_threads); 850 const uint32_t max_invocations = 32 * max_threads; 851 ctx->Const.MaxComputeWorkGroupSize[0] = max_invocations; 852 ctx->Const.MaxComputeWorkGroupSize[1] = max_invocations; 853 ctx->Const.MaxComputeWorkGroupSize[2] = max_invocations; 854 ctx->Const.MaxComputeWorkGroupInvocations = max_invocations; 855 ctx->Const.MaxComputeSharedMemorySize = 64 * 1024; 856 } 857 858 /** 859 * Process driconf (drirc) options, setting appropriate context flags. 860 * 861 * intelInitExtensions still pokes at optionCache directly, in order to 862 * avoid advertising various extensions. No flags are set, so it makes 863 * sense to continue doing that there. 864 */ 865 static void 866 brw_process_driconf_options(struct brw_context *brw) 867 { 868 struct gl_context *ctx = &brw->ctx; 869 870 driOptionCache *options = &brw->optionCache; 871 driParseConfigFiles(options, &brw->screen->optionCache, 872 brw->driContext->driScreenPriv->myNum, "i965"); 873 874 int bo_reuse_mode = driQueryOptioni(options, "bo_reuse"); 875 switch (bo_reuse_mode) { 876 case DRI_CONF_BO_REUSE_DISABLED: 877 break; 878 case DRI_CONF_BO_REUSE_ALL: 879 intel_bufmgr_gem_enable_reuse(brw->bufmgr); 880 break; 881 } 882 883 if (!driQueryOptionb(options, "hiz")) { 884 brw->has_hiz = false; 885 /* On gen6, you can only do separate stencil with HIZ. */ 886 if (brw->gen == 6) 887 brw->has_separate_stencil = false; 888 } 889 890 if (driQueryOptionb(options, "always_flush_batch")) { 891 fprintf(stderr, "flushing batchbuffer before/after each draw call\n"); 892 brw->always_flush_batch = true; 893 } 894 895 if (driQueryOptionb(options, "always_flush_cache")) { 896 fprintf(stderr, "flushing GPU caches before/after each draw call\n"); 897 brw->always_flush_cache = true; 898 } 899 900 if (driQueryOptionb(options, "disable_throttling")) { 901 fprintf(stderr, "disabling flush throttling\n"); 902 brw->disable_throttling = true; 903 } 904 905 brw->precompile = driQueryOptionb(&brw->optionCache, "shader_precompile"); 906 907 if (driQueryOptionb(&brw->optionCache, "precise_trig")) 908 brw->screen->compiler->precise_trig = true; 909 910 ctx->Const.ForceGLSLExtensionsWarn = 911 driQueryOptionb(options, "force_glsl_extensions_warn"); 912 913 ctx->Const.ForceGLSLVersion = 914 driQueryOptioni(options, "force_glsl_version"); 915 916 ctx->Const.DisableGLSLLineContinuations = 917 driQueryOptionb(options, "disable_glsl_line_continuations"); 918 919 ctx->Const.AllowGLSLExtensionDirectiveMidShader = 920 driQueryOptionb(options, "allow_glsl_extension_directive_midshader"); 921 922 ctx->Const.GLSLZeroInit = driQueryOptionb(options, "glsl_zero_init"); 923 924 brw->dual_color_blend_by_location = 925 driQueryOptionb(options, "dual_color_blend_by_location"); 926 } 927 928 GLboolean 929 brwCreateContext(gl_api api, 930 const struct gl_config *mesaVis, 931 __DRIcontext *driContextPriv, 932 unsigned major_version, 933 unsigned minor_version, 934 uint32_t flags, 935 bool notify_reset, 936 unsigned *dri_ctx_error, 937 void *sharedContextPrivate) 938 { 939 struct gl_context *shareCtx = (struct gl_context *) sharedContextPrivate; 940 struct intel_screen *screen = driContextPriv->driScreenPriv->driverPrivate; 941 const struct gen_device_info *devinfo = &screen->devinfo; 942 struct dd_function_table functions; 943 944 /* Only allow the __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS flag if the kernel 945 * provides us with context reset notifications. 946 */ 947 uint32_t allowed_flags = __DRI_CTX_FLAG_DEBUG 948 | __DRI_CTX_FLAG_FORWARD_COMPATIBLE; 949 950 if (screen->has_context_reset_notification) 951 allowed_flags |= __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS; 952 953 if (flags & ~allowed_flags) { 954 *dri_ctx_error = __DRI_CTX_ERROR_UNKNOWN_FLAG; 955 return false; 956 } 957 958 struct brw_context *brw = rzalloc(NULL, struct brw_context); 959 if (!brw) { 960 fprintf(stderr, "%s: failed to alloc context\n", __func__); 961 *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY; 962 return false; 963 } 964 965 driContextPriv->driverPrivate = brw; 966 brw->driContext = driContextPriv; 967 brw->screen = screen; 968 brw->bufmgr = screen->bufmgr; 969 970 brw->gen = devinfo->gen; 971 brw->gt = devinfo->gt; 972 brw->is_g4x = devinfo->is_g4x; 973 brw->is_baytrail = devinfo->is_baytrail; 974 brw->is_haswell = devinfo->is_haswell; 975 brw->is_cherryview = devinfo->is_cherryview; 976 brw->is_broxton = devinfo->is_broxton; 977 brw->has_llc = devinfo->has_llc; 978 brw->has_hiz = devinfo->has_hiz_and_separate_stencil; 979 brw->has_separate_stencil = devinfo->has_hiz_and_separate_stencil; 980 brw->has_pln = devinfo->has_pln; 981 brw->has_compr4 = devinfo->has_compr4; 982 brw->has_surface_tile_offset = devinfo->has_surface_tile_offset; 983 brw->has_negative_rhw_bug = devinfo->has_negative_rhw_bug; 984 brw->needs_unlit_centroid_workaround = 985 devinfo->needs_unlit_centroid_workaround; 986 987 brw->must_use_separate_stencil = devinfo->must_use_separate_stencil; 988 brw->has_swizzling = screen->hw_has_swizzling; 989 990 isl_device_init(&brw->isl_dev, devinfo, screen->hw_has_swizzling); 991 992 brw->vs.base.stage = MESA_SHADER_VERTEX; 993 brw->tcs.base.stage = MESA_SHADER_TESS_CTRL; 994 brw->tes.base.stage = MESA_SHADER_TESS_EVAL; 995 brw->gs.base.stage = MESA_SHADER_GEOMETRY; 996 brw->wm.base.stage = MESA_SHADER_FRAGMENT; 997 if (brw->gen >= 8) { 998 gen8_init_vtable_surface_functions(brw); 999 brw->vtbl.emit_depth_stencil_hiz = gen8_emit_depth_stencil_hiz; 1000 } else if (brw->gen >= 7) { 1001 gen7_init_vtable_surface_functions(brw); 1002 brw->vtbl.emit_depth_stencil_hiz = gen7_emit_depth_stencil_hiz; 1003 } else if (brw->gen >= 6) { 1004 gen6_init_vtable_surface_functions(brw); 1005 brw->vtbl.emit_depth_stencil_hiz = gen6_emit_depth_stencil_hiz; 1006 } else { 1007 gen4_init_vtable_surface_functions(brw); 1008 brw->vtbl.emit_depth_stencil_hiz = brw_emit_depth_stencil_hiz; 1009 } 1010 1011 brw_init_driver_functions(brw, &functions); 1012 1013 if (notify_reset) 1014 functions.GetGraphicsResetStatus = brw_get_graphics_reset_status; 1015 1016 struct gl_context *ctx = &brw->ctx; 1017 1018 if (!_mesa_initialize_context(ctx, api, mesaVis, shareCtx, &functions)) { 1019 *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY; 1020 fprintf(stderr, "%s: failed to init mesa context\n", __func__); 1021 intelDestroyContext(driContextPriv); 1022 return false; 1023 } 1024 1025 driContextSetFlags(ctx, flags); 1026 1027 /* Initialize the software rasterizer and helper modules. 1028 * 1029 * As of GL 3.1 core, the gen4+ driver doesn't need the swrast context for 1030 * software fallbacks (which we have to support on legacy GL to do weird 1031 * glDrawPixels(), glBitmap(), and other functions). 1032 */ 1033 if (api != API_OPENGL_CORE && api != API_OPENGLES2) { 1034 _swrast_CreateContext(ctx); 1035 } 1036 1037 _vbo_CreateContext(ctx); 1038 if (ctx->swrast_context) { 1039 _tnl_CreateContext(ctx); 1040 TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline; 1041 _swsetup_CreateContext(ctx); 1042 1043 /* Configure swrast to match hardware characteristics: */ 1044 _swrast_allow_pixel_fog(ctx, false); 1045 _swrast_allow_vertex_fog(ctx, true); 1046 } 1047 1048 _mesa_meta_init(ctx); 1049 1050 brw_process_driconf_options(brw); 1051 1052 if (INTEL_DEBUG & DEBUG_PERF) 1053 brw->perf_debug = true; 1054 1055 brw_initialize_cs_context_constants(brw); 1056 brw_initialize_context_constants(brw); 1057 1058 ctx->Const.ResetStrategy = notify_reset 1059 ? GL_LOSE_CONTEXT_ON_RESET_ARB : GL_NO_RESET_NOTIFICATION_ARB; 1060 1061 /* Reinitialize the context point state. It depends on ctx->Const values. */ 1062 _mesa_init_point(ctx); 1063 1064 intel_fbo_init(brw); 1065 1066 intel_batchbuffer_init(&brw->batch, brw->bufmgr, brw->has_llc); 1067 1068 if (brw->gen >= 6) { 1069 /* Create a new hardware context. Using a hardware context means that 1070 * our GPU state will be saved/restored on context switch, allowing us 1071 * to assume that the GPU is in the same state we left it in. 1072 * 1073 * This is required for transform feedback buffer offsets, query objects, 1074 * and also allows us to reduce how much state we have to emit. 1075 */ 1076 brw->hw_ctx = drm_intel_gem_context_create(brw->bufmgr); 1077 1078 if (!brw->hw_ctx) { 1079 fprintf(stderr, "Gen6+ requires Kernel 3.6 or later.\n"); 1080 intelDestroyContext(driContextPriv); 1081 return false; 1082 } 1083 } 1084 1085 if (brw_init_pipe_control(brw, devinfo)) { 1086 *dri_ctx_error = __DRI_CTX_ERROR_NO_MEMORY; 1087 intelDestroyContext(driContextPriv); 1088 return false; 1089 } 1090 1091 brw_init_state(brw); 1092 1093 intelInitExtensions(ctx); 1094 1095 brw_init_surface_formats(brw); 1096 1097 if (brw->gen >= 6) 1098 brw_blorp_init(brw); 1099 1100 brw->urb.size = devinfo->urb.size; 1101 1102 if (brw->gen == 6) 1103 brw->urb.gs_present = false; 1104 1105 brw->prim_restart.in_progress = false; 1106 brw->prim_restart.enable_cut_index = false; 1107 brw->gs.enabled = false; 1108 brw->sf.viewport_transform_enable = true; 1109 brw->clip.viewport_count = 1; 1110 1111 brw->predicate.state = BRW_PREDICATE_STATE_RENDER; 1112 1113 brw->max_gtt_map_object_size = screen->max_gtt_map_object_size; 1114 1115 brw->use_resource_streamer = screen->has_resource_streamer && 1116 (env_var_as_boolean("INTEL_USE_HW_BT", false) || 1117 env_var_as_boolean("INTEL_USE_GATHER", false)); 1118 1119 ctx->VertexProgram._MaintainTnlProgram = true; 1120 ctx->FragmentProgram._MaintainTexEnvProgram = true; 1121 1122 brw_draw_init( brw ); 1123 1124 if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) { 1125 /* Turn on some extra GL_ARB_debug_output generation. */ 1126 brw->perf_debug = true; 1127 } 1128 1129 if ((flags & __DRI_CTX_FLAG_ROBUST_BUFFER_ACCESS) != 0) { 1130 ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB; 1131 ctx->Const.RobustAccess = GL_TRUE; 1132 } 1133 1134 if (INTEL_DEBUG & DEBUG_SHADER_TIME) 1135 brw_init_shader_time(brw); 1136 1137 _mesa_compute_version(ctx); 1138 1139 _mesa_initialize_dispatch_tables(ctx); 1140 _mesa_initialize_vbo_vtxfmt(ctx); 1141 1142 vbo_use_buffer_objects(ctx); 1143 vbo_always_unmap_buffers(ctx); 1144 1145 return true; 1146 } 1147 1148 void 1149 intelDestroyContext(__DRIcontext * driContextPriv) 1150 { 1151 struct brw_context *brw = 1152 (struct brw_context *) driContextPriv->driverPrivate; 1153 struct gl_context *ctx = &brw->ctx; 1154 1155 /* Dump a final BMP in case the application doesn't call SwapBuffers */ 1156 if (INTEL_DEBUG & DEBUG_AUB) { 1157 intel_batchbuffer_flush(brw); 1158 aub_dump_bmp(&brw->ctx); 1159 } 1160 1161 _mesa_meta_free(&brw->ctx); 1162 1163 if (INTEL_DEBUG & DEBUG_SHADER_TIME) { 1164 /* Force a report. */ 1165 brw->shader_time.report_time = 0; 1166 1167 brw_collect_and_report_shader_time(brw); 1168 brw_destroy_shader_time(brw); 1169 } 1170 1171 if (brw->gen >= 6) 1172 blorp_finish(&brw->blorp); 1173 1174 brw_destroy_state(brw); 1175 brw_draw_destroy(brw); 1176 1177 drm_intel_bo_unreference(brw->curbe.curbe_bo); 1178 if (brw->vs.base.scratch_bo) 1179 drm_intel_bo_unreference(brw->vs.base.scratch_bo); 1180 if (brw->tcs.base.scratch_bo) 1181 drm_intel_bo_unreference(brw->tcs.base.scratch_bo); 1182 if (brw->tes.base.scratch_bo) 1183 drm_intel_bo_unreference(brw->tes.base.scratch_bo); 1184 if (brw->gs.base.scratch_bo) 1185 drm_intel_bo_unreference(brw->gs.base.scratch_bo); 1186 if (brw->wm.base.scratch_bo) 1187 drm_intel_bo_unreference(brw->wm.base.scratch_bo); 1188 1189 gen7_reset_hw_bt_pool_offsets(brw); 1190 drm_intel_bo_unreference(brw->hw_bt_pool.bo); 1191 brw->hw_bt_pool.bo = NULL; 1192 1193 drm_intel_gem_context_destroy(brw->hw_ctx); 1194 1195 if (ctx->swrast_context) { 1196 _swsetup_DestroyContext(&brw->ctx); 1197 _tnl_DestroyContext(&brw->ctx); 1198 } 1199 _vbo_DestroyContext(&brw->ctx); 1200 1201 if (ctx->swrast_context) 1202 _swrast_DestroyContext(&brw->ctx); 1203 1204 brw_fini_pipe_control(brw); 1205 intel_batchbuffer_free(&brw->batch); 1206 1207 drm_intel_bo_unreference(brw->throttle_batch[1]); 1208 drm_intel_bo_unreference(brw->throttle_batch[0]); 1209 brw->throttle_batch[1] = NULL; 1210 brw->throttle_batch[0] = NULL; 1211 1212 driDestroyOptionCache(&brw->optionCache); 1213 1214 /* free the Mesa context */ 1215 _mesa_free_context_data(&brw->ctx); 1216 1217 ralloc_free(brw); 1218 driContextPriv->driverPrivate = NULL; 1219 } 1220 1221 GLboolean 1222 intelUnbindContext(__DRIcontext * driContextPriv) 1223 { 1224 /* Unset current context and dispath table */ 1225 _mesa_make_current(NULL, NULL, NULL); 1226 1227 return true; 1228 } 1229 1230 /** 1231 * Fixes up the context for GLES23 with our default-to-sRGB-capable behavior 1232 * on window system framebuffers. 1233 * 1234 * Desktop GL is fairly reasonable in its handling of sRGB: You can ask if 1235 * your renderbuffer can do sRGB encode, and you can flip a switch that does 1236 * sRGB encode if the renderbuffer can handle it. You can ask specifically 1237 * for a visual where you're guaranteed to be capable, but it turns out that 1238 * everyone just makes all their ARGB8888 visuals capable and doesn't offer 1239 * incapable ones, because there's no difference between the two in resources 1240 * used. Applications thus get built that accidentally rely on the default 1241 * visual choice being sRGB, so we make ours sRGB capable. Everything sounds 1242 * great... 1243 * 1244 * But for GLES2/3, they decided that it was silly to not turn on sRGB encode 1245 * for sRGB renderbuffers you made with the GL_EXT_texture_sRGB equivalent. 1246 * So they removed the enable knob and made it "if the renderbuffer is sRGB 1247 * capable, do sRGB encode". Then, for your window system renderbuffers, you 1248 * can ask for sRGB visuals and get sRGB encode, or not ask for sRGB visuals 1249 * and get no sRGB encode (assuming that both kinds of visual are available). 1250 * Thus our choice to support sRGB by default on our visuals for desktop would 1251 * result in broken rendering of GLES apps that aren't expecting sRGB encode. 1252 * 1253 * Unfortunately, renderbuffer setup happens before a context is created. So 1254 * in intel_screen.c we always set up sRGB, and here, if you're a GLES2/3 1255 * context (without an sRGB visual, though we don't have sRGB visuals exposed 1256 * yet), we go turn that back off before anyone finds out. 1257 */ 1258 static void 1259 intel_gles3_srgb_workaround(struct brw_context *brw, 1260 struct gl_framebuffer *fb) 1261 { 1262 struct gl_context *ctx = &brw->ctx; 1263 1264 if (_mesa_is_desktop_gl(ctx) || !fb->Visual.sRGBCapable) 1265 return; 1266 1267 /* Some day when we support the sRGB capable bit on visuals available for 1268 * GLES, we'll need to respect that and not disable things here. 1269 */ 1270 fb->Visual.sRGBCapable = false; 1271 for (int i = 0; i < BUFFER_COUNT; i++) { 1272 struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer; 1273 if (rb) 1274 rb->Format = _mesa_get_srgb_format_linear(rb->Format); 1275 } 1276 } 1277 1278 GLboolean 1279 intelMakeCurrent(__DRIcontext * driContextPriv, 1280 __DRIdrawable * driDrawPriv, 1281 __DRIdrawable * driReadPriv) 1282 { 1283 struct brw_context *brw; 1284 GET_CURRENT_CONTEXT(curCtx); 1285 1286 if (driContextPriv) 1287 brw = (struct brw_context *) driContextPriv->driverPrivate; 1288 else 1289 brw = NULL; 1290 1291 /* According to the glXMakeCurrent() man page: "Pending commands to 1292 * the previous context, if any, are flushed before it is released." 1293 * But only flush if we're actually changing contexts. 1294 */ 1295 if (brw_context(curCtx) && brw_context(curCtx) != brw) { 1296 _mesa_flush(curCtx); 1297 } 1298 1299 if (driContextPriv) { 1300 struct gl_context *ctx = &brw->ctx; 1301 struct gl_framebuffer *fb, *readFb; 1302 1303 if (driDrawPriv == NULL) { 1304 fb = _mesa_get_incomplete_framebuffer(); 1305 } else { 1306 fb = driDrawPriv->driverPrivate; 1307 driContextPriv->dri2.draw_stamp = driDrawPriv->dri2.stamp - 1; 1308 } 1309 1310 if (driReadPriv == NULL) { 1311 readFb = _mesa_get_incomplete_framebuffer(); 1312 } else { 1313 readFb = driReadPriv->driverPrivate; 1314 driContextPriv->dri2.read_stamp = driReadPriv->dri2.stamp - 1; 1315 } 1316 1317 /* The sRGB workaround changes the renderbuffer's format. We must change 1318 * the format before the renderbuffer's miptree get's allocated, otherwise 1319 * the formats of the renderbuffer and its miptree will differ. 1320 */ 1321 intel_gles3_srgb_workaround(brw, fb); 1322 intel_gles3_srgb_workaround(brw, readFb); 1323 1324 /* If the context viewport hasn't been initialized, force a call out to 1325 * the loader to get buffers so we have a drawable size for the initial 1326 * viewport. */ 1327 if (!brw->ctx.ViewportInitialized) 1328 intel_prepare_render(brw); 1329 1330 _mesa_make_current(ctx, fb, readFb); 1331 } else { 1332 _mesa_make_current(NULL, NULL, NULL); 1333 } 1334 1335 return true; 1336 } 1337 1338 void 1339 intel_resolve_for_dri2_flush(struct brw_context *brw, 1340 __DRIdrawable *drawable) 1341 { 1342 if (brw->gen < 6) { 1343 /* MSAA and fast color clear are not supported, so don't waste time 1344 * checking whether a resolve is needed. 1345 */ 1346 return; 1347 } 1348 1349 struct gl_framebuffer *fb = drawable->driverPrivate; 1350 struct intel_renderbuffer *rb; 1351 1352 /* Usually, only the back buffer will need to be downsampled. However, 1353 * the front buffer will also need it if the user has rendered into it. 1354 */ 1355 static const gl_buffer_index buffers[2] = { 1356 BUFFER_BACK_LEFT, 1357 BUFFER_FRONT_LEFT, 1358 }; 1359 1360 for (int i = 0; i < 2; ++i) { 1361 rb = intel_get_renderbuffer(fb, buffers[i]); 1362 if (rb == NULL || rb->mt == NULL) 1363 continue; 1364 if (rb->mt->num_samples <= 1) { 1365 assert(rb->mt_layer == 0 && rb->mt_level == 0 && 1366 rb->layer_count == 1); 1367 intel_miptree_resolve_color(brw, rb->mt, 0, 0, 1, 0); 1368 } else { 1369 intel_renderbuffer_downsample(brw, rb); 1370 } 1371 } 1372 } 1373 1374 static unsigned 1375 intel_bits_per_pixel(const struct intel_renderbuffer *rb) 1376 { 1377 return _mesa_get_format_bytes(intel_rb_format(rb)) * 8; 1378 } 1379 1380 static void 1381 intel_query_dri2_buffers(struct brw_context *brw, 1382 __DRIdrawable *drawable, 1383 __DRIbuffer **buffers, 1384 int *count); 1385 1386 static void 1387 intel_process_dri2_buffer(struct brw_context *brw, 1388 __DRIdrawable *drawable, 1389 __DRIbuffer *buffer, 1390 struct intel_renderbuffer *rb, 1391 const char *buffer_name); 1392 1393 static void 1394 intel_update_image_buffers(struct brw_context *brw, __DRIdrawable *drawable); 1395 1396 static void 1397 intel_update_dri2_buffers(struct brw_context *brw, __DRIdrawable *drawable) 1398 { 1399 struct gl_framebuffer *fb = drawable->driverPrivate; 1400 struct intel_renderbuffer *rb; 1401 __DRIbuffer *buffers = NULL; 1402 int i, count; 1403 const char *region_name; 1404 1405 /* Set this up front, so that in case our buffers get invalidated 1406 * while we're getting new buffers, we don't clobber the stamp and 1407 * thus ignore the invalidate. */ 1408 drawable->lastStamp = drawable->dri2.stamp; 1409 1410 if (unlikely(INTEL_DEBUG & DEBUG_DRI)) 1411 fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable); 1412 1413 intel_query_dri2_buffers(brw, drawable, &buffers, &count); 1414 1415 if (buffers == NULL) 1416 return; 1417 1418 for (i = 0; i < count; i++) { 1419 switch (buffers[i].attachment) { 1420 case __DRI_BUFFER_FRONT_LEFT: 1421 rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); 1422 region_name = "dri2 front buffer"; 1423 break; 1424 1425 case __DRI_BUFFER_FAKE_FRONT_LEFT: 1426 rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); 1427 region_name = "dri2 fake front buffer"; 1428 break; 1429 1430 case __DRI_BUFFER_BACK_LEFT: 1431 rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT); 1432 region_name = "dri2 back buffer"; 1433 break; 1434 1435 case __DRI_BUFFER_DEPTH: 1436 case __DRI_BUFFER_HIZ: 1437 case __DRI_BUFFER_DEPTH_STENCIL: 1438 case __DRI_BUFFER_STENCIL: 1439 case __DRI_BUFFER_ACCUM: 1440 default: 1441 fprintf(stderr, 1442 "unhandled buffer attach event, attachment type %d\n", 1443 buffers[i].attachment); 1444 return; 1445 } 1446 1447 intel_process_dri2_buffer(brw, drawable, &buffers[i], rb, region_name); 1448 } 1449 1450 } 1451 1452 void 1453 intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) 1454 { 1455 struct brw_context *brw = context->driverPrivate; 1456 __DRIscreen *dri_screen = brw->screen->driScrnPriv; 1457 1458 /* Set this up front, so that in case our buffers get invalidated 1459 * while we're getting new buffers, we don't clobber the stamp and 1460 * thus ignore the invalidate. */ 1461 drawable->lastStamp = drawable->dri2.stamp; 1462 1463 if (unlikely(INTEL_DEBUG & DEBUG_DRI)) 1464 fprintf(stderr, "enter %s, drawable %p\n", __func__, drawable); 1465 1466 if (dri_screen->image.loader) 1467 intel_update_image_buffers(brw, drawable); 1468 else 1469 intel_update_dri2_buffers(brw, drawable); 1470 1471 driUpdateFramebufferSize(&brw->ctx, drawable); 1472 } 1473 1474 /** 1475 * intel_prepare_render should be called anywhere that curent read/drawbuffer 1476 * state is required. 1477 */ 1478 void 1479 intel_prepare_render(struct brw_context *brw) 1480 { 1481 struct gl_context *ctx = &brw->ctx; 1482 __DRIcontext *driContext = brw->driContext; 1483 __DRIdrawable *drawable; 1484 1485 drawable = driContext->driDrawablePriv; 1486 if (drawable && drawable->dri2.stamp != driContext->dri2.draw_stamp) { 1487 if (drawable->lastStamp != drawable->dri2.stamp) 1488 intel_update_renderbuffers(driContext, drawable); 1489 driContext->dri2.draw_stamp = drawable->dri2.stamp; 1490 } 1491 1492 drawable = driContext->driReadablePriv; 1493 if (drawable && drawable->dri2.stamp != driContext->dri2.read_stamp) { 1494 if (drawable->lastStamp != drawable->dri2.stamp) 1495 intel_update_renderbuffers(driContext, drawable); 1496 driContext->dri2.read_stamp = drawable->dri2.stamp; 1497 } 1498 1499 /* If we're currently rendering to the front buffer, the rendering 1500 * that will happen next will probably dirty the front buffer. So 1501 * mark it as dirty here. 1502 */ 1503 if (_mesa_is_front_buffer_drawing(ctx->DrawBuffer)) 1504 brw->front_buffer_dirty = true; 1505 } 1506 1507 /** 1508 * \brief Query DRI2 to obtain a DRIdrawable's buffers. 1509 * 1510 * To determine which DRI buffers to request, examine the renderbuffers 1511 * attached to the drawable's framebuffer. Then request the buffers with 1512 * DRI2GetBuffers() or DRI2GetBuffersWithFormat(). 1513 * 1514 * This is called from intel_update_renderbuffers(). 1515 * 1516 * \param drawable Drawable whose buffers are queried. 1517 * \param buffers [out] List of buffers returned by DRI2 query. 1518 * \param buffer_count [out] Number of buffers returned. 1519 * 1520 * \see intel_update_renderbuffers() 1521 * \see DRI2GetBuffers() 1522 * \see DRI2GetBuffersWithFormat() 1523 */ 1524 static void 1525 intel_query_dri2_buffers(struct brw_context *brw, 1526 __DRIdrawable *drawable, 1527 __DRIbuffer **buffers, 1528 int *buffer_count) 1529 { 1530 __DRIscreen *dri_screen = brw->screen->driScrnPriv; 1531 struct gl_framebuffer *fb = drawable->driverPrivate; 1532 int i = 0; 1533 unsigned attachments[8]; 1534 1535 struct intel_renderbuffer *front_rb; 1536 struct intel_renderbuffer *back_rb; 1537 1538 front_rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); 1539 back_rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT); 1540 1541 memset(attachments, 0, sizeof(attachments)); 1542 if ((_mesa_is_front_buffer_drawing(fb) || 1543 _mesa_is_front_buffer_reading(fb) || 1544 !back_rb) && front_rb) { 1545 /* If a fake front buffer is in use, then querying for 1546 * __DRI_BUFFER_FRONT_LEFT will cause the server to copy the image from 1547 * the real front buffer to the fake front buffer. So before doing the 1548 * query, we need to make sure all the pending drawing has landed in the 1549 * real front buffer. 1550 */ 1551 intel_batchbuffer_flush(brw); 1552 intel_flush_front(&brw->ctx); 1553 1554 attachments[i++] = __DRI_BUFFER_FRONT_LEFT; 1555 attachments[i++] = intel_bits_per_pixel(front_rb); 1556 } else if (front_rb && brw->front_buffer_dirty) { 1557 /* We have pending front buffer rendering, but we aren't querying for a 1558 * front buffer. If the front buffer we have is a fake front buffer, 1559 * the X server is going to throw it away when it processes the query. 1560 * So before doing the query, make sure all the pending drawing has 1561 * landed in the real front buffer. 1562 */ 1563 intel_batchbuffer_flush(brw); 1564 intel_flush_front(&brw->ctx); 1565 } 1566 1567 if (back_rb) { 1568 attachments[i++] = __DRI_BUFFER_BACK_LEFT; 1569 attachments[i++] = intel_bits_per_pixel(back_rb); 1570 } 1571 1572 assert(i <= ARRAY_SIZE(attachments)); 1573 1574 *buffers = 1575 dri_screen->dri2.loader->getBuffersWithFormat(drawable, 1576 &drawable->w, 1577 &drawable->h, 1578 attachments, i / 2, 1579 buffer_count, 1580 drawable->loaderPrivate); 1581 } 1582 1583 /** 1584 * \brief Assign a DRI buffer's DRM region to a renderbuffer. 1585 * 1586 * This is called from intel_update_renderbuffers(). 1587 * 1588 * \par Note: 1589 * DRI buffers whose attachment point is DRI2BufferStencil or 1590 * DRI2BufferDepthStencil are handled as special cases. 1591 * 1592 * \param buffer_name is a human readable name, such as "dri2 front buffer", 1593 * that is passed to drm_intel_bo_gem_create_from_name(). 1594 * 1595 * \see intel_update_renderbuffers() 1596 */ 1597 static void 1598 intel_process_dri2_buffer(struct brw_context *brw, 1599 __DRIdrawable *drawable, 1600 __DRIbuffer *buffer, 1601 struct intel_renderbuffer *rb, 1602 const char *buffer_name) 1603 { 1604 struct gl_framebuffer *fb = drawable->driverPrivate; 1605 drm_intel_bo *bo; 1606 1607 if (!rb) 1608 return; 1609 1610 unsigned num_samples = rb->Base.Base.NumSamples; 1611 1612 /* We try to avoid closing and reopening the same BO name, because the first 1613 * use of a mapping of the buffer involves a bunch of page faulting which is 1614 * moderately expensive. 1615 */ 1616 struct intel_mipmap_tree *last_mt; 1617 if (num_samples == 0) 1618 last_mt = rb->mt; 1619 else 1620 last_mt = rb->singlesample_mt; 1621 1622 uint32_t old_name = 0; 1623 if (last_mt) { 1624 /* The bo already has a name because the miptree was created by a 1625 * previous call to intel_process_dri2_buffer(). If a bo already has a 1626 * name, then drm_intel_bo_flink() is a low-cost getter. It does not 1627 * create a new name. 1628 */ 1629 drm_intel_bo_flink(last_mt->bo, &old_name); 1630 } 1631 1632 if (old_name == buffer->name) 1633 return; 1634 1635 if (unlikely(INTEL_DEBUG & DEBUG_DRI)) { 1636 fprintf(stderr, 1637 "attaching buffer %d, at %d, cpp %d, pitch %d\n", 1638 buffer->name, buffer->attachment, 1639 buffer->cpp, buffer->pitch); 1640 } 1641 1642 bo = drm_intel_bo_gem_create_from_name(brw->bufmgr, buffer_name, 1643 buffer->name); 1644 if (!bo) { 1645 fprintf(stderr, 1646 "Failed to open BO for returned DRI2 buffer " 1647 "(%dx%d, %s, named %d).\n" 1648 "This is likely a bug in the X Server that will lead to a " 1649 "crash soon.\n", 1650 drawable->w, drawable->h, buffer_name, buffer->name); 1651 return; 1652 } 1653 1654 intel_update_winsys_renderbuffer_miptree(brw, rb, bo, 1655 drawable->w, drawable->h, 1656 buffer->pitch); 1657 1658 if (_mesa_is_front_buffer_drawing(fb) && 1659 (buffer->attachment == __DRI_BUFFER_FRONT_LEFT || 1660 buffer->attachment == __DRI_BUFFER_FAKE_FRONT_LEFT) && 1661 rb->Base.Base.NumSamples > 1) { 1662 intel_renderbuffer_upsample(brw, rb); 1663 } 1664 1665 assert(rb->mt); 1666 1667 drm_intel_bo_unreference(bo); 1668 } 1669 1670 /** 1671 * \brief Query DRI image loader to obtain a DRIdrawable's buffers. 1672 * 1673 * To determine which DRI buffers to request, examine the renderbuffers 1674 * attached to the drawable's framebuffer. Then request the buffers from 1675 * the image loader 1676 * 1677 * This is called from intel_update_renderbuffers(). 1678 * 1679 * \param drawable Drawable whose buffers are queried. 1680 * \param buffers [out] List of buffers returned by DRI2 query. 1681 * \param buffer_count [out] Number of buffers returned. 1682 * 1683 * \see intel_update_renderbuffers() 1684 */ 1685 1686 static void 1687 intel_update_image_buffer(struct brw_context *intel, 1688 __DRIdrawable *drawable, 1689 struct intel_renderbuffer *rb, 1690 __DRIimage *buffer, 1691 enum __DRIimageBufferMask buffer_type) 1692 { 1693 struct gl_framebuffer *fb = drawable->driverPrivate; 1694 1695 if (!rb || !buffer->bo) 1696 return; 1697 1698 unsigned num_samples = rb->Base.Base.NumSamples; 1699 1700 /* Check and see if we're already bound to the right 1701 * buffer object 1702 */ 1703 struct intel_mipmap_tree *last_mt; 1704 if (num_samples == 0) 1705 last_mt = rb->mt; 1706 else 1707 last_mt = rb->singlesample_mt; 1708 1709 if (last_mt && last_mt->bo == buffer->bo) 1710 return; 1711 1712 intel_update_winsys_renderbuffer_miptree(intel, rb, buffer->bo, 1713 buffer->width, buffer->height, 1714 buffer->pitch); 1715 1716 if (_mesa_is_front_buffer_drawing(fb) && 1717 buffer_type == __DRI_IMAGE_BUFFER_FRONT && 1718 rb->Base.Base.NumSamples > 1) { 1719 intel_renderbuffer_upsample(intel, rb); 1720 } 1721 } 1722 1723 static void 1724 intel_update_image_buffers(struct brw_context *brw, __DRIdrawable *drawable) 1725 { 1726 struct gl_framebuffer *fb = drawable->driverPrivate; 1727 __DRIscreen *dri_screen = brw->screen->driScrnPriv; 1728 struct intel_renderbuffer *front_rb; 1729 struct intel_renderbuffer *back_rb; 1730 struct __DRIimageList images; 1731 unsigned int format; 1732 uint32_t buffer_mask = 0; 1733 int ret; 1734 1735 front_rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT); 1736 back_rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT); 1737 1738 if (back_rb) 1739 format = intel_rb_format(back_rb); 1740 else if (front_rb) 1741 format = intel_rb_format(front_rb); 1742 else 1743 return; 1744 1745 if (front_rb && (_mesa_is_front_buffer_drawing(fb) || 1746 _mesa_is_front_buffer_reading(fb) || !back_rb)) { 1747 buffer_mask |= __DRI_IMAGE_BUFFER_FRONT; 1748 } 1749 1750 if (back_rb) 1751 buffer_mask |= __DRI_IMAGE_BUFFER_BACK; 1752 1753 ret = dri_screen->image.loader->getBuffers(drawable, 1754 driGLFormatToImageFormat(format), 1755 &drawable->dri2.stamp, 1756 drawable->loaderPrivate, 1757 buffer_mask, 1758 &images); 1759 if (!ret) 1760 return; 1761 1762 if (images.image_mask & __DRI_IMAGE_BUFFER_FRONT) { 1763 drawable->w = images.front->width; 1764 drawable->h = images.front->height; 1765 intel_update_image_buffer(brw, 1766 drawable, 1767 front_rb, 1768 images.front, 1769 __DRI_IMAGE_BUFFER_FRONT); 1770 } 1771 if (images.image_mask & __DRI_IMAGE_BUFFER_BACK) { 1772 drawable->w = images.back->width; 1773 drawable->h = images.back->height; 1774 intel_update_image_buffer(brw, 1775 drawable, 1776 back_rb, 1777 images.back, 1778 __DRI_IMAGE_BUFFER_BACK); 1779 } 1780 } 1781