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

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

Issue 257803011: gpu: Optimize and cleanup shader code used for CHROMIUM_copy_texture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix DCHECK_LTs Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698