1 /* 2 * Copyright 2006 VMware, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sublicense, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the 14 * next paragraph) shall be included in all copies or substantial portions 15 * of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 21 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 /** @file intel_mipmap_tree.h 27 * 28 * This file defines the structure that wraps a BO and describes how the 29 * mipmap levels and slices of a texture are laid out. 30 * 31 * The hardware has a fixed layout of a texture depending on parameters such 32 * as the target/type (2D, 3D, CUBE), width, height, pitch, and number of 33 * mipmap levels. The individual level/layer slices are each 2D rectangles of 34 * pixels at some x/y offset from the start of the brw_bo. 35 * 36 * Original OpenGL allowed texture miplevels to be specified in arbitrary 37 * order, and a texture may change size over time. Thus, each 38 * intel_texture_image has a reference to a miptree that contains the pixel 39 * data sized appropriately for it, which will later be referenced by/copied 40 * to the intel_texture_object at draw time (intel_finalize_mipmap_tree()) so 41 * that there's a single miptree for the complete texture. 42 */ 43 44 #ifndef INTEL_MIPMAP_TREE_H 45 #define INTEL_MIPMAP_TREE_H 46 47 #include <assert.h> 48 49 #include "main/mtypes.h" 50 #include "isl/isl.h" 51 #include "blorp/blorp.h" 52 #include "brw_bufmgr.h" 53 #include "brw_context.h" 54 #include <GL/internal/dri_interface.h> 55 56 #ifdef __cplusplus 57 extern "C" { 58 #endif 59 60 struct brw_context; 61 struct intel_renderbuffer; 62 63 struct intel_texture_image; 64 65 /** 66 * This bit extends the set of GL_MAP_*_BIT enums. 67 * 68 * When calling intel_miptree_map() on an ETC-transcoded-to-RGB miptree or a 69 * depthstencil-split-to-separate-stencil miptree, we'll normally make a 70 * temporary and recreate the kind of data requested by Mesa core, since we're 71 * satisfying some glGetTexImage() request or something. 72 * 73 * However, occasionally you want to actually map the miptree's current data 74 * without transcoding back. This flag to intel_miptree_map() gets you that. 75 */ 76 #define BRW_MAP_DIRECT_BIT 0x80000000 77 78 struct intel_miptree_map { 79 /** Bitfield of GL_MAP_*_BIT and BRW_MAP_*_BIT. */ 80 GLbitfield mode; 81 /** Region of interest for the map. */ 82 int x, y, w, h; 83 /** Possibly malloced temporary buffer for the mapping. */ 84 void *buffer; 85 /** Possible pointer to a temporary linear miptree for the mapping. */ 86 struct intel_mipmap_tree *linear_mt; 87 /** Pointer to the start of (map_x, map_y) returned by the mapping. */ 88 void *ptr; 89 /** Stride of the mapping. */ 90 int stride; 91 }; 92 93 /** 94 * Describes the location of each texture image within a miptree. 95 */ 96 struct intel_mipmap_level 97 { 98 /** Offset to this miptree level, used in computing x_offset. */ 99 GLuint level_x; 100 /** Offset to this miptree level, used in computing y_offset. */ 101 GLuint level_y; 102 103 /** 104 * \brief Is HiZ enabled for this level? 105 * 106 * If \c mt->level[l].has_hiz is set, then (1) \c mt->hiz_mt has been 107 * allocated and (2) the HiZ memory for the slices in this level reside at 108 * \c mt->hiz_mt->level[l]. 109 */ 110 bool has_hiz; 111 112 /** 113 * \brief List of 2D images in this mipmap level. 114 * 115 * This may be a list of cube faces, array slices in 2D array texture, or 116 * layers in a 3D texture. The list's length is \c depth. 117 */ 118 struct intel_mipmap_slice { 119 /** 120 * Mapping information. Persistent for the duration of 121 * intel_miptree_map/unmap on this slice. 122 */ 123 struct intel_miptree_map *map; 124 } *slice; 125 }; 126 127 /** 128 * Miptree aux buffer. These buffers are associated with a miptree, but the 129 * format is managed by the hardware. 130 * 131 * For Gen7+, we always give the hardware the start of the buffer, and let it 132 * handle all accesses to the buffer. Therefore we don't need the full miptree 133 * layout structure for this buffer. 134 */ 135 struct intel_miptree_aux_buffer 136 { 137 struct isl_surf surf; 138 139 /** 140 * Buffer object containing the pixel data. 141 * 142 * @see RENDER_SURFACE_STATE.AuxiliarySurfaceBaseAddress 143 * @see 3DSTATE_HIER_DEPTH_BUFFER.AuxiliarySurfaceBaseAddress 144 */ 145 struct brw_bo *bo; 146 147 /** 148 * Offset into bo where the surface starts. 149 * 150 * @see intel_mipmap_aux_buffer::bo 151 * 152 * @see RENDER_SURFACE_STATE.AuxiliarySurfaceBaseAddress 153 * @see 3DSTATE_DEPTH_BUFFER.SurfaceBaseAddress 154 * @see 3DSTATE_HIER_DEPTH_BUFFER.SurfaceBaseAddress 155 * @see 3DSTATE_STENCIL_BUFFER.SurfaceBaseAddress 156 */ 157 uint32_t offset; 158 159 /* 160 * Size of the MCS surface. 161 * 162 * This is needed when doing any gtt mapped operations on the buffer (which 163 * will be Y-tiled). It is possible that it will not be the same as bo->size 164 * when the drm allocator rounds up the requested size. 165 */ 166 size_t size; 167 168 /** 169 * Pitch in bytes. 170 * 171 * @see RENDER_SURFACE_STATE.AuxiliarySurfacePitch 172 * @see 3DSTATE_HIER_DEPTH_BUFFER.SurfacePitch 173 */ 174 uint32_t pitch; 175 176 /** 177 * The distance in rows between array slices. 178 * 179 * @see RENDER_SURFACE_STATE.AuxiliarySurfaceQPitch 180 * @see 3DSTATE_HIER_DEPTH_BUFFER.SurfaceQPitch 181 */ 182 uint32_t qpitch; 183 }; 184 185 struct intel_mipmap_tree 186 { 187 struct isl_surf surf; 188 189 /** 190 * Buffer object containing the surface. 191 * 192 * @see intel_mipmap_tree::offset 193 * @see RENDER_SURFACE_STATE.SurfaceBaseAddress 194 * @see RENDER_SURFACE_STATE.AuxiliarySurfaceBaseAddress 195 * @see 3DSTATE_DEPTH_BUFFER.SurfaceBaseAddress 196 * @see 3DSTATE_HIER_DEPTH_BUFFER.SurfaceBaseAddress 197 * @see 3DSTATE_STENCIL_BUFFER.SurfaceBaseAddress 198 */ 199 struct brw_bo *bo; 200 201 /** 202 * @brief One of GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, etc. 203 * 204 * @see RENDER_SURFACE_STATE.SurfaceType 205 * @see RENDER_SURFACE_STATE.SurfaceArray 206 * @see 3DSTATE_DEPTH_BUFFER.SurfaceType 207 */ 208 GLenum target; 209 210 /** 211 * Generally, this is just the same as the gl_texture_image->TexFormat or 212 * gl_renderbuffer->Format. 213 * 214 * However, for textures and renderbuffers with packed depth/stencil formats 215 * on hardware where we want or need to use separate stencil, there will be 216 * two miptrees for storing the data. If the depthstencil texture or rb is 217 * MESA_FORMAT_Z32_FLOAT_S8X24_UINT, then mt->format will be 218 * MESA_FORMAT_Z_FLOAT32, otherwise for MESA_FORMAT_Z24_UNORM_S8_UINT objects it will be 219 * MESA_FORMAT_Z24_UNORM_X8_UINT. 220 * 221 * For ETC1/ETC2 textures, this is one of the uncompressed mesa texture 222 * formats if the hardware lacks support for ETC1/ETC2. See @ref etc_format. 223 * 224 * @see RENDER_SURFACE_STATE.SurfaceFormat 225 * @see 3DSTATE_DEPTH_BUFFER.SurfaceFormat 226 */ 227 mesa_format format; 228 229 /** 230 * This variable stores the value of ETC compressed texture format 231 * 232 * @see RENDER_SURFACE_STATE.SurfaceFormat 233 */ 234 mesa_format etc_format; 235 236 GLuint first_level; 237 GLuint last_level; 238 239 /** Bytes per pixel (or bytes per block if compressed) */ 240 GLuint cpp; 241 242 bool compressed; 243 244 /* Includes image offset tables: */ 245 struct intel_mipmap_level level[MAX_TEXTURE_LEVELS]; 246 247 /** 248 * Offset into bo where the surface starts. 249 * 250 * @see intel_mipmap_tree::bo 251 * 252 * @see RENDER_SURFACE_STATE.AuxiliarySurfaceBaseAddress 253 * @see 3DSTATE_DEPTH_BUFFER.SurfaceBaseAddress 254 * @see 3DSTATE_HIER_DEPTH_BUFFER.SurfaceBaseAddress 255 * @see 3DSTATE_STENCIL_BUFFER.SurfaceBaseAddress 256 */ 257 uint32_t offset; 258 259 /** 260 * \brief HiZ aux buffer 261 * 262 * To allocate the hiz buffer, use intel_miptree_alloc_hiz(). 263 * 264 * To determine if hiz is enabled, do not check this pointer. Instead, use 265 * intel_miptree_level_has_hiz(). 266 */ 267 struct intel_miptree_aux_buffer *hiz_buf; 268 269 /** 270 * \brief The type of auxiliary compression used by this miptree. 271 * 272 * This describes the type of auxiliary compression that is intended to be 273 * used by this miptree. An aux usage of ISL_AUX_USAGE_NONE means that 274 * auxiliary compression is permanently disabled. An aux usage other than 275 * ISL_AUX_USAGE_NONE does not imply that the auxiliary buffer has actually 276 * been allocated nor does it imply that auxiliary compression will always 277 * be enabled for this surface. For instance, with CCS_D, we may allocate 278 * the CCS on-the-fly and it may not be used for texturing if the miptree 279 * is fully resolved. 280 */ 281 enum isl_aux_usage aux_usage; 282 283 /** 284 * \brief Whether or not this miptree supports fast clears. 285 */ 286 bool supports_fast_clear; 287 288 /** 289 * \brief Maps miptree slices to their current aux state 290 * 291 * This two-dimensional array is indexed as [level][layer] and stores an 292 * aux state for each slice. 293 */ 294 enum isl_aux_state **aux_state; 295 296 /** 297 * \brief Stencil miptree for depthstencil textures. 298 * 299 * This miptree is used for depthstencil textures and renderbuffers that 300 * require separate stencil. It always has the true copy of the stencil 301 * bits, regardless of mt->format. 302 * 303 * \see 3DSTATE_STENCIL_BUFFER 304 * \see intel_miptree_map_depthstencil() 305 * \see intel_miptree_unmap_depthstencil() 306 */ 307 struct intel_mipmap_tree *stencil_mt; 308 309 /** 310 * \brief Stencil texturing miptree for sampling from a stencil texture 311 * 312 * Some hardware doesn't support sampling from the stencil texture as 313 * required by the GL_ARB_stencil_texturing extenion. To workaround this we 314 * blit the texture into a new texture that can be sampled. 315 * 316 * \see intel_update_r8stencil() 317 */ 318 struct intel_mipmap_tree *r8stencil_mt; 319 bool r8stencil_needs_update; 320 321 /** 322 * \brief MCS auxiliary buffer. 323 * 324 * This buffer contains the "multisample control surface", which stores 325 * the necessary information to implement compressed MSAA 326 * (INTEL_MSAA_FORMAT_CMS) and "fast color clear" behaviour on Gen7+. 327 * 328 * NULL if no MCS buffer is in use for this surface. 329 */ 330 struct intel_miptree_aux_buffer *mcs_buf; 331 332 /** 333 * Planes 1 and 2 in case this is a planar surface. 334 */ 335 struct intel_mipmap_tree *plane[2]; 336 337 /** 338 * Fast clear color for this surface. For depth surfaces, the clear value 339 * is stored as a float32 in the red component. 340 */ 341 union isl_color_value fast_clear_color; 342 343 /** 344 * For external surfaces, this is DRM format modifier that was used to 345 * create or import the surface. For internal surfaces, this will always 346 * be DRM_FORMAT_MOD_INVALID. 347 */ 348 uint64_t drm_modifier; 349 350 /* These are also refcounted: 351 */ 352 GLuint refcount; 353 }; 354 355 bool 356 intel_miptree_alloc_ccs(struct brw_context *brw, 357 struct intel_mipmap_tree *mt); 358 359 enum intel_miptree_create_flags { 360 /** No miptree create flags */ 361 MIPTREE_CREATE_DEFAULT = 0, 362 363 /** Miptree creation should try to allocate a currently busy BO 364 * 365 * This may be advantageous if we know the next thing to touch the BO will 366 * be the GPU because the BO will likely already be in the GTT and maybe 367 * even in some caches. If there is a chance that the next thing to touch 368 * the miptree BO will be the CPU, this flag should not be set. 369 */ 370 MIPTREE_CREATE_BUSY = 1 << 0, 371 372 /** Create a linear (not tiled) miptree */ 373 MIPTREE_CREATE_LINEAR = 1 << 1, 374 375 /** Create the miptree with auxiliary compression disabled 376 * 377 * This does not prevent the caller of intel_miptree_create from coming 378 * along later and turning auxiliary compression back on but it does mean 379 * that the miptree will be created with mt->aux_usage == NONE. 380 */ 381 MIPTREE_CREATE_NO_AUX = 1 << 2, 382 }; 383 384 struct intel_mipmap_tree *intel_miptree_create(struct brw_context *brw, 385 GLenum target, 386 mesa_format format, 387 GLuint first_level, 388 GLuint last_level, 389 GLuint width0, 390 GLuint height0, 391 GLuint depth0, 392 GLuint num_samples, 393 enum intel_miptree_create_flags flags); 394 395 struct intel_mipmap_tree * 396 intel_miptree_create_for_bo(struct brw_context *brw, 397 struct brw_bo *bo, 398 mesa_format format, 399 uint32_t offset, 400 uint32_t width, 401 uint32_t height, 402 uint32_t depth, 403 int pitch, 404 enum isl_tiling tiling, 405 enum intel_miptree_create_flags flags); 406 407 struct intel_mipmap_tree * 408 intel_miptree_create_for_dri_image(struct brw_context *brw, 409 __DRIimage *image, 410 GLenum target, 411 mesa_format format, 412 bool is_winsys_image); 413 414 bool 415 intel_update_winsys_renderbuffer_miptree(struct brw_context *intel, 416 struct intel_renderbuffer *irb, 417 struct intel_mipmap_tree *singlesample_mt, 418 uint32_t width, uint32_t height, 419 uint32_t pitch); 420 421 /** 422 * Create a miptree appropriate as the storage for a non-texture renderbuffer. 423 * The miptree has the following properties: 424 * - The target is GL_TEXTURE_2D. 425 * - There are no levels other than the base level 0. 426 * - Depth is 1. 427 */ 428 struct intel_mipmap_tree* 429 intel_miptree_create_for_renderbuffer(struct brw_context *brw, 430 mesa_format format, 431 uint32_t width, 432 uint32_t height, 433 uint32_t num_samples); 434 435 mesa_format 436 intel_depth_format_for_depthstencil_format(mesa_format format); 437 438 mesa_format 439 intel_lower_compressed_format(struct brw_context *brw, mesa_format format); 440 441 unsigned 442 brw_get_num_logical_layers(const struct intel_mipmap_tree *mt, unsigned level); 443 444 /** \brief Assert that the level and layer are valid for the miptree. */ 445 void 446 intel_miptree_check_level_layer(const struct intel_mipmap_tree *mt, 447 uint32_t level, 448 uint32_t layer); 449 450 void intel_miptree_reference(struct intel_mipmap_tree **dst, 451 struct intel_mipmap_tree *src); 452 453 void intel_miptree_release(struct intel_mipmap_tree **mt); 454 455 /* Check if an image fits an existing mipmap tree layout 456 */ 457 bool intel_miptree_match_image(struct intel_mipmap_tree *mt, 458 struct gl_texture_image *image); 459 460 void 461 intel_miptree_get_image_offset(const struct intel_mipmap_tree *mt, 462 GLuint level, GLuint slice, 463 GLuint *x, GLuint *y); 464 465 enum isl_surf_dim 466 get_isl_surf_dim(GLenum target); 467 468 enum isl_dim_layout 469 get_isl_dim_layout(const struct gen_device_info *devinfo, 470 enum isl_tiling tiling, GLenum target); 471 472 enum isl_aux_usage 473 intel_miptree_get_aux_isl_usage(const struct brw_context *brw, 474 const struct intel_mipmap_tree *mt); 475 476 void 477 intel_get_image_dims(struct gl_texture_image *image, 478 int *width, int *height, int *depth); 479 480 void 481 intel_get_tile_masks(enum isl_tiling tiling, uint32_t cpp, 482 uint32_t *mask_x, uint32_t *mask_y); 483 484 void 485 intel_get_tile_dims(enum isl_tiling tiling, uint32_t cpp, 486 uint32_t *tile_w, uint32_t *tile_h); 487 488 uint32_t 489 intel_miptree_get_tile_offsets(const struct intel_mipmap_tree *mt, 490 GLuint level, GLuint slice, 491 uint32_t *tile_x, 492 uint32_t *tile_y); 493 uint32_t 494 intel_miptree_get_aligned_offset(const struct intel_mipmap_tree *mt, 495 uint32_t x, uint32_t y); 496 497 void 498 intel_miptree_copy_slice(struct brw_context *brw, 499 struct intel_mipmap_tree *src_mt, 500 unsigned src_level, unsigned src_layer, 501 struct intel_mipmap_tree *dst_mt, 502 unsigned dst_level, unsigned dst_layer); 503 504 void 505 intel_miptree_copy_teximage(struct brw_context *brw, 506 struct intel_texture_image *intelImage, 507 struct intel_mipmap_tree *dst_mt); 508 509 /** 510 * \name Miptree HiZ functions 511 * \{ 512 * 513 * It is safe to call the "slice_set_need_resolve" and "slice_resolve" 514 * functions on a miptree without HiZ. In that case, each function is a no-op. 515 */ 516 517 /** 518 * \brief Allocate the miptree's embedded HiZ miptree. 519 * \see intel_mipmap_tree:hiz_mt 520 * \return false if allocation failed 521 */ 522 bool 523 intel_miptree_alloc_hiz(struct brw_context *brw, 524 struct intel_mipmap_tree *mt); 525 526 bool 527 intel_miptree_level_has_hiz(const struct intel_mipmap_tree *mt, uint32_t level); 528 529 /**\}*/ 530 531 bool 532 intel_miptree_has_color_unresolved(const struct intel_mipmap_tree *mt, 533 unsigned start_level, unsigned num_levels, 534 unsigned start_layer, unsigned num_layers); 535 536 537 #define INTEL_REMAINING_LAYERS UINT32_MAX 538 #define INTEL_REMAINING_LEVELS UINT32_MAX 539 540 /** Prepare a miptree for access 541 * 542 * This function should be called prior to any access to miptree in order to 543 * perform any needed resolves. 544 * 545 * \param[in] start_level The first mip level to be accessed 546 * 547 * \param[in] num_levels The number of miplevels to be accessed or 548 * INTEL_REMAINING_LEVELS to indicate every level 549 * above start_level will be accessed 550 * 551 * \param[in] start_layer The first array slice or 3D layer to be accessed 552 * 553 * \param[in] num_layers The number of array slices or 3D layers be 554 * accessed or INTEL_REMAINING_LAYERS to indicate 555 * every layer above start_layer will be accessed 556 * 557 * \param[in] aux_supported Whether or not the access will support the 558 * miptree's auxiliary compression format; this 559 * must be false for uncompressed miptrees 560 * 561 * \param[in] fast_clear_supported Whether or not the access will support 562 * fast clears in the miptree's auxiliary 563 * compression format 564 */ 565 void 566 intel_miptree_prepare_access(struct brw_context *brw, 567 struct intel_mipmap_tree *mt, 568 uint32_t start_level, uint32_t num_levels, 569 uint32_t start_layer, uint32_t num_layers, 570 enum isl_aux_usage aux_usage, 571 bool fast_clear_supported); 572 573 /** Complete a write operation 574 * 575 * This function should be called after any operation writes to a miptree. 576 * This will update the miptree's compression state so that future resolves 577 * happen correctly. Technically, this function can be called before the 578 * write occurs but the caller must ensure that they don't interlace 579 * intel_miptree_prepare_access and intel_miptree_finish_write calls to 580 * overlapping layer/level ranges. 581 * 582 * \param[in] level The mip level that was written 583 * 584 * \param[in] start_layer The first array slice or 3D layer written 585 * 586 * \param[in] num_layers The number of array slices or 3D layers 587 * written or INTEL_REMAINING_LAYERS to indicate 588 * every layer above start_layer was written 589 * 590 * \param[in] written_with_aux Whether or not the write was done with 591 * auxiliary compression enabled 592 */ 593 void 594 intel_miptree_finish_write(struct brw_context *brw, 595 struct intel_mipmap_tree *mt, uint32_t level, 596 uint32_t start_layer, uint32_t num_layers, 597 enum isl_aux_usage aux_usage); 598 599 /** Get the auxiliary compression state of a miptree slice */ 600 enum isl_aux_state 601 intel_miptree_get_aux_state(const struct intel_mipmap_tree *mt, 602 uint32_t level, uint32_t layer); 603 604 /** Set the auxiliary compression state of a miptree slice range 605 * 606 * This function directly sets the auxiliary compression state of a slice 607 * range of a miptree. It only modifies data structures and does not do any 608 * resolves. This should only be called by code which directly performs 609 * compression operations such as fast clears and resolves. Most code should 610 * use intel_miptree_prepare_access or intel_miptree_finish_write. 611 */ 612 void 613 intel_miptree_set_aux_state(struct brw_context *brw, 614 struct intel_mipmap_tree *mt, uint32_t level, 615 uint32_t start_layer, uint32_t num_layers, 616 enum isl_aux_state aux_state); 617 618 /** 619 * Prepare a miptree for raw access 620 * 621 * This helper prepares the miptree for access that knows nothing about any 622 * sort of compression whatsoever. This is useful when mapping the surface or 623 * using it with the blitter. 624 */ 625 static inline void 626 intel_miptree_access_raw(struct brw_context *brw, 627 struct intel_mipmap_tree *mt, 628 uint32_t level, uint32_t layer, 629 bool write) 630 { 631 intel_miptree_prepare_access(brw, mt, level, 1, layer, 1, false, false); 632 if (write) 633 intel_miptree_finish_write(brw, mt, level, layer, 1, false); 634 } 635 636 enum isl_aux_usage 637 intel_miptree_texture_aux_usage(struct brw_context *brw, 638 struct intel_mipmap_tree *mt, 639 enum isl_format view_format); 640 void 641 intel_miptree_prepare_texture(struct brw_context *brw, 642 struct intel_mipmap_tree *mt, 643 enum isl_format view_format, 644 uint32_t start_level, uint32_t num_levels, 645 uint32_t start_layer, uint32_t num_layers, 646 bool disable_aux); 647 void 648 intel_miptree_prepare_image(struct brw_context *brw, 649 struct intel_mipmap_tree *mt); 650 651 enum isl_aux_usage 652 intel_miptree_render_aux_usage(struct brw_context *brw, 653 struct intel_mipmap_tree *mt, 654 enum isl_format render_format, 655 bool blend_enabled, 656 bool draw_aux_disabled); 657 void 658 intel_miptree_prepare_render(struct brw_context *brw, 659 struct intel_mipmap_tree *mt, uint32_t level, 660 uint32_t start_layer, uint32_t layer_count, 661 enum isl_aux_usage aux_usage); 662 void 663 intel_miptree_finish_render(struct brw_context *brw, 664 struct intel_mipmap_tree *mt, uint32_t level, 665 uint32_t start_layer, uint32_t layer_count, 666 enum isl_aux_usage aux_usage); 667 void 668 intel_miptree_prepare_depth(struct brw_context *brw, 669 struct intel_mipmap_tree *mt, uint32_t level, 670 uint32_t start_layer, uint32_t layer_count); 671 void 672 intel_miptree_finish_depth(struct brw_context *brw, 673 struct intel_mipmap_tree *mt, uint32_t level, 674 uint32_t start_layer, uint32_t layer_count, 675 bool depth_written); 676 void 677 intel_miptree_prepare_external(struct brw_context *brw, 678 struct intel_mipmap_tree *mt); 679 680 void 681 intel_miptree_make_shareable(struct brw_context *brw, 682 struct intel_mipmap_tree *mt); 683 684 void 685 intel_miptree_updownsample(struct brw_context *brw, 686 struct intel_mipmap_tree *src, 687 struct intel_mipmap_tree *dst); 688 689 void 690 intel_update_r8stencil(struct brw_context *brw, 691 struct intel_mipmap_tree *mt); 692 693 void 694 intel_miptree_map(struct brw_context *brw, 695 struct intel_mipmap_tree *mt, 696 unsigned int level, 697 unsigned int slice, 698 unsigned int x, 699 unsigned int y, 700 unsigned int w, 701 unsigned int h, 702 GLbitfield mode, 703 void **out_ptr, 704 ptrdiff_t *out_stride); 705 706 void 707 intel_miptree_unmap(struct brw_context *brw, 708 struct intel_mipmap_tree *mt, 709 unsigned int level, 710 unsigned int slice); 711 712 bool 713 intel_miptree_sample_with_hiz(struct brw_context *brw, 714 struct intel_mipmap_tree *mt); 715 716 717 static inline bool 718 intel_miptree_set_clear_color(struct gl_context *ctx, 719 struct intel_mipmap_tree *mt, 720 union isl_color_value clear_color) 721 { 722 if (memcmp(&mt->fast_clear_color, &clear_color, sizeof(clear_color)) != 0) { 723 mt->fast_clear_color = clear_color; 724 ctx->NewDriverState |= BRW_NEW_AUX_STATE; 725 return true; 726 } 727 return false; 728 } 729 730 static inline bool 731 intel_miptree_set_depth_clear_value(struct gl_context *ctx, 732 struct intel_mipmap_tree *mt, 733 float clear_value) 734 { 735 if (mt->fast_clear_color.f32[0] != clear_value) { 736 mt->fast_clear_color.f32[0] = clear_value; 737 ctx->NewDriverState |= BRW_NEW_AUX_STATE; 738 return true; 739 } 740 return false; 741 } 742 743 #ifdef __cplusplus 744 } 745 #endif 746 747 #endif 748