blob: 1ea1a07ae61425e2a19766253d50ee909a5b7eee [file] [log] [blame]
/*
* Copyright (C) 2012 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.
*/
#ifndef EXYNOS_VIRTUAL_DISPLAY_DISPLAY_H
#define EXYNOS_VIRTUAL_DISPLAY_DISPLAY_H
#include "ExynosHWCDebug.h"
#include "../libdevice/ExynosDisplay.h"
#define VIRTUAL_DISLAY_SKIP_LAYER 0x00000100
class ExynosMPPModule;
enum WFDState {
DISABLE_WFD,
GOOGLEWFD,
LLWFD,
GOOGLEWFD_TO_LLWFD,
LLWFD_TO_GOOGLEWFD,
};
enum WFDCommand {
SET_WFD_MODE,
SET_TARGET_DISPLAY_LUMINANCE,
SET_TARGET_DISPLAY_DEVICE,
};
class ExynosVirtualDisplay : public ExynosDisplay {
public:
enum CompositionType {
COMPOSITION_UNKNOWN = 0,
COMPOSITION_GLES = 1,
COMPOSITION_HWC = 2,
COMPOSITION_MIXED = COMPOSITION_GLES | COMPOSITION_HWC
};
ExynosVirtualDisplay(uint32_t type, ExynosDevice *device);
~ExynosVirtualDisplay();
void createVirtualDisplay(uint32_t width, uint32_t height, int32_t* format);
void destroyVirtualDisplay();
int setWFDMode(unsigned int mode);
int getWFDMode();
int sendWFDCommand(int32_t cmd, int32_t ext1, int32_t ext2);
int setSecureVDSMode(unsigned int mode);
int setWFDOutputResolution(unsigned int width, unsigned int height);
void getWFDOutputResolution(unsigned int *width, unsigned int *height);
void setPresentationMode(bool use);
int getPresentationMode(void);
int setVDSGlesFormat(int format);
/* getDisplayAttribute(..., config, attribute, outValue)
* Descriptor: HWC2_FUNCTION_GET_DISPLAY_ATTRIBUTE
* HWC2_PFN_GET_DISPLAY_ATTRIBUTE
*/
virtual int32_t getDisplayAttribute(
hwc2_config_t config,
int32_t /*hwc2_attribute_t*/ attribute, int32_t* outValue);
/* setOutputBuffer(..., buffer, releaseFence)
* Descriptor: HWC2_FUNCTION_SET_OUTPUT_BUFFER
* HWC2_PFN_SET_OUTPUT_BUFFER
* releaseFence is actually acquireFence
* output buffer reader should wait releaseFence
*/
virtual int32_t setOutputBuffer(
buffer_handle_t buffer,
int32_t releaseFence);
virtual int clearDisplay();
/* validateDisplay(..., outNumTypes, outNumRequests)
* Descriptor: HWC2_FUNCTION_VALIDATE_DISPLAY
* HWC2_PFN_VALIDATE_DISPLAY
*/
virtual int32_t validateDisplay(uint32_t* outNumTypes, uint32_t* outNumRequests);
virtual int32_t canSkipValidate();
/* presentDisplay(..., outRetireFence)
* Descriptor: HWC2_FUNCTION_PRESENT_DISPLAY
* HWC2_PFN_PRESENT_DISPLAY
*/
virtual int32_t presentDisplay(int32_t* outRetireFence);
/**
* set config related DPU window
* Only DRM video playback scenario use it.
*/
virtual int setWinConfigData();
/**
* set config related with DPU WB
* Only DRM video playback scenario use it.
*/
virtual int setDisplayWinConfigData();
/**
* check validation of DPU config
* Only DRM video playback scenario use it.
*/
virtual int32_t validateWinConfigData();
/**
* call ioctl for DPU
* Only DRM video playback scenario use it.
*/
virtual int deliverWinConfigData();
/**
* set release fence of DPU to layers
* Only DRM video playback scenario use it.
*/
virtual int setReleaseFences();
/**
* check output buffer validation
* If it is invalid, don't presetnDisplay
* And function handle fence of DEVICE composition Layer.
*/
virtual bool checkFrameValidation();
/**
* If mIsWFDState is true, VirtualDisplaySurface use HWC
*/
int mIsWFDState;
protected:
void setSinkBufferUsage();
void setCompositionType();
void setDrmMode();
void initPerFrameData();
bool checkSkipFrame();
void handleSkipFrame();
void handleAcquireFence();
/**
* Display width, height information set by surfaceflinger
*/
unsigned int mDisplayWidth;
unsigned int mDisplayHeight;
/**
* output buffer and fence are set by setOutputBuffer()
*/
buffer_handle_t mOutputBuffer;
int32_t mOutputBufferAcquireFenceFd;
int32_t mOutputBufferReleaseFenceFd;
/**
* If mIsSecureVDSState is true, HWC doesn't change the color format of SINK BQ
*/
bool mIsSecureVDSState;
/**
* If mIsSkipFrame is true, TV should not be updated.
*/
bool mIsSkipFrame;
bool mPresentationMode;
/**
* If mIsRotationState is true,
* VurtualDisplaySurface don't queue graphic buffer
*/
int32_t mCompositionType;
/**
* G3D pixel format
*/
int32_t mGLESFormat;
/**
* output buffer usage
*/
int32_t mSinkUsage;
/**
* If mIsSecureDRM is true, DPU composition is used.
* Otherwise, G2D composition is used.
*/
bool mIsSecureDRM;
bool mIsNormalDRM;
/**
* reload the G2D instance to remove the shared buffer for HWFC
*/
bool mNeedReloadResourceForHWFC;
/**
* the minimum luminance and maximum luminance of the SINK device's display
* WFD engine will set this values.
*/
uint16_t mMaxTargetLuminance;
uint16_t mMinTargetLuminance;
/**
* the type of the SINK device
* WFD engine will set this values.
*/
int32_t mSinkDeviceType;
};
#endif