Skip to content
This repository was archived by the owner on Oct 8, 2024. It is now read-only.

Commit 936d086

Browse files
committed
A experiment to swtich to SF composition
Change-Id: I5f76c30116bc9fd8695a3ce6882302a4dabc3fd2 Signed-off-by: Lin Johnson <[email protected]>
1 parent e9ecf2d commit 936d086

File tree

4 files changed

+78
-27
lines changed

4 files changed

+78
-27
lines changed

common/compositor/compositor.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,19 @@ void Compositor::SeparateLayers(const std::vector<size_t> &dedicated_layers,
316316
const HwcRect<int> &damage_region,
317317
std::vector<CompositionRegion> &comp_regions) {
318318
CTRACE();
319+
320+
#if 1
321+
// we just need to return layers with damage region into com_regions
322+
size_t layer_index = 0;
323+
for (auto &frame : display_frame) {
324+
CompositionRegion comp;
325+
comp.frame = frame;
326+
comp.source_layers.emplace_back(layer_index);
327+
comp_regions.emplace_back(comp);
328+
layer_index++;
329+
}
330+
#else
331+
319332
if (source_layers.size() > 64) {
320333
ETRACE("Failed to separate layers because there are more than 64");
321334
return;
@@ -381,6 +394,7 @@ void Compositor::SeparateLayers(const std::vector<size_t> &dedicated_layers,
381394
region.rect, SetBitsToVector(region.id_set.getBits() >> layer_offset,
382395
source_layers)});
383396
}
397+
#endif
384398
}
385399

386400
} // namespace hwcomposer

common/compositor/gl/glprogram.cpp

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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
8685
static 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)
136172
static GLint LoadPreBuiltBinary(GLint gl_program, void *binary, long size) {
137173
GLint status;
@@ -311,7 +347,7 @@ GLProgram::~GLProgram() {
311347

312348
bool 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

common/compositor/gl/glrenderer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ bool GLRenderer::Draw(const std::vector<RenderState> &render_states,
105105
surface->SetClearSurface(NativeSurface::kNone);
106106

107107
glViewport(left, top, frame_width, frame_height);
108+
glClearColor(0.0, 0.0, 0.0, 1.0);
108109

109110
if (clear_surface || partial_clear) {
110111
const HwcRect<int> &damage = surface->GetSurfaceDamage();
@@ -137,7 +138,7 @@ bool GLRenderer::Draw(const std::vector<RenderState> &render_states,
137138
#endif
138139
for (const RenderState &state : render_states) {
139140
unsigned size = state.layer_state_.size();
140-
GLProgram *program = GetProgram(size);
141+
GLProgram *program = GetProgram(1);
141142
if (!program)
142143
continue;
143144

common/core/overlaylayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ struct OverlayLayer {
116116
}
117117

118118
const HwcRect<int>& GetSurfaceDamage() const {
119-
return surface_damage_;
119+
return display_frame_;
120120
}
121121

122122
HwcRect<int>& GetSurfaceDamage() {

0 commit comments

Comments
 (0)