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 <string.h> | 7 #include <algorithm> |
| 8 |
8 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
9 #include "gpu/command_buffer/common/types.h" | 10 #include "gpu/command_buffer/common/types.h" |
10 #include "gpu/command_buffer/service/gl_utils.h" | 11 #include "gpu/command_buffer/service/gl_utils.h" |
11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
12 | 13 |
13 #define SHADER(src) \ | 14 #define SHADER(src) \ |
14 "#ifdef GL_ES\n" \ | 15 "#ifdef GL_ES\n" \ |
15 "precision mediump float;\n" \ | 16 "precision mediump float;\n" \ |
| 17 "#define TexCoordPrecision mediump\n" \ |
| 18 "#else\n" \ |
| 19 "#define TexCoordPrecision\n" \ |
16 "#endif\n" #src | 20 "#endif\n" #src |
17 #define SHADER_2D(src) \ | 21 #define SHADER_2D(src) \ |
18 "#define SamplerType sampler2D\n" \ | 22 "#define SamplerType sampler2D\n" \ |
19 "#define TextureLookup texture2D\n" SHADER(src) | 23 "#define TextureLookup texture2D\n" SHADER(src) |
20 #define SHADER_EXTERNAL_OES(src) \ | 24 #define SHADER_EXTERNAL_OES(src) \ |
21 "#extension GL_OES_EGL_image_external : require\n" \ | 25 "#extension GL_OES_EGL_image_external : require\n" \ |
22 "#define SamplerType samplerExternalOES\n" \ | 26 "#define SamplerType samplerExternalOES\n" \ |
23 "#define TextureLookup texture2D\n" SHADER(src) | 27 "#define TextureLookup texture2D\n" SHADER(src) |
24 #define SHADERS(src) \ | 28 #define FRAGMENT_SHADERS(src) \ |
25 { SHADER_2D(src), SHADER_EXTERNAL_OES(src) } | 29 SHADER_2D(src), SHADER_EXTERNAL_OES(src) |
26 | 30 |
27 namespace { | 31 namespace { |
28 | 32 |
29 const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, | 33 enum VertexShaderId { |
30 1.0f, -1.0f, 0.0f, 1.0f, | 34 VERTEX_SHADER_COPY_TEXTURE, |
31 1.0f, 1.0f, 0.0f, 1.0f, | 35 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, |
32 -1.0f, 1.0f, 0.0f, 1.0f }; | 36 NUM_VERTEX_SHADERS, |
33 | |
34 enum ShaderId { | |
35 SHADER_COPY_TEXTURE, | |
36 SHADER_COPY_TEXTURE_FLIP_Y, | |
37 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA, | |
38 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, | |
39 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIP_Y, | |
40 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIP_Y, | |
41 NUM_SHADERS, | |
42 }; | 37 }; |
43 | 38 |
44 enum SamplerId { | 39 enum FragmentShaderId { |
45 SAMPLER_TEXTURE_2D, | 40 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
46 SAMPLER_TEXTURE_EXTERNAL_OES, | 41 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
47 NUM_SAMPLERS, | 42 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 43 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 44 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
| 45 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 46 NUM_FRAGMENT_SHADERS, |
48 }; | 47 }; |
49 | 48 |
50 const char* vertex_shader_source = | 49 const char* vertex_shader_source[NUM_VERTEX_SHADERS] = { |
| 50 // VERTEX_SHADER_COPY_TEXTURE |
51 SHADER( | 51 SHADER( |
52 uniform mat4 u_matrix; | 52 uniform mat4 u_matrix; |
53 attribute vec4 a_position; | 53 attribute vec4 a_position; |
54 varying vec2 v_uv; | 54 varying TexCoordPrecision vec2 v_uv; |
55 void main(void) { | 55 void main(void) { |
56 gl_Position = u_matrix * a_position; | 56 gl_Position = u_matrix * a_position; |
57 v_uv = a_position.xy * 0.5 + vec2(0.5, 0.5); | 57 v_uv = a_position.xy * vec2(0.5, 0.5) + vec2(0.5, 0.5); |
58 }); | 58 }), |
| 59 // VERTEX_SHADER_COPY_TEXTURE_FLIP_Y |
| 60 SHADER( |
| 61 uniform mat4 u_matrix; |
| 62 attribute vec4 a_position; |
| 63 varying TexCoordPrecision vec2 v_uv; |
| 64 void main(void) { |
| 65 gl_Position = u_matrix * a_position; |
| 66 v_uv = a_position.xy * vec2(0.5, -0.5) + vec2(0.5, 0.5); |
| 67 }), |
| 68 }; |
59 | 69 |
60 const char* fragment_shader_source[NUM_SHADERS][NUM_SAMPLERS] = { | 70 const char* fragment_shader_source[NUM_FRAGMENT_SHADERS] = { |
61 // SHADER_COPY_TEXTURE | 71 // FRAGMENT_SHADER_COPY_TEXTURE_* |
62 SHADERS( | 72 FRAGMENT_SHADERS( |
63 uniform SamplerType u_texSampler; | 73 uniform SamplerType u_sampler; |
64 varying vec2 v_uv; | 74 varying TexCoordPrecision vec2 v_uv; |
65 void main(void) { | 75 void main(void) { |
66 gl_FragColor = TextureLookup(u_texSampler, v_uv.st); | 76 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
67 }), | 77 }), |
68 // SHADER_COPY_TEXTURE_FLIP_Y | 78 // FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_* |
69 SHADERS( | 79 FRAGMENT_SHADERS( |
70 uniform SamplerType u_texSampler; | 80 uniform SamplerType u_sampler; |
71 varying vec2 v_uv; | 81 varying TexCoordPrecision vec2 v_uv; |
72 void main(void) { | 82 void main(void) { |
73 gl_FragColor = TextureLookup(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | 83 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
74 }), | |
75 // SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA | |
76 SHADERS( | |
77 uniform SamplerType u_texSampler; | |
78 varying vec2 v_uv; | |
79 void main(void) { | |
80 gl_FragColor = TextureLookup(u_texSampler, v_uv.st); | |
81 gl_FragColor.rgb *= gl_FragColor.a; | 84 gl_FragColor.rgb *= gl_FragColor.a; |
82 }), | 85 }), |
83 // SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA | 86 // FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_* |
84 SHADERS( | 87 FRAGMENT_SHADERS( |
85 uniform SamplerType u_texSampler; | 88 uniform SamplerType u_sampler; |
86 varying vec2 v_uv; | 89 varying TexCoordPrecision vec2 v_uv; |
87 void main(void) { | 90 void main(void) { |
88 gl_FragColor = TextureLookup(u_texSampler, v_uv.st); | 91 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
89 if (gl_FragColor.a > 0.0) | |
90 gl_FragColor.rgb /= gl_FragColor.a; | |
91 }), | |
92 // SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIP_Y | |
93 SHADERS( | |
94 uniform SamplerType u_texSampler; | |
95 varying vec2 v_uv; | |
96 void main(void) { | |
97 gl_FragColor = TextureLookup(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | |
98 gl_FragColor.rgb *= gl_FragColor.a; | |
99 }), | |
100 // SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIP_Y | |
101 SHADERS( | |
102 uniform SamplerType u_texSampler; | |
103 varying vec2 v_uv; | |
104 void main(void) { | |
105 gl_FragColor = TextureLookup(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); | |
106 if (gl_FragColor.a > 0.0) | 92 if (gl_FragColor.a > 0.0) |
107 gl_FragColor.rgb /= gl_FragColor.a; | 93 gl_FragColor.rgb /= gl_FragColor.a; |
108 }), | 94 }), |
109 }; | 95 }; |
110 | 96 |
111 // Returns the correct shader id to evaluate the copy operation for | 97 // Returns the correct vertex shader id to evaluate the copy operation for |
112 // the CHROMIUM_flipy and premultiply alpha pixel store settings. | 98 // the CHROMIUM_flipy setting. |
113 ShaderId GetShaderId(bool flip_y, | 99 VertexShaderId GetVertexShaderId(bool flip_y) { |
114 bool premultiply_alpha, | 100 // bit 0: flip y |
115 bool unpremultiply_alpha) { | 101 static VertexShaderId shader_ids[] = { |
116 // If both pre-multiply and unpremultiply are requested, then perform no | 102 VERTEX_SHADER_COPY_TEXTURE, |
117 // alpha manipulation. | 103 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, |
118 if (premultiply_alpha && unpremultiply_alpha) { | |
119 premultiply_alpha = false; | |
120 unpremultiply_alpha = false; | |
121 } | |
122 | |
123 // bit 0: Flip_y | |
124 // bit 1: Premult | |
125 // bit 2: Unpremult | |
126 static ShaderId shader_ids[] = { | |
127 SHADER_COPY_TEXTURE, | |
128 SHADER_COPY_TEXTURE_FLIP_Y, // F | |
129 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA, // P | |
130 SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIP_Y, // F P | |
131 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, // U | |
132 SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIP_Y, // F U | |
133 SHADER_COPY_TEXTURE, // P U | |
134 SHADER_COPY_TEXTURE_FLIP_Y, // F P U | |
135 }; | 104 }; |
136 | 105 |
137 unsigned index = (flip_y ? (1 << 0) : 0) | | 106 unsigned index = flip_y ? 1 : 0; |
138 (premultiply_alpha ? (1 << 1) : 0) | | |
139 (unpremultiply_alpha ? (1 << 2) : 0); | |
140 return shader_ids[index]; | 107 return shader_ids[index]; |
141 } | 108 } |
142 | 109 |
143 SamplerId GetSamplerId(GLenum source_target) { | 110 // Returns the correct fragment shader id to evaluate the copy operation for |
144 switch (source_target) { | 111 // the premultiply alpha pixel store settings and target. |
| 112 FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, |
| 113 bool unpremultiply_alpha, |
| 114 GLenum target) { |
| 115 enum { |
| 116 SAMPLER_2D, |
| 117 SAMPLER_EXTERNAL_OES, |
| 118 NUM_SAMPLERS |
| 119 }; |
| 120 |
| 121 // bit 0: premultiply alpha |
| 122 // bit 1: unpremultiply alpha |
| 123 static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { |
| 124 { |
| 125 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 126 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 127 }, |
| 128 { |
| 129 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 130 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 131 }, |
| 132 { |
| 133 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
| 134 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 135 }, |
| 136 { |
| 137 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 138 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 139 }}; |
| 140 |
| 141 unsigned index = (premultiply_alpha ? (1 << 0) : 0) | |
| 142 (unpremultiply_alpha ? (1 << 1) : 0); |
| 143 |
| 144 switch (target) { |
145 case GL_TEXTURE_2D: | 145 case GL_TEXTURE_2D: |
146 return SAMPLER_TEXTURE_2D; | 146 return shader_ids[index][SAMPLER_2D]; |
147 case GL_TEXTURE_EXTERNAL_OES: | 147 case GL_TEXTURE_EXTERNAL_OES: |
148 return SAMPLER_TEXTURE_EXTERNAL_OES; | 148 return shader_ids[index][SAMPLER_EXTERNAL_OES]; |
| 149 default: |
| 150 break; |
149 } | 151 } |
150 | 152 |
151 NOTREACHED(); | 153 NOTREACHED(); |
152 return SAMPLER_TEXTURE_2D; | 154 return shader_ids[index][SAMPLER_2D]; |
153 } | 155 } |
154 | 156 |
155 void CompileShader(GLuint shader, const char* shader_source) { | 157 void CompileShader(GLuint shader, const char* shader_source) { |
156 glShaderSource(shader, 1, &shader_source, 0); | 158 glShaderSource(shader, 1, &shader_source, 0); |
157 glCompileShader(shader); | 159 glCompileShader(shader); |
158 #ifndef NDEBUG | 160 #ifndef NDEBUG |
159 GLint compile_status; | 161 GLint compile_status; |
160 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); | 162 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); |
161 if (GL_TRUE != compile_status) | 163 if (GL_TRUE != compile_status) |
162 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; | 164 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; |
163 #endif | 165 #endif |
164 } | 166 } |
165 | 167 |
| 168 void DeleteShader(GLuint shader) { |
| 169 if (shader) |
| 170 glDeleteShader(shader); |
| 171 } |
| 172 |
166 } // namespace | 173 } // namespace |
167 | 174 |
168 namespace gpu { | 175 namespace gpu { |
169 | 176 |
170 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() | 177 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() |
171 : initialized_(false), buffer_id_(0), framebuffer_(0), vertex_shader_(0) { | 178 : initialized_(false), |
172 } | 179 vertex_shaders_(NUM_VERTEX_SHADERS, 0u), |
| 180 fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u), |
| 181 buffer_id_(0u), |
| 182 framebuffer_(0u) {} |
173 | 183 |
174 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() {} | 184 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() {} |
175 | 185 |
176 void CopyTextureCHROMIUMResourceManager::Initialize( | 186 void CopyTextureCHROMIUMResourceManager::Initialize( |
177 const gles2::GLES2Decoder* decoder) { | 187 const gles2::GLES2Decoder* decoder) { |
178 COMPILE_ASSERT( | 188 COMPILE_ASSERT( |
179 kVertexPositionAttrib == 0u, | 189 kVertexPositionAttrib == 0u, |
180 Position_attribs_must_be_0); | 190 Position_attribs_must_be_0); |
181 | 191 |
182 // Initialize all of the GPU resources required to perform the copy. | 192 // Initialize all of the GPU resources required to perform the copy. |
183 glGenBuffersARB(1, &buffer_id_); | 193 glGenBuffersARB(1, &buffer_id_); |
184 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 194 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
185 glBufferData(GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, | 195 const GLfloat kQuadVertices[] = {-1.0f, -1.0f, |
186 GL_STATIC_DRAW); | 196 1.0f, -1.0f, |
| 197 1.0f, 1.0f, |
| 198 -1.0f, 1.0f}; |
| 199 glBufferData( |
| 200 GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW); |
187 | 201 |
188 glGenFramebuffersEXT(1, &framebuffer_); | 202 glGenFramebuffersEXT(1, &framebuffer_); |
189 | 203 |
190 vertex_shader_ = glCreateShader(GL_VERTEX_SHADER); | |
191 CompileShader(vertex_shader_, vertex_shader_source); | |
192 | |
193 decoder->RestoreBufferBindings(); | 204 decoder->RestoreBufferBindings(); |
194 | 205 |
195 initialized_ = true; | 206 initialized_ = true; |
196 } | 207 } |
197 | 208 |
198 void CopyTextureCHROMIUMResourceManager::Destroy() { | 209 void CopyTextureCHROMIUMResourceManager::Destroy() { |
199 if (!initialized_) | 210 if (!initialized_) |
200 return; | 211 return; |
201 | 212 |
202 glDeleteFramebuffersEXT(1, &framebuffer_); | 213 glDeleteFramebuffersEXT(1, &framebuffer_); |
203 | 214 |
204 glDeleteShader(vertex_shader_); | 215 std::for_each(vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader); |
| 216 std::for_each( |
| 217 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); |
| 218 |
205 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); | 219 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); |
206 ++it) { | 220 ++it) { |
207 const ProgramInfo& info = it->second; | 221 const ProgramInfo& info = it->second; |
208 glDeleteProgram(info.program); | 222 glDeleteProgram(info.program); |
209 } | 223 } |
210 | 224 |
211 glDeleteBuffersARB(1, &buffer_id_); | 225 glDeleteBuffersARB(1, &buffer_id_); |
212 } | 226 } |
213 | 227 |
214 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( | 228 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 bool premultiply_alpha, | 260 bool premultiply_alpha, |
247 bool unpremultiply_alpha, | 261 bool unpremultiply_alpha, |
248 const GLfloat transform_matrix[16]) { | 262 const GLfloat transform_matrix[16]) { |
249 DCHECK(source_target == GL_TEXTURE_2D || | 263 DCHECK(source_target == GL_TEXTURE_2D || |
250 source_target == GL_TEXTURE_EXTERNAL_OES); | 264 source_target == GL_TEXTURE_EXTERNAL_OES); |
251 if (!initialized_) { | 265 if (!initialized_) { |
252 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 266 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
253 return; | 267 return; |
254 } | 268 } |
255 | 269 |
256 ShaderId shader_id = | 270 VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); |
257 GetShaderId(flip_y, premultiply_alpha, unpremultiply_alpha); | 271 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); |
258 SamplerId sampler_id = GetSamplerId(source_target); | 272 GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; |
| 273 if (!*vertex_shader) { |
| 274 *vertex_shader = glCreateShader(GL_VERTEX_SHADER); |
| 275 CompileShader(*vertex_shader, vertex_shader_source[vertex_shader_id]); |
| 276 } |
259 | 277 |
260 ProgramMapKey key(shader_id, sampler_id); | 278 FragmentShaderId fragment_shader_id = GetFragmentShaderId( |
| 279 premultiply_alpha, unpremultiply_alpha, source_target); |
| 280 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); |
| 281 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; |
| 282 if (!*fragment_shader) { |
| 283 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); |
| 284 CompileShader(*fragment_shader, fragment_shader_source[fragment_shader_id]); |
| 285 } |
| 286 |
| 287 ProgramMapKey key(vertex_shader_id, fragment_shader_id); |
261 ProgramInfo* info = &programs_[key]; | 288 ProgramInfo* info = &programs_[key]; |
262 // Create program if necessary. | 289 // Create program if necessary. |
263 if (!info->program) { | 290 if (!info->program) { |
264 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER); | |
265 CompileShader(shader, fragment_shader_source[shader_id][sampler_id]); | |
266 info->program = glCreateProgram(); | 291 info->program = glCreateProgram(); |
267 glAttachShader(info->program, vertex_shader_); | 292 glAttachShader(info->program, *vertex_shader); |
268 glAttachShader(info->program, shader); | 293 glAttachShader(info->program, *fragment_shader); |
269 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); | 294 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); |
270 glLinkProgram(info->program); | 295 glLinkProgram(info->program); |
271 #ifndef NDEBUG | 296 #ifndef NDEBUG |
272 GLint linked; | 297 GLint linked; |
273 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); | 298 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); |
274 if (!linked) | 299 if (!linked) |
275 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; | 300 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; |
276 #endif | 301 #endif |
277 info->sampler_locations = | |
278 glGetUniformLocation(info->program, "u_texSampler"); | |
279 info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); | 302 info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); |
280 glDeleteShader(shader); | 303 info->sampler_handle = glGetUniformLocation(info->program, "u_sampler"); |
281 } | 304 } |
282 glUseProgram(info->program); | 305 glUseProgram(info->program); |
283 | 306 |
284 #ifndef NDEBUG | 307 #ifndef NDEBUG |
285 glValidateProgram(info->program); | 308 glValidateProgram(info->program); |
286 GLint validation_status; | 309 GLint validation_status; |
287 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); | 310 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); |
288 if (GL_TRUE != validation_status) { | 311 if (GL_TRUE != validation_status) { |
289 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; | 312 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; |
290 return; | 313 return; |
(...skipping 17 matching lines...) Expand all Loading... |
308 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 331 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
309 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { | 332 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { |
310 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; | 333 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; |
311 } else | 334 } else |
312 #endif | 335 #endif |
313 { | 336 { |
314 decoder->ClearAllAttributes(); | 337 decoder->ClearAllAttributes(); |
315 glEnableVertexAttribArray(kVertexPositionAttrib); | 338 glEnableVertexAttribArray(kVertexPositionAttrib); |
316 | 339 |
317 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 340 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
318 glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, | 341 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); |
319 4 * sizeof(GLfloat), 0); | |
320 | 342 |
321 glUniform1i(info->sampler_locations, 0); | 343 glUniform1i(info->sampler_handle, 0); |
322 | 344 |
323 glBindTexture(source_target, source_id); | 345 glBindTexture(source_target, source_id); |
324 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 346 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
325 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 347 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
326 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 348 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
327 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 349 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
328 | 350 |
329 glDisable(GL_DEPTH_TEST); | 351 glDisable(GL_DEPTH_TEST); |
330 glDisable(GL_SCISSOR_TEST); | 352 glDisable(GL_SCISSOR_TEST); |
331 glDisable(GL_STENCIL_TEST); | 353 glDisable(GL_STENCIL_TEST); |
(...skipping 10 matching lines...) Expand all Loading... |
342 decoder->RestoreTextureState(source_id); | 364 decoder->RestoreTextureState(source_id); |
343 decoder->RestoreTextureState(dest_id); | 365 decoder->RestoreTextureState(dest_id); |
344 decoder->RestoreTextureUnitBindings(0); | 366 decoder->RestoreTextureUnitBindings(0); |
345 decoder->RestoreActiveTexture(); | 367 decoder->RestoreActiveTexture(); |
346 decoder->RestoreProgramBindings(); | 368 decoder->RestoreProgramBindings(); |
347 decoder->RestoreBufferBindings(); | 369 decoder->RestoreBufferBindings(); |
348 decoder->RestoreFramebufferBindings(); | 370 decoder->RestoreFramebufferBindings(); |
349 decoder->RestoreGlobalState(); | 371 decoder->RestoreGlobalState(); |
350 } | 372 } |
351 | 373 |
352 } // namespace | 374 } // namespace gpu |
353 | |
OLD | NEW |