[Mesa-dev] [PATCH] Adding tiled to linear conversion functionality

Satyajit Sahu satyajit.sahu at amd.com
Wed Nov 22 11:00:31 UTC 2017


Add tiled to linear conversion and expose outside mesa.
Also exposing the create compute and destroy surface fucntions outside.

Change-Id: Ie464ba0eac5d80048797bef1f6ad730c22947601
Signed-off-by: Satyajit Sahu <satyajit.sahu at amd.com>
---
 src/amd/Makefile.common.am      |   4 ++
 src/amd/common/ac_gpu_info.c    |   2 +
 src/amd/common/ac_surface.c     | 102 ++++++++++++++++++++++++++++++++++++++++
 src/amd/common/ac_surface.h     |   9 ++++
 src/gallium/targets/dri/dri.sym |   5 ++
 5 files changed, 122 insertions(+)

diff --git a/src/amd/Makefile.common.am b/src/amd/Makefile.common.am
index d62e9d41cf..651b3c7be0 100644
--- a/src/amd/Makefile.common.am
+++ b/src/amd/Makefile.common.am
@@ -53,6 +53,10 @@ common_libamd_common_la_CXXFLAGS = \
 	$(LLVM_CXXFLAGS)
 
 noinst_LTLIBRARIES += $(COMMON_LIBS)
+include_HEADERS = $(top_srcdir)/src/amd/common/ac_surface.h \
+		$(top_srcdir)/src/amd/common/ac_gpu_info.h \
+		$(top_srcdir)/src/amd/common/amd_family.h
+
 
 common_libamd_common_la_SOURCES = \
 	$(AMD_COMMON_FILES) \
diff --git a/src/amd/common/ac_gpu_info.c b/src/amd/common/ac_gpu_info.c
index 82ff18d436..89dc7fd683 100644
--- a/src/amd/common/ac_gpu_info.c
+++ b/src/amd/common/ac_gpu_info.c
@@ -28,6 +28,7 @@
 #include "gfx9d.h"
 
 #include "util/u_math.h"
+#include "util/macros.h"
 
 #include <stdio.h>
 
@@ -92,6 +93,7 @@ static bool has_syncobj(int fd)
 	return value ? true : false;
 }
 
+PUBLIC
 bool ac_query_gpu_info(int fd, amdgpu_device_handle dev,
 		       struct radeon_info *info,
 		       struct amdgpu_gpu_info *amdinfo)
diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
index f956c14a10..179043f6ff 100644
--- a/src/amd/common/ac_surface.c
+++ b/src/amd/common/ac_surface.c
@@ -150,6 +150,7 @@ static ADDR_E_RETURNCODE ADDR_API freeSysMem(const ADDR_FREESYSMEM_INPUT * pInpu
 	return ADDR_OK;
 }
 
+PUBLIC
 ADDR_HANDLE amdgpu_addr_create(const struct radeon_info *info,
 			       const struct amdgpu_gpu_info *amdinfo,
 			       uint64_t *max_alignment)
@@ -214,6 +215,15 @@ ADDR_HANDLE amdgpu_addr_create(const struct radeon_info *info,
 	return addrCreateOutput.hLib;
 }
 
+PUBLIC
+int amdgpu_addr_destroy(ADDR_HANDLE handle) {
+       ADDR_E_RETURNCODE ret = AddrDestroy(handle);
+       if(ret = ADDR_OK)
+               return 0;
+       else
+               return -((int)ret);
+}
+
 static int surf_config_sanity(const struct ac_surf_config *config)
 {
 	/* all dimension must be at least 1 ! */
@@ -1223,6 +1233,7 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib,
 	return 0;
 }
 
+PUBLIC
 int ac_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *info,
 		       const struct ac_surf_config *config,
 		       enum radeon_surf_mode mode,
@@ -1239,3 +1250,94 @@ int ac_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *info,
 	else
 		return gfx6_compute_surface(addrlib, info, config, mode, surf);
 }
