[PATCH i-g-t 7/7] lib/igt_fb: Fix GEN12 CCS plane alignments
Imre Deak
imre.deak at intel.com
Tue Nov 12 10:07:58 UTC 2019
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
lib/igt_fb.c | 66 +++++++++++++++++++++++++++-------------------------
1 file changed, 34 insertions(+), 32 deletions(-)
diff --git a/lib/igt_fb.c b/lib/igt_fb.c
index 77030d49..ac1a6e7d 100644
--- a/lib/igt_fb.c
+++ b/lib/igt_fb.c
@@ -401,6 +401,7 @@ void igt_get_fb_tile_size(int fd, uint64_t modifier, int fb_bpp,
break;
case LOCAL_I915_FORMAT_MOD_Y_TILED:
case LOCAL_I915_FORMAT_MOD_Y_TILED_CCS:
+ case LOCAL_I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
igt_require_intel(fd);
if (intel_gen(intel_get_drm_devid(fd)) == 2) {
*width_ret = 128;
@@ -413,33 +414,6 @@ void igt_get_fb_tile_size(int fd, uint64_t modifier, int fb_bpp,
*height_ret = 32;
}
break;
- case LOCAL_I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS:
- igt_require_intel(fd);
- switch (fb_bpp) {
- case 8:
- *width_ret = 512;
- *height_ret = 32;
- break;
- case 16:
- *width_ret = 256;
- *height_ret = 32;
- break;
- case 32:
- *width_ret = 128;
- *height_ret = 32;
- break;
- case 64:
- *width_ret = 64;
- *height_ret = 32;
- break;
- case 128:
- *width_ret = 32;
- *height_ret = 32;
- break;
- default:
- igt_assert(false);
- }
- break;
case LOCAL_I915_FORMAT_MOD_Yf_TILED:
case LOCAL_I915_FORMAT_MOD_Yf_TILED_CCS:
igt_require_intel(fd);
@@ -492,10 +466,15 @@ void igt_get_fb_tile_size(int fd, uint64_t modifier, int fb_bpp,
}
}
+static bool is_gen12_ccs_modifier(uint64_t modifier)
+{
+ return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS;
+}
+
static bool is_ccs_modifier(uint64_t modifier)
{
- return modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS ||
+ return is_gen12_ccs_modifier(modifier) ||
modifier == I915_FORMAT_MOD_Y_TILED_CCS ||
modifier == I915_FORMAT_MOD_Yf_TILED_CCS;
}
@@ -504,8 +483,12 @@ static unsigned fb_plane_width(const struct igt_fb *fb, int plane)
{
const struct format_desc_struct *format = lookup_drm_format(fb->drm_format);
- if (is_ccs_modifier(fb->modifier) && plane == 1)
+ if (is_ccs_modifier(fb->modifier) && plane == 1) {
+ if (is_gen12_ccs_modifier(fb->modifier))
+ return DIV_ROUND_UP(fb->width,
+ 512 / (fb->plane_bpp[0] / 8)) * 64;
return DIV_ROUND_UP(fb->width, 1024) * 128;
+ }
if (plane == 0)
return fb->width;
@@ -527,8 +510,12 @@ static unsigned fb_plane_height(const struct igt_fb *fb, int plane)
{
const struct format_desc_struct *format = lookup_drm_format(fb->drm_format);
- if (is_ccs_modifier(fb->modifier) && plane == 1)
- return DIV_ROUND_UP(fb->height, 512) * 32;
+ if (is_ccs_modifier(fb->modifier) && plane == 1) {
+ if (is_gen12_ccs_modifier(fb->modifier))
+ return DIV_ROUND_UP(fb->height, 128) * 4;
+ else
+ return DIV_ROUND_UP(fb->height, 512) * 32;
+ }
if (plane == 0)
return fb->height;
@@ -601,12 +588,17 @@ static uint32_t calc_plane_stride(struct igt_fb *fb, int plane)
* so the easiest way is to align the luma stride to 256.
*/
return ALIGN(min_stride, 256);
+ } else if (is_gen12_ccs_modifier(fb->modifier) && plane == 1) {
+ return ALIGN(min_stride, 64);
} else {
unsigned int tile_width, tile_height;
igt_get_fb_tile_size(fb->fd, fb->modifier, fb->plane_bpp[plane],
&tile_width, &tile_height);
+ if (is_gen12_ccs_modifier(fb->modifier))
+ tile_width *= 4;
+
return ALIGN(min_stride, tile_width);
}
}
@@ -632,12 +624,18 @@ static uint64_t calc_plane_size(struct igt_fb *fb, int plane)
size = roundup_power_of_two(size);
return size;
+ } else if (is_gen12_ccs_modifier(fb->modifier) && plane == 1) {
+ return (uint64_t)fb->strides[plane] *
+ ALIGN(fb->plane_height[plane], 64);
} else {
unsigned int tile_width, tile_height;
igt_get_fb_tile_size(fb->fd, fb->modifier, fb->plane_bpp[plane],
&tile_width, &tile_height);
+ if (is_gen12_ccs_modifier(fb->modifier))
+ tile_height *= 4;
+
/* Special case where the "tile height" represents a
* height-based stride, such as with VC4 SAND tiling modes.
*/
@@ -1925,7 +1923,11 @@ static void init_buf(struct fb_blit_upload *blit,
if (is_ccs_modifier(fb->modifier)) {
igt_assert_eq(fb->strides[0] & 127, 0);
- igt_assert_eq(fb->strides[1] & 127, 0);
+
+ if (is_gen12_ccs_modifier(fb->modifier))
+ igt_assert_eq(fb->strides[1] & 63, 0);
+ else
+ igt_assert_eq(fb->strides[1] & 127, 0);
buf->aux.offset = fb->offsets[1];
buf->aux.stride = fb->strides[1];
--
2.17.1
More information about the Intel-gfx-trybot
mailing list