Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: cc/output/shader.cc

Issue 2610803002: The great shader refactor: Prepare to merge all vertex shaders. (Closed)
Patch Set: Merge Init and FillLocations Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« cc/output/shader.h ('K') | « cc/output/shader.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 11 matching lines...) Expand all
22 static_assert(size >= 8, 22 static_assert(size >= 8,
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 #define VERTEX_SHADER(Head, Body) SetVertexShaderDefines(Head + Body)
33 32
34 using gpu::gles2::GLES2Interface; 33 using gpu::gles2::GLES2Interface;
35 34
36 namespace cc { 35 namespace cc {
37 36
38 namespace { 37 namespace {
39 38
40 static void GetProgramUniformLocations(GLES2Interface* context, 39 static void GetProgramUniformLocations(GLES2Interface* context,
41 unsigned program, 40 unsigned program,
42 size_t count, 41 size_t count,
(...skipping 26 matching lines...) Expand all
69 DCHECK_EQ(shader_string.find("texture2D"), std::string::npos); 68 DCHECK_EQ(shader_string.find("texture2D"), std::string::npos);
70 DCHECK_EQ(shader_string.find("texture2DRect"), std::string::npos); 69 DCHECK_EQ(shader_string.find("texture2DRect"), std::string::npos);
71 return shader_string; 70 return shader_string;
72 default: 71 default:
73 NOTREACHED(); 72 NOTREACHED();
74 break; 73 break;
75 } 74 }
76 return shader_string; 75 return shader_string;
77 } 76 }
78 77
79 static std::string SetVertexShaderDefines(const std::string& shader_string) {
80 // We unconditionally use highp in the vertex shader since
81 // we are unlikely to be vertex shader bound when drawing large quads.
82 // Also, some vertex shaders mutate the texture coordinate in such a
83 // way that the effective precision might be lower than expected.
84 return base::StringPrintf(
85 "#define TexCoordPrecision highp\n"
86 "#define NUM_STATIC_QUADS %d\n",
87 StaticGeometryBinding::NUM_QUADS) +
88 shader_string;
89 }
90
91 TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context, 78 TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context,
92 int* highp_threshold_cache, 79 int* highp_threshold_cache,
93 int highp_threshold_min, 80 int highp_threshold_min,
94 int x, 81 int x,
95 int y) { 82 int y) {
96 if (*highp_threshold_cache == 0) { 83 if (*highp_threshold_cache == 0) {
97 // Initialize range and precision with minimum spec values for when 84 // Initialize range and precision with minimum spec values for when
98 // GetShaderPrecisionFormat is a test stub. 85 // GetShaderPrecisionFormat is a test stub.
99 // TODO(brianderson): Implement better stubs of GetShaderPrecisionFormat 86 // TODO(brianderson): Implement better stubs of GetShaderPrecisionFormat
100 // everywhere. 87 // everywhere.
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 int* highp_threshold_cache, 153 int* highp_threshold_cache,
167 int highp_threshold_min, 154 int highp_threshold_min,
168 const gfx::Size& max_size) { 155 const gfx::Size& max_size) {
169 return TexCoordPrecisionRequired(context, 156 return TexCoordPrecisionRequired(context,
170 highp_threshold_cache, 157 highp_threshold_cache,
171 highp_threshold_min, 158 highp_threshold_min,
172 max_size.width(), 159 max_size.width(),
173 max_size.height()); 160 max_size.height());
174 } 161 }
175 162
176 VertexShaderPosTex::VertexShaderPosTex() : matrix_location_(-1) { 163 VertexShaderBase::VertexShaderBase() {}
164
165 void VertexShaderBase::Init(GLES2Interface* context,
166 unsigned program,
167 int* base_uniform_index) {
168 std::vector<const char*> uniforms;
169 std::vector<int> locations;
170
171 if (has_tex_transform_)
172 uniforms.push_back("texTransform");
173 if (has_vertex_tex_transform_)
174 uniforms.push_back("vertexTexTransform");
175 if (has_tex_matrix_)
176 uniforms.push_back("texMatrix");
177 if (has_ya_uv_tex_scale_offset_) {
178 uniforms.push_back("yaTexScale");
179 uniforms.push_back("yaTexOffset");
180 uniforms.push_back("uvTexScale");
181 uniforms.push_back("uvTexOffset");
182 }
183 if (has_matrix_)
184 uniforms.push_back("matrix");
185 if (has_vertex_opacity_)
186 uniforms.push_back("opacity");
187 if (has_aa_) {
188 uniforms.push_back("viewport");
189 uniforms.push_back("edge");
190 }
191 if (has_quad_)
192 uniforms.push_back("quad");
193
194 locations.resize(uniforms.size());
195
196 GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(),
197 locations.data(), base_uniform_index);
198
199 size_t index = 0;
200 if (has_tex_transform_)
201 tex_transform_location_ = locations[index++];
202 if (has_vertex_tex_transform_)
203 vertex_tex_transform_location_ = locations[index++];
204 if (has_tex_matrix_)
205 tex_matrix_location_ = locations[index++];
206 if (has_ya_uv_tex_scale_offset_) {
207 ya_tex_scale_location_ = locations[index++];
208 ya_tex_offset_location_ = locations[index++];
209 uv_tex_scale_location_ = locations[index++];
210 uv_tex_offset_location_ = locations[index++];
211 }
212 if (has_matrix_)
213 matrix_location_ = locations[index++];
214 if (has_vertex_opacity_)
215 vertex_opacity_location_ = locations[index++];
216 if (has_aa_) {
217 viewport_location_ = locations[index++];
218 edge_location_ = locations[index++];
219 }
220 if (has_quad_)
221 quad_location_ = locations[index++];
177 } 222 }
178 223
179 void VertexShaderPosTex::Init(GLES2Interface* context, 224 void VertexShaderBase::FillLocations(ShaderLocations* locations) const {
180 unsigned program, 225 locations->quad = quad_location();
181 int* base_uniform_index) { 226 locations->edge = edge_location();
182 static const char* uniforms[] = { 227 locations->viewport = viewport_location();
183 "matrix", 228 locations->matrix = matrix_location();
184 }; 229 locations->tex_transform = tex_transform_location();
185 int locations[arraysize(uniforms)];
186
187 GetProgramUniformLocations(context,
188 program,
189 arraysize(uniforms),
190 uniforms,
191 locations,
192 base_uniform_index);
193 matrix_location_ = locations[0];
194 } 230 }
195 231
196 std::string VertexShaderPosTex::GetShaderString() const { 232 std::string VertexShaderBase::GetShaderString() const {
197 return VERTEX_SHADER(GetShaderHead(), GetShaderBody()); 233 // We unconditionally use highp in the vertex shader since
234 // we are unlikely to be vertex shader bound when drawing large quads.
235 // Also, some vertex shaders mutate the texture coordinate in such a
236 // way that the effective precision might be lower than expected.
237 return base::StringPrintf(
238 "#define TexCoordPrecision highp\n"
239 "#define NUM_STATIC_QUADS %d\n",
240 StaticGeometryBinding::NUM_QUADS) +
241 GetShaderSource();
198 } 242 }
199 243
200 std::string VertexShaderPosTex::GetShaderHead() { 244 std::string VertexShaderPosTex::GetShaderSource() const {
201 return SHADER0([]() { 245 return SHADER0([]() {
202 attribute vec4 a_position; 246 attribute vec4 a_position;
203 attribute TexCoordPrecision vec2 a_texCoord; 247 attribute TexCoordPrecision vec2 a_texCoord;
204 uniform mat4 matrix; 248 uniform mat4 matrix;
205 varying TexCoordPrecision vec2 v_texCoord; 249 varying TexCoordPrecision vec2 v_texCoord;
206 });
207 }
208
209 std::string VertexShaderPosTex::GetShaderBody() {
210 return SHADER0([]() {
211 void main() { 250 void main() {
212 gl_Position = matrix * a_position; 251 gl_Position = matrix * a_position;
213 v_texCoord = a_texCoord; 252 v_texCoord = a_texCoord;
214 } 253 }
215 }); 254 });
216 } 255 }
217 256
218 VertexShaderPosTexYUVStretchOffset::VertexShaderPosTexYUVStretchOffset() 257 std::string VertexShaderPosTexYUVStretchOffset::GetShaderSource() const {
219 : matrix_location_(-1),
220 ya_tex_scale_location_(-1),
221 ya_tex_offset_location_(-1),
222 uv_tex_scale_location_(-1),
223 uv_tex_offset_location_(-1) {
224 }
225
226 void VertexShaderPosTexYUVStretchOffset::Init(GLES2Interface* context,
227 unsigned program,
228 int* base_uniform_index) {
229 static const char* uniforms[] = {
230 "matrix", "yaTexScale", "yaTexOffset", "uvTexScale", "uvTexOffset",
231 };
232 int locations[arraysize(uniforms)];
233
234 GetProgramUniformLocations(context,
235 program,
236 arraysize(uniforms),
237 uniforms,
238 locations,
239 base_uniform_index);
240 matrix_location_ = locations[0];
241 ya_tex_scale_location_ = locations[1];
242 ya_tex_offset_location_ = locations[2];
243 uv_tex_scale_location_ = locations[3];
244 uv_tex_offset_location_ = locations[4];
245 }
246
247 std::string VertexShaderPosTexYUVStretchOffset::GetShaderString() const {
248 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
249 }
250
251 std::string VertexShaderPosTexYUVStretchOffset::GetShaderHead() {
252 return SHADER0([]() { 258 return SHADER0([]() {
253 precision mediump float; 259 precision mediump float;
254 attribute vec4 a_position; 260 attribute vec4 a_position;
255 attribute TexCoordPrecision vec2 a_texCoord; 261 attribute TexCoordPrecision vec2 a_texCoord;
256 uniform mat4 matrix; 262 uniform mat4 matrix;
257 varying TexCoordPrecision vec2 v_yaTexCoord; 263 varying TexCoordPrecision vec2 v_yaTexCoord;
258 varying TexCoordPrecision vec2 v_uvTexCoord; 264 varying TexCoordPrecision vec2 v_uvTexCoord;
259 uniform TexCoordPrecision vec2 yaTexScale; 265 uniform TexCoordPrecision vec2 yaTexScale;
260 uniform TexCoordPrecision vec2 yaTexOffset; 266 uniform TexCoordPrecision vec2 yaTexOffset;
261 uniform TexCoordPrecision vec2 uvTexScale; 267 uniform TexCoordPrecision vec2 uvTexScale;
262 uniform TexCoordPrecision vec2 uvTexOffset; 268 uniform TexCoordPrecision vec2 uvTexOffset;
263 });
264 }
265
266 std::string VertexShaderPosTexYUVStretchOffset::GetShaderBody() {
267 return SHADER0([]() {
268 void main() { 269 void main() {
269 gl_Position = matrix * a_position; 270 gl_Position = matrix * a_position;
270 v_yaTexCoord = a_texCoord * yaTexScale + yaTexOffset; 271 v_yaTexCoord = a_texCoord * yaTexScale + yaTexOffset;
271 v_uvTexCoord = a_texCoord * uvTexScale + uvTexOffset; 272 v_uvTexCoord = a_texCoord * uvTexScale + uvTexOffset;
272 } 273 }
273 }); 274 });
274 } 275 }
275 276
276 VertexShaderPos::VertexShaderPos() : matrix_location_(-1) { 277 std::string VertexShaderPos::GetShaderSource() const {
277 }
278
279 void VertexShaderPos::Init(GLES2Interface* context,
280 unsigned program,
281 int* base_uniform_index) {
282 static const char* uniforms[] = {
283 "matrix",
284 };
285 int locations[arraysize(uniforms)];
286
287 GetProgramUniformLocations(context,
288 program,
289 arraysize(uniforms),
290 uniforms,
291 locations,
292 base_uniform_index);
293 matrix_location_ = locations[0];
294 }
295
296 std::string VertexShaderPos::GetShaderString() const {
297 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
298 }
299
300 std::string VertexShaderPos::GetShaderHead() {
301 return SHADER0([]() { 278 return SHADER0([]() {
302 attribute vec4 a_position; 279 attribute vec4 a_position;
303 uniform mat4 matrix; 280 uniform mat4 matrix;
304 });
305 }
306
307 std::string VertexShaderPos::GetShaderBody() {
308 return SHADER0([]() {
309 void main() { gl_Position = matrix * a_position; } 281 void main() { gl_Position = matrix * a_position; }
310 }); 282 });
311 } 283 }
312 284
313 VertexShaderPosTexTransform::VertexShaderPosTexTransform() 285 std::string VertexShaderPosTexTransform::GetShaderSource() const {
314 : matrix_location_(-1),
315 tex_transform_location_(-1),
316 vertex_opacity_location_(-1) {
317 }
318
319 void VertexShaderPosTexTransform::Init(GLES2Interface* context,
320 unsigned program,
321 int* base_uniform_index) {
322 static const char* uniforms[] = {
323 "matrix", "texTransform", "opacity",
324 };
325 int locations[arraysize(uniforms)];
326
327 GetProgramUniformLocations(context,
328 program,
329 arraysize(uniforms),
330 uniforms,
331 locations,
332 base_uniform_index);
333 matrix_location_ = locations[0];
334 tex_transform_location_ = locations[1];
335 vertex_opacity_location_ = locations[2];
336 }
337
338 std::string VertexShaderPosTexTransform::GetShaderString() const {
339 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
340 }
341
342 std::string VertexShaderPosTexTransform::GetShaderHead() {
343 return SHADER0([]() { 286 return SHADER0([]() {
344 attribute vec4 a_position; 287 attribute vec4 a_position;
345 attribute TexCoordPrecision vec2 a_texCoord; 288 attribute TexCoordPrecision vec2 a_texCoord;
346 attribute float a_index; 289 attribute float a_index;
347 uniform mat4 matrix[NUM_STATIC_QUADS]; 290 uniform mat4 matrix[NUM_STATIC_QUADS];
348 uniform TexCoordPrecision vec4 texTransform[NUM_STATIC_QUADS]; 291 uniform TexCoordPrecision vec4 texTransform[NUM_STATIC_QUADS];
349 uniform float opacity[NUM_STATIC_QUADS * 4]; 292 uniform float opacity[NUM_STATIC_QUADS * 4];
350 varying TexCoordPrecision vec2 v_texCoord; 293 varying TexCoordPrecision vec2 v_texCoord;
351 varying float v_alpha; 294 varying float v_alpha;
352 });
353 }
354
355 std::string VertexShaderPosTexTransform::GetShaderBody() {
356 return SHADER0([]() {
357 void main() { 295 void main() {
358 int quad_index = int(a_index * 0.25); // NOLINT 296 int quad_index = int(a_index * 0.25); // NOLINT
359 gl_Position = matrix[quad_index] * a_position; 297 gl_Position = matrix[quad_index] * a_position;
360 TexCoordPrecision vec4 texTrans = texTransform[quad_index]; 298 TexCoordPrecision vec4 texTrans = texTransform[quad_index];
361 v_texCoord = a_texCoord * texTrans.zw + texTrans.xy; 299 v_texCoord = a_texCoord * texTrans.zw + texTrans.xy;
362 v_alpha = opacity[int(a_index)]; // NOLINT 300 v_alpha = opacity[int(a_index)]; // NOLINT
363 } 301 }
364 }); 302 });
365 } 303 }
366 304
367 void VertexShaderPosTexTransform::FillLocations( 305 std::string VertexShaderPosTexIdentity::GetShaderSource() const {
368 ShaderLocations* locations) const {
369 locations->matrix = matrix_location();
370 locations->tex_transform = tex_transform_location();
371 }
372
373 std::string VertexShaderPosTexIdentity::GetShaderString() const {
374 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
375 }
376
377 std::string VertexShaderPosTexIdentity::GetShaderHead() {
378 return SHADER0([]() { 306 return SHADER0([]() {
379 attribute vec4 a_position; 307 attribute vec4 a_position;
380 varying TexCoordPrecision vec2 v_texCoord; 308 varying TexCoordPrecision vec2 v_texCoord;
381 });
382 }
383
384 std::string VertexShaderPosTexIdentity::GetShaderBody() {
385 return SHADER0([]() {
386 void main() { 309 void main() {
387 gl_Position = a_position; 310 gl_Position = a_position;
388 v_texCoord = (a_position.xy + vec2(1.0)) * 0.5; 311 v_texCoord = (a_position.xy + vec2(1.0)) * 0.5;
389 } 312 }
390 }); 313 });
391 } 314 }
392 315
393 VertexShaderQuad::VertexShaderQuad() 316 std::string VertexShaderQuad::GetShaderSource() const {
394 : matrix_location_(-1), quad_location_(-1) {
395 }
396
397 void VertexShaderQuad::Init(GLES2Interface* context,
398 unsigned program,
399 int* base_uniform_index) {
400 static const char* uniforms[] = {
401 "matrix", "quad",
402 };
403 int locations[arraysize(uniforms)];
404
405 GetProgramUniformLocations(context,
406 program,
407 arraysize(uniforms),
408 uniforms,
409 locations,
410 base_uniform_index);
411 matrix_location_ = locations[0];
412 quad_location_ = locations[1];
413 }
414
415 std::string VertexShaderQuad::GetShaderString() const {
416 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
417 }
418
419 std::string VertexShaderQuad::GetShaderHead() {
420 #if defined(OS_ANDROID) 317 #if defined(OS_ANDROID)
421 // TODO(epenner): Find the cause of this 'quad' uniform 318 // TODO(epenner): Find the cause of this 'quad' uniform
422 // being missing if we don't add dummy variables. 319 // being missing if we don't add dummy variables.
423 // http://crbug.com/240602 320 // http://crbug.com/240602
424 return SHADER0([]() { 321 return SHADER0([]() {
425 attribute TexCoordPrecision vec4 a_position; 322 attribute TexCoordPrecision vec4 a_position;
426 attribute float a_index; 323 attribute float a_index;
427 uniform mat4 matrix; 324 uniform mat4 matrix;
428 uniform TexCoordPrecision vec2 quad[4]; 325 uniform TexCoordPrecision vec2 quad[4];
429 uniform TexCoordPrecision vec2 dummy_uniform; 326 uniform TexCoordPrecision vec2 dummy_uniform;
430 varying TexCoordPrecision vec2 dummy_varying; 327 varying TexCoordPrecision vec2 dummy_varying;
431 });
432 #else
433 return SHADER0([]() {
434 attribute TexCoordPrecision vec4 a_position;
435 attribute float a_index;
436 uniform mat4 matrix;
437 uniform TexCoordPrecision vec2 quad[4];
438 });
439 #endif
440 }
441
442 std::string VertexShaderQuad::GetShaderBody() {
443 #if defined(OS_ANDROID)
444 return SHADER0([]() {
445 void main() { 328 void main() {
446 vec2 pos = quad[int(a_index)]; // NOLINT 329 vec2 pos = quad[int(a_index)]; // NOLINT
447 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); 330 gl_Position = matrix * vec4(pos, a_position.z, a_position.w);
448 dummy_varying = dummy_uniform; 331 dummy_varying = dummy_uniform;
449 } 332 }
450 }); 333 });
451 #else 334 #else
452 return SHADER0([]() { 335 return SHADER0([]() {
336 attribute TexCoordPrecision vec4 a_position;
337 attribute float a_index;
338 uniform mat4 matrix;
339 uniform TexCoordPrecision vec2 quad[4];
453 void main() { 340 void main() {
454 vec2 pos = quad[int(a_index)]; // NOLINT 341 vec2 pos = quad[int(a_index)]; // NOLINT
455 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); 342 gl_Position = matrix * vec4(pos, a_position.z, a_position.w);
456 } 343 }
457 }); 344 });
458 #endif 345 #endif
459 } 346 }
460 347
461 VertexShaderQuadAA::VertexShaderQuadAA() 348 std::string VertexShaderQuadAA::GetShaderSource() const {
462 : matrix_location_(-1),
463 viewport_location_(-1),
464 quad_location_(-1),
465 edge_location_(-1) {
466 }
467
468 void VertexShaderQuadAA::Init(GLES2Interface* context,
469 unsigned program,
470 int* base_uniform_index) {
471 static const char* uniforms[] = {
472 "matrix", "viewport", "quad", "edge",
473 };
474 int locations[arraysize(uniforms)];
475
476 GetProgramUniformLocations(context,
477 program,
478 arraysize(uniforms),
479 uniforms,
480 locations,
481 base_uniform_index);
482 matrix_location_ = locations[0];
483 viewport_location_ = locations[1];
484 quad_location_ = locations[2];
485 edge_location_ = locations[3];
486 }
487
488 std::string VertexShaderQuadAA::GetShaderString() const {
489 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
490 }
491
492 std::string VertexShaderQuadAA::GetShaderHead() {
493 return SHADER0([]() { 349 return SHADER0([]() {
494 attribute TexCoordPrecision vec4 a_position; 350 attribute TexCoordPrecision vec4 a_position;
495 attribute float a_index; 351 attribute float a_index;
496 uniform mat4 matrix; 352 uniform mat4 matrix;
497 uniform vec4 viewport; 353 uniform vec4 viewport;
498 uniform TexCoordPrecision vec2 quad[4]; 354 uniform TexCoordPrecision vec2 quad[4];
499 uniform TexCoordPrecision vec3 edge[8]; 355 uniform TexCoordPrecision vec3 edge[8];
500 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. 356 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
501 });
502 }
503
504 std::string VertexShaderQuadAA::GetShaderBody() {
505 return SHADER0([]() {
506 void main() { 357 void main() {
507 vec2 pos = quad[int(a_index)]; // NOLINT 358 vec2 pos = quad[int(a_index)]; // NOLINT
508 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); 359 gl_Position = matrix * vec4(pos, a_position.z, a_position.w);
509 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w); 360 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w);
510 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0); 361 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0);
511 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos), 362 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos),
512 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) * 363 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) *
513 gl_Position.w; 364 gl_Position.w;
514 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos), 365 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos),
515 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) * 366 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) *
516 gl_Position.w; 367 gl_Position.w;
517 } 368 }
518 }); 369 });
519 } 370 }
520 371
521 VertexShaderQuadTexTransformAA::VertexShaderQuadTexTransformAA() 372 std::string VertexShaderQuadTexTransformAA::GetShaderSource() const {
522 : matrix_location_(-1),
523 viewport_location_(-1),
524 quad_location_(-1),
525 edge_location_(-1),
526 tex_transform_location_(-1) {
527 }
528
529 void VertexShaderQuadTexTransformAA::Init(GLES2Interface* context,
530 unsigned program,
531 int* base_uniform_index) {
532 static const char* uniforms[] = {
533 "matrix", "viewport", "quad", "edge", "texTrans",
534 };
535 int locations[arraysize(uniforms)];
536
537 GetProgramUniformLocations(context,
538 program,
539 arraysize(uniforms),
540 uniforms,
541 locations,
542 base_uniform_index);
543 matrix_location_ = locations[0];
544 viewport_location_ = locations[1];
545 quad_location_ = locations[2];
546 edge_location_ = locations[3];
547 tex_transform_location_ = locations[4];
548 }
549
550 std::string VertexShaderQuadTexTransformAA::GetShaderString() const {
551 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
552 }
553
554 std::string VertexShaderQuadTexTransformAA::GetShaderHead() {
555 return SHADER0([]() { 373 return SHADER0([]() {
556 attribute TexCoordPrecision vec4 a_position; 374 attribute TexCoordPrecision vec4 a_position;
557 attribute float a_index; 375 attribute float a_index;
558 uniform mat4 matrix; 376 uniform mat4 matrix;
559 uniform vec4 viewport; 377 uniform vec4 viewport;
560 uniform TexCoordPrecision vec2 quad[4]; 378 uniform TexCoordPrecision vec2 quad[4];
561 uniform TexCoordPrecision vec3 edge[8]; 379 uniform TexCoordPrecision vec3 edge[8];
562 uniform TexCoordPrecision vec4 texTrans; 380 uniform TexCoordPrecision vec4 texTransform;
ccameron 2017/01/04 09:06:12 This is the one instance where I had to edit a sha
563 varying TexCoordPrecision vec2 v_texCoord; 381 varying TexCoordPrecision vec2 v_texCoord;
564 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. 382 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
565 });
566 }
567
568 std::string VertexShaderQuadTexTransformAA::GetShaderBody() {
569 return SHADER0([]() {
570 void main() { 383 void main() {
571 vec2 pos = quad[int(a_index)]; // NOLINT 384 vec2 pos = quad[int(a_index)]; // NOLINT
572 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); 385 gl_Position = matrix * vec4(pos, a_position.z, a_position.w);
573 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w); 386 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w);
574 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0); 387 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0);
575 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos), 388 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos),
576 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) * 389 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) *
577 gl_Position.w; 390 gl_Position.w;
578 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos), 391 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos),
579 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) * 392 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) *
580 gl_Position.w; 393 gl_Position.w;
581 v_texCoord = (pos.xy + vec2(0.5)) * texTrans.zw + texTrans.xy; 394 v_texCoord = (pos.xy + vec2(0.5)) * texTransform.zw + texTransform.xy;
582 } 395 }
583 }); 396 });
584 } 397 }
585 398
586 void VertexShaderQuadTexTransformAA::FillLocations( 399 std::string VertexShaderTile::GetShaderSource() const {
587 ShaderLocations* locations) const {
588 locations->quad = quad_location();
589 locations->edge = edge_location();
590 locations->viewport = viewport_location();
591 locations->matrix = matrix_location();
592 locations->tex_transform = tex_transform_location();
593 }
594
595
596 VertexShaderTile::VertexShaderTile()
597 : matrix_location_(-1),
598 quad_location_(-1),
599 vertex_tex_transform_location_(-1) {
600 }
601
602 void VertexShaderTile::Init(GLES2Interface* context,
603 unsigned program,
604 int* base_uniform_index) {
605 static const char* uniforms[] = {
606 "matrix", "quad", "vertexTexTransform",
607 };
608 int locations[arraysize(uniforms)];
609
610 GetProgramUniformLocations(context,
611 program,
612 arraysize(uniforms),
613 uniforms,
614 locations,
615 base_uniform_index);
616 matrix_location_ = locations[0];
617 quad_location_ = locations[1];
618 vertex_tex_transform_location_ = locations[2];
619 }
620
621 std::string VertexShaderTile::GetShaderString() const {
622 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
623 }
624
625 std::string VertexShaderTile::GetShaderHead() {
626 return SHADER0([]() { 400 return SHADER0([]() {
627 attribute TexCoordPrecision vec4 a_position; 401 attribute TexCoordPrecision vec4 a_position;
628 attribute TexCoordPrecision vec2 a_texCoord; 402 attribute TexCoordPrecision vec2 a_texCoord;
629 attribute float a_index; 403 attribute float a_index;
630 uniform mat4 matrix; 404 uniform mat4 matrix;
631 uniform TexCoordPrecision vec2 quad[4]; 405 uniform TexCoordPrecision vec2 quad[4];
632 uniform TexCoordPrecision vec4 vertexTexTransform; 406 uniform TexCoordPrecision vec4 vertexTexTransform;
633 varying TexCoordPrecision vec2 v_texCoord; 407 varying TexCoordPrecision vec2 v_texCoord;
634 });
635 }
636
637 std::string VertexShaderTile::GetShaderBody() {
638 return SHADER0([]() {
639 void main() { 408 void main() {
640 vec2 pos = quad[int(a_index)]; // NOLINT 409 vec2 pos = quad[int(a_index)]; // NOLINT
641 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); 410 gl_Position = matrix * vec4(pos, a_position.z, a_position.w);
642 v_texCoord = a_texCoord * vertexTexTransform.zw + vertexTexTransform.xy; 411 v_texCoord = a_texCoord * vertexTexTransform.zw + vertexTexTransform.xy;
643 } 412 }
644 }); 413 });
645 } 414 }
646 415
647 VertexShaderTileAA::VertexShaderTileAA() 416 std::string VertexShaderTileAA::GetShaderSource() const {
648 : matrix_location_(-1),
649 viewport_location_(-1),
650 quad_location_(-1),
651 edge_location_(-1),
652 vertex_tex_transform_location_(-1) {
653 }
654
655 void VertexShaderTileAA::Init(GLES2Interface* context,
656 unsigned program,
657 int* base_uniform_index) {
658 static const char* uniforms[] = {
659 "matrix", "viewport", "quad", "edge", "vertexTexTransform",
660 };
661 int locations[arraysize(uniforms)];
662
663 GetProgramUniformLocations(context,
664 program,
665 arraysize(uniforms),
666 uniforms,
667 locations,
668 base_uniform_index);
669 matrix_location_ = locations[0];
670 viewport_location_ = locations[1];
671 quad_location_ = locations[2];
672 edge_location_ = locations[3];
673 vertex_tex_transform_location_ = locations[4];
674 }
675
676 std::string VertexShaderTileAA::GetShaderString() const {
677 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
678 }
679
680 std::string VertexShaderTileAA::GetShaderHead() {
681 return SHADER0([]() { 417 return SHADER0([]() {
682 attribute TexCoordPrecision vec4 a_position; 418 attribute TexCoordPrecision vec4 a_position;
683 attribute float a_index; 419 attribute float a_index;
684 uniform mat4 matrix; 420 uniform mat4 matrix;
685 uniform vec4 viewport; 421 uniform vec4 viewport;
686 uniform TexCoordPrecision vec2 quad[4]; 422 uniform TexCoordPrecision vec2 quad[4];
687 uniform TexCoordPrecision vec3 edge[8]; 423 uniform TexCoordPrecision vec3 edge[8];
688 uniform TexCoordPrecision vec4 vertexTexTransform; 424 uniform TexCoordPrecision vec4 vertexTexTransform;
689 varying TexCoordPrecision vec2 v_texCoord; 425 varying TexCoordPrecision vec2 v_texCoord;
690 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances. 426 varying TexCoordPrecision vec4 edge_dist[2]; // 8 edge distances.
691 });
692 }
693
694 std::string VertexShaderTileAA::GetShaderBody() {
695 return SHADER0([]() {
696 void main() { 427 void main() {
697 vec2 pos = quad[int(a_index)]; // NOLINT 428 vec2 pos = quad[int(a_index)]; // NOLINT
698 gl_Position = matrix * vec4(pos, a_position.z, a_position.w); 429 gl_Position = matrix * vec4(pos, a_position.z, a_position.w);
699 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w); 430 vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w);
700 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0); 431 vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0);
701 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos), 432 edge_dist[0] = vec4(dot(edge[0], screen_pos), dot(edge[1], screen_pos),
702 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) * 433 dot(edge[2], screen_pos), dot(edge[3], screen_pos)) *
703 gl_Position.w; 434 gl_Position.w;
704 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos), 435 edge_dist[1] = vec4(dot(edge[4], screen_pos), dot(edge[5], screen_pos),
705 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) * 436 dot(edge[6], screen_pos), dot(edge[7], screen_pos)) *
706 gl_Position.w; 437 gl_Position.w;
707 v_texCoord = pos.xy * vertexTexTransform.zw + vertexTexTransform.xy; 438 v_texCoord = pos.xy * vertexTexTransform.zw + vertexTexTransform.xy;
708 } 439 }
709 }); 440 });
710 } 441 }
711 442
712 VertexShaderVideoTransform::VertexShaderVideoTransform() 443 std::string VertexShaderVideoTransform::GetShaderSource() const {
713 : matrix_location_(-1), tex_matrix_location_(-1) {
714 }
715
716 void VertexShaderVideoTransform::Init(GLES2Interface* context,
717 unsigned program,
718 int* base_uniform_index) {
719 static const char* uniforms[] = {
720 "matrix", "texMatrix",
721 };
722 int locations[arraysize(uniforms)];
723
724 GetProgramUniformLocations(context,
725 program,
726 arraysize(uniforms),
727 uniforms,
728 locations,
729 base_uniform_index);
730 matrix_location_ = locations[0];
731 tex_matrix_location_ = locations[1];
732 }
733
734 std::string VertexShaderVideoTransform::GetShaderString() const {
735 return VERTEX_SHADER(GetShaderHead(), GetShaderBody());
736 }
737
738 std::string VertexShaderVideoTransform::GetShaderHead() {
739 return SHADER0([]() { 444 return SHADER0([]() {
740 attribute vec4 a_position; 445 attribute vec4 a_position;
741 attribute TexCoordPrecision vec2 a_texCoord; 446 attribute TexCoordPrecision vec2 a_texCoord;
742 uniform mat4 matrix; 447 uniform mat4 matrix;
743 uniform TexCoordPrecision mat4 texMatrix; 448 uniform TexCoordPrecision mat4 texMatrix;
744 varying TexCoordPrecision vec2 v_texCoord; 449 varying TexCoordPrecision vec2 v_texCoord;
745 });
746 }
747
748 std::string VertexShaderVideoTransform::GetShaderBody() {
749 return SHADER0([]() {
750 void main() { 450 void main() {
751 gl_Position = matrix * a_position; 451 gl_Position = matrix * a_position;
752 v_texCoord = (texMatrix * vec4(a_texCoord.xy, 0.0, 1.0)).xy; 452 v_texCoord = (texMatrix * vec4(a_texCoord.xy, 0.0, 1.0)).xy;
753 } 453 }
754 }); 454 });
755 } 455 }
756 456
757 #define BLEND_MODE_UNIFORMS "s_backdropTexture", \ 457 #define BLEND_MODE_UNIFORMS "s_backdropTexture", \
758 "s_originalBackdropTexture", \ 458 "s_originalBackdropTexture", \
759 "backdropRect" 459 "backdropRect"
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 break; 1012 break;
1313 } 1013 }
1314 source += "}\n"; 1014 source += "}\n";
1315 1015
1316 #undef HDR 1016 #undef HDR
1317 #undef SRC 1017 #undef SRC
1318 1018
1319 return header + source; 1019 return header + source;
1320 } 1020 }
1321 1021
1322 FragmentShaderYUVVideo::FragmentShaderYUVVideo() 1022 FragmentShaderYUVVideo::FragmentShaderYUVVideo() {}
1323 : y_texture_location_(-1),
1324 u_texture_location_(-1),
1325 v_texture_location_(-1),
1326 uv_texture_location_(-1),
1327 a_texture_location_(-1),
1328 lut_texture_location_(-1),
1329 alpha_location_(-1),
1330 yuv_matrix_location_(-1),
1331 yuv_adj_location_(-1),
1332 ya_clamp_rect_location_(-1),
1333 uv_clamp_rect_location_(-1),
1334 resource_multiplier_location_(-1),
1335 resource_offset_location_(-1) {}
1336 1023
1337 void FragmentShaderYUVVideo::SetFeatures(bool use_alpha_texture, 1024 void FragmentShaderYUVVideo::SetFeatures(bool use_alpha_texture,
1338 bool use_nv12, 1025 bool use_nv12,
1339 bool use_color_lut) { 1026 bool use_color_lut) {
1340 use_alpha_texture_ = use_alpha_texture; 1027 use_alpha_texture_ = use_alpha_texture;
1341 use_nv12_ = use_nv12; 1028 use_nv12_ = use_nv12;
1342 use_color_lut_ = use_color_lut; 1029 use_color_lut_ = use_color_lut;
1343 } 1030 }
1344 1031
1345 void FragmentShaderYUVVideo::Init(GLES2Interface* context, 1032 void FragmentShaderYUVVideo::Init(GLES2Interface* context,
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1475 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord)); 1162 max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));
1476 vec3 yuv = vec3(y_raw, GetUV(uv_clamped)); 1163 vec3 yuv = vec3(y_raw, GetUV(uv_clamped));
1477 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped); 1164 gl_FragColor = vec4(yuv2rgb(yuv), 1.0) * GetAlpha(ya_clamped);
1478 } 1165 }
1479 }); 1166 });
1480 1167
1481 return head + functions; 1168 return head + functions;
1482 } 1169 }
1483 1170
1484 } // namespace cc 1171 } // namespace cc
OLDNEW
« cc/output/shader.h ('K') | « cc/output/shader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698