16cbe883275ec58139ea13fef69628f233822808eZach Reizner/*
26cbe883275ec58139ea13fef69628f233822808eZach Reizner * Copyright (C) 2015 The Android Open Source Project
36cbe883275ec58139ea13fef69628f233822808eZach Reizner *
46cbe883275ec58139ea13fef69628f233822808eZach Reizner * Licensed under the Apache License, Version 2.0 (the "License");
56cbe883275ec58139ea13fef69628f233822808eZach Reizner * you may not use this file except in compliance with the License.
66cbe883275ec58139ea13fef69628f233822808eZach Reizner * You may obtain a copy of the License at
76cbe883275ec58139ea13fef69628f233822808eZach Reizner *
86cbe883275ec58139ea13fef69628f233822808eZach Reizner *      http://www.apache.org/licenses/LICENSE-2.0
96cbe883275ec58139ea13fef69628f233822808eZach Reizner *
106cbe883275ec58139ea13fef69628f233822808eZach Reizner * Unless required by applicable law or agreed to in writing, software
116cbe883275ec58139ea13fef69628f233822808eZach Reizner * distributed under the License is distributed on an "AS IS" BASIS,
126cbe883275ec58139ea13fef69628f233822808eZach Reizner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136cbe883275ec58139ea13fef69628f233822808eZach Reizner * See the License for the specific language governing permissions and
146cbe883275ec58139ea13fef69628f233822808eZach Reizner * limitations under the License.
156cbe883275ec58139ea13fef69628f233822808eZach Reizner */
166cbe883275ec58139ea13fef69628f233822808eZach Reizner
176cbe883275ec58139ea13fef69628f233822808eZach Reizner#ifndef ANDROID_GL_WORKER_H_
186cbe883275ec58139ea13fef69628f233822808eZach Reizner#define ANDROID_GL_WORKER_H_
196cbe883275ec58139ea13fef69628f233822808eZach Reizner
206cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <vector>
216cbe883275ec58139ea13fef69628f233822808eZach Reizner
226cbe883275ec58139ea13fef69628f233822808eZach Reizner#define EGL_EGLEXT_PROTOTYPES
236cbe883275ec58139ea13fef69628f233822808eZach Reizner#define GL_GLEXT_PROTOTYPES
246cbe883275ec58139ea13fef69628f233822808eZach Reizner
256cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <EGL/egl.h>
266cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <EGL/eglext.h>
276cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <GLES2/gl2.h>
286cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <GLES2/gl2ext.h>
296cbe883275ec58139ea13fef69628f233822808eZach Reizner
30dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner#include <ui/GraphicBuffer.h>
31dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner
32098070590ae648ede5f2ef846298de178ccd3637Zach Reizner#include "autogl.h"
336cbe883275ec58139ea13fef69628f233822808eZach Reizner
346cbe883275ec58139ea13fef69628f233822808eZach Reiznernamespace android {
356cbe883275ec58139ea13fef69628f233822808eZach Reizner
3692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reiznerstruct DrmHwcLayer;
3792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reiznerstruct DrmCompositionRegion;
384a253659cef3d82bfb0b25b3ff4c7b073d7a0460Zach Reizner
39dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reiznerclass GLWorkerCompositor {
40dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner public:
41dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  GLWorkerCompositor();
42dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  ~GLWorkerCompositor();
43dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner
44dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  int Init();
4592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner  int Composite(DrmHwcLayer *layers, DrmCompositionRegion *regions,
4690f92d863c6ec50b1124a540f46cd74b1dedcfbaRob Clark                size_t num_regions, const sp<GraphicBuffer> &framebuffer,
4790f92d863c6ec50b1124a540f46cd74b1dedcfbaRob Clark                Importer *importer);
488d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner  void Finish();
49dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner
50dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner private:
518d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner  struct CachedFramebuffer {
528d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    // If the strong_framebuffer is non-NULL, we are holding a strong reference
538d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    // until we are sure rendering is done. The weak reference will be equal in
548d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    // that case.
558d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    sp<GraphicBuffer> strong_framebuffer;
568d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    wp<GraphicBuffer> weak_framebuffer;
578d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    AutoEGLDisplayImage egl_fb_image;
588d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    AutoGLTexture gl_fb_tex;
598d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    AutoGLFramebuffer gl_fb;
608d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner
618d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    CachedFramebuffer(const sp<GraphicBuffer> &gb, AutoEGLDisplayImage &&image,
628d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner                      AutoGLTexture &&tex, AutoGLFramebuffer &&fb);
638d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner
648d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner    bool Promote();
658d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner  };
668d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner
678d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner  CachedFramebuffer *FindCachedFramebuffer(
688d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner      const sp<GraphicBuffer> &framebuffer);
698d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner  CachedFramebuffer *PrepareAndCacheFramebuffer(
708d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner      const sp<GraphicBuffer> &framebuffer);
718d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner
72d68353163dc72d2282c564379785dfca47b6df65Zach Reizner  GLint PrepareAndCacheProgram(unsigned texture_count);
73d68353163dc72d2282c564379785dfca47b6df65Zach Reizner
74dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  EGLDisplay egl_display_;
75dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  EGLContext egl_ctx_;
76dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner
77dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  std::vector<AutoGLProgram> blend_programs_;
78dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner  AutoGLBuffer vertex_buffer_;
798d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner
808d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner  std::vector<CachedFramebuffer> cached_framebuffers_;
81dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reizner};
826cbe883275ec58139ea13fef69628f233822808eZach Reizner}
836cbe883275ec58139ea13fef69628f233822808eZach Reizner
846cbe883275ec58139ea13fef69628f233822808eZach Reizner#endif
85