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