#define GEN7_SURFACE_MOCS_SHIFT 16
#define GEN7_SURFACE_MOCS_MASK INTEL_MASK(19, 16)
-#define GEN9_SURFACE_TRMODE_SHIFT 18
-#define GEN9_SURFACE_TRMODE_MASK INTEL_MASK(19, 18)
-#define GEN9_SURFACE_TRMODE_NONE 0
-#define GEN9_SURFACE_TRMODE_TILEYF 1
-#define GEN9_SURFACE_TRMODE_TILEYS 2
-
#define GEN9_SURFACE_MIP_TAIL_START_LOD_SHIFT 8
#define GEN9_SURFACE_MIP_TAIL_START_LOD_MASK INTEL_MASK(11, 8)
#define BR13_16161616 (0x4 << 24)
#define BR13_32323232 (0x5 << 24)
-#define XY_FAST_SRC_TRMODE_YF (1 << 31)
-#define XY_FAST_DST_TRMODE_YF (1 << 30)
-
/* Pipeline Statistics Counter Registers */
#define IA_VERTICES_COUNT 0x2310
#define IA_PRIMITIVES_COUNT 0x2318
uint32_t tile_mask_x = 0, tile_mask_y = 0;
if (depth_mt) {
- intel_get_tile_masks(depth_mt->tiling, depth_mt->tr_mode,
+ intel_get_tile_masks(depth_mt->tiling,
depth_mt->cpp,
&tile_mask_x, &tile_mask_y);
assert(!intel_miptree_level_has_hiz(depth_mt, depth_level));
} else {
uint32_t stencil_tile_mask_x, stencil_tile_mask_y;
intel_get_tile_masks(stencil_mt->tiling,
- stencil_mt->tr_mode,
stencil_mt->cpp,
&stencil_tile_mask_x,
&stencil_tile_mask_y);
#define FILE_DEBUG_FLAG DEBUG_MIPTREE
-static unsigned int
-tr_mode_horizontal_texture_alignment(const struct intel_mipmap_tree *mt)
-{
- unsigned ret_align, divisor, multiplier_ys;
-
- /* Values in below tables specifiy the horizontal alignment requirement
- * in elements for TRMODE_YF surface. An element is defined as a pixel in
- * uncompressed surface formats, and as a compression block in compressed
- * surface formats. For MSFMT_DEPTH_STENCIL type multisampled surfaces, an
- * element is a sample.
- */
- const unsigned align_1d_yf[] = {4096, 2048, 1024, 512, 256};
- const unsigned align_2d_yf[] = {64, 64, 32, 32, 16};
- const unsigned align_3d_yf[] = {16, 8, 8, 8, 4};
-
- assert(mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE);
-
- /* Alignment computations below assume a power of 2 cpp. */
- assert (mt->cpp >= 1 && mt->cpp <= 16 && _mesa_is_pow_two(mt->cpp));
- /* Compute array index. */
- const int i = ffs(mt->cpp) - 1;
-
- switch(mt->target) {
- case GL_TEXTURE_1D:
- case GL_TEXTURE_1D_ARRAY:
- ret_align = align_1d_yf[i];
- multiplier_ys = 16;
- break;
- case GL_TEXTURE_2D:
- case GL_TEXTURE_RECTANGLE:
- case GL_TEXTURE_2D_ARRAY:
- case GL_TEXTURE_CUBE_MAP:
- case GL_TEXTURE_CUBE_MAP_ARRAY:
- case GL_TEXTURE_2D_MULTISAMPLE:
- case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
- ret_align = align_2d_yf[i];
- multiplier_ys = 4;
- break;
- case GL_TEXTURE_3D:
- ret_align = align_3d_yf[i];
- multiplier_ys = 4;
- break;
- default:
- unreachable("not reached");
- }
-
- if (mt->tr_mode == INTEL_MIPTREE_TRMODE_YS)
- ret_align *= multiplier_ys;
-
- assert(_mesa_is_pow_two(mt->num_samples));
-
- switch (mt->num_samples) {
- case 2:
- case 4:
- divisor = 2;
- break;
- case 8:
- case 16:
- divisor = 4;
- break;
- default:
- divisor = 1;
- break;
- }
- return ret_align / divisor;
-}
-
-
static unsigned int
intel_horizontal_texture_alignment_unit(struct brw_context *brw,
struct intel_mipmap_tree *mt,
return 4;
}
-static unsigned int
-tr_mode_vertical_texture_alignment(const struct intel_mipmap_tree *mt)
-{
- unsigned ret_align, divisor, multiplier_ys;
-
- /* Vertical alignment tables for TRMODE_YF */
- const unsigned align_2d_yf[] = {64, 32, 32, 16, 16};
- const unsigned align_3d_yf[] = {16, 16, 16, 8, 8};
-
- assert(mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE);
-
- /* Alignment computations below assume a power of 2 cpp. */
- assert (mt->cpp >= 1 && mt->cpp <= 16 && _mesa_is_pow_two(mt->cpp)) ;
- /* Compute array index. */
- const int i = ffs(mt->cpp) - 1;
-
- switch(mt->target) {
- case GL_TEXTURE_2D:
- case GL_TEXTURE_RECTANGLE:
- case GL_TEXTURE_2D_ARRAY:
- case GL_TEXTURE_CUBE_MAP:
- case GL_TEXTURE_CUBE_MAP_ARRAY:
- case GL_TEXTURE_2D_MULTISAMPLE:
- case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
- ret_align = align_2d_yf[i];
- multiplier_ys = 4;
- break;
- case GL_TEXTURE_3D:
- ret_align = align_3d_yf[i];
- multiplier_ys = 2;
- break;
- case GL_TEXTURE_1D:
- case GL_TEXTURE_1D_ARRAY:
- default:
- unreachable("Unexpected miptree target");
- }
-
- if (mt->tr_mode == INTEL_MIPTREE_TRMODE_YS)
- ret_align *= multiplier_ys;
-
- assert(_mesa_is_pow_two(mt->num_samples));
-
- switch (mt->num_samples) {
- case 4:
- case 8:
- divisor = 2;
- break;
- case 16:
- divisor = 4;
- break;
- default:
- divisor = 1;
- break;
- }
- return ret_align / divisor;
-}
-
static unsigned int
intel_vertical_texture_alignment_unit(struct brw_context *brw,
const struct intel_mipmap_tree *mt)
} else if (mt->format == MESA_FORMAT_S_UINT8) {
mt->halign = 8;
mt->valign = brw->gen >= 7 ? 8 : 4;
- } else if (brw->gen >= 9 && mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE) {
- mt->halign = tr_mode_horizontal_texture_alignment(mt);
- mt->valign = tr_mode_vertical_texture_alignment(mt);
} else {
mt->halign =
intel_horizontal_texture_alignment_unit(brw, mt, layout_flags);
struct intel_mipmap_tree *mt,
uint32_t layout_flags)
{
- mt->tr_mode = INTEL_MIPTREE_TRMODE_NONE;
-
intel_miptree_set_alignment(brw, mt, layout_flags);
intel_miptree_set_total_width_height(brw, mt);
}
}
-/* This function computes Yf/Ys tiled bo size, alignment and pitch. */
-static unsigned long
-intel_get_yf_ys_bo_size(struct intel_mipmap_tree *mt, unsigned *alignment,
- unsigned long *pitch)
-{
- uint32_t tile_width, tile_height;
- unsigned long stride, size, aligned_y;
-
- assert(mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE);
- intel_get_tile_dims(mt->tiling, mt->tr_mode, mt->cpp,
- &tile_width, &tile_height);
-
- aligned_y = ALIGN(mt->total_height, tile_height);
- stride = mt->total_width * mt->cpp;
- stride = ALIGN(stride, tile_width);
- size = stride * aligned_y;
-
- if (mt->tr_mode == INTEL_MIPTREE_TRMODE_YF) {
- assert(size % 4096 == 0);
- *alignment = 4096;
- } else {
- assert(size % (64 * 1024) == 0);
- *alignment = 64 * 1024;
- }
- *pitch = stride;
- return size;
-}
-
static struct intel_mipmap_tree *
miptree_create(struct brw_context *brw,
GLenum target,
unsigned long pitch;
mt->etc_format = etc_format;
- if (mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE) {
- unsigned alignment = 0;
- unsigned long size;
- size = intel_get_yf_ys_bo_size(mt, &alignment, &pitch);
- assert(size);
- mt->bo = drm_intel_bo_alloc_for_render(brw->bufmgr, "miptree",
- size, alignment);
+ if (format == MESA_FORMAT_S_UINT8) {
+ /* Align to size of W tile, 64x64. */
+ mt->bo = drm_intel_bo_alloc_tiled(brw->bufmgr, "miptree",
+ ALIGN(mt->total_width, 64),
+ ALIGN(mt->total_height, 64),
+ mt->cpp, &mt->tiling, &pitch,
+ alloc_flags);
} else {
- if (format == MESA_FORMAT_S_UINT8) {
- /* Align to size of W tile, 64x64. */
- mt->bo = drm_intel_bo_alloc_tiled(brw->bufmgr, "miptree",
- ALIGN(mt->total_width, 64),
- ALIGN(mt->total_height, 64),
- mt->cpp, &mt->tiling, &pitch,
- alloc_flags);
- } else {
- mt->bo = drm_intel_bo_alloc_tiled(brw->bufmgr, "miptree",
- mt->total_width, mt->total_height,
- mt->cpp, &mt->tiling, &pitch,
- alloc_flags);
- }
+ mt->bo = drm_intel_bo_alloc_tiled(brw->bufmgr, "miptree",
+ mt->total_width, mt->total_height,
+ mt->cpp, &mt->tiling, &pitch,
+ alloc_flags);
}
mt->pitch = pitch;
* and tile_h is set to 1.
*/
void
-intel_get_tile_dims(uint32_t tiling, uint32_t tr_mode, uint32_t cpp,
+intel_get_tile_dims(uint32_t tiling, uint32_t cpp,
uint32_t *tile_w, uint32_t *tile_h)
{
- if (tr_mode == INTEL_MIPTREE_TRMODE_NONE) {
- switch (tiling) {
- case I915_TILING_X:
- *tile_w = 512;
- *tile_h = 8;
- break;
- case I915_TILING_Y:
- *tile_w = 128;
- *tile_h = 32;
- break;
- case I915_TILING_NONE:
- *tile_w = cpp;
- *tile_h = 1;
- break;
- default:
- unreachable("not reached");
- }
- } else {
- uint32_t aspect_ratio = 1;
- assert(_mesa_is_pow_two(cpp));
-
- switch (cpp) {
- case 1:
- *tile_h = 64;
- break;
- case 2:
- case 4:
- *tile_h = 32;
- break;
- case 8:
- case 16:
- *tile_h = 16;
- break;
- default:
- unreachable("not reached");
- }
-
- if (cpp == 2 || cpp == 8)
- aspect_ratio = 2;
-
- if (tr_mode == INTEL_MIPTREE_TRMODE_YS)
- *tile_h *= 4;
-
- *tile_w = *tile_h * aspect_ratio * cpp;
+ switch (tiling) {
+ case I915_TILING_X:
+ *tile_w = 512;
+ *tile_h = 8;
+ break;
+ case I915_TILING_Y:
+ *tile_w = 128;
+ *tile_h = 32;
+ break;
+ case I915_TILING_NONE:
+ *tile_w = cpp;
+ *tile_h = 1;
+ break;
+ default:
+ unreachable("not reached");
}
}
* untiled, the masks are set to 0.
*/
void
-intel_get_tile_masks(uint32_t tiling, uint32_t tr_mode, uint32_t cpp,
+intel_get_tile_masks(uint32_t tiling, uint32_t cpp,
uint32_t *mask_x, uint32_t *mask_y)
{
uint32_t tile_w_bytes, tile_h;
- intel_get_tile_dims(tiling, tr_mode, cpp, &tile_w_bytes, &tile_h);
+ intel_get_tile_dims(tiling, cpp, &tile_w_bytes, &tile_h);
*mask_x = tile_w_bytes / cpp - 1;
*mask_y = tile_h - 1;
uint32_t x, y;
uint32_t mask_x, mask_y;
- intel_get_tile_masks(mt->tiling, mt->tr_mode, mt->cpp, &mask_x, &mask_y);
+ intel_get_tile_masks(mt->tiling, mt->cpp, &mask_x, &mask_y);
intel_miptree_get_image_offset(mt, level, slice, &x, &y);
*tile_x = x & mask_x;
{
if (brw->has_llc &&
/* It's probably not worth swapping to the blit ring because of
- * all the overhead involved. But, we must use blitter for the
- * surfaces with INTEL_MIPTREE_TRMODE_{YF,YS}.
+ * all the overhead involved.
*/
- (!(mode & GL_MAP_WRITE_BIT) ||
- mt->tr_mode != INTEL_MIPTREE_TRMODE_NONE) &&
+ !(mode & GL_MAP_WRITE_BIT) &&
!mt->compressed &&
(mt->tiling == I915_TILING_X ||
/* Prior to Sandybridge, the blitter can't handle Y tiling */
intel_miptree_map_movntdqa(brw, mt, map, level, slice);
#endif
} else {
- /* intel_miptree_map_gtt() doesn't support surfaces with Yf/Ys tiling. */
- assert(mt->tr_mode == INTEL_MIPTREE_TRMODE_NONE);
intel_miptree_map_gtt(brw, mt, map, level, slice);
}
case I915_TILING_X:
return ISL_TILING_X;
case I915_TILING_Y:
- switch (mt->tr_mode) {
- case INTEL_MIPTREE_TRMODE_NONE:
return ISL_TILING_Y0;
- case INTEL_MIPTREE_TRMODE_YF:
- return ISL_TILING_Yf;
- case INTEL_MIPTREE_TRMODE_YS:
- return ISL_TILING_Ys;
- default:
- unreachable("Invalid tiled resource mode");
- }
default:
unreachable("Invalid tiling mode");
}
struct intel_mipmap_tree *mt;
};
-/* Tile resource modes */
-enum intel_miptree_tr_mode {
- INTEL_MIPTREE_TRMODE_NONE,
- INTEL_MIPTREE_TRMODE_YF,
- INTEL_MIPTREE_TRMODE_YS
-};
-
struct intel_mipmap_tree
{
/**
*/
uint32_t tiling;
- /**
- * @see RENDER_SURFACE_STATE.TiledResourceMode
- * @see 3DSTATE_DEPTH_BUFFER.TiledResourceMode
- */
- enum intel_miptree_tr_mode tr_mode;
-
/**
* @brief One of GL_TEXTURE_2D, GL_TEXTURE_2D_ARRAY, etc.
*
int *width, int *height, int *depth);
void
-intel_get_tile_masks(uint32_t tiling, uint32_t tr_mode, uint32_t cpp,
+intel_get_tile_masks(uint32_t tiling, uint32_t cpp,
uint32_t *mask_x, uint32_t *mask_y);
void
-intel_get_tile_dims(uint32_t tiling, uint32_t tr_mode, uint32_t cpp,
+intel_get_tile_dims(uint32_t tiling, uint32_t cpp,
uint32_t *tile_w, uint32_t *tile_h);
uint32_t