mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
Add amdgpu_pixmap_get_tiling_info
Retrieves the tiling information about a pixmap BO from the kernel
driver.
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Tested-by: Qiang Yu <qiang.yu@amd.com>
(Cherry picked from commit 8e40f190e4)
This commit is contained in:
committed by
Michel Dänzer
parent
8cd5aa76c7
commit
5be3295cb2
@@ -131,6 +131,35 @@ Bool amdgpu_bo_get_handle(struct amdgpu_buffer *bo, uint32_t *handle)
|
||||
handle) == 0;
|
||||
}
|
||||
|
||||
static void amdgpu_pixmap_do_get_tiling_info(PixmapPtr pixmap)
|
||||
{
|
||||
struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap);
|
||||
ScreenPtr screen = pixmap->drawable.pScreen;
|
||||
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
|
||||
AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn);
|
||||
struct drm_amdgpu_gem_metadata gem_metadata;
|
||||
|
||||
gem_metadata.handle = priv->handle;
|
||||
gem_metadata.op = AMDGPU_GEM_METADATA_OP_GET_METADATA;
|
||||
|
||||
if (drmCommandWriteRead(pAMDGPUEnt->fd, DRM_AMDGPU_GEM_METADATA,
|
||||
&gem_metadata, sizeof(gem_metadata)) == 0)
|
||||
priv->tiling_info = gem_metadata.data.tiling_info;
|
||||
}
|
||||
|
||||
uint64_t amdgpu_pixmap_get_tiling_info(PixmapPtr pixmap)
|
||||
{
|
||||
struct amdgpu_pixmap *priv = amdgpu_get_pixmap_private(pixmap);
|
||||
uint32_t handle;
|
||||
|
||||
if (!priv || !priv->handle_valid) {
|
||||
amdgpu_pixmap_get_handle(pixmap, &handle);
|
||||
priv = amdgpu_get_pixmap_private(pixmap);
|
||||
}
|
||||
|
||||
return priv->tiling_info;
|
||||
}
|
||||
|
||||
Bool amdgpu_pixmap_get_handle(PixmapPtr pixmap, uint32_t *handle)
|
||||
{
|
||||
#ifdef USE_GLAMOR
|
||||
@@ -162,13 +191,15 @@ Bool amdgpu_pixmap_get_handle(PixmapPtr pixmap, uint32_t *handle)
|
||||
r = drmPrimeFDToHandle(pAMDGPUEnt->fd, fd, &priv->handle);
|
||||
close(fd);
|
||||
if (r == 0)
|
||||
goto success;
|
||||
goto get_tiling_info;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!priv->bo || !amdgpu_bo_get_handle(priv->bo, &priv->handle))
|
||||
return FALSE;
|
||||
|
||||
get_tiling_info:
|
||||
amdgpu_pixmap_do_get_tiling_info(pixmap);
|
||||
success:
|
||||
priv->handle_valid = TRUE;
|
||||
*handle = priv->handle;
|
||||
|
||||
@@ -31,6 +31,8 @@ extern struct amdgpu_buffer *amdgpu_alloc_pixmap_bo(ScrnInfoPtr pScrn, int width
|
||||
|
||||
extern Bool amdgpu_bo_get_handle(struct amdgpu_buffer *bo, uint32_t *handle);
|
||||
|
||||
extern uint64_t amdgpu_pixmap_get_tiling_info(PixmapPtr pixmap);
|
||||
|
||||
extern Bool amdgpu_pixmap_get_handle(PixmapPtr pixmap, uint32_t *handle);
|
||||
|
||||
extern int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo);
|
||||
|
||||
@@ -32,6 +32,8 @@ struct amdgpu_pixmap {
|
||||
uint_fast32_t gpu_read;
|
||||
uint_fast32_t gpu_write;
|
||||
|
||||
uint64_t tiling_info;
|
||||
|
||||
struct amdgpu_buffer *bo;
|
||||
|
||||
/* GEM handle for pixmaps shared via DRI2/3 */
|
||||
|
||||
Reference in New Issue
Block a user