OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |