OSDN Git Service

Revert "Merge Android R"
[android-x86/external-minigbm.git] / i915.c
diff --git a/i915.c b/i915.c
index 05c8272..bccc0b5 100644 (file)
--- a/i915.c
+++ b/i915.c
@@ -81,25 +81,23 @@ static int i915_add_combinations(struct driver *drv)
                             texture_only);
 
        drv_modify_linear_combinations(drv);
-       /*
-        * Chrome uses DMA-buf mmap to write to YV12 buffers, which are then accessed by the
-        * Video Encoder Accelerator (VEA). It could also support NV12 potentially in the future.
-        */
-       drv_modify_combination(drv, DRM_FORMAT_YVU420, &metadata, BO_USE_HW_VIDEO_ENCODER);
+
+       /* NV12 format for camera, display, decoding and encoding. */
        /* IPU3 camera ISP supports only NV12 output. */
        drv_modify_combination(drv, DRM_FORMAT_NV12, &metadata,
-                              BO_USE_HW_VIDEO_ENCODER | BO_USE_HW_VIDEO_DECODER |
-                                  BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_SCANOUT);
+                              BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_SCANOUT |
+                                  BO_USE_HW_VIDEO_DECODER | BO_USE_HW_VIDEO_ENCODER);
 
        /* Android CTS tests require this. */
        drv_add_combination(drv, DRM_FORMAT_BGR888, &metadata, BO_USE_SW_MASK);
 
        /*
         * R8 format is used for Android's HAL_PIXEL_FORMAT_BLOB and is used for JPEG snapshots
-        * from camera.
+        * from camera and input/output from hardware decoder/encoder.
         */
        drv_modify_combination(drv, DRM_FORMAT_R8, &metadata,
-                              BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE);
+                              BO_USE_CAMERA_READ | BO_USE_CAMERA_WRITE | BO_USE_HW_VIDEO_DECODER |
+                                  BO_USE_HW_VIDEO_ENCODER);
 
        render = unset_flags(render, linear_mask);
        scanout_and_render = unset_flags(scanout_and_render, linear_mask);
@@ -116,7 +114,8 @@ static int i915_add_combinations(struct driver *drv)
        metadata.priority = 3;
        metadata.modifier = I915_FORMAT_MOD_Y_TILED;
 
-       scanout_and_render = unset_flags(scanout_and_render, BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY);
+       scanout_and_render =
+           unset_flags(scanout_and_render, BO_USE_SW_READ_RARELY | BO_USE_SW_WRITE_RARELY);
 /* Support y-tiled NV12 and P010 for libva */
 #ifdef I915_SCANOUT_Y_TILED
        drv_add_combination(drv, DRM_FORMAT_NV12, &metadata,
@@ -272,12 +271,13 @@ static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t heig
                                    uint64_t use_flags, const uint64_t *modifiers, uint32_t count)
 {
        static const uint64_t modifier_order[] = {
-               I915_FORMAT_MOD_Y_TILED_CCS,
                I915_FORMAT_MOD_Y_TILED,
                I915_FORMAT_MOD_X_TILED,
                DRM_FORMAT_MOD_LINEAR,
        };
        uint64_t modifier;
+       struct i915_device *i915 = bo->drv->priv;
+       bool huge_bo = (i915->gen <= 11) && (width > 4096);
 
        if (modifiers) {
                modifier =
@@ -289,6 +289,21 @@ static int i915_bo_compute_metadata(struct bo *bo, uint32_t width, uint32_t heig
                modifier = combo->metadata.modifier;
        }
 
+       /*
+        * i915 only supports linear/x-tiled above 4096 wide
+        */
+       if (huge_bo && modifier != I915_FORMAT_MOD_X_TILED && modifier != DRM_FORMAT_MOD_LINEAR) {
+               uint32_t i;
+               for (i = 0; modifiers && i < count; i++) {
+                       if (modifiers[i] == I915_FORMAT_MOD_X_TILED)
+                               break;
+               }
+               if (i == count)
+                       modifier = DRM_FORMAT_MOD_LINEAR;
+               else
+                       modifier = I915_FORMAT_MOD_X_TILED;
+       }
+
        switch (modifier) {
        case DRM_FORMAT_MOD_LINEAR:
                bo->meta.tiling = I915_TILING_NONE;