blob: 22f3bbd80a776aba66115fbea68979105a307139 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.display;
import android.Manifest;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.os.IBinder;
import android.view.Display;
import java.util.Objects;
/**
* Calls into SurfaceFlinger for Display creation and deletion.
*/
public class DisplayControl {
private static native IBinder nativeCreateDisplay(String name, boolean secure,
float requestedRefreshRate);
private static native void nativeDestroyDisplay(IBinder displayToken);
private static native void nativeOverrideHdrTypes(IBinder displayToken, int[] modes);
private static native long[] nativeGetPhysicalDisplayIds();
private static native IBinder nativeGetPhysicalDisplayToken(long physicalDisplayId);
private static native int nativeSetHdrConversionMode(int conversionMode,
int preferredHdrOutputType, int[] autoHdrTypes, int autoHdrTypesLength);
private static native int[] nativeGetSupportedHdrOutputTypes();
private static native int[] nativeGetHdrOutputTypesWithLatency();
private static native boolean nativeGetHdrOutputConversionSupport();
/**
* Create a display in SurfaceFlinger.
*
* @param name The name of the display
* @param secure Whether this display is secure.
* @return The token reference for the display in SurfaceFlinger.
*/
public static IBinder createDisplay(String name, boolean secure) {
Objects.requireNonNull(name, "name must not be null");
return nativeCreateDisplay(name, secure, 0.0f);
}
/**
* Create a display in SurfaceFlinger.
*
* @param name The name of the display
* @param secure Whether this display is secure.
* @param requestedRefreshRate The requested refresh rate in frames per second.
* For best results, specify a divisor of the physical refresh rate, e.g., 30 or 60 on
* 120hz display. If an arbitrary refresh rate is specified, the rate will be rounded
* up or down to a divisor of the physical display. If 0 is specified, the virtual
* display is refreshed at the physical display refresh rate.
* @return The token reference for the display in SurfaceFlinger.
*/
public static IBinder createDisplay(String name, boolean secure,
float requestedRefreshRate) {
Objects.requireNonNull(name, "name must not be null");
return nativeCreateDisplay(name, secure, requestedRefreshRate);
}
/**
* Destroy a display in SurfaceFlinger.
*
* @param displayToken The display token for the display to be destroyed.
*/
public static void destroyDisplay(IBinder displayToken) {
if (displayToken == null) {
throw new IllegalArgumentException("displayToken must not be null");
}
nativeDestroyDisplay(displayToken);
}
/**
* Overrides HDR modes for a display device.
*/
@RequiresPermission(Manifest.permission.ACCESS_SURFACE_FLINGER)
public static void overrideHdrTypes(@NonNull IBinder displayToken, @NonNull int[] modes) {
nativeOverrideHdrTypes(displayToken, modes);
}
/**
* Gets all the physical display ids.
*/
public static long[] getPhysicalDisplayIds() {
return nativeGetPhysicalDisplayIds();
}
/**
* Gets the display's token from the physical display id
*/
public static IBinder getPhysicalDisplayToken(long physicalDisplayId) {
return nativeGetPhysicalDisplayToken(physicalDisplayId);
}
/**
* Sets the HDR conversion mode for the device.
*
* Returns the system preferred Hdr output type nn case when HDR conversion mode is
* {@link android.hardware.display.HdrConversionMode#HDR_CONVERSION_SYSTEM}.
* Returns Hdr::INVALID in other cases.
* @hide
*/
public static int setHdrConversionMode(int conversionMode, int preferredHdrOutputType,
int[] autoHdrTypes) {
int length = autoHdrTypes != null ? autoHdrTypes.length : 0;
return nativeSetHdrConversionMode(
conversionMode, preferredHdrOutputType, autoHdrTypes, length);
}
/**
* Returns the HDR output types supported by the device.
* @hide
*/
public static @Display.HdrCapabilities.HdrType int[] getSupportedHdrOutputTypes() {
return nativeGetSupportedHdrOutputTypes();
}
/**
* Returns the HDR output types which introduces latency on conversion to them.
* @hide
*/
public static @Display.HdrCapabilities.HdrType int[] getHdrOutputTypesWithLatency() {
return nativeGetHdrOutputTypesWithLatency();
}
/**
* Returns whether the HDR output conversion is supported by the device.
* @hide
*/
public static boolean getHdrOutputConversionSupport() {
return nativeGetHdrOutputConversionSupport();
}
}