1/*
2* Copyright (c) 2015 - 2016, The Linux Foundation. All rights reserved.
3*
4* Redistribution and use in source and binary forms, with or without
5* modification, are permitted provided that the following conditions are
6* met:
7*     * Redistributions of source code must retain the above copyright
8*       notice, this list of conditions and the following disclaimer.
9*     * Redistributions in binary form must reproduce the above
10*       copyright notice, this list of conditions and the following
11*       disclaimer in the documentation and/or other materials provided
12*       with the distribution.
13*     * Neither the name of The Linux Foundation nor the names of its
14*       contributors may be used to endorse or promote products derived
15*       from this software without specific prior written permission.
16*
17* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#include <utils/debug.h>
31#include "hw_virtual.h"
32
33#define __CLASS__ "HWVirtual"
34
35namespace sdm {
36
37DisplayError HWVirtual::Create(HWInterface **intf, HWInfoInterface *hw_info_intf,
38                               BufferSyncHandler *buffer_sync_handler) {
39  DisplayError error = kErrorNone;
40  HWVirtual *hw_virtual = NULL;
41
42  hw_virtual = new HWVirtual(buffer_sync_handler, hw_info_intf);
43  error = hw_virtual->Init();
44  if (error != kErrorNone) {
45    delete hw_virtual;
46  } else {
47    *intf = hw_virtual;
48  }
49
50  return error;
51}
52
53DisplayError HWVirtual::Destroy(HWInterface *intf) {
54  HWVirtual *hw_virtual = static_cast<HWVirtual *>(intf);
55  hw_virtual->Deinit();
56  delete hw_virtual;
57
58  return kErrorNone;
59}
60
61HWVirtual::HWVirtual(BufferSyncHandler *buffer_sync_handler, HWInfoInterface *hw_info_intf)
62  : HWDevice(buffer_sync_handler) {
63  HWDevice::device_type_ = kDeviceVirtual;
64  HWDevice::device_name_ = "Virtual Display Device";
65  HWDevice::hw_info_intf_ = hw_info_intf;
66}
67
68DisplayError HWVirtual::Init() {
69  return HWDevice::Init();
70}
71
72DisplayError HWVirtual::Validate(HWLayers *hw_layers) {
73  HWDevice::ResetDisplayParams();
74  return HWDevice::Validate(hw_layers);
75}
76
77DisplayError HWVirtual::GetMixerAttributes(HWMixerAttributes *mixer_attributes) {
78  if (!mixer_attributes) {
79    return kErrorParameters;
80  }
81
82  mixer_attributes->width = display_attributes_.x_pixels;
83  mixer_attributes->height = display_attributes_.y_pixels;
84  mixer_attributes_.split_left = display_attributes_.is_device_split ?
85      (display_attributes_.x_pixels / 2) : mixer_attributes_.width;
86
87  return kErrorNone;
88}
89
90DisplayError HWVirtual::SetDisplayAttributes(const HWDisplayAttributes &display_attributes) {
91  if (display_attributes.x_pixels == 0 || display_attributes.y_pixels == 0) {
92    return kErrorParameters;
93  }
94
95  display_attributes_ = display_attributes;
96
97  if (display_attributes_.x_pixels > hw_resource_.max_mixer_width) {
98    display_attributes_.is_device_split = true;
99  }
100
101  return kErrorNone;
102}
103
104}  // namespace sdm
105
106