101935f3245562c70ee911972fb039916ba74c46cZach Reizner/* 201935f3245562c70ee911972fb039916ba74c46cZach Reizner * Copyright (C) 2015 The Android Open Source Project 301935f3245562c70ee911972fb039916ba74c46cZach Reizner * 401935f3245562c70ee911972fb039916ba74c46cZach Reizner * Licensed under the Apache License, Version 2.0 (the "License"); 501935f3245562c70ee911972fb039916ba74c46cZach Reizner * you may not use this file except in compliance with the License. 601935f3245562c70ee911972fb039916ba74c46cZach Reizner * You may obtain a copy of the License at 701935f3245562c70ee911972fb039916ba74c46cZach Reizner * 801935f3245562c70ee911972fb039916ba74c46cZach Reizner * http://www.apache.org/licenses/LICENSE-2.0 901935f3245562c70ee911972fb039916ba74c46cZach Reizner * 1001935f3245562c70ee911972fb039916ba74c46cZach Reizner * Unless required by applicable law or agreed to in writing, software 1101935f3245562c70ee911972fb039916ba74c46cZach Reizner * distributed under the License is distributed on an "AS IS" BASIS, 1201935f3245562c70ee911972fb039916ba74c46cZach Reizner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1301935f3245562c70ee911972fb039916ba74c46cZach Reizner * See the License for the specific language governing permissions and 1401935f3245562c70ee911972fb039916ba74c46cZach Reizner * limitations under the License. 1501935f3245562c70ee911972fb039916ba74c46cZach Reizner */ 1601935f3245562c70ee911972fb039916ba74c46cZach Reizner 17be98c8cb94511d374238e4a02c92b545b6e5fde2Stéphane Marchesin#define ATRACE_TAG ATRACE_TAG_GRAPHICS 1801935f3245562c70ee911972fb039916ba74c46cZach Reizner#define LOG_TAG "GLCompositor" 1901935f3245562c70ee911972fb039916ba74c46cZach Reizner 2001935f3245562c70ee911972fb039916ba74c46cZach Reizner#include <vector> 2101935f3245562c70ee911972fb039916ba74c46cZach Reizner 2201935f3245562c70ee911972fb039916ba74c46cZach Reizner#include <cutils/log.h> 2301935f3245562c70ee911972fb039916ba74c46cZach Reizner 2401935f3245562c70ee911972fb039916ba74c46cZach Reizner#include <ui/GraphicBuffer.h> 25be98c8cb94511d374238e4a02c92b545b6e5fde2Stéphane Marchesin#include <utils/Trace.h> 2601935f3245562c70ee911972fb039916ba74c46cZach Reizner 2701935f3245562c70ee911972fb039916ba74c46cZach Reizner#include <sync/sync.h> 2801935f3245562c70ee911972fb039916ba74c46cZach Reizner#include <sw_sync.h> 2901935f3245562c70ee911972fb039916ba74c46cZach Reizner 3001935f3245562c70ee911972fb039916ba74c46cZach Reizner#include "drm_hwcomposer.h" 3101935f3245562c70ee911972fb039916ba74c46cZach Reizner 3201935f3245562c70ee911972fb039916ba74c46cZach Reizner#include "gl_compositor.h" 336cbe883275ec58139ea13fef69628f233822808eZach Reizner#include "glworker.h" 3401935f3245562c70ee911972fb039916ba74c46cZach Reizner 3501935f3245562c70ee911972fb039916ba74c46cZach Reiznernamespace android { 3601935f3245562c70ee911972fb039916ba74c46cZach Reizner 3701935f3245562c70ee911972fb039916ba74c46cZach Reiznerstatic const char *get_gl_error(void); 3801935f3245562c70ee911972fb039916ba74c46cZach Reiznerstatic const char *get_egl_error(void); 3901935f3245562c70ee911972fb039916ba74c46cZach Reiznerstatic bool has_extension(const char *extension, const char *extensions); 4001935f3245562c70ee911972fb039916ba74c46cZach Reizner 4101935f3245562c70ee911972fb039916ba74c46cZach Reiznertemplate <typename T> 4201935f3245562c70ee911972fb039916ba74c46cZach Reiznerint AllocResource(std::vector<T> &array) { 4301935f3245562c70ee911972fb039916ba74c46cZach Reizner for (typename std::vector<T>::iterator it = array.begin(); it != array.end(); 4401935f3245562c70ee911972fb039916ba74c46cZach Reizner ++it) { 4501935f3245562c70ee911972fb039916ba74c46cZach Reizner if (!it->is_some()) { 4601935f3245562c70ee911972fb039916ba74c46cZach Reizner return std::distance(array.begin(), it); 4701935f3245562c70ee911972fb039916ba74c46cZach Reizner } 4801935f3245562c70ee911972fb039916ba74c46cZach Reizner } 4901935f3245562c70ee911972fb039916ba74c46cZach Reizner 5001935f3245562c70ee911972fb039916ba74c46cZach Reizner array.push_back(T()); 5101935f3245562c70ee911972fb039916ba74c46cZach Reizner return array.size() - 1; 5201935f3245562c70ee911972fb039916ba74c46cZach Reizner} 5301935f3245562c70ee911972fb039916ba74c46cZach Reizner 5401935f3245562c70ee911972fb039916ba74c46cZach Reiznertemplate <typename T> 5501935f3245562c70ee911972fb039916ba74c46cZach Reiznervoid FreeResource(std::vector<T> &array, int index) { 5601935f3245562c70ee911972fb039916ba74c46cZach Reizner if (index == (int)array.size() - 1) { 5701935f3245562c70ee911972fb039916ba74c46cZach Reizner array.pop_back(); 5801935f3245562c70ee911972fb039916ba74c46cZach Reizner } else if (index >= 0 && (unsigned)index < array.size()) { 5901935f3245562c70ee911972fb039916ba74c46cZach Reizner array[index].Reset(); 6001935f3245562c70ee911972fb039916ba74c46cZach Reizner } 6101935f3245562c70ee911972fb039916ba74c46cZach Reizner} 6201935f3245562c70ee911972fb039916ba74c46cZach Reizner 6301935f3245562c70ee911972fb039916ba74c46cZach Reiznerstruct GLTarget { 6401935f3245562c70ee911972fb039916ba74c46cZach Reizner sp<GraphicBuffer> fb; 6501935f3245562c70ee911972fb039916ba74c46cZach Reizner bool forgotten; 6601935f3245562c70ee911972fb039916ba74c46cZach Reizner unsigned composition_count; 6701935f3245562c70ee911972fb039916ba74c46cZach Reizner 686cbe883275ec58139ea13fef69628f233822808eZach Reizner GLTarget() : forgotten(true), composition_count(0) { 6901935f3245562c70ee911972fb039916ba74c46cZach Reizner } 7001935f3245562c70ee911972fb039916ba74c46cZach Reizner 7101935f3245562c70ee911972fb039916ba74c46cZach Reizner void Reset() { 7201935f3245562c70ee911972fb039916ba74c46cZach Reizner fb.clear(); 7301935f3245562c70ee911972fb039916ba74c46cZach Reizner forgotten = true; 7401935f3245562c70ee911972fb039916ba74c46cZach Reizner composition_count = 0; 7501935f3245562c70ee911972fb039916ba74c46cZach Reizner } 7601935f3245562c70ee911972fb039916ba74c46cZach Reizner 7701935f3245562c70ee911972fb039916ba74c46cZach Reizner bool is_some() const { 786cbe883275ec58139ea13fef69628f233822808eZach Reizner return fb != NULL; 7901935f3245562c70ee911972fb039916ba74c46cZach Reizner } 8001935f3245562c70ee911972fb039916ba74c46cZach Reizner}; 8101935f3245562c70ee911972fb039916ba74c46cZach Reizner 8201935f3245562c70ee911972fb039916ba74c46cZach Reiznerstruct GLCompositor::priv_data { 8301935f3245562c70ee911972fb039916ba74c46cZach Reizner int current_target; 8401935f3245562c70ee911972fb039916ba74c46cZach Reizner std::vector<GLTarget> targets; 8501935f3245562c70ee911972fb039916ba74c46cZach Reizner std::vector<GLComposition *> compositions; 8601935f3245562c70ee911972fb039916ba74c46cZach Reizner 876cbe883275ec58139ea13fef69628f233822808eZach Reizner GLWorker worker; 8801935f3245562c70ee911972fb039916ba74c46cZach Reizner 896cbe883275ec58139ea13fef69628f233822808eZach Reizner priv_data() : current_target(-1) { 9001935f3245562c70ee911972fb039916ba74c46cZach Reizner } 9101935f3245562c70ee911972fb039916ba74c46cZach Reizner}; 9201935f3245562c70ee911972fb039916ba74c46cZach Reizner 9301935f3245562c70ee911972fb039916ba74c46cZach Reiznerclass GLComposition : public Composition { 9401935f3245562c70ee911972fb039916ba74c46cZach Reizner public: 9501935f3245562c70ee911972fb039916ba74c46cZach Reizner struct LayerData { 9601935f3245562c70ee911972fb039916ba74c46cZach Reizner hwc_layer_1 layer; 9701935f3245562c70ee911972fb039916ba74c46cZach Reizner hwc_drm_bo bo; 9801935f3245562c70ee911972fb039916ba74c46cZach Reizner }; 9901935f3245562c70ee911972fb039916ba74c46cZach Reizner 100f5fa77cb53ed2e7f840c2f1d4c1f3a1fe6fcd466Zach Reizner GLComposition(GLCompositor *owner, Importer *imp) 1016cbe883275ec58139ea13fef69628f233822808eZach Reizner : compositor(owner), importer(imp), target_handle(-1), timeline_fd(-1) { 1026cbe883275ec58139ea13fef69628f233822808eZach Reizner int ret = sw_sync_timeline_create(); 1036cbe883275ec58139ea13fef69628f233822808eZach Reizner if (ret < 0) { 1046cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to create sw sync timeline %d", ret); 1056cbe883275ec58139ea13fef69628f233822808eZach Reizner } 1066cbe883275ec58139ea13fef69628f233822808eZach Reizner timeline_fd = ret; 10701935f3245562c70ee911972fb039916ba74c46cZach Reizner } 10801935f3245562c70ee911972fb039916ba74c46cZach Reizner 10901935f3245562c70ee911972fb039916ba74c46cZach Reizner virtual ~GLComposition() { 1106cbe883275ec58139ea13fef69628f233822808eZach Reizner if (timeline_fd >= 0) 1116cbe883275ec58139ea13fef69628f233822808eZach Reizner close(timeline_fd); 1126cbe883275ec58139ea13fef69628f233822808eZach Reizner 11301935f3245562c70ee911972fb039916ba74c46cZach Reizner if (compositor == NULL) { 11401935f3245562c70ee911972fb039916ba74c46cZach Reizner return; 11501935f3245562c70ee911972fb039916ba74c46cZach Reizner } 11601935f3245562c70ee911972fb039916ba74c46cZach Reizner 11701935f3245562c70ee911972fb039916ba74c46cZach Reizner // Removes this composition from the owning compositor automatically. 11801935f3245562c70ee911972fb039916ba74c46cZach Reizner std::vector<GLComposition *> &compositions = 11901935f3245562c70ee911972fb039916ba74c46cZach Reizner compositor->priv_->compositions; 12001935f3245562c70ee911972fb039916ba74c46cZach Reizner std::vector<GLComposition *>::iterator it = 12101935f3245562c70ee911972fb039916ba74c46cZach Reizner std::find(compositions.begin(), compositions.end(), this); 12201935f3245562c70ee911972fb039916ba74c46cZach Reizner if (it != compositions.end()) { 12301935f3245562c70ee911972fb039916ba74c46cZach Reizner compositions.erase(it); 12401935f3245562c70ee911972fb039916ba74c46cZach Reizner } 12501935f3245562c70ee911972fb039916ba74c46cZach Reizner 12601935f3245562c70ee911972fb039916ba74c46cZach Reizner GLTarget *target = &compositor->priv_->targets[target_handle]; 12701935f3245562c70ee911972fb039916ba74c46cZach Reizner target->composition_count--; 12801935f3245562c70ee911972fb039916ba74c46cZach Reizner compositor->CheckAndDestroyTarget(target_handle); 12901935f3245562c70ee911972fb039916ba74c46cZach Reizner } 13001935f3245562c70ee911972fb039916ba74c46cZach Reizner 13101935f3245562c70ee911972fb039916ba74c46cZach Reizner virtual int AddLayer(int display, hwc_layer_1 *layer, hwc_drm_bo *bo) { 13201935f3245562c70ee911972fb039916ba74c46cZach Reizner (void)display; 13301935f3245562c70ee911972fb039916ba74c46cZach Reizner if (layer->compositionType != HWC_OVERLAY) { 13401935f3245562c70ee911972fb039916ba74c46cZach Reizner ALOGE("Must add layers with compositionType == HWC_OVERLAY"); 13501935f3245562c70ee911972fb039916ba74c46cZach Reizner return 1; 13601935f3245562c70ee911972fb039916ba74c46cZach Reizner } 13701935f3245562c70ee911972fb039916ba74c46cZach Reizner 13801935f3245562c70ee911972fb039916ba74c46cZach Reizner if (layer->handle == 0) { 13901935f3245562c70ee911972fb039916ba74c46cZach Reizner ALOGE("Must add layers with valid buffer handle"); 14001935f3245562c70ee911972fb039916ba74c46cZach Reizner return 1; 14101935f3245562c70ee911972fb039916ba74c46cZach Reizner } 14201935f3245562c70ee911972fb039916ba74c46cZach Reizner 1436cbe883275ec58139ea13fef69628f233822808eZach Reizner layer->releaseFenceFd = sw_sync_fence_create( 1446cbe883275ec58139ea13fef69628f233822808eZach Reizner timeline_fd, "GLComposition release fence", layers.size() + 1); 1456cbe883275ec58139ea13fef69628f233822808eZach Reizner 1466cbe883275ec58139ea13fef69628f233822808eZach Reizner layers.push_back(*layer); 14701935f3245562c70ee911972fb039916ba74c46cZach Reizner 148f5fa77cb53ed2e7f840c2f1d4c1f3a1fe6fcd466Zach Reizner return importer->ReleaseBuffer(bo); 14901935f3245562c70ee911972fb039916ba74c46cZach Reizner } 15001935f3245562c70ee911972fb039916ba74c46cZach Reizner 15101935f3245562c70ee911972fb039916ba74c46cZach Reizner virtual unsigned GetRemainingLayers(int display, unsigned num_needed) const { 15201935f3245562c70ee911972fb039916ba74c46cZach Reizner (void)display; 15301935f3245562c70ee911972fb039916ba74c46cZach Reizner return num_needed; 15401935f3245562c70ee911972fb039916ba74c46cZach Reizner } 15501935f3245562c70ee911972fb039916ba74c46cZach Reizner 15601935f3245562c70ee911972fb039916ba74c46cZach Reizner GLCompositor *compositor; 157f5fa77cb53ed2e7f840c2f1d4c1f3a1fe6fcd466Zach Reizner Importer *importer; 15801935f3245562c70ee911972fb039916ba74c46cZach Reizner int target_handle; 1596cbe883275ec58139ea13fef69628f233822808eZach Reizner int timeline_fd; 1606cbe883275ec58139ea13fef69628f233822808eZach Reizner std::vector<hwc_layer_1> layers; 16101935f3245562c70ee911972fb039916ba74c46cZach Reizner}; 16201935f3245562c70ee911972fb039916ba74c46cZach Reizner 16301935f3245562c70ee911972fb039916ba74c46cZach ReiznerGLCompositor::GLCompositor() { 16401935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_ = new priv_data; 16501935f3245562c70ee911972fb039916ba74c46cZach Reizner} 16601935f3245562c70ee911972fb039916ba74c46cZach Reizner 16701935f3245562c70ee911972fb039916ba74c46cZach ReiznerGLCompositor::~GLCompositor() { 16801935f3245562c70ee911972fb039916ba74c46cZach Reizner for (std::vector<GLComposition *>::iterator it = priv_->compositions.end(); 16901935f3245562c70ee911972fb039916ba74c46cZach Reizner it != priv_->compositions.begin(); it = priv_->compositions.end()) { 17001935f3245562c70ee911972fb039916ba74c46cZach Reizner --it; 17101935f3245562c70ee911972fb039916ba74c46cZach Reizner 17201935f3245562c70ee911972fb039916ba74c46cZach Reizner // Prevents compositor from trying to erase itself 17301935f3245562c70ee911972fb039916ba74c46cZach Reizner (*it)->compositor = NULL; 17401935f3245562c70ee911972fb039916ba74c46cZach Reizner delete *it; 17501935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_->compositions.erase(it); 17601935f3245562c70ee911972fb039916ba74c46cZach Reizner } 17701935f3245562c70ee911972fb039916ba74c46cZach Reizner 17801935f3245562c70ee911972fb039916ba74c46cZach Reizner delete priv_; 17901935f3245562c70ee911972fb039916ba74c46cZach Reizner} 18001935f3245562c70ee911972fb039916ba74c46cZach Reizner 18101935f3245562c70ee911972fb039916ba74c46cZach Reiznerint GLCompositor::Init() { 1826cbe883275ec58139ea13fef69628f233822808eZach Reizner return priv_->worker.Init(); 18301935f3245562c70ee911972fb039916ba74c46cZach Reizner} 18401935f3245562c70ee911972fb039916ba74c46cZach Reizner 18501935f3245562c70ee911972fb039916ba74c46cZach ReiznerTargeting *GLCompositor::targeting() { 18601935f3245562c70ee911972fb039916ba74c46cZach Reizner return (Targeting *)this; 18701935f3245562c70ee911972fb039916ba74c46cZach Reizner} 18801935f3245562c70ee911972fb039916ba74c46cZach Reizner 18901935f3245562c70ee911972fb039916ba74c46cZach Reiznerint GLCompositor::CreateTarget(sp<GraphicBuffer> &buffer) { 19001935f3245562c70ee911972fb039916ba74c46cZach Reizner int ret; 19101935f3245562c70ee911972fb039916ba74c46cZach Reizner 19201935f3245562c70ee911972fb039916ba74c46cZach Reizner int target_handle = AllocResource(priv_->targets); 19301935f3245562c70ee911972fb039916ba74c46cZach Reizner GLTarget *target = &priv_->targets[target_handle]; 19401935f3245562c70ee911972fb039916ba74c46cZach Reizner 19501935f3245562c70ee911972fb039916ba74c46cZach Reizner target->fb = buffer; 19601935f3245562c70ee911972fb039916ba74c46cZach Reizner target->forgotten = false; 19701935f3245562c70ee911972fb039916ba74c46cZach Reizner 1986cbe883275ec58139ea13fef69628f233822808eZach Reizner return target_handle; 19901935f3245562c70ee911972fb039916ba74c46cZach Reizner} 20001935f3245562c70ee911972fb039916ba74c46cZach Reizner 20101935f3245562c70ee911972fb039916ba74c46cZach Reiznervoid GLCompositor::SetTarget(int target_handle) { 20201935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target_handle >= 0 && (unsigned)target_handle < priv_->targets.size()) { 20301935f3245562c70ee911972fb039916ba74c46cZach Reizner GLTarget *target = &priv_->targets[target_handle]; 20401935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target->is_some()) { 20501935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_->current_target = target_handle; 20601935f3245562c70ee911972fb039916ba74c46cZach Reizner return; 20701935f3245562c70ee911972fb039916ba74c46cZach Reizner } 20801935f3245562c70ee911972fb039916ba74c46cZach Reizner } 20901935f3245562c70ee911972fb039916ba74c46cZach Reizner 21001935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_->current_target = -1; 21101935f3245562c70ee911972fb039916ba74c46cZach Reizner} 21201935f3245562c70ee911972fb039916ba74c46cZach Reizner 21301935f3245562c70ee911972fb039916ba74c46cZach Reiznervoid GLCompositor::ForgetTarget(int target_handle) { 21401935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target_handle >= 0 && (unsigned)target_handle < priv_->targets.size()) { 21501935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target_handle == priv_->current_target) { 21601935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_->current_target = -1; 21701935f3245562c70ee911972fb039916ba74c46cZach Reizner } 21801935f3245562c70ee911972fb039916ba74c46cZach Reizner 21901935f3245562c70ee911972fb039916ba74c46cZach Reizner GLTarget *target = &priv_->targets[target_handle]; 22001935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target->is_some()) { 22101935f3245562c70ee911972fb039916ba74c46cZach Reizner target->forgotten = true; 22201935f3245562c70ee911972fb039916ba74c46cZach Reizner CheckAndDestroyTarget(target_handle); 22301935f3245562c70ee911972fb039916ba74c46cZach Reizner return; 22401935f3245562c70ee911972fb039916ba74c46cZach Reizner } 22501935f3245562c70ee911972fb039916ba74c46cZach Reizner } 22601935f3245562c70ee911972fb039916ba74c46cZach Reizner 22701935f3245562c70ee911972fb039916ba74c46cZach Reizner ALOGE("Failed to forget target because of invalid handle"); 22801935f3245562c70ee911972fb039916ba74c46cZach Reizner} 22901935f3245562c70ee911972fb039916ba74c46cZach Reizner 23001935f3245562c70ee911972fb039916ba74c46cZach Reiznervoid GLCompositor::CheckAndDestroyTarget(int target_handle) { 23101935f3245562c70ee911972fb039916ba74c46cZach Reizner GLTarget *target = &priv_->targets[target_handle]; 23201935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target->composition_count == 0 && target->forgotten) { 23301935f3245562c70ee911972fb039916ba74c46cZach Reizner FreeResource(priv_->targets, target_handle); 23401935f3245562c70ee911972fb039916ba74c46cZach Reizner } 23501935f3245562c70ee911972fb039916ba74c46cZach Reizner} 23601935f3245562c70ee911972fb039916ba74c46cZach Reizner 237f5fa77cb53ed2e7f840c2f1d4c1f3a1fe6fcd466Zach ReiznerComposition *GLCompositor::CreateComposition(Importer *importer) { 23801935f3245562c70ee911972fb039916ba74c46cZach Reizner if (priv_->current_target >= 0 && 23901935f3245562c70ee911972fb039916ba74c46cZach Reizner (unsigned)priv_->current_target < priv_->targets.size()) { 24001935f3245562c70ee911972fb039916ba74c46cZach Reizner GLTarget *target = &priv_->targets[priv_->current_target]; 24101935f3245562c70ee911972fb039916ba74c46cZach Reizner if (target->is_some()) { 242f5fa77cb53ed2e7f840c2f1d4c1f3a1fe6fcd466Zach Reizner GLComposition *composition = new GLComposition(this, importer); 24301935f3245562c70ee911972fb039916ba74c46cZach Reizner composition->target_handle = priv_->current_target; 24401935f3245562c70ee911972fb039916ba74c46cZach Reizner target->composition_count++; 24501935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_->compositions.push_back(composition); 24601935f3245562c70ee911972fb039916ba74c46cZach Reizner return composition; 24701935f3245562c70ee911972fb039916ba74c46cZach Reizner } 24801935f3245562c70ee911972fb039916ba74c46cZach Reizner } 24901935f3245562c70ee911972fb039916ba74c46cZach Reizner 25001935f3245562c70ee911972fb039916ba74c46cZach Reizner ALOGE("Failed to create composition because of invalid target handle %d", 25101935f3245562c70ee911972fb039916ba74c46cZach Reizner priv_->current_target); 25201935f3245562c70ee911972fb039916ba74c46cZach Reizner 25301935f3245562c70ee911972fb039916ba74c46cZach Reizner return NULL; 25401935f3245562c70ee911972fb039916ba74c46cZach Reizner} 25501935f3245562c70ee911972fb039916ba74c46cZach Reizner 25601935f3245562c70ee911972fb039916ba74c46cZach Reiznerint GLCompositor::QueueComposition(Composition *composition) { 25701935f3245562c70ee911972fb039916ba74c46cZach Reizner if (composition) { 2586cbe883275ec58139ea13fef69628f233822808eZach Reizner GLComposition *gl_composition = (GLComposition *)composition; 2596cbe883275ec58139ea13fef69628f233822808eZach Reizner int ret = DoComposition(gl_composition); 2606cbe883275ec58139ea13fef69628f233822808eZach Reizner gl_composition->timeline_fd = -1; 26101935f3245562c70ee911972fb039916ba74c46cZach Reizner delete composition; 26201935f3245562c70ee911972fb039916ba74c46cZach Reizner return ret; 26301935f3245562c70ee911972fb039916ba74c46cZach Reizner } 26401935f3245562c70ee911972fb039916ba74c46cZach Reizner 26501935f3245562c70ee911972fb039916ba74c46cZach Reizner ALOGE("Failed to queue composition because of invalid composition handle"); 26601935f3245562c70ee911972fb039916ba74c46cZach Reizner 26701935f3245562c70ee911972fb039916ba74c46cZach Reizner return -EINVAL; 26801935f3245562c70ee911972fb039916ba74c46cZach Reizner} 26901935f3245562c70ee911972fb039916ba74c46cZach Reizner 27001935f3245562c70ee911972fb039916ba74c46cZach Reiznerint GLCompositor::Composite() { 27101935f3245562c70ee911972fb039916ba74c46cZach Reizner return 0; 27201935f3245562c70ee911972fb039916ba74c46cZach Reizner} 27301935f3245562c70ee911972fb039916ba74c46cZach Reizner 2746cbe883275ec58139ea13fef69628f233822808eZach Reiznerint GLCompositor::DoComposition(GLComposition *composition) { 275be98c8cb94511d374238e4a02c92b545b6e5fde2Stéphane Marchesin ATRACE_CALL(); 27601935f3245562c70ee911972fb039916ba74c46cZach Reizner int ret = 0; 27701935f3245562c70ee911972fb039916ba74c46cZach Reizner 2786cbe883275ec58139ea13fef69628f233822808eZach Reizner GLTarget *target = &priv_->targets[composition->target_handle]; 2796cbe883275ec58139ea13fef69628f233822808eZach Reizner GLWorker::Work work; 2806cbe883275ec58139ea13fef69628f233822808eZach Reizner work.layers = composition->layers.data(); 2816cbe883275ec58139ea13fef69628f233822808eZach Reizner work.num_layers = composition->layers.size(); 2826cbe883275ec58139ea13fef69628f233822808eZach Reizner work.timeline_fd = composition->timeline_fd; 2836cbe883275ec58139ea13fef69628f233822808eZach Reizner work.framebuffer = target->fb; 28401935f3245562c70ee911972fb039916ba74c46cZach Reizner 2856cbe883275ec58139ea13fef69628f233822808eZach Reizner ret = priv_->worker.DoWork(&work); 28601935f3245562c70ee911972fb039916ba74c46cZach Reizner 2876cbe883275ec58139ea13fef69628f233822808eZach Reizner if (work.timeline_fd >= 0) { 2886cbe883275ec58139ea13fef69628f233822808eZach Reizner sw_sync_timeline_inc(work.timeline_fd, work.num_layers + 1); 2896cbe883275ec58139ea13fef69628f233822808eZach Reizner close(work.timeline_fd); 29001935f3245562c70ee911972fb039916ba74c46cZach Reizner } 29101935f3245562c70ee911972fb039916ba74c46cZach Reizner 29201935f3245562c70ee911972fb039916ba74c46cZach Reizner return ret; 29301935f3245562c70ee911972fb039916ba74c46cZach Reizner} 29401935f3245562c70ee911972fb039916ba74c46cZach Reizner 29501935f3245562c70ee911972fb039916ba74c46cZach Reizner} // namespace android 296