+
+PUBLIC
+int ac_read_write_tiled_data(ADDR_HANDLE addrlib,
+			  struct ac_surf_config * config,
+                          struct radeon_surf * surf,
+                          void * addr, uint8_t * linear_ptr,
+                          bool write_to_tiled_buf) {
+	ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT in_param = { 0 };
+	ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT out_param;
+	const ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT *in_param_ptr = &in_param;
+	ADDR_TILEINFO tile_info = {0};
+	ADDR_E_RETURNCODE ret = ADDR_OK;
+	uint8_t *tiled_ptr;
+
+	if (!addr || !linear_ptr)
+		return -EINVAL;
+	out_param.size = sizeof(ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_OUTPUT);
+	in_param.size = sizeof(ADDR_COMPUTE_SURFACE_ADDRFROMCOORD_INPUT);
+	tile_info.banks = surf->u.legacy.num_banks;
+	tile_info.bankWidth = surf->u.legacy.bankw;
+	tile_info.bankHeight = surf->u.legacy.bankh;
+	tile_info.macroAspectRatio = surf->u.legacy.mtilea;
+	tile_info.tileSplitBytes = surf->u.legacy.tile_split;
+	tile_info.pipeConfig = surf->u.legacy.pipe_config;
+	/* bpp in bytes */
+	in_param.bpp = surf->bpe << 3;
+	in_param.pitch = surf->u.legacy.level[0].nblk_x;
+	in_param.height = surf->u.legacy.level[0].nblk_y;
+	in_param.numSlices = config->info.depth;
+	in_param.numSamples = config->info.samples;
+        switch (surf->u.legacy.level[0].mode) {
+	        case RADEON_SURF_MODE_LINEAR_ALIGNED:
+			in_param.tileMode = ADDR_TM_LINEAR_ALIGNED;
+		        break;
+		case RADEON_SURF_MODE_1D:
+		        in_param.tileMode = ADDR_TM_1D_TILED_THIN1;
+		        break;
+		case RADEON_SURF_MODE_2D:
+			in_param.tileMode = ADDR_TM_2D_TILED_THIN1;
+			tile_info.pipeConfig = surf->u.legacy.pipe_config + 1;
+			break;
+		default:
+			return -EINVAL;
+	}
+	if (surf->flags & RADEON_SURF_SCANOUT)
+		in_param.tileType = ADDR_DISPLAYABLE;
+	else if (surf->flags & (RADEON_SURF_Z_OR_SBUFFER | RADEON_SURF_FMASK))
+		in_param.tileType = ADDR_DEPTH_SAMPLE_ORDER;
+	else
+		in_param.tileType = ADDR_NON_DISPLAYABLE;
+	in_param.pTileInfo = &tile_info;
+	in_param.tileIndex = -1;
+	if (write_to_tiled_buf)	{
+		for (uint32_t j = 0; j < in_param.height; j++) {
+			for (uint32_t i = 0; i < in_param.pitch; i++) {
+				in_param.x = i;
+				in_param.y = j;
+				ret = AddrComputeSurfaceAddrFromCoord(addrlib, in_param_ptr, &out_param);
+				if (ADDR_OK == ret) {
+					/* get the pixel data ptr by adding the offset returned */
+					tiled_ptr = ((uint8_t *)addr) + out_param.addr;
+					if (tiled_ptr != NULL) {
+						memcpy(tiled_ptr, linear_ptr, (in_param.bpp >> 3));
+						linear_ptr += in_param.bpp >> 3;
+					}
+				} else {
+					return -((int)ret);
+				}
+			}
+		}
+	} else {
+		for (uint32_t j = 0; j < in_param.height; j++) {
+			for (uint32_t i = 0; i < in_param.pitch; i++) {
+				in_param.x = i;
+				in_param.y = j;
+				ret = AddrComputeSurfaceAddrFromCoord(addrlib, in_param_ptr, &out_param);
+				if (ADDR_OK == ret) {
+					/* get the pixel data ptr by adding the offset returned */
+					tiled_ptr = ((uint8_t *)addr) + out_param.addr;
+					if (tiled_ptr != NULL) {
+						memcpy(linear_ptr, tiled_ptr, (in_param.bpp >> 3));
+						linear_ptr += in_param.bpp >> 3;
+					}
+				} else {
+					return -((int)ret);
+				}
+			}
+		}
+	}
+	return 0;
+}
diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h
index 7ac4737e6d..61b094f16e 100644
--- a/src/amd/common/ac_surface.h
+++ b/src/amd/common/ac_surface.h
@@ -26,6 +26,7 @@
 #ifndef AC_SURFACE_H
 #define AC_SURFACE_H
 
+#include <stdbool.h>
 #include <stdint.h>
 
 #include "amd_family.h"
@@ -229,11 +230,19 @@ ADDR_HANDLE amdgpu_addr_create(const struct radeon_info *info,
 			       const struct amdgpu_gpu_info *amdinfo,
 			       uint64_t *max_alignment);
 
+int amdgpu_addr_destroy(ADDR_HANDLE handle);
+
 int ac_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *info,
 		       const struct ac_surf_config * config,
 		       enum radeon_surf_mode mode,
 		       struct radeon_surf *surf);
 
+int ac_read_write_tiled_data(ADDR_HANDLE addrlib,
+			  struct ac_surf_config * config,
+			  struct radeon_surf * surf,
+			  void * addr, uint8_t * linear_ptr,
+			  bool write_to_tiled_buf);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/gallium/targets/dri/dri.sym b/src/gallium/targets/dri/dri.sym
index 1fdf18beee..18a5f4b1bd 100644
--- a/src/gallium/targets/dri/dri.sym
+++ b/src/gallium/targets/dri/dri.sym
@@ -4,6 +4,11 @@
 		__driDriverGetExtensions*;
 		nouveau_drm_screen_create;
 		radeon_drm_winsys_create;
+		ac_compute_surface;
+		ac_query_gpu_info;
+		ac_read_write_tiled_data;
+		amdgpu_addr_create;
+		amdgpu_addr_destroy;
 		amdgpu_winsys_create;
 		fd_drm_screen_create;
 	local:
-- 
2.13.5



More information about the mesa-dev mailing list