1/*
2// Copyright (c) 2014 Intel Corporation 
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//      http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15*/
16
17#include <common/utils/HwcTrace.h>
18#include <DisplayPlane.h>
19#include <hal_public.h>
20#include <DisplayQuery.h>
21#include <khronos/openmax/OMX_IntelVideoExt.h>
22#include <Hwcomposer.h>
23
24
25namespace android {
26namespace intel {
27
28bool DisplayQuery::isVideoFormat(uint32_t format)
29{
30    switch (format) {
31    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar:
32    case OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled:
33    // Expand format to support the case: Software decoder + HW rendering
34    // Only VP9 use this foramt now
35    case HAL_PIXEL_FORMAT_INTEL_YV12:
36        return true;
37    default:
38        return false;
39    }
40}
41
42int DisplayQuery::getOverlayLumaStrideAlignment(uint32_t format)
43{
44    // both luma and chroma stride need to be 64-byte aligned for overlay
45    switch (format) {
46    case HAL_PIXEL_FORMAT_YV12:
47    case HAL_PIXEL_FORMAT_INTEL_YV12:
48    case HAL_PIXEL_FORMAT_I420:
49        // for these two formats, chroma stride is calculated as half of luma stride
50        // so luma stride needs to be 128-byte aligned.
51        return 128;
52    default:
53        return 64;
54    }
55}
56
57uint32_t DisplayQuery::queryNV12Format()
58{
59    return HAL_PIXEL_FORMAT_NV12;
60}
61
62bool DisplayQuery::forceFbScaling(int device)
63{
64    // RGB planes don't support scaling. Panel fitter can be used to scale frame buffer to device's resolution
65    // if scaling factor is less than 1.5. Otherwise, GPU scaling is needed on RGB buffer, or hardware overlay
66    // scaling is needed on NV12 buffer
67
68    // this needs to work together with kernel driver. Panel fitter needs to be disabled if scaling factor is greater
69    // than 1.5
70
71    uint32_t width, height;
72    if (!Hwcomposer::getInstance().getDrm()->getDisplayResolution(device, width, height)) {
73        return false;
74    }
75
76    if (DEFAULT_DRM_FB_WIDTH / (float)width > 1.5) {
77        return true;
78    }
79
80    if (DEFAULT_DRM_FB_HEIGHT / (float)height > 1.5) {
81        return true;
82    }
83
84    return false;
85}
86
87} // namespace intel
88} // namespace android
89
90