@@ -65,24 +65,23 @@ static std::string GenerateVertexShader(int layer_count) {
6565 << " #define LAYER_COUNT " << layer_count << " \n "
6666 << " precision mediump int;\n "
6767 << " uniform vec4 uViewport;\n "
68- << " uniform vec4 uLayerCrop[LAYER_COUNT] ;\n "
69- << " uniform mat2 uTexMatrix[LAYER_COUNT] ;\n "
68+ << " uniform vec4 uLayerCrop;\n "
69+ << " uniform mat2 uTexMatrix;\n "
7070 << " in vec2 vPosition;\n "
7171 << " in vec2 vTexCoords;\n "
72- << " out vec2 fTexCoords[LAYER_COUNT] ;\n "
72+ << " out vec2 fTexCoords;\n "
7373 << " void main() {\n "
74- << " for (int i = 0; i < LAYER_COUNT; i++) {\n "
75- << " vec2 tempCoords = vTexCoords * uTexMatrix[i];\n "
76- << " fTexCoords[i] =\n "
77- << " uLayerCrop[i].xy + tempCoords * uLayerCrop[i].zw;\n "
78- << " }\n "
74+ << " vec2 tempCoords = vTexCoords * uTexMatrix;\n "
75+ << " fTexCoords =\n "
76+ << " uLayerCrop.xy + tempCoords * uLayerCrop.zw;\n "
7977 << " vec2 scaledPosition = uViewport.xy + vPosition * uViewport.zw;\n "
8078 << " gl_Position =\n "
8179 << " vec4(scaledPosition * vec2(2.0) - vec2(1.0), 0.0, 1.0);\n "
8280 << " }\n " ;
8381 return vertex_shader_stream.str ();
8482}
8583
84+ #if 0
8685static std::string GenerateFragmentShader(int layer_count) {
8786 std::ostringstream fragment_shader_stream;
8887 fragment_shader_stream << "#version 300 es\n"
@@ -99,7 +98,7 @@ static std::string GenerateFragmentShader(int layer_count) {
9998 << "in vec2 fTexCoords[LAYER_COUNT];\n"
10099 << "out vec4 oFragColor;\n"
101100 << "void main() {\n"
102- << " vec3 color = vec3(0.0, 0.0, 0.0) ;\n "
101+ << " vec3 color = gl_LastFragData[0].rgb ;\n"
103102 << " float alphaCover = 1.0;\n"
104103 << " vec4 texSample;\n"
105104 << " vec3 multRgb;\n"
@@ -132,6 +131,43 @@ static std::string GenerateFragmentShader(int layer_count) {
132131 return fragment_shader_stream.str();
133132}
134133
134+ #else
135+ static std::string GenerateFragmentShader (int layer_count) {
136+ std::ostringstream fragment_shader_stream;
137+ fragment_shader_stream
138+ << " #version 300 es\n "
139+ << " #define LAYER_COUNT " << 1 << " \n "
140+ << " #extension GL_OES_EGL_image_external : require\n "
141+ << " #extension GL_EXT_shader_framebuffer_fetch : require\n "
142+ << " precision mediump float;\n " ;
143+ fragment_shader_stream << " uniform samplerExternalOES uLayerTexture;\n " ;
144+
145+ fragment_shader_stream << " uniform float uLayerAlpha;\n "
146+ << " uniform float uLayerPremult;\n "
147+ << " uniform vec4 uLayerColor;\n "
148+ << " in vec2 fTexCoords;\n "
149+ << " inout vec4 oFragColor;\n "
150+ << " void main() {\n "
151+ << " vec3 color = oFragColor.rgb;\n "
152+ << " float alphaCover = 1.0 - oFragColor.a;\n "
153+ << " vec4 texSample;\n "
154+ << " vec3 multRgb;\n "
155+ << " float tempAlpha;\n "
156+ << " if (alphaCover > 0.5/255.0) { \n " ;
157+ // clang-format off
158+ fragment_shader_stream << " texSample = texture2D(uLayerTexture, fTexCoords); \n "
159+ << " texSample.rgb = texSample.rgb + uLayerColor.rgb; \n "
160+ << " tempAlpha = min(texSample.a, uLayerColor.a); \n "
161+ << " multRgb = texSample.rgb *max(tempAlpha, uLayerPremult); \n "
162+ << " color += multRgb * uLayerAlpha * alphaCover; \n "
163+ << " alphaCover *= (1.0 - texSample.a - uLayerAlpha);\n "
164+ << " oFragColor = vec4(color, 1.0 - alphaCover);\n "
165+ << " }}\n " ;
166+ return fragment_shader_stream.str ();
167+ }
168+ #endif
169+
170+
135171#if defined(LOAD_PREBUILT_SHADER_FILE) || defined(USE_PREBUILT_SHADER_BIN_ARRAY)
136172static GLint LoadPreBuiltBinary (GLint gl_program, void *binary, long size) {
137173 GLint status;
@@ -311,7 +347,7 @@ GLProgram::~GLProgram() {
311347
312348bool GLProgram::Init (unsigned texture_count) {
313349 std::ostringstream shader_log;
314- program_ = GenerateProgram (texture_count , &shader_log);
350+ program_ = GenerateProgram (1 , &shader_log);
315351 if (!program_) {
316352 ETRACE (" %s" , shader_log.str ().c_str ());
317353 return false ;
@@ -331,13 +367,13 @@ void GLProgram::UseProgram(const RenderState &state, GLuint viewport_width,
331367 premult_loc_ = glGetUniformLocation (program_, " uLayerPremult" );
332368 tex_matrix_loc_ = glGetUniformLocation (program_, " uTexMatrix" );
333369 solid_color_loc_ = glGetUniformLocation (program_, " uLayerColor" );
334- for (unsigned src_index = 0 ; src_index < size; src_index++) {
335- std::ostringstream texture_name_formatter;
336- texture_name_formatter << " uLayerTexture" << src_index ;
337- GLuint tex_loc =
370+ // for (unsigned src_index = 0; src_index < size; src_index++) {
371+ std::ostringstream texture_name_formatter;
372+ texture_name_formatter << " uLayerTexture" ;
373+ GLuint tex_loc =
338374 glGetUniformLocation (program_, texture_name_formatter.str ().c_str ());
339- glUniform1i (tex_loc, src_index );
340- }
375+ glUniform1i (tex_loc, 0 );
376+ // }
341377
342378 initialized_ = true ;
343379 }
@@ -347,22 +383,22 @@ void GLProgram::UseProgram(const RenderState &state, GLuint viewport_width,
347383 (state.width_ ) / (float )viewport_width,
348384 (state.height_ ) / (float )viewport_height);
349385
350- for (unsigned src_index = 0 ; src_index < size; src_index++) {
351- const RenderState::LayerState &src = state.layer_state_ [src_index ];
352- glUniform1f (alpha_loc_ + src_index , src.alpha_ );
353- glUniform1f (premult_loc_ + src_index , src.premult_ );
354- glUniform4f (crop_loc_ + src_index , src.crop_bounds_ [0 ], src.crop_bounds_ [1 ],
386+ // for (unsigned src_index = 0; src_index < size; src_index++) {
387+ const RenderState::LayerState &src = state.layer_state_ [0 ];
388+ glUniform1f (alpha_loc_, src.alpha_ );
389+ glUniform1f (premult_loc_, src.premult_ );
390+ glUniform4f (crop_loc_, src.crop_bounds_ [0 ], src.crop_bounds_ [1 ],
355391 src.crop_bounds_ [2 ] - src.crop_bounds_ [0 ],
356392 src.crop_bounds_ [3 ] - src.crop_bounds_ [1 ]);
357- glUniformMatrix2fv (tex_matrix_loc_ + src_index , 1 , GL_FALSE,
393+ glUniformMatrix2fv (tex_matrix_loc_, 1 , GL_FALSE,
358394 src.texture_matrix_ );
359- glActiveTexture (GL_TEXTURE0 + src_index );
395+ glActiveTexture (GL_TEXTURE0);
360396 glBindTexture (GL_TEXTURE_EXTERNAL_OES, src.handle_ );
361- glUniform4f (solid_color_loc_ + src_index , (float )src.solid_color_array_ [3 ],
397+ glUniform4f (solid_color_loc_, (float )src.solid_color_array_ [3 ],
362398 (float )src.solid_color_array_ [2 ],
363399 (float )src.solid_color_array_ [1 ],
364400 (float )src.solid_color_array_ [0 ]);
365- }
401+ // }
366402}
367403
368404} // namespace hwcomposer
0 commit comments