OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/output/shader.h" | 5 #include "cc/output/shader.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <vector> | 10 #include <vector> |
(...skipping 12 matching lines...) Expand all Loading... |
23 "String passed to StripLambda must be at least 8 characters"); | 23 "String passed to StripLambda must be at least 8 characters"); |
24 DCHECK_EQ(strncmp("[]() {", shader, 6), 0); | 24 DCHECK_EQ(strncmp("[]() {", shader, 6), 0); |
25 DCHECK_EQ(shader[size - 2], '}'); | 25 DCHECK_EQ(shader[size - 2], '}'); |
26 return std::string(shader + 6, shader + size - 2); | 26 return std::string(shader + 6, shader + size - 2); |
27 } | 27 } |
28 | 28 |
29 // Shaders are passed in with lambda syntax, which tricks clang-format into | 29 // Shaders are passed in with lambda syntax, which tricks clang-format into |
30 // handling them correctly. StipLambda removes this. | 30 // handling them correctly. StipLambda removes this. |
31 #define SHADER0(Src) StripLambda(#Src) | 31 #define SHADER0(Src) StripLambda(#Src) |
32 | 32 |
| 33 #define HDR(x) \ |
| 34 do { \ |
| 35 header += x + std::string("\n"); \ |
| 36 } while (0) |
| 37 #define SRC(x) \ |
| 38 do { \ |
| 39 source += std::string(" ") + x + std::string("\n"); \ |
| 40 } while (0) |
| 41 |
33 using gpu::gles2::GLES2Interface; | 42 using gpu::gles2::GLES2Interface; |
34 | 43 |
35 namespace cc { | 44 namespace cc { |
36 | 45 |
37 namespace { | 46 namespace { |
38 | 47 |
39 static void GetProgramUniformLocations(GLES2Interface* context, | 48 static void GetProgramUniformLocations(GLES2Interface* context, |
40 unsigned program, | 49 unsigned program, |
41 size_t count, | 50 size_t count, |
42 const char** uniforms, | 51 const char** uniforms, |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 } | 170 } |
162 | 171 |
163 VertexShaderBase::VertexShaderBase() {} | 172 VertexShaderBase::VertexShaderBase() {} |
164 | 173 |
165 void VertexShaderBase::Init(GLES2Interface* context, | 174 void VertexShaderBase::Init(GLES2Interface* context, |
166 unsigned program, | 175 unsigned program, |
167 int* base_uniform_index) { | 176 int* base_uniform_index) { |
168 std::vector<const char*> uniforms; | 177 std::vector<const char*> uniforms; |
169 std::vector<int> locations; | 178 std::vector<int> locations; |
170 | 179 |
171 if (has_tex_transform_) | 180 switch (tex_coord_transform_) { |
172 uniforms.push_back("texTransform"); | 181 case TEX_COORD_TRANSFORM_NONE: |
173 if (has_vertex_tex_transform_) | 182 break; |
174 uniforms.push_back("vertexTexTransform"); | 183 case TEX_COORD_TRANSFORM_VEC4: |
175 if (has_tex_matrix_) | 184 case TEX_COORD_TRANSFORM_TRANSLATED_VEC4: |
176 uniforms.push_back("texMatrix"); | 185 uniforms.push_back("vertexTexTransform"); |
177 if (has_ya_uv_tex_scale_offset_) { | 186 break; |
| 187 case TEX_COORD_TRANSFORM_MATRIX: |
| 188 uniforms.push_back("texMatrix"); |
| 189 break; |
| 190 } |
| 191 if (is_ya_uv_) { |
178 uniforms.push_back("yaTexScale"); | 192 uniforms.push_back("yaTexScale"); |
179 uniforms.push_back("yaTexOffset"); | 193 uniforms.push_back("yaTexOffset"); |
180 uniforms.push_back("uvTexScale"); | 194 uniforms.push_back("uvTexScale"); |
181 uniforms.push_back("uvTexOffset"); | 195 uniforms.push_back("uvTexOffset"); |
182 } | 196 } |
183 if (has_matrix_) | 197 if (has_matrix_) |
184 uniforms.push_back("matrix"); | 198 uniforms.push_back("matrix"); |
185 if (has_vertex_opacity_) | 199 if (has_vertex_opacity_) |
186 uniforms.push_back("opacity"); | 200 uniforms.push_back("opacity"); |
187 if (has_aa_) { | 201 if (has_aa_) { |
188 uniforms.push_back("viewport"); | 202 uniforms.push_back("viewport"); |
189 uniforms.push_back("edge"); | 203 uniforms.push_back("edge"); |
190 } | 204 } |
191 if (has_quad_) | 205 if (position_source_ == POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM) |
192 uniforms.push_back("quad"); | 206 uniforms.push_back("quad"); |
193 | 207 |
194 locations.resize(uniforms.size()); | 208 locations.resize(uniforms.size()); |
195 | 209 |
196 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), | 210 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(), |
197 locations.data(), base_uniform_index); | 211 locations.data(), base_uniform_index); |
198 | 212 |
199 size_t index = 0; | 213 size_t index = 0; |
200 if (has_tex_transform_) | 214 switch (tex_coord_transform_) { |
201 tex_transform_location_ = locations[index++]; | 215 case TEX_COORD_TRANSFORM_NONE: |
202 if (has_vertex_tex_transform_) | 216 break; |
203 vertex_tex_transform_location_ = locations[index++]; | 217 case TEX_COORD_TRANSFORM_VEC4: |
204 if (has_tex_matrix_) | 218 case TEX_COORD_TRANSFORM_TRANSLATED_VEC4: |
205 tex_matrix_location_ = locations[index++]; | 219 vertex_tex_transform_location_ = locations[index++]; |
206 if (has_ya_uv_tex_scale_offset_) { | 220 break; |
| 221 case TEX_COORD_TRANSFORM_MATRIX: |
| 222 tex_matrix_location_ = locations[index++]; |
| 223 break; |
| 224 } |
| 225 if (is_ya_uv_) { |
207 ya_tex_scale_location_ = locations[index++]; | 226 ya_tex_scale_location_ = locations[index++]; |
208 ya_tex_offset_location_ = locations[index++]; | 227 ya_tex_offset_location_ = locations[index++]; |
209 uv_tex_scale_location_ = locations[index++]; | 228 uv_tex_scale_location_ = locations[index++]; |
210 uv_tex_offset_location_ = locations[index++]; | 229 uv_tex_offset_location_ = locations[index++]; |
211 } | 230 } |
212 if (has_matrix_) | 231 if (has_matrix_) |
213 matrix_location_ = locations[index++]; | 232 matrix_location_ = locations[index++]; |
214 if (has_vertex_opacity_) | 233 if (has_vertex_opacity_) |
215 vertex_opacity_location_ = locations[index++]; | 234 vertex_opacity_location_ = locations[index++]; |
216 if (has_aa_) { | 235 if (has_aa_) { |
217 viewport_location_ = locations[index++]; | 236 viewport_location_ = locations[index++]; |
218 edge_location_ = locations[index++]; | 237 edge_location_ = locations[index++]; |
219 } | 238 } |
220 if (has_quad_) | 239 if (position_source_ == POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM) |
221 quad_location_ = locations[index++]; | 240 quad_location_ = locations[index++]; |
222 } | 241 } |
223 | 242 |
224 void VertexShaderBase::FillLocations(ShaderLocations* locations) const { | 243 void VertexShaderBase::FillLocations(ShaderLocations* locations) const { |
225 locations->quad = quad_location(); | 244 locations->quad = quad_location(); |
226 locations->edge = edge_location(); | 245 locations->edge = edge_location(); |
227 locations->viewport = viewport_location(); | 246 locations->viewport = viewport_location(); |
228 locations->matrix = matrix_location(); | 247 locations->matrix = matrix_location(); |
229 locations->tex_transform = tex_transform_location(); | 248 locations->vertex_tex_transform = vertex_tex_transform_location(); |
230 } | 249 } |
231 | 250 |
232 std::string VertexShaderBase::GetShaderString() const { | 251 std::string VertexShaderBase::GetShaderString() const { |
233 // We unconditionally use highp in the vertex shader since | 252 // We unconditionally use highp in the vertex shader since |
234 // we are unlikely to be vertex shader bound when drawing large quads. | 253 // we are unlikely to be vertex shader bound when drawing large quads. |
235 // Also, some vertex shaders mutate the texture coordinate in such a | 254 // Also, some vertex shaders mutate the texture coordinate in such a |
236 // way that the effective precision might be lower than expected. | 255 // way that the effective precision might be lower than expected. |
237 return base::StringPrintf( | 256 std::string header = "#define TexCoordPrecision highp\n"; |
238 "#define TexCoordPrecision highp\n" | 257 std::string source = "void main() {\n"; |
239 "#define NUM_STATIC_QUADS %d\n", | 258 |
240 StaticGeometryBinding::NUM_QUADS) + | 259 // Define the size of quads for attribute indexed uniform arrays. |
241 GetShaderSource(); | 260 if (use_uniform_arrays_) { |
| 261 header += base::StringPrintf("#define NUM_QUADS %d\n", |
| 262 StaticGeometryBinding::NUM_QUADS); |
| 263 } |
| 264 |
| 265 // Read the index variables. |
| 266 if (use_uniform_arrays_ || |
| 267 position_source_ == POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM) { |
| 268 HDR("attribute float a_index;"); |
| 269 SRC("// Compute indices for uniform arrays."); |
| 270 SRC("int vertex_index = int(a_index);"); |
| 271 if (use_uniform_arrays_) |
| 272 SRC("int quad_index = int(a_index * 0.25);"); |
| 273 SRC(""); |
| 274 } |
| 275 |
| 276 // Read the position and compute gl_Position. |
| 277 HDR("attribute TexCoordPrecision vec4 a_position;"); |
| 278 SRC("// Compute the position."); |
| 279 switch (position_source_) { |
| 280 case POSITION_SOURCE_ATTRIBUTE: |
| 281 SRC("vec4 pos = a_position;"); |
| 282 break; |
| 283 case POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM: |
| 284 HDR("uniform TexCoordPrecision vec2 quad[4];"); |
| 285 SRC("vec4 pos = vec4(quad[vertex_index], a_position.z, a_position.w);"); |
| 286 break; |
| 287 } |
| 288 if (has_matrix_) { |
| 289 if (use_uniform_arrays_) { |
| 290 HDR("uniform mat4 matrix[NUM_QUADS];"); |
| 291 SRC("gl_Position = matrix[quad_index] * pos;"); |
| 292 } else { |
| 293 HDR("uniform mat4 matrix;"); |
| 294 SRC("gl_Position = matrix * pos;"); |
| 295 } |
| 296 } else { |
| 297 SRC("gl_Position = pos;"); |
| 298 } |
| 299 |
| 300 // Compute the anti-aliasing edge distances. |
| 301 if (has_aa_) { |
| 302 HDR("uniform TexCoordPrecision vec3 edge[8];"); |
| 303 HDR("uniform vec4 viewport;"); |
| 304 HDR("varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances."); |
| 305 SRC("// Compute anti-aliasing properties.\n"); |
| 306 SRC("vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w);"); |
| 307 SRC("vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0);"); |
| 308 SRC("edge_dist[0] = vec4(dot(edge[0], screen_pos),"); |
| 309 SRC(" dot(edge[1], screen_pos),"); |
| 310 SRC(" dot(edge[2], screen_pos),"); |
| 311 SRC(" dot(edge[3], screen_pos)) * gl_Position.w;"); |
| 312 SRC("edge_dist[1] = vec4(dot(edge[4], screen_pos),"); |
| 313 SRC(" dot(edge[5], screen_pos),"); |
| 314 SRC(" dot(edge[6], screen_pos),"); |
| 315 SRC(" dot(edge[7], screen_pos)) * gl_Position.w;"); |
| 316 } |
| 317 |
| 318 // Read, transform, and write texture coordinates. |
| 319 if (tex_coord_source_ != TEX_COORD_SOURCE_NONE) { |
| 320 if (is_ya_uv_) { |
| 321 HDR("varying TexCoordPrecision vec2 v_uvTexCoord;"); |
| 322 HDR("varying TexCoordPrecision vec2 v_yaTexCoord;"); |
| 323 } else { |
| 324 HDR("varying TexCoordPrecision vec2 v_texCoord;"); |
| 325 } |
| 326 |
| 327 SRC("// Compute texture coordinates."); |
| 328 // Read coordinates. |
| 329 switch (tex_coord_source_) { |
| 330 case TEX_COORD_SOURCE_NONE: |
| 331 break; |
| 332 case TEX_COORD_SOURCE_POSITION: |
| 333 SRC("vec2 texCoord = pos.xy;"); |
| 334 break; |
| 335 case TEX_COORD_SOURCE_ATTRIBUTE: |
| 336 HDR("attribute TexCoordPrecision vec2 a_texCoord;"); |
| 337 SRC("vec2 texCoord = a_texCoord;"); |
| 338 break; |
| 339 } |
| 340 // Transform coordinates (except YUV). |
| 341 switch (tex_coord_transform_) { |
| 342 case TEX_COORD_TRANSFORM_NONE: |
| 343 break; |
| 344 case TEX_COORD_TRANSFORM_TRANSLATED_VEC4: |
| 345 SRC("texCoord = texCoord + vec2(0.5);"); |
| 346 // Fall through... |
| 347 case TEX_COORD_TRANSFORM_VEC4: |
| 348 if (use_uniform_arrays_) { |
| 349 HDR("uniform TexCoordPrecision vec4 vertexTexTransform[NUM_QUADS];"); |
| 350 SRC("TexCoordPrecision vec4 texTrans ="); |
| 351 SRC(" vertexTexTransform[quad_index];"); |
| 352 SRC("texCoord = texCoord * texTrans.zw + texTrans.xy;"); |
| 353 } else { |
| 354 HDR("uniform TexCoordPrecision vec4 vertexTexTransform;"); |
| 355 SRC("texCoord = texCoord * vertexTexTransform.zw +"); |
| 356 SRC(" vertexTexTransform.xy;"); |
| 357 } |
| 358 break; |
| 359 case TEX_COORD_TRANSFORM_MATRIX: |
| 360 HDR("uniform TexCoordPrecision mat4 texMatrix;"); |
| 361 SRC("texCoord = (texMatrix * vec4(texCoord.xy, 0.0, 1.0)).xy;"); |
| 362 break; |
| 363 } |
| 364 // Write the output texture coordinates. |
| 365 if (is_ya_uv_) { |
| 366 HDR("uniform TexCoordPrecision vec2 uvTexOffset;"); |
| 367 HDR("uniform TexCoordPrecision vec2 uvTexScale;"); |
| 368 HDR("uniform TexCoordPrecision vec2 yaTexOffset;"); |
| 369 HDR("uniform TexCoordPrecision vec2 yaTexScale;"); |
| 370 SRC("v_yaTexCoord = texCoord * yaTexScale + yaTexOffset;"); |
| 371 SRC("v_uvTexCoord = texCoord * uvTexScale + uvTexOffset;"); |
| 372 } else { |
| 373 SRC("v_texCoord = texCoord;"); |
| 374 } |
| 375 } |
| 376 |
| 377 // Write varying vertex opacity. |
| 378 if (has_vertex_opacity_) { |
| 379 DCHECK(use_uniform_arrays_); |
| 380 HDR("uniform float opacity[NUM_QUADS * 4];"); |
| 381 HDR("varying float v_alpha;"); |
| 382 SRC("v_alpha = opacity[quad_index];"); |
| 383 } |
| 384 |
| 385 // Add cargo-culted dummy variables for Android. |
| 386 if (has_dummy_variables_) { |
| 387 HDR("uniform TexCoordPrecision vec2 dummy_uniform;"); |
| 388 HDR("varying TexCoordPrecision vec2 dummy_varying;"); |
| 389 SRC("dummy_varying = dummy_uniform;"); |
| 390 } |
| 391 |
| 392 source += "}\n"; |
| 393 return header + source; |
242 } | 394 } |
243 | 395 |
244 std::string VertexShaderPosTex::GetShaderSource() const { | |
245 return SHADER0([]() { | |
246 attribute vec4 a_position; | |
247 attribute TexCoordPrecision vec2 a_texCoord; | |
248 uniform mat4 matrix; | |
249 varying TexCoordPrecision vec2 v_texCoord; | |
250 void main() { | |
251 gl_Position = matrix * a_position; | |
252 v_texCoord = a_texCoord; | |
253 } | |
254 }); | |
255 } | |
256 | |
257 std::string VertexShaderPosTexYUVStretchOffset::GetShaderSource() const { | |
258 return SHADER0([]() { | |
259 precision mediump float; | |
260 attribute vec4 a_position; | |
261 attribute TexCoordPrecision vec2 a_texCoord; | |
262 uniform mat4 matrix; | |
263 varying TexCoordPrecision vec2 v_yaTexCoord; | |
264 varying TexCoordPrecision vec2 v_uvTexCoord; | |
265 uniform TexCoordPrecision vec2 yaTexScale; | |
266 uniform TexCoordPrecision vec2 yaTexOffset; | |
267 uniform TexCoordPrecision vec2 uvTexScale; | |
268 uniform TexCoordPrecision vec2 uvTexOffset; | |
269 void main() { | |
270 gl_Position = matrix * a_position; | |
271 v_yaTexCoord = a_texCoord * yaTexScale + yaTexOffset; | |
272 v_uvTexCoord = a_texCoord * uvTexScale + uvTexOffset; | |
273 } | |
274 }); | |
275 } | |
276 | |
277 std::string VertexShaderPos::GetShaderSource() const { | |
278 return SHADER0([]() { | |
279 attribute vec4 a_position; | |
280 uniform mat4 matrix; | |
281 void main() { gl_Position = matrix * a_position; } | |
282 }); | |
283 } | |
284 | |
285 std::string VertexShaderPosTexTransform::GetShaderSource() const { | |
286 return SHADER0([]() { | |
287 attribute vec4 a_position; | |
288 attribute TexCoordPrecision vec2 a_texCoord; | |
289 attribute float a_index; | |
290 uniform mat4 matrix[NUM_STATIC_QUADS]; | |
291 uniform TexCoordPrecision vec4 texTransform[NUM_STATIC_QUADS]; | |
292 uniform float opacity[NUM_STATIC_QUADS * 4]; | |
293 varying TexCoordPrecision vec2 v_texCoord; | |
294 varying float v_alpha; | |
295 void main() { | |
296 int quad_index = int(a_index * 0.25); // NOLINT | |
297 gl_Position = matrix[quad_index] * a_position; | |
298 TexCoordPrecision vec4 texTrans = texTransform[quad_index]; | |
299 v_texCoord = a_texCoord * texTrans.zw + texTrans.xy; | |
300 v_alpha = opacity[int(a_index)]; // NOLINT | |
301 } | |
302 }); | |
303 } | |
304 | |
305 std::string VertexShaderPosTexIdentity::GetShaderSource() const { | |
306 return SHADER0([]() { | |
307 attribute vec4 a_position; | |
308 varying TexCoordPrecision vec2 v_texCoord; | |
309 void main() { | |
310 gl_Position = a_position; | |
311 v_texCoord = (a_position.xy + vec2(1.0)) * 0.5; | |
312 } | |
313 }); | |
314 } | |
315 | |
316 std::string VertexShaderQuad::GetShaderSource() const { | |
317 #if defined(OS_ANDROID) | |
318 // TODO(epenner): Find the cause of this 'quad' uniform | |
319 // being missing if we don't add dummy variables. | |
320 // http://crbug.com/240602 | |
321 return SHADER0([]() { | |
322 attribute TexCoordPrecision vec4 a_position; | |
323 attribute float a_index; | |
324 uniform mat4 matrix; | |
325 uniform TexCoordPrecision vec2 quad[4]; | |
326 uniform TexCoordPrecision vec2 dummy_uniform; | |
327 varying TexCoordPrecision vec2 dummy_varying; | |
328 void main() { | |
329 vec2 pos = quad[int(a_index)]; // NOLINT | |
330 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); | |
331 dummy_varying = dummy_uniform; | |
332 } | |
333 }); | |
334 #else | |
335 return SHADER0([]() { | |
336 attribute TexCoordPrecision vec4 a_position; | |
337 attribute float a_index; | |
338 uniform mat4 matrix; | |
339 uniform TexCoordPrecision vec2 quad[4]; | |
340 void main() { | |
341 vec2 pos = quad[int(a_index)]; // NOLINT | |
342 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); | |
343 } | |
344 }); | |
345 #endif | |
346 } | |
347 | |
348 std::string VertexShaderQuadAA::GetShaderSource() const { | |
349 return SHADER0([]() { | |
350 attribute TexCoordPrecision vec4 a_position; | |
351 attribute float a_index; | |
352 uniform mat4 matrix; | |
353 uniform vec4 viewport; | |
354 uniform TexCoordPrecision vec2 quad[4]; | |
355 uniform TexCoordPrecision vec3 edge[8]; | |
356 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
357 void main() { | |
358 vec2 pos = quad[int(a_index)]; // NOLINT | |
359 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); | |
360 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w); | |
361 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0); | |
362 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos), | |
363 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) * | |
364 gl_Position.w; | |
365 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos), | |
366 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) * | |
367 gl_Position.w; | |
368 } | |
369 }); | |
370 } | |
371 | |
372 std::string VertexShaderQuadTexTransformAA::GetShaderSource() const { | |
373 return SHADER0([]() { | |
374 attribute TexCoordPrecision vec4 a_position; | |
375 attribute float a_index; | |
376 uniform mat4 matrix; | |
377 uniform vec4 viewport; | |
378 uniform TexCoordPrecision vec2 quad[4]; | |
379 uniform TexCoordPrecision vec3 edge[8]; | |
380 uniform TexCoordPrecision vec4 texTransform; | |
381 varying TexCoordPrecision vec2 v_texCoord; | |
382 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
383 void main() { | |
384 vec2 pos = quad[int(a_index)]; // NOLINT | |
385 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); | |
386 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w); | |
387 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0); | |
388 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos), | |
389 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) * | |
390 gl_Position.w; | |
391 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos), | |
392 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) * | |
393 gl_Position.w; | |
394 v_texCoord = (pos.xy + vec2(0.5)) * texTransform.zw + texTransform.xy; | |
395 } | |
396 }); | |
397 } | |
398 | |
399 std::string VertexShaderTile::GetShaderSource() const { | |
400 return SHADER0([]() { | |
401 attribute TexCoordPrecision vec4 a_position; | |
402 attribute TexCoordPrecision vec2 a_texCoord; | |
403 attribute float a_index; | |
404 uniform mat4 matrix; | |
405 uniform TexCoordPrecision vec2 quad[4]; | |
406 uniform TexCoordPrecision vec4 vertexTexTransform; | |
407 varying TexCoordPrecision vec2 v_texCoord; | |
408 void main() { | |
409 vec2 pos = quad[int(a_index)]; // NOLINT | |
410 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); | |
411 v_texCoord = a_texCoord * vertexTexTransform.zw + vertexTexTransform.xy; | |
412 } | |
413 }); | |
414 } | |
415 | |
416 std::string VertexShaderTileAA::GetShaderSource() const { | |
417 return SHADER0([]() { | |
418 attribute TexCoordPrecision vec4 a_position; | |
419 attribute float a_index; | |
420 uniform mat4 matrix; | |
421 uniform vec4 viewport; | |
422 uniform TexCoordPrecision vec2 quad[4]; | |
423 uniform TexCoordPrecision vec3 edge[8]; | |
424 uniform TexCoordPrecision vec4 vertexTexTransform; | |
425 varying TexCoordPrecision vec2 v_texCoord; | |
426 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. | |
427 void main() { | |
428 vec2 pos = quad[int(a_index)]; // NOLINT | |
429 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); | |
430 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w); | |
431 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0); | |
432 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos), | |
433 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) * | |
434 gl_Position.w; | |
435 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos), | |
436 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) * | |
437 gl_Position.w; | |
438 v_texCoord = pos.xy * vertexTexTransform.zw + vertexTexTransform.xy; | |
439 } | |
440 }); | |
441 } | |
442 | |
443 std::string VertexShaderVideoTransform::GetShaderSource() const { | |
444 return SHADER0([]() { | |
445 attribute vec4 a_position; | |
446 attribute TexCoordPrecision vec2 a_texCoord; | |
447 uniform mat4 matrix; | |
448 uniform TexCoordPrecision mat4 texMatrix; | |
449 varying TexCoordPrecision vec2 v_texCoord; | |
450 void main() { | |
451 gl_Position = matrix * a_position; | |
452 v_texCoord = (texMatrix * vec4(a_texCoord.xy, 0.0, 1.0)).xy; | |
453 } | |
454 }); | |
455 } | |
456 | |
457 #define BLEND_MODE_UNIFORMS "s_backdropTexture", \ | |
458 "s_originalBackdropTexture", \ | |
459 "backdropRect" | |
460 #define UNUSED_BLEND_MODE_UNIFORMS (!has_blend_mode() ? 3 : 0) | |
461 #define BLEND_MODE_SET_LOCATIONS(X, POS) \ | |
462 if (has_blend_mode()) { \ | |
463 DCHECK_LT(static_cast<size_t>(POS) + 2, arraysize(X)); \ | |
464 backdrop_location_ = locations[POS]; \ | |
465 original_backdrop_location_ = locations[POS + 1]; \ | |
466 backdrop_rect_location_ = locations[POS + 2]; \ | |
467 } | |
468 | |
469 FragmentShaderBase::FragmentShaderBase() {} | 396 FragmentShaderBase::FragmentShaderBase() {} |
470 | 397 |
471 std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision, | 398 std::string FragmentShaderBase::GetShaderString(TexCoordPrecision precision, |
472 SamplerType sampler) const { | 399 SamplerType sampler) const { |
473 // The AA shader values will use TexCoordPrecision. | 400 // The AA shader values will use TexCoordPrecision. |
474 if (has_aa_ && precision == TEX_COORD_PRECISION_NA) | 401 if (has_aa_ && precision == TEX_COORD_PRECISION_NA) |
475 precision = TEX_COORD_PRECISION_MEDIUM; | 402 precision = TEX_COORD_PRECISION_MEDIUM; |
476 return SetFragmentTexCoordPrecision( | 403 return SetFragmentTexCoordPrecision( |
477 precision, SetFragmentSamplerType( | 404 precision, SetFragmentSamplerType( |
478 sampler, SetBlendModeFunctions(GetShaderSource()))); | 405 sampler, SetBlendModeFunctions(GetShaderSource()))); |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 case BLEND_MODE_NONE: | 795 case BLEND_MODE_NONE: |
869 NOTREACHED(); | 796 NOTREACHED(); |
870 } | 797 } |
871 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; | 798 return "result = vec4(1.0, 0.0, 0.0, 1.0);"; |
872 } | 799 } |
873 | 800 |
874 std::string FragmentShaderBase::GetShaderSource() const { | 801 std::string FragmentShaderBase::GetShaderSource() const { |
875 std::string header = "precision mediump float;\n"; | 802 std::string header = "precision mediump float;\n"; |
876 std::string source = "void main() {\n"; | 803 std::string source = "void main() {\n"; |
877 | 804 |
878 #define HDR(x) \ | |
879 do { \ | |
880 header += x + std::string("\n"); \ | |
881 } while (0) | |
882 #define SRC(x) \ | |
883 do { \ | |
884 source += std::string(" ") + x + std::string("\n"); \ | |
885 } while (0) | |
886 | |
887 // Read the input into vec4 texColor. | 805 // Read the input into vec4 texColor. |
888 switch (input_color_type_) { | 806 switch (input_color_type_) { |
889 case INPUT_COLOR_SOURCE_RGBA_TEXTURE: | 807 case INPUT_COLOR_SOURCE_RGBA_TEXTURE: |
890 if (ignore_sampler_type_) | 808 if (ignore_sampler_type_) |
891 HDR("uniform sampler2D s_texture;"); | 809 HDR("uniform sampler2D s_texture;"); |
892 else | 810 else |
893 HDR("uniform SamplerType s_texture;"); | 811 HDR("uniform SamplerType s_texture;"); |
894 HDR("varying TexCoordPrecision vec2 v_texCoord;"); | 812 HDR("varying TexCoordPrecision vec2 v_texCoord;"); |
895 if (has_rgba_fragment_tex_transform_) { | 813 if (has_rgba_fragment_tex_transform_) { |
896 HDR("uniform TexCoordPrecision vec4 fragmentTexTransform;"); | 814 HDR("uniform TexCoordPrecision vec4 fragmentTexTransform;"); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1006 break; | 924 break; |
1007 case FRAG_COLOR_MODE_APPLY_BLEND_MODE: | 925 case FRAG_COLOR_MODE_APPLY_BLEND_MODE: |
1008 if (has_mask_sampler_) | 926 if (has_mask_sampler_) |
1009 SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);"); | 927 SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);"); |
1010 else | 928 else |
1011 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);"); | 929 SRC("gl_FragColor = ApplyBlendMode(texColor, 0.0);"); |
1012 break; | 930 break; |
1013 } | 931 } |
1014 source += "}\n"; | 932 source += "}\n"; |
1015 | 933 |
1016 #undef HDR | |
1017 #undef SRC | |
1018 | |
1019 return header + source; | 934 return header + source; |
1020 } | 935 } |
1021 | 936 |
1022 FragmentShaderYUVVideo::FragmentShaderYUVVideo() {} | 937 FragmentShaderYUVVideo::FragmentShaderYUVVideo() {} |
1023 | 938 |
1024 void FragmentShaderYUVVideo::SetFeatures(bool use_alpha_texture, | 939 void FragmentShaderYUVVideo::SetFeatures(bool use_alpha_texture, |
1025 bool use_nv12, | 940 bool use_nv12, |
1026 bool use_color_lut) { | 941 bool use_color_lut) { |
1027 use_alpha_texture_ = use_alpha_texture; | 942 use_alpha_texture_ = use_alpha_texture; |
1028 use_nv12_ = use_nv12; | 943 use_nv12_ = use_nv12; |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); | 1077 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); |
1163 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); | 1078 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); |
1164 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); | 1079 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); |
1165 } | 1080 } |
1166 }); | 1081 }); |
1167 | 1082 |
1168 return head + functions; | 1083 return head + functions; |
1169 } | 1084 } |
1170 | 1085 |
1171 } // namespace cc | 1086 } // namespace cc |
OLD | NEW |