summaryrefslogtreecommitdiff
path: root/lib/veboxcopy_gen12.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/veboxcopy_gen12.c')
-rw-r--r--lib/veboxcopy_gen12.c109
1 files changed, 81 insertions, 28 deletions
diff --git a/lib/veboxcopy_gen12.c b/lib/veboxcopy_gen12.c
index 17564493..aa90939b 100644
--- a/lib/veboxcopy_gen12.c
+++ b/lib/veboxcopy_gen12.c
@@ -53,19 +53,25 @@ struct vebox_surface_state {
uint32_t width:14;
uint32_t height:14;
} ss2;
- struct {
+ union {
+ struct {
#define VEBOX_TILE_WALK_XMAJOR 0
#define VEBOX_TILE_WALK_YMAJOR 1
- uint32_t tile_walk:1;
- uint32_t tiled_surface:1;
- uint32_t chroma_half_pitch:1;
- uint32_t surface_pitch:17;
- uint32_t chroma_interleave:1;
- uint32_t lsb_packed_enable:1;
- uint32_t bayer_input_alignment:2;
- uint32_t bayer_pattern_format:1;
- uint32_t bayer_pattern_offset:2;
- uint32_t surface_format:5;
+ uint32_t tile_walk:1;
+ uint32_t tiled_surface:1;
+ uint32_t chroma_half_pitch:1;
+ uint32_t surface_pitch:17;
+ uint32_t chroma_interleave:1;
+ uint32_t lsb_packed_enable:1;
+ uint32_t bayer_input_alignment:2;
+ uint32_t bayer_pattern_format:1;
+ uint32_t bayer_pattern_offset:2;
+ uint32_t surface_format:5;
+ } tgl;
+ struct {
+ uint32_t tile_mode:2;
+ uint32_t pad0:30;
+ } dg2;
} ss3;
struct {
uint32_t u_y_offset:15;
@@ -82,9 +88,15 @@ struct vebox_surface_state {
uint32_t frame_x_offset:15;
uint32_t pad:2;
} ss6;
- struct {
- uint32_t derived_surface_pitch:17;
- uint32_t pad:15;
+ union {
+ struct {
+ uint32_t derived_surface_pitch:17;
+ uint32_t pad:15;
+ } skl;
+ struct {
+ uint32_t pad:27;
+ uint32_t compression_format:5;
+ } dg2;
} ss7;
struct {
uint32_t skin_score_output_surface_pitch:17;
@@ -166,17 +178,46 @@ static void emit_surface_state_cmd(struct intel_bb *ibb,
ss->ss2.height = height - 1;
ss->ss2.width = width - 1;
- ss->ss3.surface_format = format;
+ ss->ss3.tgl.surface_format = format;
if (format_is_interleaved_yuv(format))
- ss->ss3.chroma_interleave = 1;
- ss->ss3.surface_pitch = pitch - 1;
- ss->ss3.tile_walk = (tiling == I915_TILING_Y) ||
- (tiling == I915_TILING_Yf);
- ss->ss3.tiled_surface = tiling != I915_TILING_NONE;
+ ss->ss3.tgl.chroma_interleave = 1;
+ ss->ss3.tgl.surface_pitch = pitch - 1;
ss->ss4.u_y_offset = uv_offset / pitch;
- ss->ss7.derived_surface_pitch = pitch - 1;
+ if (HAS_FLATCCS(ibb->devid)) {
+ /*
+ * f-tile = 3 (Tile F)
+ */
+ ss->ss3.dg2.tile_mode = (tiling != I915_TILING_NONE) ? 3 : 0;
+
+ switch (format) {
+ case R8G8B8A8_UNORM:
+ ss->ss7.dg2.compression_format = 0xa;
+ break;
+ case PLANAR_420_8:
+ ss->ss7.dg2.compression_format = 0xf;
+ break;
+ case PLANAR_420_16:
+ ss->ss7.dg2.compression_format = 8;
+ break;
+ case YCRCB_NORMAL:
+ ss->ss7.dg2.compression_format = 3;
+ break;
+ case PACKED_444A_8:
+ ss->ss7.dg2.compression_format = 0x9;
+ break;
+ default:
+ igt_assert(0);
+ }
+ } else {
+ ss->ss3.tgl.tile_walk = (tiling == I915_TILING_Y) ||
+ (tiling == I915_TILING_Yf) ||
+ (tiling == I915_TILING_4);
+ ss->ss3.tgl.tiled_surface = tiling != I915_TILING_NONE;
+ }
+
+ ss->ss7.skl.derived_surface_pitch = pitch - 1;
intel_bb_ptr_add(ibb, sizeof(*ss));
}
@@ -203,7 +244,11 @@ static void emit_tiling_convert_cmd(struct intel_bb *ibb,
tc->tc1_2.input_compression_type =
src->compression == I915_COMPRESSION_RENDER;
}
- tc->tc1_2.input_tiled_resource_mode = src->tiling == I915_TILING_Yf;
+
+ if (HAS_4TILE(ibb->devid))
+ tc->tc1_2.input_mocs_idx = 3;
+ else
+ tc->tc1_2.input_tiled_resource_mode = src->tiling == I915_TILING_Yf;
reloc_delta = tc->tc1_2_l;
igt_assert(src->addr.offset == ALIGN(src->addr.offset, 0x1000));
@@ -220,7 +265,12 @@ static void emit_tiling_convert_cmd(struct intel_bb *ibb,
tc->tc3_4.output_compression_type =
dst->compression == I915_COMPRESSION_RENDER;
}
- tc->tc3_4.output_tiled_resource_mode = dst->tiling == I915_TILING_Yf;
+
+ if (HAS_4TILE(ibb->devid))
+ tc->tc3_4.output_mocs_idx = 3;
+ else
+ tc->tc3_4.output_tiled_resource_mode = dst->tiling == I915_TILING_Yf;
+
reloc_delta = tc->tc3_4_l;
igt_assert(dst->addr.offset == ALIGN(dst->addr.offset, 0x1000));
@@ -255,10 +305,12 @@ void gen12_vebox_copyfunc(struct intel_bb *ibb,
intel_bb_add_intel_buf(ibb, dst, true);
intel_bb_add_intel_buf(ibb, src, false);
- intel_bb_ptr_set(ibb, BATCH_STATE_SPLIT);
- gen12_aux_pgtable_init(&aux_pgtable_info, ibb, src, dst);
- aux_pgtable_state = gen12_create_aux_pgtable_state(ibb,
- aux_pgtable_info.pgtable_buf);
+ if (!HAS_FLATCCS(ibb->devid)) {
+ intel_bb_ptr_set(ibb, BATCH_STATE_SPLIT);
+ gen12_aux_pgtable_init(&aux_pgtable_info, ibb, src, dst);
+ aux_pgtable_state = gen12_create_aux_pgtable_state(ibb,
+ aux_pgtable_info.pgtable_buf);
+ }
intel_bb_ptr_set(ibb, 0);
gen12_emit_aux_pgtable_state(ibb, aux_pgtable_state, false);
@@ -311,5 +363,6 @@ void gen12_vebox_copyfunc(struct intel_bb *ibb,
intel_bb_reset(ibb, false);
- gen12_aux_pgtable_cleanup(ibb, &aux_pgtable_info);
+ if (!HAS_FLATCCS(ibb->devid))
+ gen12_aux_pgtable_cleanup(ibb, &aux_pgtable_info);
}