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