1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_GL_WORKER_H_ 18 #define ANDROID_GL_WORKER_H_ 19 20 #include <vector> 21 22 #define EGL_EGLEXT_PROTOTYPES 23 #define GL_GLEXT_PROTOTYPES 24 25 #include <EGL/egl.h> 26 #include <EGL/eglext.h> 27 #include <GLES2/gl2.h> 28 #include <GLES2/gl2ext.h> 29 30 #include <ui/GraphicBuffer.h> 31 32 #include "autogl.h" 33 34 namespace android { 35 36 struct DrmHwcLayer; 37 struct DrmCompositionRegion; 38 39 class GLWorkerCompositor { 40 public: 41 GLWorkerCompositor(); 42 ~GLWorkerCompositor(); 43 44 int Init(); 45 int Composite(DrmHwcLayer *layers, DrmCompositionRegion *regions, 46 size_t num_regions, const sp<GraphicBuffer> &framebuffer); 47 void Finish(); 48 49 private: 50 struct CachedFramebuffer { 51 // If the strong_framebuffer is non-NULL, we are holding a strong reference 52 // until we are sure rendering is done. The weak reference will be equal in 53 // that case. 54 sp<GraphicBuffer> strong_framebuffer; 55 wp<GraphicBuffer> weak_framebuffer; 56 AutoEGLDisplayImage egl_fb_image; 57 AutoGLTexture gl_fb_tex; 58 AutoGLFramebuffer gl_fb; 59 60 CachedFramebuffer(const sp<GraphicBuffer> &gb, AutoEGLDisplayImage &&image, 61 AutoGLTexture &&tex, AutoGLFramebuffer &&fb); 62 63 bool Promote(); 64 }; 65 66 CachedFramebuffer *FindCachedFramebuffer( 67 const sp<GraphicBuffer> &framebuffer); 68 CachedFramebuffer *PrepareAndCacheFramebuffer( 69 const sp<GraphicBuffer> &framebuffer); 70 71 GLint PrepareAndCacheProgram(unsigned texture_count); 72 73 EGLDisplay egl_display_; 74 EGLContext egl_ctx_; 75 76 std::vector<AutoGLProgram> blend_programs_; 77 AutoGLBuffer vertex_buffer_; 78 79 std::vector<CachedFramebuffer> cached_framebuffers_; 80 }; 81 } 82 83 #endif 84