1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/hardware_display_plane.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <drm.h> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <errno.h> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <xf86drm.h> 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/geometry/rect.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/ozone/platform/dri/dri_wrapper.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace ui { 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kCrtcPropName = "CRTC_ID"; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kFbPropName = "FB_ID"; 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kCrtcXPropName = "CRTC_X"; 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kCrtcYPropName = "CRTC_Y"; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kCrtcWPropName = "CRTC_W"; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kCrtcHPropName = "CRTC_H"; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kSrcXPropName = "SRC_X"; 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kSrcYPropName = "SRC_Y"; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kSrcWPropName = "SRC_W"; 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char* kSrcHPropName = "SRC_H"; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 30116680a4aac90f2aa7413d9095a592090648e557Ben MurdochHardwareDisplayPlane::Property::Property() : id_(0) { 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool HardwareDisplayPlane::Property::Initialize( 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DriWrapper* drm, 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const char* name, 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ScopedDrmObjectPropertyPtr& plane_props) { 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (uint32_t i = 0; i < plane_props->count_props; i++) { 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedDrmPropertyPtr property( 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModeGetProperty(drm->get_fd(), plane_props->props[i])); 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!strcmp(property->name, name)) { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch id_ = property->prop_id; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!id_) { 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Could not find property " << name; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 52116680a4aac90f2aa7413d9095a592090648e557Ben MurdochHardwareDisplayPlane::HardwareDisplayPlane( 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DriWrapper* drm, 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetPtr atomic_property_set, 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedDrmPlanePtr plane) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : drm_(drm), 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_(atomic_property_set), 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch plane_(plane.Pass()), 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch plane_id_(plane_->plane_id) { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 62116680a4aac90f2aa7413d9095a592090648e557Ben MurdochHardwareDisplayPlane::~HardwareDisplayPlane() { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool HardwareDisplayPlane::CanUseForCrtc(uint32_t crtc_id) { 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return plane_->possible_crtcs & (1 << crtc_id); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool HardwareDisplayPlane::SetPlaneData(uint32_t crtc_id, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32_t framebuffer, 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& crtc_rect, 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::Rect& src_rect) { 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int plane_set_error = 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, crtc_prop_.id_, crtc_id) || 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, fb_prop_.id_, framebuffer) || 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, crtc_x_prop_.id_, crtc_rect.x()) || 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, crtc_y_prop_.id_, crtc_rect.y()) || 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, crtc_w_prop_.id_, crtc_rect.width()) || 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, crtc_h_prop_.id_, crtc_rect.height()) || 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, src_x_prop_.id_, src_rect.x()) || 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, src_y_prop_.id_, src_rect.x()) || 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, src_w_prop_.id_, src_rect.width()) || 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drmModePropertySetAdd( 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch property_set_, plane_id_, src_h_prop_.id_, src_rect.height()); 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (plane_set_error) { 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Failed to set plane data"; 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool HardwareDisplayPlane::Initialize() { 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedDrmObjectPropertyPtr plane_props(drmModeObjectGetProperties( 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch drm_->get_fd(), plane_id_, DRM_MODE_OBJECT_PLANE)); 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!plane_props) { 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Unable to get plane properties."; 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool props_init = 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crtc_prop_.Initialize(drm_, kCrtcPropName, plane_props) && 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch fb_prop_.Initialize(drm_, kFbPropName, plane_props) && 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crtc_x_prop_.Initialize(drm_, kCrtcXPropName, plane_props) && 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crtc_y_prop_.Initialize(drm_, kCrtcYPropName, plane_props) && 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crtc_w_prop_.Initialize(drm_, kCrtcWPropName, plane_props) && 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch crtc_h_prop_.Initialize(drm_, kCrtcHPropName, plane_props) && 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch src_x_prop_.Initialize(drm_, kSrcXPropName, plane_props) && 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch src_y_prop_.Initialize(drm_, kSrcYPropName, plane_props) && 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch src_w_prop_.Initialize(drm_, kSrcWPropName, plane_props) && 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch src_h_prop_.Initialize(drm_, kSrcHPropName, plane_props); 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!props_init) { 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Unable to get plane properties."; 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace ui 131