From c81484aec2acf359dca925009320f2487e476b7d Mon Sep 17 00:00:00 2001 From: ZhuChenyanX Date: Thu, 10 Jul 2025 08:54:06 +0000 Subject: [PATCH 1/2] Optimize antutu video score for xe driver Fix low decoding score on antutu ux in lunarlake. Tracked-On: OAM-134051 Signed-off-by: ZhuChenyanX Signed-off-by: HeYue --- cros_gralloc/cros_gralloc_helpers.cc | 2 +- xe.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/cros_gralloc/cros_gralloc_helpers.cc b/cros_gralloc/cros_gralloc_helpers.cc index 31297335..4a2be898 100644 --- a/cros_gralloc/cros_gralloc_helpers.cc +++ b/cros_gralloc/cros_gralloc_helpers.cc @@ -138,7 +138,7 @@ uint64_t cros_gralloc_convert_usage(uint64_t usage) handle_usage(&usage, GRALLOC_USAGE_HW_RENDER, &use_flags, BO_USE_RENDERING); handle_usage(&usage, GRALLOC_USAGE_HW_2D, &use_flags, BO_USE_RENDERING); /* HWC wants to use display hardware, but can defer to OpenGL. */ - handle_usage(&usage, GRALLOC_USAGE_HW_COMPOSER, &use_flags, BO_USE_TEXTURE); + handle_usage(&usage, GRALLOC_USAGE_HW_COMPOSER, &use_flags, BO_USE_TEXTURE | BO_USE_SCANOUT); handle_usage(&usage, GRALLOC_USAGE_PRIVATE_1, &use_flags, BO_USE_SCANOUT); handle_usage(&usage, GRALLOC_USAGE_HW_FB, &use_flags, BO_USE_NONE); /* diff --git a/xe.c b/xe.c index d083cf94..d199b6cd 100644 --- a/xe.c +++ b/xe.c @@ -237,7 +237,7 @@ static int xe_add_combinations(struct driver *drv) /* Media/Camera expect these formats support. */ drv_add_combinations(drv, linear_source_formats, ARRAY_SIZE(linear_source_formats), - &metadata_linear, texture_flags | BO_USE_CAMERA_MASK); + &metadata_linear, texture_flags | BO_USE_CAMERA_MASK); const uint64_t render_not_linear = unset_flags(render, linear_mask); const uint64_t scanout_and_render_not_linear = render_not_linear | BO_USE_SCANOUT; @@ -386,7 +386,11 @@ static void xe_clflush(void *start, size_t size) __builtin_ia32_mfence(); while (p < end) { - __builtin_ia32_clflush(p); + #if defined(__CLFLUSHOPT__) + __builtin_ia32_clflushopt(p); + #else + __builtin_ia32_clflush(p); + #endif p = (void *)((uintptr_t)p + XE_CACHELINE_SIZE); } } @@ -706,12 +710,17 @@ static int xe_bo_create_from_metadata(struct bo *bo) struct drm_xe_gem_create gem_create = { .vm_id = vm, .size = ALIGN(bo->meta.total_size, PAGE_SIZE), - .flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT, + .flags = 0, }; /* FIXME: let's assume iGPU with SYSMEM is only supported */ gem_create.placement |= BITFIELD_BIT(DRM_XE_MEM_REGION_CLASS_SYSMEM); - gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WC; + if (bo->meta.use_flags & BO_USE_SCANOUT) { + gem_create.flags |= DRM_XE_GEM_CREATE_FLAG_SCANOUT; + gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WC; + } else { + gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WB; + } ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_CREATE, &gem_create); if (ret) { @@ -788,7 +797,8 @@ static int xe_bo_invalidate(struct bo *bo, struct mapping *mapping) static int xe_bo_flush(struct bo *bo, struct mapping *mapping) { struct xe_device *xe = bo->drv->priv; - if (bo->meta.tiling == XE_TILING_NONE) + if ((bo->meta.tiling == XE_TILING_NONE) + && (bo->meta.use_flags & BO_USE_SW_WRITE_OFTEN)) xe_clflush(mapping->vma->addr, mapping->vma->length); return 0; From 2f9a75a153cd6370836c867557d019dc4d2761e4 Mon Sep 17 00:00:00 2001 From: ZhuChenyanX Date: Mon, 28 Jul 2025 01:18:23 +0000 Subject: [PATCH 2/2] Fix scrcpy fail issue Scrcpy needs WC bo, otherwise it'll has mos_bo_create_from_prime_xe fail error. The AB24 bo uses VIDEO_ENCODER flag, but no CPU_READ_OFTEN flag. Tracked-On: OAM-134051 Signed-off-by: ZhuChenyanX --- cros_gralloc/cros_gralloc_driver.cc | 18 ++++++------- cros_gralloc/cros_gralloc_helpers.cc | 2 +- i915.c | 2 +- xe.c | 40 +++++++++++++++------------- 4 files changed, 33 insertions(+), 29 deletions(-) diff --git a/cros_gralloc/cros_gralloc_driver.cc b/cros_gralloc/cros_gralloc_driver.cc index f5144d4c..bb871d55 100644 --- a/cros_gralloc/cros_gralloc_driver.cc +++ b/cros_gralloc/cros_gralloc_driver.cc @@ -395,15 +395,15 @@ bool cros_gralloc_driver::get_resolved_format_and_use_flags( resolved_use_flags &= ~BO_USE_SCANOUT; combo = drv_get_combination(drv, resolved_format, descriptor->use_flags); } - if (!combo && (descriptor->droid_usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) && - descriptor->droid_format != HAL_PIXEL_FORMAT_YCbCr_420_888) { - // Unmask BO_USE_HW_VIDEO_ENCODER for other formats. They are mostly - // intermediate formats not passed directly to the encoder (e.g. - // camera). YV12 is passed to the encoder component, but it is converted - // to YCbCr_420_888 before being passed to the hw encoder. - resolved_use_flags &= ~BO_USE_HW_VIDEO_ENCODER; - combo = drv_get_combination(drv, resolved_format, resolved_use_flags); - } + // if (!combo && (descriptor->droid_usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) && + // descriptor->droid_format != HAL_PIXEL_FORMAT_YCbCr_420_888) { + // // Unmask BO_USE_HW_VIDEO_ENCODER for other formats. They are mostly + // // intermediate formats not passed directly to the encoder (e.g. + // // camera). YV12 is passed to the encoder component, but it is converted + // // to YCbCr_420_888 before being passed to the hw encoder. + // resolved_use_flags &= ~BO_USE_HW_VIDEO_ENCODER; + // combo = drv_get_combination(drv, resolved_format, resolved_use_flags); + // } if (!combo && (descriptor->droid_usage & BUFFER_USAGE_FRONT_RENDERING_MASK)) { resolved_use_flags &= ~BO_USE_FRONT_RENDERING; resolved_use_flags |= BO_USE_LINEAR; diff --git a/cros_gralloc/cros_gralloc_helpers.cc b/cros_gralloc/cros_gralloc_helpers.cc index 4a2be898..b5162eb8 100644 --- a/cros_gralloc/cros_gralloc_helpers.cc +++ b/cros_gralloc/cros_gralloc_helpers.cc @@ -151,7 +151,7 @@ uint64_t cros_gralloc_convert_usage(uint64_t usage) handle_usage(&usage, GRALLOC_USAGE_CURSOR, &use_flags, BO_USE_NONE); /* HACK: See b/30054495 for BO_USE_SW_READ_OFTEN. */ handle_usage(&usage, GRALLOC_USAGE_HW_VIDEO_ENCODER, &use_flags, - BO_USE_HW_VIDEO_ENCODER | BO_USE_SW_READ_OFTEN); + BO_USE_HW_VIDEO_ENCODER /* | BO_USE_SW_READ_OFTEN*/); handle_usage(&usage, GRALLOC_USAGE_HW_CAMERA_WRITE, &use_flags, BO_USE_CAMERA_WRITE); handle_usage(&usage, GRALLOC_USAGE_HW_CAMERA_READ, &use_flags, BO_USE_CAMERA_READ); handle_usage(&usage, GRALLOC_USAGE_RENDERSCRIPT, &use_flags, BO_USE_RENDERSCRIPT); diff --git a/i915.c b/i915.c index 5a68a115..bb4184dd 100644 --- a/i915.c +++ b/i915.c @@ -267,7 +267,7 @@ static int i915_add_combinations(struct driver *drv) BO_USE_HW_VIDEO_ENCODER | BO_USE_GPU_DATA_BUFFER | BO_USE_SENSOR_DIRECT_DATA); drv_modify_combination(drv, DRM_FORMAT_ABGR8888, &metadata_linear, BO_USE_CURSOR | BO_USE_SCANOUT | - BO_USE_GPU_DATA_BUFFER); + BO_USE_GPU_DATA_BUFFER | BO_USE_HW_VIDEO_ENCODER); drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata_linear, BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_CAMERA_MASK); drv_modify_combination(drv, DRM_FORMAT_YUYV, &metadata_linear, diff --git a/xe.c b/xe.c index d199b6cd..e95689f3 100644 --- a/xe.c +++ b/xe.c @@ -221,7 +221,7 @@ static int xe_add_combinations(struct driver *drv) BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_HW_VIDEO_DECODER | BO_USE_HW_VIDEO_ENCODER | BO_USE_GPU_DATA_BUFFER | BO_USE_SENSOR_DIRECT_DATA); - drv_modify_combination(drv, DRM_FORMAT_ABGR8888, &metadata_linear, BO_USE_CURSOR | BO_USE_SCANOUT); + drv_modify_combination(drv, DRM_FORMAT_ABGR8888, &metadata_linear, BO_USE_CURSOR | BO_USE_SCANOUT | BO_USE_HW_VIDEO_ENCODER); drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata_linear, BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_CAMERA_MASK); drv_modify_combination(drv, DRM_FORMAT_YUYV, &metadata_linear, @@ -280,8 +280,8 @@ static int xe_add_combinations(struct driver *drv) drv_add_combinations(drv, scanout_render_formats, ARRAY_SIZE(scanout_render_formats), &metadata_4_tiled, render_not_linear); - drv_add_combinations(drv, source_formats, ARRAY_SIZE(source_formats), &metadata_4_tiled, - texture_flags | BO_USE_NON_GPU_HW); + drv_add_combinations(drv, source_formats, ARRAY_SIZE(source_formats), &metadata_4_tiled, + texture_flags | BO_USE_NON_GPU_HW); } else { struct format_metadata metadata_y_tiled = { .tiling = XE_TILING_Y, @@ -712,16 +712,23 @@ static int xe_bo_create_from_metadata(struct bo *bo) .size = ALIGN(bo->meta.total_size, PAGE_SIZE), .flags = 0, }; - /* FIXME: let's assume iGPU with SYSMEM is only supported */ gem_create.placement |= BITFIELD_BIT(DRM_XE_MEM_REGION_CLASS_SYSMEM); - if (bo->meta.use_flags & BO_USE_SCANOUT) { - gem_create.flags |= DRM_XE_GEM_CREATE_FLAG_SCANOUT; + if ((bo->meta.use_flags & BO_USE_SCANOUT) && + !(bo->meta.use_flags & + (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_SW_READ_OFTEN))) { + gem_create.flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT; gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WC; - } else { + } else if (((bo->meta.use_flags & BO_USE_SW_WRITE_OFTEN) || + (bo->meta.use_flags & BO_USE_SW_READ_OFTEN)) && + !(bo->meta.use_flags & BO_USE_HW_VIDEO_ENCODER)) { gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WB; + } else { + gem_create.flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT; + gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WC; } + ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_CREATE, &gem_create); if (ret) { drv_loge("DRM_IOCTL_XE_GEM_CREATE failed (size=%llu)\n", gem_create.size); @@ -764,20 +771,17 @@ static void *xe_bo_map(struct bo *bo, struct vma *vma, uint32_t map_flags) struct xe_device *xe = bo->drv->priv; if ((bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_CCS) || - (bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) || - (bo->meta.format_modifier == I915_FORMAT_MOD_4_TILED)) + (bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS)) return MAP_FAILED; - if ((bo->meta.tiling == XE_TILING_NONE) || (addr == MAP_FAILED)) { - struct drm_xe_gem_mmap_offset gem_map = { 0 }; - gem_map.handle = bo->handles[0].u32; + struct drm_xe_gem_mmap_offset gem_map = { 0 }; + gem_map.handle = bo->handles[0].u32; - /* Get the fake offset back */ - ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_MMAP_OFFSET, &gem_map); - if (ret == 0) - addr = mmap(0, bo->meta.total_size, drv_get_prot(map_flags), - MAP_SHARED, bo->drv->fd, gem_map.offset); - } + /* Get the fake offset back */ + ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_MMAP_OFFSET, &gem_map); + if (ret == 0) + addr = mmap(0, bo->meta.total_size, drv_get_prot(map_flags), + MAP_SHARED, bo->drv->fd, gem_map.offset); if (addr == MAP_FAILED) { drv_loge("xe GEM mmap failed\n");