Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Ville Syrjala <ville.syrjala@linux.intel.com>
To: igt-dev@lists.freedesktop.org
Subject: [PATCH i-g-t 05/14] lib/igt_draw: Use function pointers for the linear<->tiled conversion
Date: Fri,  4 Oct 2024 13:41:12 +0300	[thread overview]
Message-ID: <20241004104121.32750-6-ville.syrjala@linux.intel.com> (raw)
In-Reply-To: <20241004104121.32750-1-ville.syrjala@linux.intel.com>

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Replace the bare switch statements in the linear<->tiled
conversions with functions pointers. This will allow us to
more cleanly provide platform specific implementations for
each tiling format.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 lib/igt_draw.c | 79 ++++++++++++++++++++++++++++----------------------
 1 file changed, 44 insertions(+), 35 deletions(-)

diff --git a/lib/igt_draw.c b/lib/igt_draw.c
index b39a33dcf2cb..dea73aca57b5 100644
--- a/lib/igt_draw.c
+++ b/lib/igt_draw.c
@@ -420,30 +420,34 @@ static void draw_rect_ptr_linear(void *ptr, uint32_t stride,
 	}
 }
 
-static void draw_rect_ptr_tiled(void *ptr, uint32_t stride, uint32_t tiling,
+typedef int (*linear_x_y_to_tiled_pos_fn)(int x, int y, uint32_t stride, int swizzle,
+					  int bpp);
+
+static linear_x_y_to_tiled_pos_fn linear_to_tiled_fn(int fd, uint32_t tiling)
+{
+	switch (tiling) {
+	case I915_TILING_X:
+		return linear_x_y_to_xtiled_pos;
+	case I915_TILING_Y:
+		return linear_x_y_to_ytiled_pos;
+	case I915_TILING_4:
+		return linear_x_y_to_4tiled_pos;
+	default:
+		igt_assert(false);
+	}
+}
+
+static void draw_rect_ptr_tiled(int fd, void *ptr, uint32_t stride, uint32_t tiling,
 				int swizzle, struct rect *rect, uint64_t color,
 				int bpp)
 {
+	linear_x_y_to_tiled_pos_fn linear_x_y_to_tiled_pos =
+		linear_to_tiled_fn(fd, tiling);
 	int x, y, pos;
 
 	for (y = rect->y; y < rect->y + rect->h; y++) {
 		for (x = rect->x; x < rect->x + rect->w; x++) {
-			switch (tiling) {
-			case I915_TILING_X:
-				pos = linear_x_y_to_xtiled_pos(x, y, stride,
-							       swizzle, bpp);
-				break;
-			case I915_TILING_Y:
-				pos = linear_x_y_to_ytiled_pos(x, y, stride,
-							       swizzle, bpp);
-				break;
-			case I915_TILING_4:
-				pos = linear_x_y_to_4tiled_pos(x, y, stride,
-							       swizzle, bpp);
-				break;
-			default:
-				igt_assert(false);
-			}
+			pos = linear_x_y_to_tiled_pos(x, y, stride, swizzle, bpp);
 			set_pixel(ptr, pos, color, bpp);
 		}
 	}
@@ -471,7 +475,7 @@ static void draw_rect_mmap_cpu(int fd, struct buf_data *buf, struct rect *rect,
 	case I915_TILING_X:
 	case I915_TILING_Y:
 	case I915_TILING_4:
-		draw_rect_ptr_tiled(ptr, buf->stride, tiling, swizzle, rect,
+		draw_rect_ptr_tiled(fd, ptr, buf->stride, tiling, swizzle, rect,
 				    color, buf->bpp);
 		break;
 	default:
@@ -536,7 +540,7 @@ static void draw_rect_mmap_wc(int fd, struct buf_data *buf, struct rect *rect,
 	case I915_TILING_X:
 	case I915_TILING_Y:
 	case I915_TILING_4:
-		draw_rect_ptr_tiled(ptr, buf->stride, tiling, swizzle, rect,
+		draw_rect_ptr_tiled(fd, ptr, buf->stride, tiling, swizzle, rect,
 				    color, buf->bpp);
 		break;
 	default:
@@ -563,10 +567,29 @@ static void draw_rect_pwrite_untiled(int fd, struct buf_data *buf,
 	}
 }
 
+typedef void (*tiled_pos_to_x_y_linear_fn)(int tiled_pos, uint32_t stride,
+					   int swizzle, int bpp, int *x, int *y);
+
+static tiled_pos_to_x_y_linear_fn tiled_to_linear_fn(int fd, uint32_t tiling)
+{
+	switch (tiling) {
+	case I915_TILING_X:
+		return xtiled_pos_to_x_y_linear;
+	case I915_TILING_Y:
+		return ytiled_pos_to_x_y_linear;
+	case I915_TILING_4:
+		return tile4_pos_to_x_y_linear;
+	default:
+		igt_assert(false);
+	}
+}
+
 static void draw_rect_pwrite_tiled(int fd, struct buf_data *buf,
 				   uint32_t tiling, struct rect *rect,
 				   uint64_t color, uint32_t swizzle)
 {
+	tiled_pos_to_x_y_linear_fn tiled_pos_to_x_y_linear =
+		tiled_to_linear_fn(fd, tiling);
 	int i;
 	int tiled_pos, x, y, pixel_size;
 	uint8_t tmp[4096];
@@ -588,22 +611,8 @@ static void draw_rect_pwrite_tiled(int fd, struct buf_data *buf,
 		set_pixel(tmp, i, color, buf->bpp);
 
 	for (tiled_pos = 0; tiled_pos < buf->size; tiled_pos += pixel_size) {
-		switch (tiling) {
-		case I915_TILING_X:
-			xtiled_pos_to_x_y_linear(tiled_pos, buf->stride,
-						 swizzle, buf->bpp, &x, &y);
-			break;
-		case I915_TILING_Y:
-			ytiled_pos_to_x_y_linear(tiled_pos, buf->stride,
-						 swizzle, buf->bpp, &x, &y);
-			break;
-		case I915_TILING_4:
-			tile4_pos_to_x_y_linear(tiled_pos, buf->stride,
-						swizzle, buf->bpp, &x, &y);
-			break;
-		default:
-			igt_assert(false);
-		}
+		tiled_pos_to_x_y_linear(tiled_pos, buf->stride,
+					swizzle, buf->bpp, &x, &y);
 
 		if (x >= rect->x && x < rect->x + rect->w &&
 		    y >= rect->y && y < rect->y + rect->h) {
-- 
2.45.2


  parent reply	other threads:[~2024-10-04 10:41 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-04 10:41 [PATCH i-g-t 00/14] intel: igt_draw and intel_bufops improvements Ville Syrjala
2024-10-04 10:41 ` [PATCH i-g-t 01/14] lib/igt_draw: Use void* where appopriate Ville Syrjala
2024-10-29 14:44   ` Juha-Pekka Heikkila
2024-10-04 10:41 ` [PATCH i-g-t 02/14] lib/igt_draw: Extend the API to support 64bpp colors Ville Syrjala
2024-10-22 16:04   ` Kamil Konieczny
2024-10-04 10:41 ` [PATCH i-g-t 03/14] lib/igt_draw: Support 64bpp int the mmap/pwrite paths Ville Syrjala
2024-10-22 15:55   ` Kamil Konieczny
2024-10-04 10:41 ` [PATCH i-g-t 04/14] lib/igt_draw: Support 8bpp " Ville Syrjala
2024-10-22 15:54   ` Kamil Konieczny
2024-10-04 10:41 ` Ville Syrjala [this message]
2024-11-12  9:59   ` [PATCH i-g-t 05/14] lib/igt_draw: Use function pointers for the linear<->tiled conversion Juha-Pekka Heikkilä
2024-10-04 10:41 ` [PATCH i-g-t 06/14] lib/igt_draw: Add support for gen2 and i915 tiling layouts Ville Syrjala
2024-11-12 16:08   ` Juha-Pekka Heikkilä
2024-10-04 10:41 ` [PATCH i-g-t 07/14] lib/igt_draw: Add 64bpp support to the XY_FAST_COLOR_BLT path Ville Syrjala
2024-10-29 15:02   ` Juha-Pekka Heikkila
2024-10-04 10:41 ` [PATCH i-g-t 08/14] lib/igt_draw: Add 64bpp support for the non-XY_FAST_COLOR_BLT path Ville Syrjala
2024-11-18 14:42   ` Juha-Pekka Heikkilä
2024-10-04 10:41 ` [PATCH i-g-t 09/14] lib/intel_bufops: Add support for gen2 and i915 tiling layouts Ville Syrjala
2024-10-04 10:41 ` [PATCH i-g-t 10/14] lib/intel_bufops: Provide pread/pwrite based fallback when we don't have WC Ville Syrjala
2024-10-22 15:51   ` Kamil Konieczny
2024-10-24 16:20   ` [PATCH i-g-t v2 " Ville Syrjala
2024-10-04 10:41 ` [PATCH i-g-t 11/14] lib/rendercopy: Use igt_require() to validate gen2/3 surface size Ville Syrjala
2024-10-22 16:21   ` Kamil Konieczny
2024-10-04 10:41 ` [PATCH i-g-t 12/14] tests/kms_draw_crc: Test 64bpp Ville Syrjala
2024-11-18 14:50   ` Juha-Pekka Heikkilä
2024-10-04 10:41 ` [PATCH i-g-t 13/14] lib/igt_aux: Add igt_ror() and igt_rol() Ville Syrjala
2024-10-22 15:52   ` Kamil Konieczny
2024-10-04 10:41 ` [PATCH i-g-t 14/14] tests/gem_draw: Test igt_draw without kms Ville Syrjala
2024-10-11 10:43   ` [PATCH i-g-t v2 " Ville Syrjala
2024-10-22 16:30     ` Kamil Konieczny
2024-10-23 12:21       ` Ville Syrjälä
2024-10-07 15:39 ` ✗ GitLab.Pipeline: warning for intel: igt_draw and intel_bufops improvements Patchwork
2024-10-10 19:41   ` Ville Syrjälä
2024-10-11  6:37     ` Zbigniew Kempczyński
2024-10-11  7:42       ` Kamil Konieczny
2024-10-11 10:25       ` Ville Syrjälä
2024-10-11  7:00     ` Zbigniew Kempczyński
2024-10-11  8:01       ` Piecielska, Katarzyna
2024-10-11 10:15       ` Ville Syrjälä
2024-10-11 15:23 ` ✓ Fi.CI.BAT: success for intel: igt_draw and intel_bufops improvements (rev2) Patchwork
2024-10-11 16:01 ` ✓ CI.xeBAT: " Patchwork
2024-10-11 19:55 ` ✗ CI.xeFULL: failure " Patchwork
2024-10-12  9:01 ` ✗ Fi.CI.IGT: " Patchwork
2024-10-24 18:03 ` ✓ Fi.CI.BAT: success for intel: igt_draw and intel_bufops improvements (rev3) Patchwork
2024-10-24 18:37 ` ✓ CI.xeBAT: " Patchwork
2024-10-24 20:53 ` ✗ Fi.CI.IGT: failure " Patchwork
2024-10-25 22:48 ` ✗ CI.xeFULL: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241004104121.32750-6-ville.syrjala@linux.intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox