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

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc

Issue 2589613002: Revert of Extend CopyTextureCHROMIUM to more ES 3.0 texture formats. (Closed)
Patch Set: Created 4 years 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "gpu/command_buffer/service/gl_utils.h" 11 #include "gpu/command_buffer/service/gl_utils.h"
12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
13 #include "gpu/command_buffer/service/texture_manager.h"
14 #include "ui/gl/gl_version_info.h" 13 #include "ui/gl/gl_version_info.h"
15 14
16 namespace { 15 namespace {
17 16
18 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, 17 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f,
19 0.0f, 1.0f, 0.0f, 0.0f, 18 0.0f, 1.0f, 0.0f, 0.0f,
20 0.0f, 0.0f, 1.0f, 0.0f, 19 0.0f, 0.0f, 1.0f, 0.0f,
21 0.0f, 0.0f, 0.0f, 1.0f}; 20 0.0f, 0.0f, 0.0f, 1.0f};
22 21
23 enum { 22 enum FragmentShaderId {
24 SAMPLER_2D, 23 FRAGMENT_SHADER_COPY_TEXTURE_2D,
25 SAMPLER_RECTANGLE_ARB, 24 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB,
26 SAMPLER_EXTERNAL_OES, 25 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES,
27 NUM_SAMPLERS 26 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D,
27 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB,
28 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES,
29 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D,
30 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB,
31 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES,
32 NUM_FRAGMENT_SHADERS,
28 }; 33 };
29 34
30 enum {
31 S_FORMAT_ALPHA,
32 S_FORMAT_LUMINANCE,
33 S_FORMAT_LUMINANCE_ALPHA,
34 S_FORMAT_RED,
35 S_FORMAT_RGB,
36 S_FORMAT_RGBA,
37 S_FORMAT_RGB8,
38 S_FORMAT_RGBA8,
39 S_FORMAT_BGRA_EXT,
40 S_FORMAT_BGRA8_EXT,
41 S_FORMAT_RGB_YCBCR_420V_CHROMIUM,
42 S_FORMAT_RGB_YCBCR_422_CHROMIUM,
43 S_FORMAT_COMPRESSED,
44 NUM_S_FORMAT
45 };
46
47 enum {
48 D_FORMAT_RGB,
49 D_FORMAT_RGBA,
50 D_FORMAT_RGB8,
51 D_FORMAT_RGBA8,
52 D_FORMAT_BGRA_EXT,
53 D_FORMAT_BGRA8_EXT,
54 D_FORMAT_SRGB_EXT,
55 D_FORMAT_SRGB_ALPHA_EXT,
56 D_FORMAT_R8,
57 D_FORMAT_R8UI,
58 D_FORMAT_RG8,
59 D_FORMAT_RG8UI,
60 D_FORMAT_SRGB8,
61 D_FORMAT_RGB565,
62 D_FORMAT_RGB8UI,
63 D_FORMAT_SRGB8_ALPHA8,
64 D_FORMAT_RGB5_A1,
65 D_FORMAT_RGBA4,
66 D_FORMAT_RGBA8UI,
67 D_FORMAT_RGB9_E5,
68 D_FORMAT_R16F,
69 D_FORMAT_R32F,
70 D_FORMAT_RG16F,
71 D_FORMAT_RG32F,
72 D_FORMAT_RGB16F,
73 D_FORMAT_RGB32F,
74 D_FORMAT_RGBA16F,
75 D_FORMAT_RGBA32F,
76 D_FORMAT_R11F_G11F_B10F,
77 NUM_D_FORMAT
78 };
79
80 const unsigned kNumVertexShaders = NUM_SAMPLERS;
81 const unsigned kNumFragmentShaders =
82 4 * NUM_SAMPLERS * NUM_S_FORMAT * NUM_D_FORMAT;
83
84 typedef unsigned ShaderId;
85
86 ShaderId GetVertexShaderId(GLenum target) {
87 ShaderId id = 0;
88 switch (target) {
89 case GL_TEXTURE_2D:
90 id = SAMPLER_2D;
91 break;
92 case GL_TEXTURE_RECTANGLE_ARB:
93 id = SAMPLER_RECTANGLE_ARB;
94 break;
95 case GL_TEXTURE_EXTERNAL_OES:
96 id = SAMPLER_EXTERNAL_OES;
97 break;
98 default:
99 NOTREACHED();
100 break;
101 }
102 return id;
103 }
104
105 // Returns the correct fragment shader id to evaluate the copy operation for 35 // Returns the correct fragment shader id to evaluate the copy operation for
106 // the premultiply alpha pixel store settings and target. 36 // the premultiply alpha pixel store settings and target.
107 ShaderId GetFragmentShaderId(bool premultiply_alpha, 37 FragmentShaderId GetFragmentShaderId(bool premultiply_alpha,
108 bool unpremultiply_alpha, 38 bool unpremultiply_alpha,
109 GLenum target, 39 GLenum target) {
110 GLenum source_format, 40 enum {
111 GLenum dest_format) { 41 SAMPLER_2D,
112 unsigned alphaIndex = 0; 42 SAMPLER_RECTANGLE_ARB,
113 unsigned targetIndex = 0; 43 SAMPLER_EXTERNAL_OES,
114 unsigned sourceFormatIndex = 0; 44 NUM_SAMPLERS
115 unsigned destFormatIndex = 0; 45 };
116 46
117 alphaIndex = (premultiply_alpha ? (1 << 0) : 0) | 47 // bit 0: premultiply alpha
118 (unpremultiply_alpha ? (1 << 1) : 0); 48 // bit 1: unpremultiply alpha
49 static FragmentShaderId shader_ids[][NUM_SAMPLERS] = {
50 {
51 FRAGMENT_SHADER_COPY_TEXTURE_2D,
52 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB,
53 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES,
54 },
55 {
56 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D,
57 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB,
58 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES,
59 },
60 {
61 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D,
62 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB,
63 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES,
64 },
65 {
66 FRAGMENT_SHADER_COPY_TEXTURE_2D,
67 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB,
68 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES,
69 }};
70
71 unsigned index = (premultiply_alpha ? (1 << 0) : 0) |
72 (unpremultiply_alpha ? (1 << 1) : 0);
119 73
120 switch (target) { 74 switch (target) {
121 case GL_TEXTURE_2D: 75 case GL_TEXTURE_2D:
122 targetIndex = SAMPLER_2D; 76 return shader_ids[index][SAMPLER_2D];
123 break;
124 case GL_TEXTURE_RECTANGLE_ARB: 77 case GL_TEXTURE_RECTANGLE_ARB:
125 targetIndex = SAMPLER_RECTANGLE_ARB; 78 return shader_ids[index][SAMPLER_RECTANGLE_ARB];
126 break;
127 case GL_TEXTURE_EXTERNAL_OES: 79 case GL_TEXTURE_EXTERNAL_OES:
128 targetIndex = SAMPLER_EXTERNAL_OES; 80 return shader_ids[index][SAMPLER_EXTERNAL_OES];
129 break;
130 default: 81 default:
131 NOTREACHED();
132 break; 82 break;
133 } 83 }
134 84
135 switch (source_format) { 85 NOTREACHED();
136 case GL_ALPHA: 86 return shader_ids[0][SAMPLER_2D];
137 sourceFormatIndex = S_FORMAT_ALPHA;
138 break;
139 case GL_LUMINANCE:
140 sourceFormatIndex = S_FORMAT_LUMINANCE;
141 break;
142 case GL_LUMINANCE_ALPHA:
143 sourceFormatIndex = S_FORMAT_LUMINANCE_ALPHA;
144 break;
145 case GL_RED:
146 sourceFormatIndex = S_FORMAT_RED;
147 break;
148 case GL_RGB:
149 sourceFormatIndex = S_FORMAT_RGB;
150 break;
151 case GL_RGBA:
152 sourceFormatIndex = S_FORMAT_RGBA;
153 break;
154 case GL_RGB8:
155 sourceFormatIndex = S_FORMAT_RGB8;
156 break;
157 case GL_RGBA8:
158 sourceFormatIndex = S_FORMAT_RGBA8;
159 break;
160 case GL_BGRA_EXT:
161 sourceFormatIndex = S_FORMAT_BGRA_EXT;
162 break;
163 case GL_BGRA8_EXT:
164 sourceFormatIndex = S_FORMAT_BGRA8_EXT;
165 break;
166 case GL_RGB_YCBCR_420V_CHROMIUM:
167 sourceFormatIndex = S_FORMAT_RGB_YCBCR_420V_CHROMIUM;
168 break;
169 case GL_RGB_YCBCR_422_CHROMIUM:
170 sourceFormatIndex = S_FORMAT_RGB_YCBCR_422_CHROMIUM;
171 break;
172 case GL_ATC_RGB_AMD:
173 case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
174 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
175 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
176 case GL_ETC1_RGB8_OES:
177 sourceFormatIndex = S_FORMAT_COMPRESSED;
178 break;
179 default:
180 NOTREACHED();
181 break;
182 }
183
184 switch (dest_format) {
185 case GL_RGB:
186 destFormatIndex = D_FORMAT_RGB;
187 break;
188 case GL_RGBA:
189 destFormatIndex = D_FORMAT_RGBA;
190 break;
191 case GL_RGB8:
192 destFormatIndex = D_FORMAT_RGB8;
193 break;
194 case GL_RGBA8:
195 destFormatIndex = D_FORMAT_RGBA8;
196 break;
197 case GL_BGRA_EXT:
198 destFormatIndex = D_FORMAT_BGRA_EXT;
199 break;
200 case GL_BGRA8_EXT:
201 destFormatIndex = D_FORMAT_BGRA8_EXT;
202 break;
203 case GL_SRGB_EXT:
204 destFormatIndex = D_FORMAT_SRGB_EXT;
205 break;
206 case GL_SRGB_ALPHA_EXT:
207 destFormatIndex = D_FORMAT_SRGB_ALPHA_EXT;
208 break;
209 case GL_R8:
210 destFormatIndex = D_FORMAT_R8;
211 break;
212 case GL_R8UI:
213 destFormatIndex = D_FORMAT_R8UI;
214 break;
215 case GL_RG8:
216 destFormatIndex = D_FORMAT_RG8;
217 break;
218 case GL_RG8UI:
219 destFormatIndex = D_FORMAT_RG8UI;
220 break;
221 case GL_SRGB8:
222 destFormatIndex = D_FORMAT_SRGB8;
223 break;
224 case GL_RGB565:
225 destFormatIndex = D_FORMAT_RGB565;
226 break;
227 case GL_RGB8UI:
228 destFormatIndex = D_FORMAT_RGB8UI;
229 break;
230 case GL_SRGB8_ALPHA8:
231 destFormatIndex = D_FORMAT_SRGB8_ALPHA8;
232 break;
233 case GL_RGB5_A1:
234 destFormatIndex = D_FORMAT_RGB5_A1;
235 break;
236 case GL_RGBA4:
237 destFormatIndex = D_FORMAT_RGBA4;
238 break;
239 case GL_RGBA8UI:
240 destFormatIndex = D_FORMAT_RGBA8UI;
241 break;
242 case GL_RGB9_E5:
243 destFormatIndex = D_FORMAT_RGB9_E5;
244 break;
245 case GL_R16F:
246 destFormatIndex = D_FORMAT_R16F;
247 break;
248 case GL_R32F:
249 destFormatIndex = D_FORMAT_R32F;
250 break;
251 case GL_RG16F:
252 destFormatIndex = D_FORMAT_RG16F;
253 break;
254 case GL_RG32F:
255 destFormatIndex = D_FORMAT_RG32F;
256 break;
257 case GL_RGB16F:
258 destFormatIndex = D_FORMAT_RGB16F;
259 break;
260 case GL_RGB32F:
261 destFormatIndex = D_FORMAT_RGB32F;
262 break;
263 case GL_RGBA16F:
264 destFormatIndex = D_FORMAT_RGBA16F;
265 break;
266 case GL_RGBA32F:
267 destFormatIndex = D_FORMAT_RGBA32F;
268 break;
269 case GL_R11F_G11F_B10F:
270 destFormatIndex = D_FORMAT_R11F_G11F_B10F;
271 break;
272 default:
273 NOTREACHED();
274 break;
275 }
276
277 return alphaIndex + targetIndex * 4 + sourceFormatIndex * 4 * NUM_SAMPLERS +
278 destFormatIndex * 4 * NUM_SAMPLERS * NUM_S_FORMAT;
279 } 87 }
280 88
281 const char* kShaderPrecisionPreamble = 89 const char* kShaderPrecisionPreamble = "\
282 "#ifdef GL_ES\n" 90 #ifdef GL_ES\n\
283 "precision mediump float;\n" 91 precision mediump float;\n\
284 "#define TexCoordPrecision mediump\n" 92 #define TexCoordPrecision mediump\n\
285 "#else\n" 93 #else\n\
286 "#define TexCoordPrecision\n" 94 #define TexCoordPrecision\n\
287 "#endif\n"; 95 #endif\n";
288 96
289 std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info, 97 std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info) {
290 GLenum target) {
291 std::string source; 98 std::string source;
292 99
293 if (gl_version_info.is_es) { 100 // Preamble for core and compatibility mode.
294 if (gl_version_info.is_es3 && target != GL_TEXTURE_EXTERNAL_OES) { 101 if (gl_version_info.is_desktop_core_profile) {
295 source += "#version 300 es\n"; 102 source += std::string("\
296 source += 103 #version 150\n\
297 "#define ATTRIBUTE in\n" 104 #define ATTRIBUTE in\n\
298 "#define VARYING out\n"; 105 #define VARYING out\n");
299 } else {
300 source +=
301 "#define ATTRIBUTE attribute\n"
302 "#define VARYING varying\n";
303 }
304 } else { 106 } else {
305 source += "#version 150\n"; 107 source += std::string("\
306 source += 108 #define ATTRIBUTE attribute\n\
307 "#define ATTRIBUTE in\n" 109 #define VARYING varying\n");
308 "#define VARYING out\n";
309 } 110 }
310 111
311 // Preamble for texture precision. 112 // Preamble for texture precision.
312 source += kShaderPrecisionPreamble; 113 source += std::string(kShaderPrecisionPreamble);
313 114
314 // Main shader source. 115 // Main shader source.
315 source += 116 source += std::string("\
316 "uniform vec2 u_vertex_dest_mult;\n" 117 uniform vec2 u_vertex_dest_mult;\n\
317 "uniform vec2 u_vertex_dest_add;\n" 118 uniform vec2 u_vertex_dest_add;\n\
318 "uniform vec2 u_vertex_source_mult;\n" 119 uniform vec2 u_vertex_source_mult;\n\
319 "uniform vec2 u_vertex_source_add;\n" 120 uniform vec2 u_vertex_source_add;\n\
320 "ATTRIBUTE vec2 a_position;\n" 121 ATTRIBUTE vec2 a_position;\n\
321 "VARYING TexCoordPrecision vec2 v_uv;\n" 122 VARYING TexCoordPrecision vec2 v_uv;\n\
322 "void main(void) {\n" 123 void main(void) {\n\
323 " gl_Position = vec4(0, 0, 0, 1);\n" 124 gl_Position = vec4(0, 0, 0, 1);\n\
324 " gl_Position.xy =\n" 125 gl_Position.xy = a_position.xy * u_vertex_dest_mult + \
325 " a_position.xy * u_vertex_dest_mult + u_vertex_dest_add;\n" 126 u_vertex_dest_add;\n\
326 " v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n" 127 v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n\
327 "}\n"; 128 }\n");
328 129
329 return source; 130 return source;
330 } 131 }
331 132
332 std::string GetFragmentShaderSource(const gl::GLVersionInfo& gl_version_info, 133 std::string GetFragmentShaderSource(const gl::GLVersionInfo& gl_version_info,
333 bool premultiply_alpha, 134 bool premultiply_alpha,
334 bool unpremultiply_alpha, 135 bool unpremultiply_alpha,
335 bool nv_egl_stream_consumer_external, 136 bool nv_egl_stream_consumer_external,
336 GLenum target, 137 GLenum target) {
337 GLenum source_format,
338 GLenum dest_format) {
339 std::string source; 138 std::string source;
340 139
341 // Preamble for core and compatibility mode. 140 // Preamble for core and compatibility mode.
342 if (gl_version_info.is_es) { 141 if (gl_version_info.is_desktop_core_profile) {
343 if (gl_version_info.is_es3 && target != GL_TEXTURE_EXTERNAL_OES) { 142 source += std::string("\
344 source += "#version 300 es\n"; 143 #version 150\n\
345 } 144 out vec4 frag_color;\n\
346 if (target == GL_TEXTURE_EXTERNAL_OES) { 145 #define VARYING in\n\
347 source += "#extension GL_OES_EGL_image_external : enable\n"; 146 #define FRAGCOLOR frag_color\n\
348 147 #define TextureLookup texture\n");
349 if (nv_egl_stream_consumer_external) {
350 source += "#extension GL_NV_EGL_stream_consumer_external : enable\n";
351 }
352 }
353 } else { 148 } else {
354 source += "#version 150\n";
355 }
356
357 // Preamble for texture precision.
358 source += kShaderPrecisionPreamble;
359
360 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(dest_format)) {
361 source += "#define TextureType ivec4\n";
362 source += "#define ZERO 0\n";
363 source += "#define MAX_COLOR 255\n";
364 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format))
365 source += "#define InnerScaleValue 1\n";
366 else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format))
367 source += "#define InnerScaleValue 1u\n";
368 else
369 source += "#define InnerScaleValue 255.0\n";
370 source += "#define OuterScaleValue 1\n";
371 } else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(dest_format)) {
372 source += "#define TextureType uvec4\n";
373 source += "#define ZERO 0u\n";
374 source += "#define MAX_COLOR 255u\n";
375 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format))
376 source += "#define InnerScaleValue 1\n";
377 else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format))
378 source += "#define InnerScaleValue 1u\n";
379 else
380 source += "#define InnerScaleValue 255.0\n";
381 source += "#define OuterScaleValue 1u\n";
382 } else {
383 source += "#define TextureType vec4\n";
384 source += "#define ZERO 0.0\n";
385 source += "#define MAX_COLOR 1.0\n";
386 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format)) {
387 source += "#define InnerScaleValue 1\n";
388 source += "#define OuterScaleValue (1.0 / 255.0)\n";
389 } else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format)) {
390 source += "#define InnerScaleValue 1u\n";
391 source += "#define OuterScaleValue (1.0 / 255.0)\n";
392 } else {
393 source += "#define InnerScaleValue 1.0\n";
394 source += "#define OuterScaleValue 1.0\n";
395 }
396 }
397 if (gl_version_info.is_es2 || target == GL_TEXTURE_EXTERNAL_OES) {
398 switch (target) { 149 switch (target) {
399 case GL_TEXTURE_2D: 150 case GL_TEXTURE_2D:
151 source += std::string("#define TextureLookup texture2D\n");
152 break;
153 case GL_TEXTURE_RECTANGLE_ARB:
154 source += std::string("#define TextureLookup texture2DRect\n");
155 break;
400 case GL_TEXTURE_EXTERNAL_OES: 156 case GL_TEXTURE_EXTERNAL_OES:
401 source += "#define TextureLookup texture2D\n"; 157 source +=
158 std::string("#extension GL_OES_EGL_image_external : enable\n");
159
160 if (nv_egl_stream_consumer_external) {
161 source += std::string(
162 "#extension GL_NV_EGL_stream_consumer_external : enable\n");
163 }
164
165 source += std::string("#define TextureLookup texture2D\n");
402 break; 166 break;
403 default: 167 default:
404 NOTREACHED(); 168 NOTREACHED();
405 break; 169 break;
406 } 170 }
407 171 source += std::string("\
408 source += 172 #define VARYING varying\n\
409 "#define VARYING varying\n" 173 #define FRAGCOLOR gl_FragColor\n");
410 "#define FRAGCOLOR gl_FragColor\n";
411 } else {
412 source +=
413 "#define VARYING in\n"
414 "out TextureType frag_color;\n"
415 "#define FRAGCOLOR frag_color\n"
416 "#define TextureLookup texture\n";
417 } 174 }
418 175
419 // Preamble for sampler type. 176 // Preamble for sampler type.
420 switch (target) { 177 switch (target) {
421 case GL_TEXTURE_2D: 178 case GL_TEXTURE_2D:
422 source += "#define SamplerType sampler2D\n"; 179 source += std::string("#define SamplerType sampler2D\n");
423 break; 180 break;
424 case GL_TEXTURE_RECTANGLE_ARB: 181 case GL_TEXTURE_RECTANGLE_ARB:
425 source += "#define SamplerType sampler2DRect\n"; 182 source += std::string("#define SamplerType sampler2DRect\n");
426 break; 183 break;
427 case GL_TEXTURE_EXTERNAL_OES: 184 case GL_TEXTURE_EXTERNAL_OES:
428 source += "#define SamplerType samplerExternalOES\n"; 185 source += std::string("#define SamplerType samplerExternalOES\n");
429 break; 186 break;
430 default: 187 default:
431 NOTREACHED(); 188 NOTREACHED();
432 break; 189 break;
433 } 190 }
434 191
192 // Preamble for texture precision.
193 source += std::string(kShaderPrecisionPreamble);
194
435 // Main shader source. 195 // Main shader source.
436 source += 196 source += std::string("\
437 "uniform mediump SamplerType u_sampler;\n" 197 uniform SamplerType u_sampler;\n\
438 "uniform mat4 u_tex_coord_transform;\n" 198 uniform mat4 u_tex_coord_transform;\n\
439 "VARYING TexCoordPrecision vec2 v_uv;\n" 199 VARYING TexCoordPrecision vec2 v_uv;\n\
440 "void main(void) {\n" 200 void main(void) {\n\
441 " TexCoordPrecision vec4 uv =\n" 201 TexCoordPrecision vec4 uv = u_tex_coord_transform * vec4(v_uv, 0, 1);\n\
442 " u_tex_coord_transform * vec4(v_uv, 0, 1);\n" 202 FRAGCOLOR = TextureLookup(u_sampler, uv.st);\n");
443 " vec4 color = TextureLookup(u_sampler, uv.st);\n"
444 " FRAGCOLOR = TextureType(color * InnerScaleValue) * OuterScaleValue;\n";
445 203
446 // Post-processing to premultiply or un-premultiply alpha. 204 // Post-processing to premultiply or un-premultiply alpha.
447 // Check dest format has alpha channel first. 205 if (premultiply_alpha) {
448 if ((gpu::gles2::GLES2Util::GetChannelsForFormat(dest_format) & 0x0008) != 206 source += std::string(" FRAGCOLOR.rgb *= FRAGCOLOR.a;\n");
449 0) { 207 }
450 if (premultiply_alpha) { 208 if (unpremultiply_alpha) {
451 source += " FRAGCOLOR.rgb *= FRAGCOLOR.a;\n"; 209 source += std::string("\
452 source += " FRAGCOLOR.rgb /= MAX_COLOR;\n"; 210 if (FRAGCOLOR.a > 0.0)\n\
453 } 211 FRAGCOLOR.rgb /= FRAGCOLOR.a;\n");
454 if (unpremultiply_alpha) {
455 source +=
456 " if (FRAGCOLOR.a > ZERO) {\n"
457 " FRAGCOLOR.rgb /= FRAGCOLOR.a;\n"
458 " FRAGCOLOR.rgb *= MAX_COLOR;\n"
459 " }\n";
460 }
461 } 212 }
462 213
463 // Main function end. 214 // Main function end.
464 source += "}\n"; 215 source += std::string(" }\n");
465 216
466 return source; 217 return source;
467 } 218 }
468 219
469 GLenum getIntermediateFormat(GLenum format) {
470 switch (format) {
471 case GL_LUMINANCE_ALPHA:
472 case GL_LUMINANCE:
473 case GL_ALPHA:
474 return GL_RGBA;
475 case GL_SRGB_EXT:
476 return GL_SRGB_ALPHA_EXT;
477 case GL_RGB16F:
478 return GL_RGBA16F;
479 case GL_RGB9_E5:
480 case GL_RGB32F:
481 return GL_RGBA32F;
482 case GL_SRGB8:
483 return GL_SRGB8_ALPHA8;
484 case GL_RGB8UI:
485 return GL_RGBA8UI;
486 default:
487 return format;
488 }
489 }
490
491 void CompileShader(GLuint shader, const char* shader_source) { 220 void CompileShader(GLuint shader, const char* shader_source) {
492 glShaderSource(shader, 1, &shader_source, 0); 221 glShaderSource(shader, 1, &shader_source, 0);
493 glCompileShader(shader); 222 glCompileShader(shader);
494 #if DCHECK_IS_ON() 223 #ifndef NDEBUG
495 GLint compile_status; 224 GLint compile_status;
496 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); 225 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
497 if (GL_TRUE != compile_status) { 226 if (GL_TRUE != compile_status)
498 char buffer[1024]; 227 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure.";
499 GLsizei length = 0;
500 glGetShaderInfoLog(shader, sizeof(buffer), &length, buffer);
501 std::string log(buffer, length);
502 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure: " << log;
503 }
504 #endif 228 #endif
505 } 229 }
506 230
507 void DeleteShader(GLuint shader) { 231 void DeleteShader(GLuint shader) {
508 if (shader) 232 if (shader)
509 glDeleteShader(shader); 233 glDeleteShader(shader);
510 } 234 }
511 235
512 bool BindFramebufferTexture2D(GLenum target, 236 bool BindFramebufferTexture2D(GLenum target,
513 GLuint texture_id, 237 GLuint texture_id,
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 } 320 }
597 321
598 } // namespace 322 } // namespace
599 323
600 namespace gpu { 324 namespace gpu {
601 namespace gles2 { 325 namespace gles2 {
602 326
603 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() 327 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager()
604 : initialized_(false), 328 : initialized_(false),
605 nv_egl_stream_consumer_external_(false), 329 nv_egl_stream_consumer_external_(false),
606 vertex_shaders_(kNumVertexShaders, 0u), 330 vertex_shader_(0u),
607 fragment_shaders_(kNumFragmentShaders, 0u), 331 fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u),
608 vertex_array_object_id_(0u), 332 vertex_array_object_id_(0u),
609 buffer_id_(0u), 333 buffer_id_(0u),
610 framebuffer_(0u) {} 334 framebuffer_(0u) {}
611 335
612 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() { 336 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() {
613 // |buffer_id_| and |framebuffer_| can be not-null because when GPU context is 337 // |buffer_id_| and |framebuffer_| can be not-null because when GPU context is
614 // lost, this class can be deleted without releasing resources like 338 // lost, this class can be deleted without releasing resources like
615 // GLES2DecoderImpl. 339 // GLES2DecoderImpl.
616 } 340 }
617 341
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 return; 386 return;
663 387
664 if (vertex_array_object_id_) { 388 if (vertex_array_object_id_) {
665 glDeleteVertexArraysOES(1, &vertex_array_object_id_); 389 glDeleteVertexArraysOES(1, &vertex_array_object_id_);
666 vertex_array_object_id_ = 0; 390 vertex_array_object_id_ = 0;
667 } 391 }
668 392
669 glDeleteFramebuffersEXT(1, &framebuffer_); 393 glDeleteFramebuffersEXT(1, &framebuffer_);
670 framebuffer_ = 0; 394 framebuffer_ = 0;
671 395
672 std::for_each( 396 DeleteShader(vertex_shader_);
673 vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader);
674 std::for_each( 397 std::for_each(
675 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); 398 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader);
676 399
677 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); 400 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end();
678 ++it) { 401 ++it) {
679 const ProgramInfo& info = it->second; 402 const ProgramInfo& info = it->second;
680 glDeleteProgram(info.program); 403 glDeleteProgram(info.program);
681 } 404 }
682 405
683 glDeleteBuffersARB(1, &buffer_id_); 406 glDeleteBuffersARB(1, &buffer_id_);
684 buffer_id_ = 0; 407 buffer_id_ = 0;
685 } 408 }
686 409
687 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( 410 void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
688 const gles2::GLES2Decoder* decoder, 411 const gles2::GLES2Decoder* decoder,
689 GLenum source_target, 412 GLenum source_target,
690 GLuint source_id, 413 GLuint source_id,
691 GLenum source_internal_format, 414 GLenum source_internal_format,
692 GLenum dest_target, 415 GLenum dest_target,
693 GLuint dest_id, 416 GLuint dest_id,
694 GLenum dest_internal_format, 417 GLenum dest_internal_format,
695 GLsizei width, 418 GLsizei width,
696 GLsizei height, 419 GLsizei height,
697 bool flip_y, 420 bool flip_y,
698 bool premultiply_alpha, 421 bool premultiply_alpha,
699 bool unpremultiply_alpha, 422 bool unpremultiply_alpha) {
700 CopyTextureMethod method) {
701 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; 423 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
702 424 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
425 // format does not contain a superset of the components required by the base
426 // format of internalformat.
427 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
428 bool source_format_contain_superset_of_dest_format =
429 (source_internal_format == dest_internal_format &&
430 source_internal_format != GL_BGRA_EXT) ||
431 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
703 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, 432 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
704 // so restrict this to GL_TEXTURE_2D. 433 // so restrict this to GL_TEXTURE_2D.
705 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && 434 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D &&
706 !flip_y && !premultiply_alpha_change && method == DIRECT_COPY) { 435 !flip_y && !premultiply_alpha_change &&
436 source_format_contain_superset_of_dest_format) {
707 DoCopyTexImage2D(decoder, 437 DoCopyTexImage2D(decoder,
708 source_target, 438 source_target,
709 source_id, 439 source_id,
710 dest_target, 440 dest_target,
711 dest_id, 441 dest_id,
712 dest_internal_format, 442 dest_internal_format,
713 width, 443 width,
714 height, 444 height,
715 framebuffer_); 445 framebuffer_);
716 return; 446 return;
717 } 447 }
718 448
719 GLuint dest_texture = dest_id;
720 GLuint intermediate_texture = 0;
721 if (method == DRAW_AND_COPY) {
722 GLenum adjusted_internal_format =
723 getIntermediateFormat(dest_internal_format);
724 glGenTextures(1, &intermediate_texture);
725 glBindTexture(dest_target, intermediate_texture);
726 GLenum format = TextureManager::ExtractFormatFromStorageFormat(
727 adjusted_internal_format);
728 GLenum type =
729 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format);
730
731 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0,
732 format, type, nullptr);
733 dest_texture = intermediate_texture;
734 dest_internal_format = adjusted_internal_format;
735 }
736 // Use kIdentityMatrix if no transform passed in. 449 // Use kIdentityMatrix if no transform passed in.
737 DoCopyTextureWithTransform( 450 DoCopyTextureWithTransform(decoder, source_target, source_id, dest_target,
738 decoder, source_target, source_id, source_internal_format, dest_target, 451 dest_id, width, height, flip_y, premultiply_alpha,
739 dest_texture, dest_internal_format, width, height, flip_y, 452 unpremultiply_alpha, kIdentityMatrix);
740 premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
741
742 if (method == DRAW_AND_COPY) {
743 DoCopyTexImage2D(decoder, dest_target, intermediate_texture, dest_target,
744 dest_id, dest_internal_format, width, height,
745 framebuffer_);
746 glDeleteTextures(1, &intermediate_texture);
747 }
748 } 453 }
749 454
750 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( 455 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture(
751 const gles2::GLES2Decoder* decoder, 456 const gles2::GLES2Decoder* decoder,
752 GLenum source_target, 457 GLenum source_target,
753 GLuint source_id, 458 GLuint source_id,
754 GLenum source_internal_format, 459 GLenum source_internal_format,
755 GLenum dest_target, 460 GLenum dest_target,
756 GLuint dest_id, 461 GLuint dest_id,
757 GLenum dest_internal_format, 462 GLenum dest_internal_format,
758 GLint xoffset, 463 GLint xoffset,
759 GLint yoffset, 464 GLint yoffset,
760 GLint x, 465 GLint x,
761 GLint y, 466 GLint y,
762 GLsizei width, 467 GLsizei width,
763 GLsizei height, 468 GLsizei height,
764 GLsizei dest_width, 469 GLsizei dest_width,
765 GLsizei dest_height, 470 GLsizei dest_height,
766 GLsizei source_width, 471 GLsizei source_width,
767 GLsizei source_height, 472 GLsizei source_height,
768 bool flip_y, 473 bool flip_y,
769 bool premultiply_alpha, 474 bool premultiply_alpha,
770 bool unpremultiply_alpha, 475 bool unpremultiply_alpha) {
771 CopyTextureMethod method) {
772 bool use_gl_copy_tex_sub_image_2d = true; 476 bool use_gl_copy_tex_sub_image_2d = true;
773 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) 477 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
774 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, 478 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver,
775 // although opposite in Android. 479 // although opposite in Android.
776 // TODO(dshwang): After Mesa fixes this issue, remove this hack. 480 // TODO(dshwang): After Mesa fixes this issue, remove this hack.
777 // https://bugs.freedesktop.org/show_bug.cgi?id=98478 crbug.com/535198 481 // https://bugs.freedesktop.org/show_bug.cgi?id=98478 crbug.com/535198
778 use_gl_copy_tex_sub_image_2d = false; 482 use_gl_copy_tex_sub_image_2d = false;
779 #endif 483 #endif
780 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; 484 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
781 485 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
486 // format does not contain a superset of the components required by the base
487 // format of internalformat.
488 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
489 bool source_format_contain_superset_of_dest_format =
490 (source_internal_format == dest_internal_format &&
491 source_internal_format != GL_BGRA_EXT) ||
492 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
782 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, 493 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
783 // so restrict this to GL_TEXTURE_2D. 494 // so restrict this to GL_TEXTURE_2D.
784 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D && 495 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D &&
785 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && 496 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
786 method == DIRECT_COPY) { 497 source_format_contain_superset_of_dest_format) {
787 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id, 498 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id,
788 xoffset, yoffset, x, y, width, height, framebuffer_); 499 xoffset, yoffset, x, y, width, height, framebuffer_);
789 return; 500 return;
790 } 501 }
791 502
792 GLint dest_xoffset = xoffset;
793 GLint dest_yoffset = yoffset;
794 GLuint dest_texture = dest_id;
795 GLuint intermediate_texture = 0;
796 if (method == DRAW_AND_COPY) {
797 GLenum adjusted_internal_format =
798 getIntermediateFormat(dest_internal_format);
799 glGenTextures(1, &intermediate_texture);
800 glBindTexture(dest_target, intermediate_texture);
801 GLenum format = TextureManager::ExtractFormatFromStorageFormat(
802 adjusted_internal_format);
803 GLenum type =
804 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format);
805
806 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0,
807 format, type, nullptr);
808 dest_texture = intermediate_texture;
809 dest_internal_format = adjusted_internal_format;
810 dest_xoffset = 0;
811 dest_yoffset = 0;
812 dest_width = width;
813 dest_height = height;
814 }
815
816 DoCopySubTextureWithTransform( 503 DoCopySubTextureWithTransform(
817 decoder, source_target, source_id, source_internal_format, dest_target, 504 decoder, source_target, source_id, source_internal_format, dest_target,
818 dest_texture, dest_internal_format, dest_xoffset, dest_yoffset, x, y, 505 dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height,
819 width, height, dest_width, dest_height, source_width, source_height, 506 dest_width, dest_height, source_width, source_height, flip_y,
820 flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); 507 premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
821
822 if (method == DRAW_AND_COPY) {
823 DoCopyTexSubImage2D(decoder, dest_target, intermediate_texture, dest_target,
824 dest_id, xoffset, yoffset, 0, 0, width, height,
825 framebuffer_);
826 glDeleteTextures(1, &intermediate_texture);
827 }
828 } 508 }
829 509
830 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( 510 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform(
831 const gles2::GLES2Decoder* decoder, 511 const gles2::GLES2Decoder* decoder,
832 GLenum source_target, 512 GLenum source_target,
833 GLuint source_id, 513 GLuint source_id,
834 GLenum source_internal_format, 514 GLenum source_internal_format,
835 GLenum dest_target, 515 GLenum dest_target,
836 GLuint dest_id, 516 GLuint dest_id,
837 GLenum dest_internal_format, 517 GLenum dest_internal_format,
838 GLint xoffset, 518 GLint xoffset,
839 GLint yoffset, 519 GLint yoffset,
840 GLint x, 520 GLint x,
841 GLint y, 521 GLint y,
842 GLsizei width, 522 GLsizei width,
843 GLsizei height, 523 GLsizei height,
844 GLsizei dest_width, 524 GLsizei dest_width,
845 GLsizei dest_height, 525 GLsizei dest_height,
846 GLsizei source_width, 526 GLsizei source_width,
847 GLsizei source_height, 527 GLsizei source_height,
848 bool flip_y, 528 bool flip_y,
849 bool premultiply_alpha, 529 bool premultiply_alpha,
850 bool unpremultiply_alpha, 530 bool unpremultiply_alpha,
851 const GLfloat transform_matrix[16]) { 531 const GLfloat transform_matrix[16]) {
852 DoCopyTextureInternal( 532 DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id,
853 decoder, source_target, source_id, source_internal_format, dest_target, 533 xoffset, yoffset, x, y, width, height, dest_width, dest_height,
854 dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height, 534 source_width, source_height, flip_y, premultiply_alpha,
855 dest_width, dest_height, source_width, source_height, flip_y, 535 unpremultiply_alpha, transform_matrix);
856 premultiply_alpha, unpremultiply_alpha, transform_matrix);
857 } 536 }
858 537
859 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( 538 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform(
860 const gles2::GLES2Decoder* decoder, 539 const gles2::GLES2Decoder* decoder,
861 GLenum source_target, 540 GLenum source_target,
862 GLuint source_id, 541 GLuint source_id,
863 GLenum source_format,
864 GLenum dest_target, 542 GLenum dest_target,
865 GLuint dest_id, 543 GLuint dest_id,
866 GLenum dest_format,
867 GLsizei width, 544 GLsizei width,
868 GLsizei height, 545 GLsizei height,
869 bool flip_y, 546 bool flip_y,
870 bool premultiply_alpha, 547 bool premultiply_alpha,
871 bool unpremultiply_alpha, 548 bool unpremultiply_alpha,
872 const GLfloat transform_matrix[16]) { 549 const GLfloat transform_matrix[16]) {
873 GLsizei dest_width = width; 550 GLsizei dest_width = width;
874 GLsizei dest_height = height; 551 GLsizei dest_height = height;
875 DoCopyTextureInternal( 552 DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id,
876 decoder, source_target, source_id, source_format, dest_target, dest_id, 553 0, 0, 0, 0, width, height, dest_width, dest_height,
877 dest_format, 0, 0, 0, 0, width, height, dest_width, dest_height, width, 554 width, height, flip_y, premultiply_alpha,
878 height, flip_y, premultiply_alpha, unpremultiply_alpha, transform_matrix); 555 unpremultiply_alpha, transform_matrix);
879 } 556 }
880 557
881 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( 558 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal(
882 const gles2::GLES2Decoder* decoder, 559 const gles2::GLES2Decoder* decoder,
883 GLenum source_target, 560 GLenum source_target,
884 GLuint source_id, 561 GLuint source_id,
885 GLenum source_format,
886 GLenum dest_target, 562 GLenum dest_target,
887 GLuint dest_id, 563 GLuint dest_id,
888 GLenum dest_format,
889 GLint xoffset, 564 GLint xoffset,
890 GLint yoffset, 565 GLint yoffset,
891 GLint x, 566 GLint x,
892 GLint y, 567 GLint y,
893 GLsizei width, 568 GLsizei width,
894 GLsizei height, 569 GLsizei height,
895 GLsizei dest_width, 570 GLsizei dest_width,
896 GLsizei dest_height, 571 GLsizei dest_height,
897 GLsizei source_width, 572 GLsizei source_width,
898 GLsizei source_height, 573 GLsizei source_height,
(...skipping 26 matching lines...) Expand all
925 glBindVertexArrayOES(vertex_array_object_id_); 600 glBindVertexArrayOES(vertex_array_object_id_);
926 } else { 601 } else {
927 if (!gl_version_info.is_desktop_core_profile) { 602 if (!gl_version_info.is_desktop_core_profile) {
928 decoder->ClearAllAttributes(); 603 decoder->ClearAllAttributes();
929 } 604 }
930 glEnableVertexAttribArray(kVertexPositionAttrib); 605 glEnableVertexAttribArray(kVertexPositionAttrib);
931 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); 606 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_);
932 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); 607 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
933 } 608 }
934 609
935 ShaderId vertex_shader_id = GetVertexShaderId(source_target); 610 FragmentShaderId fragment_shader_id = GetFragmentShaderId(
936 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); 611 premultiply_alpha, unpremultiply_alpha, source_target);
937 ShaderId fragment_shader_id = GetFragmentShaderId(
938 premultiply_alpha, unpremultiply_alpha, source_target,
939 source_format, dest_format);
940 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); 612 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size());
941 613
942 ProgramMapKey key(fragment_shader_id); 614 ProgramMapKey key(fragment_shader_id);
943 ProgramInfo* info = &programs_[key]; 615 ProgramInfo* info = &programs_[key];
944 // Create program if necessary. 616 // Create program if necessary.
945 if (!info->program) { 617 if (!info->program) {
946 info->program = glCreateProgram(); 618 info->program = glCreateProgram();
947 GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; 619 if (!vertex_shader_) {
948 if (!*vertex_shader) { 620 vertex_shader_ = glCreateShader(GL_VERTEX_SHADER);
949 *vertex_shader = glCreateShader(GL_VERTEX_SHADER); 621 std::string source = GetVertexShaderSource(gl_version_info);
950 std::string source = 622 CompileShader(vertex_shader_, source.c_str());
951 GetVertexShaderSource(gl_version_info, source_target);
952 CompileShader(*vertex_shader, source.c_str());
953 } 623 }
954 glAttachShader(info->program, *vertex_shader); 624 glAttachShader(info->program, vertex_shader_);
955 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; 625 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id];
956 if (!*fragment_shader) { 626 if (!*fragment_shader) {
957 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); 627 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
958 std::string source = GetFragmentShaderSource( 628 std::string source = GetFragmentShaderSource(
959 gl_version_info, premultiply_alpha, unpremultiply_alpha, 629 gl_version_info, premultiply_alpha, unpremultiply_alpha,
960 nv_egl_stream_consumer_external_, source_target, source_format, 630 nv_egl_stream_consumer_external_, source_target);
961 dest_format);
962 CompileShader(*fragment_shader, source.c_str()); 631 CompileShader(*fragment_shader, source.c_str());
963 } 632 }
964 glAttachShader(info->program, *fragment_shader); 633 glAttachShader(info->program, *fragment_shader);
965 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); 634 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position");
966 glLinkProgram(info->program); 635 glLinkProgram(info->program);
967 #ifndef NDEBUG 636 #ifndef NDEBUG
968 GLint linked; 637 GLint linked;
969 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); 638 glGetProgramiv(info->program, GL_LINK_STATUS, &linked);
970 if (!linked) 639 if (!linked)
971 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; 640 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure.";
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 decoder->RestoreTextureUnitBindings(0); 771 decoder->RestoreTextureUnitBindings(0);
1103 decoder->RestoreActiveTexture(); 772 decoder->RestoreActiveTexture();
1104 decoder->RestoreProgramBindings(); 773 decoder->RestoreProgramBindings();
1105 decoder->RestoreBufferBindings(); 774 decoder->RestoreBufferBindings();
1106 decoder->RestoreFramebufferBindings(); 775 decoder->RestoreFramebufferBindings();
1107 decoder->RestoreGlobalState(); 776 decoder->RestoreGlobalState();
1108 } 777 }
1109 778
1110 } // namespace gles2 779 } // namespace gles2
1111 } // namespace gpu 780 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698