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#define ATRACE_TAG ATRACE_TAG_GRAPHICS 1851a597e185a9cc7f651f70b87c7d638a49c0e8b1Sean Paul#define LOG_TAG "hwc-gl-worker" 196cbe883275ec58139ea13fef69628f233822808eZach Reizner 20d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner#include <algorithm> 216cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <string> 226cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <sstream> 2392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner#include <unordered_set> 246cbe883275ec58139ea13fef69628f233822808eZach Reizner 256cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <sys/resource.h> 266cbe883275ec58139ea13fef69628f233822808eZach Reizner 278d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner#include <cutils/properties.h> 288d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 296cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <hardware/hardware.h> 306cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <hardware/hwcomposer.h> 316cbe883275ec58139ea13fef69628f233822808eZach Reizner 326cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <ui/GraphicBuffer.h> 336cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <ui/PixelFormat.h> 346cbe883275ec58139ea13fef69628f233822808eZach Reizner 356cbe883275ec58139ea13fef69628f233822808eZach Reizner#include <utils/Trace.h> 366cbe883275ec58139ea13fef69628f233822808eZach Reizner 374a253659cef3d82bfb0b25b3ff4c7b073d7a0460Zach Reizner#include "drmdisplaycomposition.h" 384a253659cef3d82bfb0b25b3ff4c7b073d7a0460Zach Reizner 396cbe883275ec58139ea13fef69628f233822808eZach Reizner#include "glworker.h" 406cbe883275ec58139ea13fef69628f233822808eZach Reizner 419cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido// TODO(zachr): use hwc_drm_bo to turn buffer handles into textures 429cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido#ifndef EGL_NATIVE_HANDLE_ANDROID_NVX 439cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido#define EGL_NATIVE_HANDLE_ANDROID_NVX 0x322A 449cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido#endif 459cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido 466cbe883275ec58139ea13fef69628f233822808eZach Reizner#define MAX_OVERLAPPING_LAYERS 64 476cbe883275ec58139ea13fef69628f233822808eZach Reizner 486cbe883275ec58139ea13fef69628f233822808eZach Reiznernamespace android { 496cbe883275ec58139ea13fef69628f233822808eZach Reizner 50d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner// clang-format off 51d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner// Column-major order: 52d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner// float mat[4] = { 1, 2, 3, 4 } === 53d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner// [ 1 3 ] 54d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner// [ 2 4 ] 55d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reiznerfloat kTextureTransformMatrices[] = { 56d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner 1.0f, 0.0f, 0.0f, 1.0f, // identity matrix 5726fc2c21a055d0ef1bb85fe205d977bd1822769aHaixia Shi 0.0f, 1.0f, 1.0f, 0.0f, // swap x and y 58d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner}; 59d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner// clang-format on 60d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner 616cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic const char *GetGLError(void) { 626cbe883275ec58139ea13fef69628f233822808eZach Reizner switch (glGetError()) { 636cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_NO_ERROR: 646cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_NO_ERROR"; 656cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_INVALID_ENUM: 666cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_INVALID_ENUM"; 676cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_INVALID_VALUE: 686cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_INVALID_VALUE"; 696cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_INVALID_OPERATION: 706cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_INVALID_OPERATION"; 716cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_INVALID_FRAMEBUFFER_OPERATION: 726cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_INVALID_FRAMEBUFFER_OPERATION"; 736cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_OUT_OF_MEMORY: 746cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_OUT_OF_MEMORY"; 756cbe883275ec58139ea13fef69628f233822808eZach Reizner default: 766cbe883275ec58139ea13fef69628f233822808eZach Reizner return "Unknown error"; 776cbe883275ec58139ea13fef69628f233822808eZach Reizner } 786cbe883275ec58139ea13fef69628f233822808eZach Reizner} 796cbe883275ec58139ea13fef69628f233822808eZach Reizner 806cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic const char *GetGLFramebufferError(void) { 816cbe883275ec58139ea13fef69628f233822808eZach Reizner switch (glCheckFramebufferStatus(GL_FRAMEBUFFER)) { 826cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_FRAMEBUFFER_COMPLETE: 836cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_FRAMEBUFFER_COMPLETE"; 846cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 856cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"; 866cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 876cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"; 886cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_FRAMEBUFFER_UNSUPPORTED: 896cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_FRAMEBUFFER_UNSUPPORTED"; 906cbe883275ec58139ea13fef69628f233822808eZach Reizner case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 916cbe883275ec58139ea13fef69628f233822808eZach Reizner return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"; 926cbe883275ec58139ea13fef69628f233822808eZach Reizner default: 936cbe883275ec58139ea13fef69628f233822808eZach Reizner return "Unknown error"; 946cbe883275ec58139ea13fef69628f233822808eZach Reizner } 956cbe883275ec58139ea13fef69628f233822808eZach Reizner} 966cbe883275ec58139ea13fef69628f233822808eZach Reizner 976cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic const char *GetEGLError(void) { 986cbe883275ec58139ea13fef69628f233822808eZach Reizner switch (eglGetError()) { 996cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_SUCCESS: 1006cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_SUCCESS"; 1016cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_NOT_INITIALIZED: 1026cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_NOT_INITIALIZED"; 1036cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_ACCESS: 1046cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_ACCESS"; 1056cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_ALLOC: 1066cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_ALLOC"; 1076cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_ATTRIBUTE: 1086cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_ATTRIBUTE"; 1096cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_CONTEXT: 1106cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_CONTEXT"; 1116cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_CONFIG: 1126cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_CONFIG"; 1136cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_CURRENT_SURFACE: 1146cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_CURRENT_SURFACE"; 1156cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_DISPLAY: 1166cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_DISPLAY"; 1176cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_SURFACE: 1186cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_SURFACE"; 1196cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_MATCH: 1206cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_MATCH"; 1216cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_PARAMETER: 1226cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_PARAMETER"; 1236cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_NATIVE_PIXMAP: 1246cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_NATIVE_PIXMAP"; 1256cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_BAD_NATIVE_WINDOW: 1266cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_BAD_NATIVE_WINDOW"; 1276cbe883275ec58139ea13fef69628f233822808eZach Reizner case EGL_CONTEXT_LOST: 1286cbe883275ec58139ea13fef69628f233822808eZach Reizner return "EGL_CONTEXT_LOST"; 1296cbe883275ec58139ea13fef69628f233822808eZach Reizner default: 1306cbe883275ec58139ea13fef69628f233822808eZach Reizner return "Unknown error"; 1316cbe883275ec58139ea13fef69628f233822808eZach Reizner } 1326cbe883275ec58139ea13fef69628f233822808eZach Reizner} 1336cbe883275ec58139ea13fef69628f233822808eZach Reizner 1346cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic bool HasExtension(const char *extension, const char *extensions) { 1356cbe883275ec58139ea13fef69628f233822808eZach Reizner const char *start, *where, *terminator; 1366cbe883275ec58139ea13fef69628f233822808eZach Reizner start = extensions; 1376cbe883275ec58139ea13fef69628f233822808eZach Reizner for (;;) { 1386cbe883275ec58139ea13fef69628f233822808eZach Reizner where = (char *)strstr((const char *)start, extension); 1396cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!where) 1406cbe883275ec58139ea13fef69628f233822808eZach Reizner break; 1416cbe883275ec58139ea13fef69628f233822808eZach Reizner terminator = where + strlen(extension); 1426cbe883275ec58139ea13fef69628f233822808eZach Reizner if (where == start || *(where - 1) == ' ') 1436cbe883275ec58139ea13fef69628f233822808eZach Reizner if (*terminator == ' ' || *terminator == '\0') 1446cbe883275ec58139ea13fef69628f233822808eZach Reizner return true; 1456cbe883275ec58139ea13fef69628f233822808eZach Reizner start = terminator; 1466cbe883275ec58139ea13fef69628f233822808eZach Reizner } 1476cbe883275ec58139ea13fef69628f233822808eZach Reizner return false; 1486cbe883275ec58139ea13fef69628f233822808eZach Reizner} 1496cbe883275ec58139ea13fef69628f233822808eZach Reizner 1506cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic AutoGLShader CompileAndCheckShader(GLenum type, unsigned source_count, 1516cbe883275ec58139ea13fef69628f233822808eZach Reizner const GLchar **sources, 152d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::ostringstream *shader_log) { 1536cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint status; 1546cbe883275ec58139ea13fef69628f233822808eZach Reizner AutoGLShader shader(glCreateShader(type)); 1556cbe883275ec58139ea13fef69628f233822808eZach Reizner if (shader.get() == 0) { 156d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (shader_log) 157d68353163dc72d2282c564379785dfca47b6df65Zach Reizner *shader_log << "Failed glCreateShader call"; 1586cbe883275ec58139ea13fef69628f233822808eZach Reizner return 0; 1596cbe883275ec58139ea13fef69628f233822808eZach Reizner } 160d68353163dc72d2282c564379785dfca47b6df65Zach Reizner 1616cbe883275ec58139ea13fef69628f233822808eZach Reizner glShaderSource(shader.get(), source_count, sources, NULL); 1626cbe883275ec58139ea13fef69628f233822808eZach Reizner glCompileShader(shader.get()); 1636cbe883275ec58139ea13fef69628f233822808eZach Reizner glGetShaderiv(shader.get(), GL_COMPILE_STATUS, &status); 1646cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!status) { 1656cbe883275ec58139ea13fef69628f233822808eZach Reizner if (shader_log) { 1666cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint log_length; 1676cbe883275ec58139ea13fef69628f233822808eZach Reizner glGetShaderiv(shader.get(), GL_INFO_LOG_LENGTH, &log_length); 168d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::string info_log(log_length, ' '); 169d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glGetShaderInfoLog(shader.get(), log_length, NULL, &info_log.front()); 170d68353163dc72d2282c564379785dfca47b6df65Zach Reizner *shader_log << "Failed to compile shader:\n" << info_log.c_str() 171d68353163dc72d2282c564379785dfca47b6df65Zach Reizner << "\nShader Source:\n"; 172d68353163dc72d2282c564379785dfca47b6df65Zach Reizner for (unsigned i = 0; i < source_count; i++) { 173d68353163dc72d2282c564379785dfca47b6df65Zach Reizner *shader_log << sources[i]; 174d68353163dc72d2282c564379785dfca47b6df65Zach Reizner } 175d68353163dc72d2282c564379785dfca47b6df65Zach Reizner *shader_log << "\n"; 1766cbe883275ec58139ea13fef69628f233822808eZach Reizner } 1776cbe883275ec58139ea13fef69628f233822808eZach Reizner return 0; 1786cbe883275ec58139ea13fef69628f233822808eZach Reizner } 1796cbe883275ec58139ea13fef69628f233822808eZach Reizner 1806cbe883275ec58139ea13fef69628f233822808eZach Reizner return shader; 1816cbe883275ec58139ea13fef69628f233822808eZach Reizner} 1826cbe883275ec58139ea13fef69628f233822808eZach Reizner 183806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shistatic std::string GenerateVertexShader(int layer_count) { 184806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi std::ostringstream vertex_shader_stream; 185806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi vertex_shader_stream 186806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "#version 300 es\n" 187806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "#define LAYER_COUNT " << layer_count << "\n" 188806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "precision mediump int;\n" 189806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "uniform vec4 uViewport;\n" 190806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "uniform vec4 uLayerCrop[LAYER_COUNT];\n" 191806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "uniform mat2 uTexMatrix[LAYER_COUNT];\n" 192806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "in vec2 vPosition;\n" 193806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "in vec2 vTexCoords;\n" 194806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "out vec2 fTexCoords[LAYER_COUNT];\n" 195806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "void main() {\n" 196806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " for (int i = 0; i < LAYER_COUNT; i++) {\n" 197806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " vec2 tempCoords = vTexCoords * uTexMatrix[i];\n" 198806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " fTexCoords[i] =\n" 199806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " uLayerCrop[i].xy + tempCoords * uLayerCrop[i].zw;\n" 200806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " }\n" 201806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " vec2 scaledPosition = uViewport.xy + vPosition * uViewport.zw;\n" 202806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " gl_Position =\n" 203806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " vec4(scaledPosition * vec2(2.0) - vec2(1.0), 0.0, 1.0);\n" 204806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "}\n"; 205806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi return vertex_shader_stream.str(); 206806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi} 207806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi 208806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shistatic std::string GenerateFragmentShader(int layer_count) { 209806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi std::ostringstream fragment_shader_stream; 210806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream << "#version 300 es\n" 211806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "#define LAYER_COUNT " << layer_count << "\n" 212806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "#extension GL_OES_EGL_image_external : require\n" 213806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "precision mediump float;\n"; 214806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi for (int i = 0; i < layer_count; ++i) { 215806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream << "uniform samplerExternalOES uLayerTexture" << i 216806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << ";\n"; 217806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi } 218806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream << "uniform float uLayerAlpha[LAYER_COUNT];\n" 219806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "uniform float uLayerPremult[LAYER_COUNT];\n" 220806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "in vec2 fTexCoords[LAYER_COUNT];\n" 221806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "out vec4 oFragColor;\n" 222806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "void main() {\n" 223806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " vec3 color = vec3(0.0, 0.0, 0.0);\n" 224806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " float alphaCover = 1.0;\n" 225806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " vec4 texSample;\n" 226806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " vec3 multRgb;\n"; 227806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi for (int i = 0; i < layer_count; ++i) { 228806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi if (i > 0) 229806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream << " if (alphaCover > 0.5/255.0) {\n"; 230806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi // clang-format off 231806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream 232806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " texSample = texture2D(uLayerTexture" << i << ",\n" 233806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " fTexCoords[" << i << "]);\n" 234806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " multRgb = texSample.rgb *\n" 235806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " max(texSample.a, uLayerPremult[" << i << "]);\n" 236806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " color += multRgb * uLayerAlpha[" << i << "] * alphaCover;\n" 237806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << " alphaCover *= 1.0 - texSample.a * uLayerAlpha[" << i << "];\n"; 238806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi // clang-format on 239806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi } 240806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi for (int i = 0; i < layer_count - 1; ++i) 241806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream << " }\n"; 242806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi fragment_shader_stream << " oFragColor = vec4(color, 1.0 - alphaCover);\n" 243806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi << "}\n"; 244806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi return fragment_shader_stream.str(); 245806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi} 246806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi 247d68353163dc72d2282c564379785dfca47b6df65Zach Reiznerstatic AutoGLProgram GenerateProgram(unsigned num_textures, 248d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::ostringstream *shader_log) { 249d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::string vertex_shader_string = GenerateVertexShader(num_textures); 250d68353163dc72d2282c564379785dfca47b6df65Zach Reizner const GLchar *vertex_shader_source = vertex_shader_string.c_str(); 251d68353163dc72d2282c564379785dfca47b6df65Zach Reizner AutoGLShader vertex_shader = CompileAndCheckShader( 252d68353163dc72d2282c564379785dfca47b6df65Zach Reizner GL_VERTEX_SHADER, 1, &vertex_shader_source, shader_log); 253d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (!vertex_shader.get()) 254d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return 0; 2556cbe883275ec58139ea13fef69628f233822808eZach Reizner 256d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::string fragment_shader_string = GenerateFragmentShader(num_textures); 257d68353163dc72d2282c564379785dfca47b6df65Zach Reizner const GLchar *fragment_shader_source = fragment_shader_string.c_str(); 258d68353163dc72d2282c564379785dfca47b6df65Zach Reizner AutoGLShader fragment_shader = CompileAndCheckShader( 259d68353163dc72d2282c564379785dfca47b6df65Zach Reizner GL_FRAGMENT_SHADER, 1, &fragment_shader_source, shader_log); 260d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (!fragment_shader.get()) 261d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return 0; 2626cbe883275ec58139ea13fef69628f233822808eZach Reizner 263d68353163dc72d2282c564379785dfca47b6df65Zach Reizner AutoGLProgram program(glCreateProgram()); 264d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (!program.get()) { 265d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (shader_log) 266d68353163dc72d2282c564379785dfca47b6df65Zach Reizner *shader_log << "Failed to create program: " << GetGLError() << "\n"; 267d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return 0; 268d68353163dc72d2282c564379785dfca47b6df65Zach Reizner } 2696cbe883275ec58139ea13fef69628f233822808eZach Reizner 270d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glAttachShader(program.get(), vertex_shader.get()); 271d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glAttachShader(program.get(), fragment_shader.get()); 272d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glBindAttribLocation(program.get(), 0, "vPosition"); 273d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glBindAttribLocation(program.get(), 1, "vTexCoords"); 274d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glLinkProgram(program.get()); 275d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glDetachShader(program.get(), vertex_shader.get()); 276d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glDetachShader(program.get(), fragment_shader.get()); 2776cbe883275ec58139ea13fef69628f233822808eZach Reizner 278d68353163dc72d2282c564379785dfca47b6df65Zach Reizner GLint status; 279d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glGetProgramiv(program.get(), GL_LINK_STATUS, &status); 280d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (!status) { 281d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (shader_log) { 282d68353163dc72d2282c564379785dfca47b6df65Zach Reizner GLint log_length; 283d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glGetProgramiv(program.get(), GL_INFO_LOG_LENGTH, &log_length); 284d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::string program_log(log_length, ' '); 285d68353163dc72d2282c564379785dfca47b6df65Zach Reizner glGetProgramInfoLog(program.get(), log_length, NULL, 286d68353163dc72d2282c564379785dfca47b6df65Zach Reizner &program_log.front()); 287d68353163dc72d2282c564379785dfca47b6df65Zach Reizner *shader_log << "Failed to link program:\n" << program_log.c_str() << "\n"; 288d68353163dc72d2282c564379785dfca47b6df65Zach Reizner } 289d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return 0; 2906cbe883275ec58139ea13fef69628f233822808eZach Reizner } 2916cbe883275ec58139ea13fef69628f233822808eZach Reizner 292d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return program; 2936cbe883275ec58139ea13fef69628f233822808eZach Reizner} 2946cbe883275ec58139ea13fef69628f233822808eZach Reizner 2956cbe883275ec58139ea13fef69628f233822808eZach Reiznerstruct RenderingCommand { 2966cbe883275ec58139ea13fef69628f233822808eZach Reizner struct TextureSource { 2976cbe883275ec58139ea13fef69628f233822808eZach Reizner unsigned texture_index; 2986cbe883275ec58139ea13fef69628f233822808eZach Reizner float crop_bounds[4]; 2996cbe883275ec58139ea13fef69628f233822808eZach Reizner float alpha; 3003a8773c4747b9e9077bfaea4ab18225077ef90c6Haixia Shi float premult; 301d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner float texture_matrix[4]; 3026cbe883275ec58139ea13fef69628f233822808eZach Reizner }; 3036cbe883275ec58139ea13fef69628f233822808eZach Reizner 3046cbe883275ec58139ea13fef69628f233822808eZach Reizner float bounds[4]; 30592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner unsigned texture_count = 0; 3066cbe883275ec58139ea13fef69628f233822808eZach Reizner TextureSource textures[MAX_OVERLAPPING_LAYERS]; 3076cbe883275ec58139ea13fef69628f233822808eZach Reizner}; 3086cbe883275ec58139ea13fef69628f233822808eZach Reizner 30992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reiznerstatic void ConstructCommand(const DrmHwcLayer *layers, 31092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner const DrmCompositionRegion ®ion, 31192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner RenderingCommand &cmd) { 31292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner std::copy_n(region.frame.bounds, 4, cmd.bounds); 31392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 31492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner for (size_t texture_index : region.source_layers) { 31592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner const DrmHwcLayer &layer = layers[texture_index]; 31692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 31792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner DrmHwcRect<float> display_rect(layer.display_frame); 31892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner float display_size[2] = {display_rect.bounds[2] - display_rect.bounds[0], 31992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner display_rect.bounds[3] - display_rect.bounds[1]}; 32092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 32192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner float tex_width = layer.buffer->width; 32292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner float tex_height = layer.buffer->height; 32392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner DrmHwcRect<float> crop_rect(layer.source_crop.left / tex_width, 32492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner layer.source_crop.top / tex_height, 32592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner layer.source_crop.right / tex_width, 32692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner layer.source_crop.bottom / tex_height); 32792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 32892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner float crop_size[2] = {crop_rect.bounds[2] - crop_rect.bounds[0], 32992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner crop_rect.bounds[3] - crop_rect.bounds[1]}; 33092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 33192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner RenderingCommand::TextureSource &src = cmd.textures[cmd.texture_count]; 33292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner cmd.texture_count++; 33392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner src.texture_index = texture_index; 33492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 33504b47ea435834b4373d57dae6485986b9f0918aeSean Paul bool swap_xy = false; 33604b47ea435834b4373d57dae6485986b9f0918aeSean Paul bool flip_xy[2] = { false, false }; 33704b47ea435834b4373d57dae6485986b9f0918aeSean Paul 33804b47ea435834b4373d57dae6485986b9f0918aeSean Paul if (layer.transform == DrmHwcTransform::kRotate180) { 33904b47ea435834b4373d57dae6485986b9f0918aeSean Paul swap_xy = false; 34004b47ea435834b4373d57dae6485986b9f0918aeSean Paul flip_xy[0] = true; 34104b47ea435834b4373d57dae6485986b9f0918aeSean Paul flip_xy[1] = true; 34204b47ea435834b4373d57dae6485986b9f0918aeSean Paul } else if (layer.transform == DrmHwcTransform::kRotate270) { 34304b47ea435834b4373d57dae6485986b9f0918aeSean Paul swap_xy = true; 34404b47ea435834b4373d57dae6485986b9f0918aeSean Paul flip_xy[0] = true; 34504b47ea435834b4373d57dae6485986b9f0918aeSean Paul flip_xy[1] = false; 34604b47ea435834b4373d57dae6485986b9f0918aeSean Paul } else if (layer.transform & DrmHwcTransform::kRotate90) { 34704b47ea435834b4373d57dae6485986b9f0918aeSean Paul swap_xy = true; 34804b47ea435834b4373d57dae6485986b9f0918aeSean Paul if (layer.transform & DrmHwcTransform::kFlipH) { 34992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner flip_xy[0] = true; 35092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner flip_xy[1] = true; 35104b47ea435834b4373d57dae6485986b9f0918aeSean Paul } else if (layer.transform & DrmHwcTransform::kFlipV) { 35204b47ea435834b4373d57dae6485986b9f0918aeSean Paul flip_xy[0] = false; 35304b47ea435834b4373d57dae6485986b9f0918aeSean Paul flip_xy[1] = false; 35404b47ea435834b4373d57dae6485986b9f0918aeSean Paul } else { 35592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner flip_xy[0] = false; 35692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner flip_xy[1] = true; 35704b47ea435834b4373d57dae6485986b9f0918aeSean Paul } 35804b47ea435834b4373d57dae6485986b9f0918aeSean Paul } else { 35904b47ea435834b4373d57dae6485986b9f0918aeSean Paul if (layer.transform & DrmHwcTransform::kFlipH) 36092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner flip_xy[0] = true; 36104b47ea435834b4373d57dae6485986b9f0918aeSean Paul if (layer.transform & DrmHwcTransform::kFlipV) 36292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner flip_xy[1] = true; 36392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner } 3646cbe883275ec58139ea13fef69628f233822808eZach Reizner 36592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner if (swap_xy) 36692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner std::copy_n(&kTextureTransformMatrices[4], 4, src.texture_matrix); 36792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner else 36892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner std::copy_n(&kTextureTransformMatrices[0], 4, src.texture_matrix); 36992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 37092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner for (int j = 0; j < 4; j++) { 37192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner int b = j ^ (swap_xy ? 1 : 0); 37292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner float bound_percent = 37392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner (cmd.bounds[b] - display_rect.bounds[b % 2]) / display_size[b % 2]; 37492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner if (flip_xy[j % 2]) { 37592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner src.crop_bounds[j] = 37692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner crop_rect.bounds[j % 2 + 2] - bound_percent * crop_size[j % 2]; 37792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner } else { 37892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner src.crop_bounds[j] = 37992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner crop_rect.bounds[j % 2] + bound_percent * crop_size[j % 2]; 3806cbe883275ec58139ea13fef69628f233822808eZach Reizner } 3816cbe883275ec58139ea13fef69628f233822808eZach Reizner } 38292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 38392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner if (layer.blending == DrmHwcBlending::kNone) { 38492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner src.alpha = src.premult = 1.0f; 38592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner // This layer is opaque. There is no point in using layers below this one. 38692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner break; 38792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner } 38892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 38992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner src.alpha = layer.alpha / 255.0f; 39034b12d332b9108f28ee463f6911828c50fab68e9Haixia Shi src.premult = (layer.blending == DrmHwcBlending::kPreMult) ? 1.0f : 0.0f; 3916cbe883275ec58139ea13fef69628f233822808eZach Reizner } 3926cbe883275ec58139ea13fef69628f233822808eZach Reizner} 3936cbe883275ec58139ea13fef69628f233822808eZach Reizner 3946cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic int EGLFenceWait(EGLDisplay egl_display, int acquireFenceFd) { 3956cbe883275ec58139ea13fef69628f233822808eZach Reizner int ret = 0; 3966cbe883275ec58139ea13fef69628f233822808eZach Reizner 3976cbe883275ec58139ea13fef69628f233822808eZach Reizner EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_FD_ANDROID, acquireFenceFd, 3986cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_NONE}; 3996cbe883275ec58139ea13fef69628f233822808eZach Reizner EGLSyncKHR egl_sync = 4006cbe883275ec58139ea13fef69628f233822808eZach Reizner eglCreateSyncKHR(egl_display, EGL_SYNC_NATIVE_FENCE_ANDROID, attribs); 4016cbe883275ec58139ea13fef69628f233822808eZach Reizner if (egl_sync == EGL_NO_SYNC_KHR) { 4026cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to make EGLSyncKHR from acquireFenceFd: %s", GetEGLError()); 4036cbe883275ec58139ea13fef69628f233822808eZach Reizner close(acquireFenceFd); 4046cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 4056cbe883275ec58139ea13fef69628f233822808eZach Reizner } 4066cbe883275ec58139ea13fef69628f233822808eZach Reizner 4076cbe883275ec58139ea13fef69628f233822808eZach Reizner EGLint success = eglWaitSyncKHR(egl_display, egl_sync, 0); 4086cbe883275ec58139ea13fef69628f233822808eZach Reizner if (success == EGL_FALSE) { 4096cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to wait for acquire: %s", GetEGLError()); 4106cbe883275ec58139ea13fef69628f233822808eZach Reizner ret = 1; 4116cbe883275ec58139ea13fef69628f233822808eZach Reizner } 4126cbe883275ec58139ea13fef69628f233822808eZach Reizner eglDestroySyncKHR(egl_display, egl_sync); 4136cbe883275ec58139ea13fef69628f233822808eZach Reizner 4146cbe883275ec58139ea13fef69628f233822808eZach Reizner return ret; 4156cbe883275ec58139ea13fef69628f233822808eZach Reizner} 4166cbe883275ec58139ea13fef69628f233822808eZach Reizner 4176cbe883275ec58139ea13fef69628f233822808eZach Reiznerstatic int CreateTextureFromHandle(EGLDisplay egl_display, 4186cbe883275ec58139ea13fef69628f233822808eZach Reizner buffer_handle_t handle, 4196cbe883275ec58139ea13fef69628f233822808eZach Reizner AutoEGLImageAndGLTexture *out) { 4209cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido EGLImageKHR image = eglCreateImageKHR( 4219cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido egl_display, EGL_NO_CONTEXT, EGL_NATIVE_HANDLE_ANDROID_NVX, 4229cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido (EGLClientBuffer)handle, NULL /* no attribs */); 4236cbe883275ec58139ea13fef69628f233822808eZach Reizner 4246cbe883275ec58139ea13fef69628f233822808eZach Reizner if (image == EGL_NO_IMAGE_KHR) { 4256cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to make image %s %p", GetEGLError(), handle); 4266cbe883275ec58139ea13fef69628f233822808eZach Reizner return -EINVAL; 4276cbe883275ec58139ea13fef69628f233822808eZach Reizner } 4286cbe883275ec58139ea13fef69628f233822808eZach Reizner 4296cbe883275ec58139ea13fef69628f233822808eZach Reizner GLuint texture; 4306cbe883275ec58139ea13fef69628f233822808eZach Reizner glGenTextures(1, &texture); 4312133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture); 4322133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, (GLeglImageOES)image); 4336b9647f3d666fad92985d0b6cef7a5b199a71687Sean Paul glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 4346b9647f3d666fad92985d0b6cef7a5b199a71687Sean Paul glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 4352133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_REPEAT); 4362133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_REPEAT); 4372133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0); 4386cbe883275ec58139ea13fef69628f233822808eZach Reizner 439098070590ae648ede5f2ef846298de178ccd3637Zach Reizner out->image.reset(egl_display, image); 4406cbe883275ec58139ea13fef69628f233822808eZach Reizner out->texture.reset(texture); 4416cbe883275ec58139ea13fef69628f233822808eZach Reizner 4426cbe883275ec58139ea13fef69628f233822808eZach Reizner return 0; 4436cbe883275ec58139ea13fef69628f233822808eZach Reizner} 4446cbe883275ec58139ea13fef69628f233822808eZach Reizner 445dac5d199ba3d6adeb96c385fa184351543f7cad6Zach ReiznerGLWorkerCompositor::GLWorkerCompositor() 4466cbe883275ec58139ea13fef69628f233822808eZach Reizner : egl_display_(EGL_NO_DISPLAY), egl_ctx_(EGL_NO_CONTEXT) { 4476cbe883275ec58139ea13fef69628f233822808eZach Reizner} 4486cbe883275ec58139ea13fef69628f233822808eZach Reizner 449dac5d199ba3d6adeb96c385fa184351543f7cad6Zach Reiznerint GLWorkerCompositor::Init() { 4506cbe883275ec58139ea13fef69628f233822808eZach Reizner int ret = 0; 4516cbe883275ec58139ea13fef69628f233822808eZach Reizner const char *egl_extensions; 4526cbe883275ec58139ea13fef69628f233822808eZach Reizner const char *gl_extensions; 4536cbe883275ec58139ea13fef69628f233822808eZach Reizner EGLint num_configs; 4546cbe883275ec58139ea13fef69628f233822808eZach Reizner EGLint attribs[] = {EGL_WIDTH, 1, EGL_HEIGHT, 1, EGL_NONE, EGL_NONE}; 4556cbe883275ec58139ea13fef69628f233822808eZach Reizner EGLConfig egl_config; 4566cbe883275ec58139ea13fef69628f233822808eZach Reizner 4576cbe883275ec58139ea13fef69628f233822808eZach Reizner // clang-format off 4586cbe883275ec58139ea13fef69628f233822808eZach Reizner const GLfloat verts[] = { 4596cbe883275ec58139ea13fef69628f233822808eZach Reizner 0.0f, 0.0f, 0.0f, 0.0f, 4606cbe883275ec58139ea13fef69628f233822808eZach Reizner 0.0f, 2.0f, 0.0f, 2.0f, 4616cbe883275ec58139ea13fef69628f233822808eZach Reizner 2.0f, 0.0f, 2.0f, 0.0f 4626cbe883275ec58139ea13fef69628f233822808eZach Reizner }; 4636cbe883275ec58139ea13fef69628f233822808eZach Reizner // clang-format on 4646cbe883275ec58139ea13fef69628f233822808eZach Reizner 4656cbe883275ec58139ea13fef69628f233822808eZach Reizner const EGLint config_attribs[] = {EGL_RENDERABLE_TYPE, 4666cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_OPENGL_ES2_BIT, 4676cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_RED_SIZE, 4686cbe883275ec58139ea13fef69628f233822808eZach Reizner 8, 4696cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_GREEN_SIZE, 4706cbe883275ec58139ea13fef69628f233822808eZach Reizner 8, 4716cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_BLUE_SIZE, 4726cbe883275ec58139ea13fef69628f233822808eZach Reizner 8, 4736cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_NONE}; 4746cbe883275ec58139ea13fef69628f233822808eZach Reizner 4756cbe883275ec58139ea13fef69628f233822808eZach Reizner const EGLint context_attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE}; 4766cbe883275ec58139ea13fef69628f233822808eZach Reizner 4776cbe883275ec58139ea13fef69628f233822808eZach Reizner egl_display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY); 4786cbe883275ec58139ea13fef69628f233822808eZach Reizner if (egl_display_ == EGL_NO_DISPLAY) { 4796cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to get egl display"); 4806cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 4816cbe883275ec58139ea13fef69628f233822808eZach Reizner } 4826cbe883275ec58139ea13fef69628f233822808eZach Reizner 4836cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!eglInitialize(egl_display_, NULL, NULL)) { 4846cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to initialize egl: %s", GetEGLError()); 4856cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 4866cbe883275ec58139ea13fef69628f233822808eZach Reizner } 4876cbe883275ec58139ea13fef69628f233822808eZach Reizner 4886cbe883275ec58139ea13fef69628f233822808eZach Reizner egl_extensions = eglQueryString(egl_display_, EGL_EXTENSIONS); 4896cbe883275ec58139ea13fef69628f233822808eZach Reizner 4906cbe883275ec58139ea13fef69628f233822808eZach Reizner // These extensions are all technically required but not always reported due 4916cbe883275ec58139ea13fef69628f233822808eZach Reizner // to meta EGL filtering them out. 4926cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!HasExtension("EGL_KHR_image_base", egl_extensions)) 4936cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGW("EGL_KHR_image_base extension not supported"); 4946cbe883275ec58139ea13fef69628f233822808eZach Reizner 4956cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!HasExtension("EGL_ANDROID_image_native_buffer", egl_extensions)) 4966cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGW("EGL_ANDROID_image_native_buffer extension not supported"); 4976cbe883275ec58139ea13fef69628f233822808eZach Reizner 4986cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!HasExtension("EGL_ANDROID_native_fence_sync", egl_extensions)) 4996cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGW("EGL_ANDROID_native_fence_sync extension not supported"); 5006cbe883275ec58139ea13fef69628f233822808eZach Reizner 5016cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!eglChooseConfig(egl_display_, config_attribs, &egl_config, 1, 5026cbe883275ec58139ea13fef69628f233822808eZach Reizner &num_configs)) { 5036cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("eglChooseConfig() failed with error: %s", GetEGLError()); 5046cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 5056cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5066cbe883275ec58139ea13fef69628f233822808eZach Reizner 5076cbe883275ec58139ea13fef69628f233822808eZach Reizner egl_ctx_ = 5086cbe883275ec58139ea13fef69628f233822808eZach Reizner eglCreateContext(egl_display_, egl_config, 5096cbe883275ec58139ea13fef69628f233822808eZach Reizner EGL_NO_CONTEXT /* No shared context */, context_attribs); 5106cbe883275ec58139ea13fef69628f233822808eZach Reizner 5116cbe883275ec58139ea13fef69628f233822808eZach Reizner if (egl_ctx_ == EGL_NO_CONTEXT) { 5126cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to create OpenGL ES Context: %s", GetEGLError()); 5136cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 5146cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5156cbe883275ec58139ea13fef69628f233822808eZach Reizner 5166cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!eglMakeCurrent(egl_display_, EGL_NO_SURFACE, EGL_NO_SURFACE, egl_ctx_)) { 5176cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to make the OpenGL ES Context current: %s", GetEGLError()); 5186cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 5196cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5206cbe883275ec58139ea13fef69628f233822808eZach Reizner 5216cbe883275ec58139ea13fef69628f233822808eZach Reizner gl_extensions = (const char *)glGetString(GL_EXTENSIONS); 5226cbe883275ec58139ea13fef69628f233822808eZach Reizner 5236cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!HasExtension("GL_OES_EGL_image", gl_extensions)) 5246cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGW("GL_OES_EGL_image extension not supported"); 5256cbe883275ec58139ea13fef69628f233822808eZach Reizner 5262133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi if (!HasExtension("GL_OES_EGL_image_external", gl_extensions)) 5272133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi ALOGW("GL_OES_EGL_image_external extension not supported"); 5282133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi 5296cbe883275ec58139ea13fef69628f233822808eZach Reizner GLuint vertex_buffer; 5306cbe883275ec58139ea13fef69628f233822808eZach Reizner glGenBuffers(1, &vertex_buffer); 5316cbe883275ec58139ea13fef69628f233822808eZach Reizner glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 5326cbe883275ec58139ea13fef69628f233822808eZach Reizner glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 5336cbe883275ec58139ea13fef69628f233822808eZach Reizner glBindBuffer(GL_ARRAY_BUFFER, 0); 5346cbe883275ec58139ea13fef69628f233822808eZach Reizner vertex_buffer_.reset(vertex_buffer); 5356cbe883275ec58139ea13fef69628f233822808eZach Reizner 536d68353163dc72d2282c564379785dfca47b6df65Zach Reizner std::ostringstream shader_log; 537d68353163dc72d2282c564379785dfca47b6df65Zach Reizner blend_programs_.emplace_back(GenerateProgram(1, &shader_log)); 538d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (blend_programs_.back().get() == 0) { 539d68353163dc72d2282c564379785dfca47b6df65Zach Reizner ALOGE("%s", shader_log.str().c_str()); 5406cbe883275ec58139ea13fef69628f233822808eZach Reizner return 1; 5416cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5426cbe883275ec58139ea13fef69628f233822808eZach Reizner 5436cbe883275ec58139ea13fef69628f233822808eZach Reizner return 0; 5446cbe883275ec58139ea13fef69628f233822808eZach Reizner} 5456cbe883275ec58139ea13fef69628f233822808eZach Reizner 546dac5d199ba3d6adeb96c385fa184351543f7cad6Zach ReiznerGLWorkerCompositor::~GLWorkerCompositor() { 5476cbe883275ec58139ea13fef69628f233822808eZach Reizner if (egl_display_ != EGL_NO_DISPLAY && egl_ctx_ != EGL_NO_CONTEXT) 5486cbe883275ec58139ea13fef69628f233822808eZach Reizner if (eglDestroyContext(egl_display_, egl_ctx_) == EGL_FALSE) 5496cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Failed to destroy OpenGL ES Context: %s", GetEGLError()); 5506cbe883275ec58139ea13fef69628f233822808eZach Reizner} 5516cbe883275ec58139ea13fef69628f233822808eZach Reizner 55292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reiznerint GLWorkerCompositor::Composite(DrmHwcLayer *layers, 55392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner DrmCompositionRegion *regions, 55492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner size_t num_regions, 5559cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido const sp<GraphicBuffer> &framebuffer) { 5566cbe883275ec58139ea13fef69628f233822808eZach Reizner ATRACE_CALL(); 5576cbe883275ec58139ea13fef69628f233822808eZach Reizner int ret = 0; 5586cbe883275ec58139ea13fef69628f233822808eZach Reizner std::vector<AutoEGLImageAndGLTexture> layer_textures; 5596cbe883275ec58139ea13fef69628f233822808eZach Reizner std::vector<RenderingCommand> commands; 5606cbe883275ec58139ea13fef69628f233822808eZach Reizner 56192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner if (num_regions == 0) { 5626cbe883275ec58139ea13fef69628f233822808eZach Reizner return -EALREADY; 5636cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5646cbe883275ec58139ea13fef69628f233822808eZach Reizner 5656cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint frame_width = framebuffer->getWidth(); 5666cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint frame_height = framebuffer->getHeight(); 5678d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner CachedFramebuffer *cached_framebuffer = 5688d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner PrepareAndCacheFramebuffer(framebuffer); 5698d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (cached_framebuffer == NULL) { 5708d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner ALOGE("Composite failed because of failed framebuffer"); 5716cbe883275ec58139ea13fef69628f233822808eZach Reizner return -EINVAL; 5726cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5736cbe883275ec58139ea13fef69628f233822808eZach Reizner 57492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner std::unordered_set<size_t> layers_used_indices; 57592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner for (size_t region_index = 0; region_index < num_regions; region_index++) { 57692f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner DrmCompositionRegion ®ion = regions[region_index]; 57792f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner layers_used_indices.insert(region.source_layers.begin(), 57892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner region.source_layers.end()); 57992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner commands.emplace_back(); 58092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner ConstructCommand(layers, region, commands.back()); 58192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner } 58292f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 58392f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner for (size_t layer_index = 0; layer_index < MAX_OVERLAPPING_LAYERS; 58492f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner layer_index++) { 58592f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner DrmHwcLayer *layer = &layers[layer_index]; 5866cbe883275ec58139ea13fef69628f233822808eZach Reizner 587098070590ae648ede5f2ef846298de178ccd3637Zach Reizner layer_textures.emplace_back(); 58892f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 58992f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner if (layers_used_indices.count(layer_index) == 0) 59092f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner continue; 59192f8e6399c0829c6ba6db77d5ea1bbd22f510bb1Zach Reizner 5924a253659cef3d82bfb0b25b3ff4c7b073d7a0460Zach Reizner ret = CreateTextureFromHandle(egl_display_, layer->get_usable_handle(), 5939cc83934f92aab292f16213c1b716e8ecfcb5875Adrian Salido &layer_textures.back()); 594098070590ae648ede5f2ef846298de178ccd3637Zach Reizner 5956cbe883275ec58139ea13fef69628f233822808eZach Reizner if (!ret) { 5964a253659cef3d82bfb0b25b3ff4c7b073d7a0460Zach Reizner ret = EGLFenceWait(egl_display_, layer->acquire_fence.Release()); 5976cbe883275ec58139ea13fef69628f233822808eZach Reizner } 5986cbe883275ec58139ea13fef69628f233822808eZach Reizner if (ret) { 5996cbe883275ec58139ea13fef69628f233822808eZach Reizner layer_textures.pop_back(); 6006cbe883275ec58139ea13fef69628f233822808eZach Reizner ret = -EINVAL; 6016cbe883275ec58139ea13fef69628f233822808eZach Reizner } 6026cbe883275ec58139ea13fef69628f233822808eZach Reizner } 6036cbe883275ec58139ea13fef69628f233822808eZach Reizner 6046cbe883275ec58139ea13fef69628f233822808eZach Reizner if (ret) 6056cbe883275ec58139ea13fef69628f233822808eZach Reizner return ret; 6066cbe883275ec58139ea13fef69628f233822808eZach Reizner 6076cbe883275ec58139ea13fef69628f233822808eZach Reizner glViewport(0, 0, frame_width, frame_height); 6086cbe883275ec58139ea13fef69628f233822808eZach Reizner 6096cbe883275ec58139ea13fef69628f233822808eZach Reizner glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 6106cbe883275ec58139ea13fef69628f233822808eZach Reizner glClear(GL_COLOR_BUFFER_BIT); 6116cbe883275ec58139ea13fef69628f233822808eZach Reizner 6126cbe883275ec58139ea13fef69628f233822808eZach Reizner glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_.get()); 6136cbe883275ec58139ea13fef69628f233822808eZach Reizner glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, NULL); 6146cbe883275ec58139ea13fef69628f233822808eZach Reizner glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 4, 6156cbe883275ec58139ea13fef69628f233822808eZach Reizner (void *)(sizeof(float) * 2)); 6166cbe883275ec58139ea13fef69628f233822808eZach Reizner glEnableVertexAttribArray(0); 6176cbe883275ec58139ea13fef69628f233822808eZach Reizner glEnableVertexAttribArray(1); 6186cbe883275ec58139ea13fef69628f233822808eZach Reizner glEnable(GL_SCISSOR_TEST); 6196cbe883275ec58139ea13fef69628f233822808eZach Reizner 6206cbe883275ec58139ea13fef69628f233822808eZach Reizner for (const RenderingCommand &cmd : commands) { 621d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (cmd.texture_count == 0) 6226cbe883275ec58139ea13fef69628f233822808eZach Reizner continue; 6236cbe883275ec58139ea13fef69628f233822808eZach Reizner 6246cbe883275ec58139ea13fef69628f233822808eZach Reizner // TODO(zachr): handle the case of too many overlapping textures for one 6256cbe883275ec58139ea13fef69628f233822808eZach Reizner // area by falling back to rendering as many layers as possible using 6266cbe883275ec58139ea13fef69628f233822808eZach Reizner // multiple blending passes. 627d68353163dc72d2282c564379785dfca47b6df65Zach Reizner GLint program = PrepareAndCacheProgram(cmd.texture_count); 628d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (program == 0) { 6296cbe883275ec58139ea13fef69628f233822808eZach Reizner ALOGE("Too many layers to render in one area"); 6306cbe883275ec58139ea13fef69628f233822808eZach Reizner continue; 6316cbe883275ec58139ea13fef69628f233822808eZach Reizner } 6326cbe883275ec58139ea13fef69628f233822808eZach Reizner 6336cbe883275ec58139ea13fef69628f233822808eZach Reizner glUseProgram(program); 6346cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint gl_viewport_loc = glGetUniformLocation(program, "uViewport"); 6356cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint gl_crop_loc = glGetUniformLocation(program, "uLayerCrop"); 6366cbe883275ec58139ea13fef69628f233822808eZach Reizner GLint gl_alpha_loc = glGetUniformLocation(program, "uLayerAlpha"); 6373a8773c4747b9e9077bfaea4ab18225077ef90c6Haixia Shi GLint gl_premult_loc = glGetUniformLocation(program, "uLayerPremult"); 638d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner GLint gl_tex_matrix_loc = glGetUniformLocation(program, "uTexMatrix"); 6396cbe883275ec58139ea13fef69628f233822808eZach Reizner glUniform4f(gl_viewport_loc, cmd.bounds[0] / (float)frame_width, 6406cbe883275ec58139ea13fef69628f233822808eZach Reizner cmd.bounds[1] / (float)frame_height, 6416cbe883275ec58139ea13fef69628f233822808eZach Reizner (cmd.bounds[2] - cmd.bounds[0]) / (float)frame_width, 6426cbe883275ec58139ea13fef69628f233822808eZach Reizner (cmd.bounds[3] - cmd.bounds[1]) / (float)frame_height); 6436cbe883275ec58139ea13fef69628f233822808eZach Reizner 6446cbe883275ec58139ea13fef69628f233822808eZach Reizner for (unsigned src_index = 0; src_index < cmd.texture_count; src_index++) { 645806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi std::ostringstream texture_name_formatter; 646806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi texture_name_formatter << "uLayerTexture" << src_index; 647806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi GLint gl_tex_loc = 648806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi glGetUniformLocation(program, texture_name_formatter.str().c_str()); 649806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi 6506cbe883275ec58139ea13fef69628f233822808eZach Reizner const RenderingCommand::TextureSource &src = cmd.textures[src_index]; 6516cbe883275ec58139ea13fef69628f233822808eZach Reizner glUniform1f(gl_alpha_loc + src_index, src.alpha); 6523a8773c4747b9e9077bfaea4ab18225077ef90c6Haixia Shi glUniform1f(gl_premult_loc + src_index, src.premult); 6536cbe883275ec58139ea13fef69628f233822808eZach Reizner glUniform4f(gl_crop_loc + src_index, src.crop_bounds[0], 6546cbe883275ec58139ea13fef69628f233822808eZach Reizner src.crop_bounds[1], src.crop_bounds[2] - src.crop_bounds[0], 6556cbe883275ec58139ea13fef69628f233822808eZach Reizner src.crop_bounds[3] - src.crop_bounds[1]); 656806b395c7ad59387773f31ffb5eb7c2f340bd794Haixia Shi glUniform1i(gl_tex_loc, src_index); 657d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner glUniformMatrix2fv(gl_tex_matrix_loc + src_index, 1, GL_FALSE, 658d35ff53cf985afec7739f1cc784d8e044aa0358eZach Reizner src.texture_matrix); 6596cbe883275ec58139ea13fef69628f233822808eZach Reizner glActiveTexture(GL_TEXTURE0 + src_index); 6602133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glBindTexture(GL_TEXTURE_EXTERNAL_OES, 6616cbe883275ec58139ea13fef69628f233822808eZach Reizner layer_textures[src.texture_index].texture.get()); 6626cbe883275ec58139ea13fef69628f233822808eZach Reizner } 6636cbe883275ec58139ea13fef69628f233822808eZach Reizner 6646cbe883275ec58139ea13fef69628f233822808eZach Reizner glScissor(cmd.bounds[0], cmd.bounds[1], cmd.bounds[2] - cmd.bounds[0], 6656cbe883275ec58139ea13fef69628f233822808eZach Reizner cmd.bounds[3] - cmd.bounds[1]); 6666cbe883275ec58139ea13fef69628f233822808eZach Reizner glDrawArrays(GL_TRIANGLES, 0, 3); 6676cbe883275ec58139ea13fef69628f233822808eZach Reizner 6686cbe883275ec58139ea13fef69628f233822808eZach Reizner for (unsigned src_index = 0; src_index < cmd.texture_count; src_index++) { 6696cbe883275ec58139ea13fef69628f233822808eZach Reizner glActiveTexture(GL_TEXTURE0 + src_index); 6702133275a68d3a3b4968c20e5827924abfa48938aHaixia Shi glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0); 6716cbe883275ec58139ea13fef69628f233822808eZach Reizner } 6726cbe883275ec58139ea13fef69628f233822808eZach Reizner } 6736cbe883275ec58139ea13fef69628f233822808eZach Reizner 6746cbe883275ec58139ea13fef69628f233822808eZach Reizner glDisable(GL_SCISSOR_TEST); 6756cbe883275ec58139ea13fef69628f233822808eZach Reizner glActiveTexture(GL_TEXTURE0); 6766cbe883275ec58139ea13fef69628f233822808eZach Reizner glDisableVertexAttribArray(0); 6776cbe883275ec58139ea13fef69628f233822808eZach Reizner glDisableVertexAttribArray(1); 6786cbe883275ec58139ea13fef69628f233822808eZach Reizner glBindBuffer(GL_ARRAY_BUFFER, 0); 6796cbe883275ec58139ea13fef69628f233822808eZach Reizner glUseProgram(0); 6806cbe883275ec58139ea13fef69628f233822808eZach Reizner 6816cbe883275ec58139ea13fef69628f233822808eZach Reizner glBindFramebuffer(GL_FRAMEBUFFER, 0); 6826cbe883275ec58139ea13fef69628f233822808eZach Reizner 6836cbe883275ec58139ea13fef69628f233822808eZach Reizner return ret; 6846cbe883275ec58139ea13fef69628f233822808eZach Reizner} 6856cbe883275ec58139ea13fef69628f233822808eZach Reizner 6868d63e7fde00f5830480cd2225954f70e6b681d8bZach Reiznervoid GLWorkerCompositor::Finish() { 6878d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner ATRACE_CALL(); 688713a6788528d4cc4cd477b2f546c8b922beb6ddeZach Reizner glFinish(); 6898d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 6908d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner char use_framebuffer_cache_opt[PROPERTY_VALUE_MAX]; 6918d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner property_get("hwc.drm.use_framebuffer_cache", use_framebuffer_cache_opt, "1"); 6928d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner bool use_framebuffer_cache = atoi(use_framebuffer_cache_opt); 6938d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 6948d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (use_framebuffer_cache) { 6958d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner for (auto &fb : cached_framebuffers_) 6968d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner fb.strong_framebuffer.clear(); 6978d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } else { 6988d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner cached_framebuffers_.clear(); 6998d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7008d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner} 7018d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7028d63e7fde00f5830480cd2225954f70e6b681d8bZach ReiznerGLWorkerCompositor::CachedFramebuffer::CachedFramebuffer( 7038d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner const sp<GraphicBuffer> &gb, AutoEGLDisplayImage &&image, 7048d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner AutoGLTexture &&tex, AutoGLFramebuffer &&fb) 7058d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner : strong_framebuffer(gb), 7068d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner weak_framebuffer(gb), 7078d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner egl_fb_image(std::move(image)), 7088d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner gl_fb_tex(std::move(tex)), 7098d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner gl_fb(std::move(fb)) { 7108d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner} 7118d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7128d63e7fde00f5830480cd2225954f70e6b681d8bZach Reiznerbool GLWorkerCompositor::CachedFramebuffer::Promote() { 7138d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (strong_framebuffer.get() != NULL) 7148d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return true; 7158d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner strong_framebuffer = weak_framebuffer.promote(); 7168d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return strong_framebuffer.get() != NULL; 7178d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner} 7188d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7198d63e7fde00f5830480cd2225954f70e6b681d8bZach ReiznerGLWorkerCompositor::CachedFramebuffer * 7208d63e7fde00f5830480cd2225954f70e6b681d8bZach ReiznerGLWorkerCompositor::FindCachedFramebuffer( 7218d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner const sp<GraphicBuffer> &framebuffer) { 7228d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner for (auto &fb : cached_framebuffers_) 7238d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (fb.weak_framebuffer == framebuffer) 7248d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return &fb; 7258d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return NULL; 7268d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner} 7278d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7288d63e7fde00f5830480cd2225954f70e6b681d8bZach ReiznerGLWorkerCompositor::CachedFramebuffer * 7298d63e7fde00f5830480cd2225954f70e6b681d8bZach ReiznerGLWorkerCompositor::PrepareAndCacheFramebuffer( 7308d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner const sp<GraphicBuffer> &framebuffer) { 7318d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner CachedFramebuffer *cached_framebuffer = FindCachedFramebuffer(framebuffer); 7328d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (cached_framebuffer != NULL) { 7338d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (cached_framebuffer->Promote()) { 7348d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glBindFramebuffer(GL_FRAMEBUFFER, cached_framebuffer->gl_fb.get()); 7358d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return cached_framebuffer; 7368d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7378d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7388d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner for (auto it = cached_framebuffers_.begin(); 7398d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner it != cached_framebuffers_.end(); ++it) { 7408d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (it->weak_framebuffer == framebuffer) { 7418d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner cached_framebuffers_.erase(it); 7428d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner break; 7438d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7448d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7458d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7468d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7478d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner AutoEGLDisplayImage egl_fb_image( 7488d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner egl_display_, 7498d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner eglCreateImageKHR(egl_display_, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, 7508d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner (EGLClientBuffer)framebuffer->getNativeBuffer(), 7518d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner NULL /* no attribs */)); 7528d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7538d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (egl_fb_image.image() == EGL_NO_IMAGE_KHR) { 7548d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner ALOGE("Failed to make image from target buffer: %s", GetEGLError()); 7558d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return NULL; 7568d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7578d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7588d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner GLuint gl_fb_tex; 7598d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glGenTextures(1, &gl_fb_tex); 7608d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner AutoGLTexture gl_fb_tex_auto(gl_fb_tex); 7618d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glBindTexture(GL_TEXTURE_2D, gl_fb_tex); 7628d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, 7638d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner (GLeglImageOES)egl_fb_image.image()); 7648d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glBindTexture(GL_TEXTURE_2D, 0); 7658d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7668d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner GLuint gl_fb; 7678d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glGenFramebuffers(1, &gl_fb); 7688d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner AutoGLFramebuffer gl_fb_auto(gl_fb); 7698d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glBindFramebuffer(GL_FRAMEBUFFER, gl_fb); 7708d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 7718d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner gl_fb_tex, 0); 7728d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7738d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 7748d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner ALOGE("Failed framebuffer check for created target buffer: %s", 7758d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner GetGLFramebufferError()); 7768d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return NULL; 7778d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner } 7788d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner 7798d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner cached_framebuffers_.emplace_back(framebuffer, std::move(egl_fb_image), 7808d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner std::move(gl_fb_tex_auto), 7818d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner std::move(gl_fb_auto)); 7828d63e7fde00f5830480cd2225954f70e6b681d8bZach Reizner return &cached_framebuffers_.back(); 783713a6788528d4cc4cd477b2f546c8b922beb6ddeZach Reizner} 784713a6788528d4cc4cd477b2f546c8b922beb6ddeZach Reizner 785d68353163dc72d2282c564379785dfca47b6df65Zach ReiznerGLint GLWorkerCompositor::PrepareAndCacheProgram(unsigned texture_count) { 786d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (blend_programs_.size() >= texture_count) { 787d68353163dc72d2282c564379785dfca47b6df65Zach Reizner GLint program = blend_programs_[texture_count - 1].get(); 788d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (program != 0) 789d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return program; 790d68353163dc72d2282c564379785dfca47b6df65Zach Reizner } 791d68353163dc72d2282c564379785dfca47b6df65Zach Reizner 792d68353163dc72d2282c564379785dfca47b6df65Zach Reizner AutoGLProgram program = GenerateProgram(texture_count, NULL); 793d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (program.get() != 0) { 794d68353163dc72d2282c564379785dfca47b6df65Zach Reizner if (blend_programs_.size() < texture_count) 795d68353163dc72d2282c564379785dfca47b6df65Zach Reizner blend_programs_.resize(texture_count); 796d68353163dc72d2282c564379785dfca47b6df65Zach Reizner blend_programs_[texture_count - 1] = std::move(program); 797d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return blend_programs_[texture_count - 1].get(); 798d68353163dc72d2282c564379785dfca47b6df65Zach Reizner } 799d68353163dc72d2282c564379785dfca47b6df65Zach Reizner 800d68353163dc72d2282c564379785dfca47b6df65Zach Reizner return 0; 801d68353163dc72d2282c564379785dfca47b6df65Zach Reizner} 802d68353163dc72d2282c564379785dfca47b6df65Zach Reizner 8036cbe883275ec58139ea13fef69628f233822808eZach Reizner} // namespace android 804