/* * Copyright (C) Texas Instruments Incorporated - http://www.ti.com/ * * 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. */ #pragma once #include #include #include #include #include #include #include #include #include "drmfb.h" #define MAX_DISPLAYS 4 #define DSS_AVAILABLE_PIPES 4 typedef struct display_config { unsigned int xres; unsigned int yres; unsigned int fps; unsigned int xdpi; unsigned int ydpi; } display_config_t; enum disp_role { DISP_ROLE_PRIMARY = 0, DISP_ROLE_SECONDARY, }; typedef struct drm_plane_props { hwc_layer_1_t* layer; kms::Plane* plane; uint64_t crtc_id; uint64_t crtc_x; uint64_t crtc_y; uint64_t crtc_w; uint64_t crtc_h; uint64_t src_x; uint64_t src_y; uint64_t src_w; uint64_t src_h; DRMFramebuffer* fb_info; } drm_plane_props_t; class KMSDisplay { public: KMSDisplay() : card(NULL), con(NULL), crtc(NULL), mode() {} kms::Card* card; kms::Connector* con; kms::Crtc* crtc; kms::Videomode mode; }; class HWCDisplay { public: HWCDisplay(enum disp_role role); ~HWCDisplay(){}; void setup_composition_pipes(); int update_display(drm_plane_props_t* planeProp); std::vector configs; uint32_t active_config; enum disp_role role; drm_plane_props_t planeProps[DSS_AVAILABLE_PIPES]; KMSDisplay disp_link; const hwc_procs_t* cb_procs; bool is_dummy; int set_vsync_state(bool state); void blank(int blank); int get_display_configs(uint32_t* configs, size_t* numConfigs); int get_display_attributes(uint32_t cfg, const uint32_t* attributes, int32_t* values); static void page_flip_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void* data); static void vblank_handler(int fd, unsigned int frame, unsigned int sec, unsigned int usec, void* data); private: std::vector pending_fb_infos; std::vector current_fb_infos; bool vsync_on; bool blanked; std::mutex mutex; std::condition_variable cond_flip; volatile bool is_flip_pending; };