Skip to content

Commit 75cad40

Browse files
yhe39sysopenci
authored andcommitted
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-134069 Signed-off-by: ZhuChenyanX <zhucx@intel.com>
1 parent 2f796c4 commit 75cad40

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed

cros_gralloc/cros_gralloc_driver.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -395,15 +395,15 @@ bool cros_gralloc_driver::get_resolved_format_and_use_flags(
395395
resolved_use_flags &= ~BO_USE_SCANOUT;
396396
combo = drv_get_combination(drv, resolved_format, descriptor->use_flags);
397397
}
398-
if (!combo && (descriptor->droid_usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) &&
399-
descriptor->droid_format != HAL_PIXEL_FORMAT_YCbCr_420_888) {
400-
// Unmask BO_USE_HW_VIDEO_ENCODER for other formats. They are mostly
401-
// intermediate formats not passed directly to the encoder (e.g.
402-
// camera). YV12 is passed to the encoder component, but it is converted
403-
// to YCbCr_420_888 before being passed to the hw encoder.
404-
resolved_use_flags &= ~BO_USE_HW_VIDEO_ENCODER;
405-
combo = drv_get_combination(drv, resolved_format, resolved_use_flags);
406-
}
398+
// if (!combo && (descriptor->droid_usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) &&
399+
// descriptor->droid_format != HAL_PIXEL_FORMAT_YCbCr_420_888) {
400+
// // Unmask BO_USE_HW_VIDEO_ENCODER for other formats. They are mostly
401+
// // intermediate formats not passed directly to the encoder (e.g.
402+
// // camera). YV12 is passed to the encoder component, but it is converted
403+
// // to YCbCr_420_888 before being passed to the hw encoder.
404+
// resolved_use_flags &= ~BO_USE_HW_VIDEO_ENCODER;
405+
// combo = drv_get_combination(drv, resolved_format, resolved_use_flags);
406+
// }
407407
if (!combo && (descriptor->droid_usage & BUFFER_USAGE_FRONT_RENDERING_MASK)) {
408408
resolved_use_flags &= ~BO_USE_FRONT_RENDERING;
409409
resolved_use_flags |= BO_USE_LINEAR;

cros_gralloc/cros_gralloc_helpers.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ uint64_t cros_gralloc_convert_usage(uint64_t usage)
167167
handle_usage(&usage, GRALLOC_USAGE_CURSOR, &use_flags, BO_USE_NONE);
168168
/* HACK: See b/30054495 for BO_USE_SW_READ_OFTEN. */
169169
handle_usage(&usage, GRALLOC_USAGE_HW_VIDEO_ENCODER, &use_flags,
170-
BO_USE_HW_VIDEO_ENCODER | BO_USE_SW_READ_OFTEN);
170+
BO_USE_HW_VIDEO_ENCODER /* | BO_USE_SW_READ_OFTEN*/);
171171
handle_usage(&usage, GRALLOC_USAGE_HW_CAMERA_WRITE, &use_flags, BO_USE_CAMERA_WRITE);
172172
handle_usage(&usage, GRALLOC_USAGE_HW_CAMERA_READ, &use_flags, BO_USE_CAMERA_READ);
173173
handle_usage(&usage, GRALLOC_USAGE_RENDERSCRIPT, &use_flags, BO_USE_RENDERSCRIPT);

