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
35 namespace sdm {
36
Create(HWInterface ** intf,HWInfoInterface * hw_info_intf,BufferSyncHandler * buffer_sync_handler)37 DisplayError 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
Destroy(HWInterface * intf)53 DisplayError 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
HWVirtual(BufferSyncHandler * buffer_sync_handler,HWInfoInterface * hw_info_intf)61 HWVirtual::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
Init()68 DisplayError HWVirtual::Init() {
69 return HWDevice::Init();
70 }
71
Validate(HWLayers * hw_layers)72 DisplayError HWVirtual::Validate(HWLayers *hw_layers) {
73 HWDevice::ResetDisplayParams();
74 return HWDevice::Validate(hw_layers);
75 }
76
GetMixerAttributes(HWMixerAttributes * mixer_attributes)77 DisplayError 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
SetDisplayAttributes(const HWDisplayAttributes & display_attributes)90 DisplayError 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