| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "gpu/command_buffer/service/gl_utils.h" | 10 #include "gpu/command_buffer/service/gl_utils.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 "#define TextureLookup texture2DRect\n" SHADER(src) | 25 "#define TextureLookup texture2DRect\n" SHADER(src) |
| 26 #define SHADER_EXTERNAL_OES(src) \ | 26 #define SHADER_EXTERNAL_OES(src) \ |
| 27 "#extension GL_OES_EGL_image_external : require\n" \ | 27 "#extension GL_OES_EGL_image_external : require\n" \ |
| 28 "#define SamplerType samplerExternalOES\n" \ | 28 "#define SamplerType samplerExternalOES\n" \ |
| 29 "#define TextureLookup texture2D\n" SHADER(src) | 29 "#define TextureLookup texture2D\n" SHADER(src) |
| 30 #define FRAGMENT_SHADERS(src) \ | 30 #define FRAGMENT_SHADERS(src) \ |
| 31 SHADER_2D(src), SHADER_RECTANGLE_ARB(src), SHADER_EXTERNAL_OES(src) | 31 SHADER_2D(src), SHADER_RECTANGLE_ARB(src), SHADER_EXTERNAL_OES(src) |
| 32 | 32 |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, | |
| 36 0.0f, 1.0f, 0.0f, 0.0f, | |
| 37 0.0f, 0.0f, 1.0f, 0.0f, | |
| 38 0.0f, 0.0f, 0.0f, 1.0f}; | |
| 39 | |
| 40 enum VertexShaderId { | 35 enum VertexShaderId { |
| 41 VERTEX_SHADER_COPY_TEXTURE, | 36 VERTEX_SHADER_COPY_TEXTURE, |
| 42 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, | 37 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, |
| 43 NUM_VERTEX_SHADERS, | 38 NUM_VERTEX_SHADERS, |
| 44 }; | 39 }; |
| 45 | 40 |
| 46 enum FragmentShaderId { | 41 enum FragmentShaderId { |
| 47 FRAGMENT_SHADER_COPY_TEXTURE_2D, | 42 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 48 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, | 43 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 49 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, | 44 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 #endif | 181 #endif |
| 187 } | 182 } |
| 188 | 183 |
| 189 void DeleteShader(GLuint shader) { | 184 void DeleteShader(GLuint shader) { |
| 190 if (shader) | 185 if (shader) |
| 191 glDeleteShader(shader); | 186 glDeleteShader(shader); |
| 192 } | 187 } |
| 193 | 188 |
| 194 bool BindFramebufferTexture2D(GLenum target, | 189 bool BindFramebufferTexture2D(GLenum target, |
| 195 GLuint texture_id, | 190 GLuint texture_id, |
| 191 GLint level, |
| 196 GLuint framebuffer) { | 192 GLuint framebuffer) { |
| 197 DCHECK(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB); | 193 DCHECK(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB); |
| 198 glActiveTexture(GL_TEXTURE0); | 194 glActiveTexture(GL_TEXTURE0); |
| 199 glBindTexture(target, texture_id); | 195 glBindTexture(target, texture_id); |
| 200 // NVidia drivers require texture settings to be a certain way | 196 // NVidia drivers require texture settings to be a certain way |
| 201 // or they won't report FRAMEBUFFER_COMPLETE. | 197 // or they won't report FRAMEBUFFER_COMPLETE. |
| 202 glTexParameterf(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 198 glTexParameterf(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 203 glTexParameterf(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 199 glTexParameterf(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 204 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 200 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 205 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 201 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 206 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); | 202 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); |
| 207 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, | 203 glFramebufferTexture2DEXT( |
| 208 texture_id, 0); | 204 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, texture_id, level); |
| 209 | 205 |
| 210 #ifndef NDEBUG | 206 #ifndef NDEBUG |
| 211 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 207 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
| 212 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { | 208 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { |
| 213 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; | 209 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; |
| 214 return false; | 210 return false; |
| 215 } | 211 } |
| 216 #endif | 212 #endif |
| 217 return true; | 213 return true; |
| 218 } | 214 } |
| 219 | 215 |
| 220 void DoCopyTexImage2D(const gpu::gles2::GLES2Decoder* decoder, | 216 void DoCopyTexImage2D(const gpu::gles2::GLES2Decoder* decoder, |
| 221 GLenum source_target, | 217 GLenum source_target, |
| 222 GLuint source_id, | 218 GLuint source_id, |
| 223 GLuint dest_id, | 219 GLuint dest_id, |
| 220 GLint dest_level, |
| 224 GLenum dest_internal_format, | 221 GLenum dest_internal_format, |
| 225 GLsizei width, | 222 GLsizei width, |
| 226 GLsizei height, | 223 GLsizei height, |
| 227 GLuint framebuffer) { | 224 GLuint framebuffer) { |
| 228 DCHECK(source_target == GL_TEXTURE_2D || | 225 DCHECK(source_target == GL_TEXTURE_2D || |
| 229 source_target == GL_TEXTURE_RECTANGLE_ARB); | 226 source_target == GL_TEXTURE_RECTANGLE_ARB); |
| 230 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { | 227 if (BindFramebufferTexture2D( |
| 228 source_target, source_id, 0 /* level */, framebuffer)) { |
| 231 glBindTexture(GL_TEXTURE_2D, dest_id); | 229 glBindTexture(GL_TEXTURE_2D, dest_id); |
| 232 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 230 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 233 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 231 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 234 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 232 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 235 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 233 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 236 glCopyTexImage2D(GL_TEXTURE_2D, 0 /* level */, dest_internal_format, | 234 glCopyTexImage2D(GL_TEXTURE_2D, |
| 237 0 /* x */, 0 /* y */, width, height, 0 /* border */); | 235 dest_level, |
| 236 dest_internal_format, |
| 237 0 /* x */, |
| 238 0 /* y */, |
| 239 width, |
| 240 height, |
| 241 0 /* border */); |
| 238 } | 242 } |
| 239 | 243 |
| 240 decoder->RestoreTextureState(source_id); | 244 decoder->RestoreTextureState(source_id); |
| 241 decoder->RestoreTextureState(dest_id); | 245 decoder->RestoreTextureState(dest_id); |
| 242 decoder->RestoreTextureUnitBindings(0); | 246 decoder->RestoreTextureUnitBindings(0); |
| 243 decoder->RestoreActiveTexture(); | 247 decoder->RestoreActiveTexture(); |
| 244 decoder->RestoreFramebufferBindings(); | 248 decoder->RestoreFramebufferBindings(); |
| 245 } | 249 } |
| 246 | 250 |
| 247 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, | |
| 248 GLenum source_target, | |
| 249 GLuint source_id, | |
| 250 GLuint dest_id, | |
| 251 GLint xoffset, | |
| 252 GLint yoffset, | |
| 253 GLsizei source_width, | |
| 254 GLsizei source_height, | |
| 255 GLuint framebuffer) { | |
| 256 DCHECK(source_target == GL_TEXTURE_2D || | |
| 257 source_target == GL_TEXTURE_RECTANGLE_ARB); | |
| 258 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { | |
| 259 glBindTexture(GL_TEXTURE_2D, dest_id); | |
| 260 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | |
| 261 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
| 262 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
| 263 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |
| 264 glCopyTexSubImage2D(GL_TEXTURE_2D, 0 /* level */, xoffset, yoffset, | |
| 265 0 /* x */, 0 /* y */, source_width, source_height); | |
| 266 } | |
| 267 | |
| 268 decoder->RestoreTextureState(source_id); | |
| 269 decoder->RestoreTextureState(dest_id); | |
| 270 decoder->RestoreTextureUnitBindings(0); | |
| 271 decoder->RestoreActiveTexture(); | |
| 272 decoder->RestoreFramebufferBindings(); | |
| 273 } | |
| 274 | |
| 275 // Copy from SkMatrix44::preTranslate | |
| 276 void PreTranslate(GLfloat* matrix, GLfloat dx, GLfloat dy, GLfloat dz) { | |
| 277 if (!dx && !dy && !dz) | |
| 278 return; | |
| 279 | |
| 280 for (int i = 0; i < 4; ++i) { | |
| 281 matrix[(3 * 4) + i] = matrix[(0 * 4) + i] * dx + matrix[(1 * 4) + i] * dy + | |
| 282 matrix[(2 * 4) + i] * dz + matrix[(3 * 4) + i]; | |
| 283 } | |
| 284 } | |
| 285 | |
| 286 } // namespace | 251 } // namespace |
| 287 | 252 |
| 288 namespace gpu { | 253 namespace gpu { |
| 289 | 254 |
| 290 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() | 255 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() |
| 291 : initialized_(false), | 256 : initialized_(false), |
| 292 vertex_shaders_(NUM_VERTEX_SHADERS, 0u), | 257 vertex_shaders_(NUM_VERTEX_SHADERS, 0u), |
| 293 fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u), | 258 fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u), |
| 294 buffer_id_(0u), | 259 buffer_id_(0u), |
| 295 framebuffer_(0u) {} | 260 framebuffer_(0u) {} |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 glDeleteBuffersARB(1, &buffer_id_); | 311 glDeleteBuffersARB(1, &buffer_id_); |
| 347 buffer_id_ = 0; | 312 buffer_id_ = 0; |
| 348 } | 313 } |
| 349 | 314 |
| 350 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( | 315 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
| 351 const gles2::GLES2Decoder* decoder, | 316 const gles2::GLES2Decoder* decoder, |
| 352 GLenum source_target, | 317 GLenum source_target, |
| 353 GLuint source_id, | 318 GLuint source_id, |
| 354 GLenum source_internal_format, | 319 GLenum source_internal_format, |
| 355 GLuint dest_id, | 320 GLuint dest_id, |
| 321 GLint dest_level, |
| 356 GLenum dest_internal_format, | 322 GLenum dest_internal_format, |
| 357 GLsizei width, | 323 GLsizei width, |
| 358 GLsizei height, | 324 GLsizei height, |
| 359 bool flip_y, | 325 bool flip_y, |
| 360 bool premultiply_alpha, | 326 bool premultiply_alpha, |
| 361 bool unpremultiply_alpha) { | 327 bool unpremultiply_alpha) { |
| 362 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 328 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 363 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's | 329 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's |
| 364 // format does not contain a superset of the components required by the base | 330 // format does not contain a superset of the components required by the base |
| 365 // format of internalformat. | 331 // format of internalformat. |
| 366 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml | 332 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml |
| 367 bool source_format_contain_superset_of_dest_format = | 333 bool source_format_contain_superset_of_dest_format = |
| 368 (source_internal_format == dest_internal_format && | 334 (source_internal_format == dest_internal_format && |
| 369 source_internal_format != GL_BGRA_EXT) || | 335 source_internal_format != GL_BGRA_EXT) || |
| 370 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); | 336 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); |
| 371 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 337 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, |
| 372 // so restrict this to GL_TEXTURE_2D. | 338 // so restrict this to GL_TEXTURE_2D. |
| 373 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | 339 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && |
| 374 source_format_contain_superset_of_dest_format) { | 340 source_format_contain_superset_of_dest_format) { |
| 375 DoCopyTexImage2D(decoder, | 341 DoCopyTexImage2D(decoder, |
| 376 source_target, | 342 source_target, |
| 377 source_id, | 343 source_id, |
| 378 dest_id, | 344 dest_id, |
| 345 dest_level, |
| 379 dest_internal_format, | 346 dest_internal_format, |
| 380 width, | 347 width, |
| 381 height, | 348 height, |
| 382 framebuffer_); | 349 framebuffer_); |
| 383 return; | 350 return; |
| 384 } | 351 } |
| 385 | 352 |
| 386 // Use kIdentityMatrix if no transform passed in. | 353 // Use default transform matrix if no transform passed in. |
| 387 DoCopyTextureWithTransform(decoder, source_target, source_id, dest_id, width, | 354 const static GLfloat default_matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, |
| 388 height, flip_y, premultiply_alpha, | 355 0.0f, 1.0f, 0.0f, 0.0f, |
| 389 unpremultiply_alpha, kIdentityMatrix); | 356 0.0f, 0.0f, 1.0f, 0.0f, |
| 390 } | 357 0.0f, 0.0f, 0.0f, 1.0f}; |
| 391 | 358 DoCopyTextureWithTransform(decoder, |
| 392 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( | 359 source_target, |
| 393 const gles2::GLES2Decoder* decoder, | 360 source_id, |
| 394 GLenum source_target, | 361 dest_id, |
| 395 GLuint source_id, | 362 dest_level, |
| 396 GLenum source_internal_format, | 363 width, |
| 397 GLuint dest_id, | 364 height, |
| 398 GLenum dest_internal_format, | 365 flip_y, |
| 399 GLint xoffset, | 366 premultiply_alpha, |
| 400 GLint yoffset, | 367 unpremultiply_alpha, |
| 401 GLsizei dest_width, | 368 default_matrix); |
| 402 GLsizei dest_height, | |
| 403 GLsizei source_width, | |
| 404 GLsizei source_height, | |
| 405 bool flip_y, | |
| 406 bool premultiply_alpha, | |
| 407 bool unpremultiply_alpha) { | |
| 408 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | |
| 409 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's | |
| 410 // format does not contain a superset of the components required by the base | |
| 411 // format of internalformat. | |
| 412 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml | |
| 413 bool source_format_contain_superset_of_dest_format = | |
| 414 (source_internal_format == dest_internal_format && | |
| 415 source_internal_format != GL_BGRA_EXT) || | |
| 416 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); | |
| 417 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | |
| 418 // so restrict this to GL_TEXTURE_2D. | |
| 419 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | |
| 420 source_format_contain_superset_of_dest_format) { | |
| 421 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset, | |
| 422 yoffset, source_width, source_height, framebuffer_); | |
| 423 return; | |
| 424 } | |
| 425 | |
| 426 // Use kIdentityMatrix if no transform passed in. | |
| 427 DoCopySubTextureWithTransform( | |
| 428 decoder, source_target, source_id, dest_id, xoffset, yoffset, dest_width, | |
| 429 dest_height, source_width, source_height, flip_y, premultiply_alpha, | |
| 430 unpremultiply_alpha, kIdentityMatrix); | |
| 431 } | 369 } |
| 432 | 370 |
| 433 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( | 371 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( |
| 434 const gles2::GLES2Decoder* decoder, | 372 const gles2::GLES2Decoder* decoder, |
| 435 GLenum source_target, | 373 GLenum source_target, |
| 436 GLuint source_id, | 374 GLuint source_id, |
| 437 GLuint dest_id, | 375 GLuint dest_id, |
| 376 GLint dest_level, |
| 438 GLsizei width, | 377 GLsizei width, |
| 439 GLsizei height, | 378 GLsizei height, |
| 440 bool flip_y, | 379 bool flip_y, |
| 441 bool premultiply_alpha, | 380 bool premultiply_alpha, |
| 442 bool unpremultiply_alpha, | 381 bool unpremultiply_alpha, |
| 443 const GLfloat transform_matrix[16]) { | |
| 444 GLsizei dest_width = width; | |
| 445 GLsizei dest_height = height; | |
| 446 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, 0, 0, | |
| 447 dest_width, dest_height, width, height, flip_y, | |
| 448 premultiply_alpha, unpremultiply_alpha, | |
| 449 transform_matrix); | |
| 450 } | |
| 451 | |
| 452 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( | |
| 453 const gles2::GLES2Decoder* decoder, | |
| 454 GLenum source_target, | |
| 455 GLuint source_id, | |
| 456 GLuint dest_id, | |
| 457 GLint xoffset, | |
| 458 GLint yoffset, | |
| 459 GLsizei dest_width, | |
| 460 GLsizei dest_height, | |
| 461 GLsizei source_width, | |
| 462 GLsizei source_height, | |
| 463 bool flip_y, | |
| 464 bool premultiply_alpha, | |
| 465 bool unpremultiply_alpha, | |
| 466 const GLfloat transform_matrix[16]) { | |
| 467 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset, | |
| 468 yoffset, dest_width, dest_height, source_width, | |
| 469 source_height, flip_y, premultiply_alpha, | |
| 470 unpremultiply_alpha, transform_matrix); | |
| 471 } | |
| 472 | |
| 473 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( | |
| 474 const gles2::GLES2Decoder* decoder, | |
| 475 GLenum source_target, | |
| 476 GLuint source_id, | |
| 477 GLuint dest_id, | |
| 478 GLint xoffset, | |
| 479 GLint yoffset, | |
| 480 GLsizei dest_width, | |
| 481 GLsizei dest_height, | |
| 482 GLsizei source_width, | |
| 483 GLsizei source_height, | |
| 484 bool flip_y, | |
| 485 bool premultiply_alpha, | |
| 486 bool unpremultiply_alpha, | |
| 487 const GLfloat transform_matrix[16]) { | 382 const GLfloat transform_matrix[16]) { |
| 488 DCHECK(source_target == GL_TEXTURE_2D || | 383 DCHECK(source_target == GL_TEXTURE_2D || |
| 489 source_target == GL_TEXTURE_RECTANGLE_ARB || | 384 source_target == GL_TEXTURE_RECTANGLE_ARB || |
| 490 source_target == GL_TEXTURE_EXTERNAL_OES); | 385 source_target == GL_TEXTURE_EXTERNAL_OES); |
| 491 DCHECK(xoffset >= 0 && xoffset + source_width <= dest_width); | |
| 492 DCHECK(yoffset >= 0 && yoffset + source_height <= dest_height); | |
| 493 if (!initialized_) { | 386 if (!initialized_) { |
| 494 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 387 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
| 495 return; | 388 return; |
| 496 } | 389 } |
| 497 | 390 |
| 498 VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); | 391 VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); |
| 499 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); | 392 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); |
| 500 FragmentShaderId fragment_shader_id = GetFragmentShaderId( | 393 FragmentShaderId fragment_shader_id = GetFragmentShaderId( |
| 501 premultiply_alpha, unpremultiply_alpha, source_target); | 394 premultiply_alpha, unpremultiply_alpha, source_target); |
| 502 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); | 395 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 #ifndef NDEBUG | 429 #ifndef NDEBUG |
| 537 glValidateProgram(info->program); | 430 glValidateProgram(info->program); |
| 538 GLint validation_status; | 431 GLint validation_status; |
| 539 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); | 432 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); |
| 540 if (GL_TRUE != validation_status) { | 433 if (GL_TRUE != validation_status) { |
| 541 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; | 434 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; |
| 542 return; | 435 return; |
| 543 } | 436 } |
| 544 #endif | 437 #endif |
| 545 | 438 |
| 546 if (!xoffset && !yoffset) { | 439 glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix); |
| 547 glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix); | |
| 548 } else { | |
| 549 // transform offsets from ([0, dest_width], [0, dest_height]) coord. | |
| 550 // to ([-1, 1], [-1, 1]) coord. | |
| 551 GLfloat xoffset_on_vertex = ((2.f * xoffset) / dest_width); | |
| 552 GLfloat yoffset_on_vertex = ((2.f * yoffset) / dest_height); | |
| 553 | |
| 554 // Pass view_matrix * offset_matrix to the program. | |
| 555 GLfloat view_transform[16]; | |
| 556 memcpy(view_transform, transform_matrix, 16 * sizeof(GLfloat)); | |
| 557 PreTranslate(view_transform, xoffset_on_vertex, yoffset_on_vertex, 0); | |
| 558 glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, view_transform); | |
| 559 } | |
| 560 if (source_target == GL_TEXTURE_RECTANGLE_ARB) | 440 if (source_target == GL_TEXTURE_RECTANGLE_ARB) |
| 561 glUniform2f(info->half_size_handle, source_width / 2.0f, | 441 glUniform2f(info->half_size_handle, width / 2.0f, height / 2.0f); |
| 562 source_height / 2.0f); | |
| 563 else | 442 else |
| 564 glUniform2f(info->half_size_handle, 0.5f, 0.5f); | 443 glUniform2f(info->half_size_handle, 0.5f, 0.5f); |
| 565 | 444 |
| 566 if (BindFramebufferTexture2D(GL_TEXTURE_2D, dest_id, framebuffer_)) { | 445 if (BindFramebufferTexture2D( |
| 446 GL_TEXTURE_2D, dest_id, dest_level, framebuffer_)) { |
| 567 decoder->ClearAllAttributes(); | 447 decoder->ClearAllAttributes(); |
| 568 glEnableVertexAttribArray(kVertexPositionAttrib); | 448 glEnableVertexAttribArray(kVertexPositionAttrib); |
| 569 | 449 |
| 570 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 450 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
| 571 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | 451 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); |
| 572 | 452 |
| 573 glUniform1i(info->sampler_handle, 0); | 453 glUniform1i(info->sampler_handle, 0); |
| 574 | 454 |
| 575 glBindTexture(source_target, source_id); | 455 glBindTexture(source_target, source_id); |
| 576 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 456 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 577 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 457 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 578 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 458 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 579 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 459 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 580 | 460 |
| 581 glDisable(GL_DEPTH_TEST); | 461 glDisable(GL_DEPTH_TEST); |
| 582 glDisable(GL_SCISSOR_TEST); | 462 glDisable(GL_SCISSOR_TEST); |
| 583 glDisable(GL_STENCIL_TEST); | 463 glDisable(GL_STENCIL_TEST); |
| 584 glDisable(GL_CULL_FACE); | 464 glDisable(GL_CULL_FACE); |
| 585 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 465 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
| 586 glDepthMask(GL_FALSE); | 466 glDepthMask(GL_FALSE); |
| 587 glDisable(GL_BLEND); | 467 glDisable(GL_BLEND); |
| 588 | 468 |
| 589 glViewport(0, 0, dest_width, dest_height); | 469 glViewport(0, 0, width, height); |
| 590 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | 470 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
| 591 } | 471 } |
| 592 | 472 |
| 593 decoder->RestoreAllAttributes(); | 473 decoder->RestoreAllAttributes(); |
| 594 decoder->RestoreTextureState(source_id); | 474 decoder->RestoreTextureState(source_id); |
| 595 decoder->RestoreTextureState(dest_id); | 475 decoder->RestoreTextureState(dest_id); |
| 596 decoder->RestoreTextureUnitBindings(0); | 476 decoder->RestoreTextureUnitBindings(0); |
| 597 decoder->RestoreActiveTexture(); | 477 decoder->RestoreActiveTexture(); |
| 598 decoder->RestoreProgramBindings(); | 478 decoder->RestoreProgramBindings(); |
| 599 decoder->RestoreBufferBindings(); | 479 decoder->RestoreBufferBindings(); |
| 600 decoder->RestoreFramebufferBindings(); | 480 decoder->RestoreFramebufferBindings(); |
| 601 decoder->RestoreGlobalState(); | 481 decoder->RestoreGlobalState(); |
| 602 } | 482 } |
| 603 | 483 |
| 604 } // namespace gpu | 484 } // namespace gpu |
| OLD | NEW |