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