xe.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ static int xe_add_combinations(struct driver *drv)
182182
BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_HW_VIDEO_DECODER |
183183
BO_USE_HW_VIDEO_ENCODER | BO_USE_GPU_DATA_BUFFER |
184184
BO_USE_SENSOR_DIRECT_DATA);
185-
drv_modify_combination(drv, DRM_FORMAT_ABGR8888, &metadata_linear, BO_USE_CURSOR | BO_USE_SCANOUT);
185+
drv_modify_combination(drv, DRM_FORMAT_ABGR8888, &metadata_linear, BO_USE_CURSOR | BO_USE_SCANOUT | BO_USE_HW_VIDEO_ENCODER);
186186
drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata_linear,
187187
BO_USE_RENDERING | BO_USE_TEXTURE | BO_USE_CAMERA_MASK);
188188
drv_modify_combination(drv, DRM_FORMAT_YUYV, &metadata_linear,
@@ -241,8 +241,8 @@ static int xe_add_combinations(struct driver *drv)
241241
drv_add_combinations(drv, scanout_render_formats,
242242
ARRAY_SIZE(scanout_render_formats), &metadata_4_tiled,
243243
scanout_and_render_not_linear);
244-
drv_add_combinations(drv, source_formats, ARRAY_SIZE(source_formats), &metadata_4_tiled,
245-
texture_flags | BO_USE_NON_GPU_HW);
244+
drv_add_combinations(drv, source_formats, ARRAY_SIZE(source_formats), &metadata_4_tiled,
245+
texture_flags | BO_USE_NON_GPU_HW);
246246

247247
} else {
248248
struct format_metadata metadata_y_tiled = { .tiling = XE_TILING_Y,
@@ -671,16 +671,23 @@ static int xe_bo_create_from_metadata(struct bo *bo)
671671
.size = ALIGN(bo->meta.total_size, PAGE_SIZE),
672672
.flags = 0,
673673
};
674-
675674
/* FIXME: let's assume iGPU with SYSMEM is only supported */
676675
gem_create.placement |= BITFIELD_BIT(DRM_XE_MEM_REGION_CLASS_SYSMEM);
677-
if (bo->meta.use_flags & BO_USE_SCANOUT) {
678-
gem_create.flags |= DRM_XE_GEM_CREATE_FLAG_SCANOUT;
676+
if ((bo->meta.use_flags & BO_USE_SCANOUT) &&
677+
!(bo->meta.use_flags & (BO_USE_RENDERSCRIPT | BO_USE_CAMERA_READ
678+
| BO_USE_CAMERA_WRITE | BO_USE_SW_READ_OFTEN))) {
679+
gem_create.flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT;
679680
gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WC;
680-
} else {
681+
} else if (((bo->meta.use_flags & BO_USE_SW_WRITE_OFTEN) ||
682+
(bo->meta.use_flags & BO_USE_SW_READ_OFTEN)) &&
683+
!(bo->meta.use_flags & BO_USE_HW_VIDEO_ENCODER)) {
681684
gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WB;
685+
} else {
686+
gem_create.flags = DRM_XE_GEM_CREATE_FLAG_SCANOUT;
687+
gem_create.cpu_caching = DRM_XE_GEM_CPU_CACHING_WC;
682688
}
683689

690+
684691
ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_CREATE, &gem_create);
685692
if (ret) {
686693
drv_loge("DRM_IOCTL_XE_GEM_CREATE failed (size=%llu)\n", gem_create.size);
@@ -723,20 +730,17 @@ static void *xe_bo_map(struct bo *bo, struct vma *vma, uint32_t map_flags)
723730
struct xe_device *xe = bo->drv->priv;
724731

725732
if ((bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_CCS) ||
726-
(bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS) ||
727-
(bo->meta.format_modifier == I915_FORMAT_MOD_4_TILED))
733+
(bo->meta.format_modifier == I915_FORMAT_MOD_Y_TILED_GEN12_RC_CCS))
728734
return MAP_FAILED;
729735

730-
if ((bo->meta.tiling == XE_TILING_NONE) || (addr == MAP_FAILED)) {
731-
struct drm_xe_gem_mmap_offset gem_map = { 0 };
732-
gem_map.handle = bo->handles[0].u32;
736+
struct drm_xe_gem_mmap_offset gem_map = { 0 };
737+
gem_map.handle = bo->handles[0].u32;
733738

734-
/* Get the fake offset back */
735-
ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_MMAP_OFFSET, &gem_map);
736-
if (ret == 0)
737-
addr = mmap(0, bo->meta.total_size, drv_get_prot(map_flags),
738-
MAP_SHARED, bo->drv->fd, gem_map.offset);
739-
}
739+
/* Get the fake offset back */
740+
ret = drmIoctl(bo->drv->fd, DRM_IOCTL_XE_GEM_MMAP_OFFSET, &gem_map);
741+
if (ret == 0)
742+
addr = mmap(0, bo->meta.total_size, drv_get_prot(map_flags),
743+
MAP_SHARED, bo->drv->fd, gem_map.offset);
740744

741745
if (addr == MAP_FAILED) {
742746
drv_loge("xe GEM mmap failed\n");

0 commit comments

Comments
 (0)