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

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

Issue 1401423003: Re-land: ui: Move GLImage::BindTexImage fallback from GLImage implementations to GLES2CmdDecoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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
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_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 1948 matching lines...) Expand 10 before | Expand all | Expand 10 after
1959 bool IsDrawValid( 1959 bool IsDrawValid(
1960 const char* function_name, GLuint max_vertex_accessed, bool instanced, 1960 const char* function_name, GLuint max_vertex_accessed, bool instanced,
1961 GLsizei primcount); 1961 GLsizei primcount);
1962 1962
1963 // Returns true if successful, simulated will be true if attrib0 was 1963 // Returns true if successful, simulated will be true if attrib0 was
1964 // simulated. 1964 // simulated.
1965 bool SimulateAttrib0( 1965 bool SimulateAttrib0(
1966 const char* function_name, GLuint max_vertex_accessed, bool* simulated); 1966 const char* function_name, GLuint max_vertex_accessed, bool* simulated);
1967 void RestoreStateForAttrib(GLuint attrib, bool restore_array_binding); 1967 void RestoreStateForAttrib(GLuint attrib, bool restore_array_binding);
1968 1968
1969 // If an image is bound to texture, this will call Will/DidUseTexImage 1969 // Calls WillUseTexImage or copies the image to the texture currently bound
1970 // to |textarget| based on the value of |image_state|. The new image state is
1971 // returned.
1972 Texture::ImageState DoWillUseTexImage(GLenum textarget,
1973 gfx::GLImage* image,
1974 Texture::ImageState image_state);
1975
1976 // Calls DidUseTexImage based on the value of |image_state|.
1977 void DoDidUseTexImage(gfx::GLImage* image, Texture::ImageState image_state);
1978
1979 // If an image is bound to texture, this will call DoWill/DidUseTexImage
1970 // if needed. 1980 // if needed.
1971 void DoWillUseTexImageIfNeeded(Texture* texture, GLenum textarget); 1981 void DoWillUseTexImageIfNeeded(Texture* texture, GLenum textarget);
1972 void DoDidUseTexImageIfNeeded(Texture* texture, GLenum textarget); 1982 void DoDidUseTexImageIfNeeded(Texture* texture, GLenum textarget);
1973 1983
1974 // Returns false if textures were replaced. 1984 // Returns false if textures were replaced.
1975 bool PrepareTexturesForRender(); 1985 bool PrepareTexturesForRender();
1976 void RestoreStateForTextures(); 1986 void RestoreStateForTextures();
1977 1987
1978 // Returns true if GL_FIXED attribs were simulated. 1988 // Returns true if GL_FIXED attribs were simulated.
1979 bool SimulateFixedAttribs( 1989 bool SimulateFixedAttribs(
(...skipping 5635 matching lines...) Expand 10 before | Expand all | Expand 10 after
7615 const char* filename, int line, const std::string& msg) { 7625 const char* filename, int line, const std::string& msg) {
7616 logger_.LogMessage(filename, line, std::string("RENDER WARNING: ") + msg); 7626 logger_.LogMessage(filename, line, std::string("RENDER WARNING: ") + msg);
7617 } 7627 }
7618 7628
7619 void GLES2DecoderImpl::PerformanceWarning( 7629 void GLES2DecoderImpl::PerformanceWarning(
7620 const char* filename, int line, const std::string& msg) { 7630 const char* filename, int line, const std::string& msg) {
7621 logger_.LogMessage(filename, line, 7631 logger_.LogMessage(filename, line,
7622 std::string("PERFORMANCE WARNING: ") + msg); 7632 std::string("PERFORMANCE WARNING: ") + msg);
7623 } 7633 }
7624 7634
7635 Texture::ImageState GLES2DecoderImpl::DoWillUseTexImage(
7636 GLenum textarget,
7637 gfx::GLImage* image,
7638 Texture::ImageState image_state) {
7639 switch (image_state) {
7640 case Texture::UNBOUND: {
7641 bool rv = image->CopyTexImage(textarget);
7642 DCHECK(rv) << "Both BindTexImage() and CopyTexImage() failed";
7643 return Texture::COPIED;
Daniele Castagna 2015/10/14 18:40:35 nit: should this be UNBOUND, not that it matters.
reveman 2015/10/14 19:28:01 State should change to COPIED to prevent us from c
7644 }
7645 case Texture::BOUND:
7646 image->WillUseTexImage();
7647 return Texture::BOUND;
7648 case Texture::COPIED:
7649 return Texture::COPIED;
7650 }
7651
7652 NOTREACHED();
7653 return Texture::UNBOUND;
7654 }
7655
7656 void GLES2DecoderImpl::DoDidUseTexImage(gfx::GLImage* image,
7657 Texture::ImageState image_state) {
7658 switch (image_state) {
7659 case Texture::BOUND:
7660 image->DidUseTexImage();
7661 return;
7662 case Texture::UNBOUND:
7663 case Texture::COPIED:
7664 return;
7665 }
7666
7667 NOTREACHED();
7668 }
7669
7625 void GLES2DecoderImpl::DoWillUseTexImageIfNeeded( 7670 void GLES2DecoderImpl::DoWillUseTexImageIfNeeded(
7626 Texture* texture, GLenum textarget) { 7671 Texture* texture, GLenum textarget) {
7627 // Image is already in use if texture is attached to a framebuffer. 7672 // Image is already in use if texture is attached to a framebuffer.
7628 if (texture && !texture->IsAttachedToFramebuffer()) { 7673 if (texture && !texture->IsAttachedToFramebuffer()) {
7629 gfx::GLImage* image = texture->GetLevelImage(textarget, 0); 7674 Texture::ImageState image_state;
7675 gfx::GLImage* image = texture->GetLevelImage(textarget, 0, &image_state);
7630 if (image) { 7676 if (image) {
7631 ScopedGLErrorSuppressor suppressor( 7677 ScopedGLErrorSuppressor suppressor(
7632 "GLES2DecoderImpl::DoWillUseTexImageIfNeeded", 7678 "GLES2DecoderImpl::DoWillUseTexImageIfNeeded",
7633 GetErrorState()); 7679 GetErrorState());
7634 glBindTexture(textarget, texture->service_id()); 7680 glBindTexture(textarget, texture->service_id());
7635 image->WillUseTexImage(); 7681 Texture::ImageState new_image_state =
7682 DoWillUseTexImage(textarget, image, image_state);
7636 RestoreCurrentTextureBindings(&state_, textarget); 7683 RestoreCurrentTextureBindings(&state_, textarget);
7684 texture->SetLevelImage(textarget, 0, image, new_image_state);
7637 } 7685 }
7638 } 7686 }
7639 } 7687 }
7640 7688
7641 void GLES2DecoderImpl::DoDidUseTexImageIfNeeded( 7689 void GLES2DecoderImpl::DoDidUseTexImageIfNeeded(
7642 Texture* texture, GLenum textarget) { 7690 Texture* texture, GLenum textarget) {
7643 // Image is still in use if texture is attached to a framebuffer. 7691 // Image is still in use if texture is attached to a framebuffer.
7644 if (texture && !texture->IsAttachedToFramebuffer()) { 7692 if (texture && !texture->IsAttachedToFramebuffer()) {
7645 gfx::GLImage* image = texture->GetLevelImage(textarget, 0); 7693 Texture::ImageState image_state;
7694 gfx::GLImage* image = texture->GetLevelImage(textarget, 0, &image_state);
7646 if (image) { 7695 if (image) {
7647 ScopedGLErrorSuppressor suppressor( 7696 ScopedGLErrorSuppressor suppressor(
7648 "GLES2DecoderImpl::DoDidUseTexImageIfNeeded", 7697 "GLES2DecoderImpl::DoDidUseTexImageIfNeeded",
7649 GetErrorState()); 7698 GetErrorState());
7650 glBindTexture(textarget, texture->service_id()); 7699 glBindTexture(textarget, texture->service_id());
7651 image->DidUseTexImage(); 7700 DoDidUseTexImage(image, image_state);
7652 RestoreCurrentTextureBindings(&state_, textarget); 7701 RestoreCurrentTextureBindings(&state_, textarget);
7653 } 7702 }
7654 } 7703 }
7655 } 7704 }
7656 7705
7657 bool GLES2DecoderImpl::PrepareTexturesForRender() { 7706 bool GLES2DecoderImpl::PrepareTexturesForRender() {
7658 DCHECK(state_.current_program.get()); 7707 DCHECK(state_.current_program.get());
7659 if (!texture_manager()->HaveUnrenderableTextures() && 7708 if (!texture_manager()->HaveUnrenderableTextures() &&
7660 !texture_manager()->HaveImages()) { 7709 !texture_manager()->HaveImages()) {
7661 return true; 7710 return true;
(...skipping 27 matching lines...) Expand all
7689 std::string("texture bound to texture unit ") + 7738 std::string("texture bound to texture unit ") +
7690 base::UintToString(texture_unit_index) + 7739 base::UintToString(texture_unit_index) +
7691 " is not renderable. It maybe non-power-of-2 and have" 7740 " is not renderable. It maybe non-power-of-2 and have"
7692 " incompatible texture filtering."); 7741 " incompatible texture filtering.");
7693 } 7742 }
7694 continue; 7743 continue;
7695 } 7744 }
7696 7745
7697 if (textarget != GL_TEXTURE_CUBE_MAP) { 7746 if (textarget != GL_TEXTURE_CUBE_MAP) {
7698 Texture* texture = texture_ref->texture(); 7747 Texture* texture = texture_ref->texture();
7699 gfx::GLImage* image = texture->GetLevelImage(textarget, 0); 7748 Texture::ImageState image_state;
7749 gfx::GLImage* image =
7750 texture->GetLevelImage(textarget, 0, &image_state);
7700 if (image && !texture->IsAttachedToFramebuffer()) { 7751 if (image && !texture->IsAttachedToFramebuffer()) {
7701 ScopedGLErrorSuppressor suppressor( 7752 ScopedGLErrorSuppressor suppressor(
7702 "GLES2DecoderImpl::PrepareTexturesForRender", GetErrorState()); 7753 "GLES2DecoderImpl::PrepareTexturesForRender", GetErrorState());
7703 textures_set = true; 7754 textures_set = true;
7704 glActiveTexture(GL_TEXTURE0 + texture_unit_index); 7755 glActiveTexture(GL_TEXTURE0 + texture_unit_index);
7705 image->WillUseTexImage(); 7756 Texture::ImageState new_image_state =
7757 DoWillUseTexImage(textarget, image, image_state);
7758 texture->SetLevelImage(textarget, 0, image, new_image_state);
7706 continue; 7759 continue;
7707 } 7760 }
7708 } 7761 }
7709 } 7762 }
7710 // else: should this be an error? 7763 // else: should this be an error?
7711 } 7764 }
7712 } 7765 }
7713 return !textures_set; 7766 return !textures_set;
7714 } 7767 }
7715 7768
(...skipping 17 matching lines...) Expand all
7733 texture_ref = texture_unit.bind_target == GL_TEXTURE_2D 7786 texture_ref = texture_unit.bind_target == GL_TEXTURE_2D
7734 ? texture_unit.bound_texture_2d.get() 7787 ? texture_unit.bound_texture_2d.get()
7735 : texture_unit.bound_texture_cube_map.get(); 7788 : texture_unit.bound_texture_cube_map.get();
7736 glBindTexture(texture_unit.bind_target, 7789 glBindTexture(texture_unit.bind_target,
7737 texture_ref ? texture_ref->service_id() : 0); 7790 texture_ref ? texture_ref->service_id() : 0);
7738 continue; 7791 continue;
7739 } 7792 }
7740 7793
7741 if (texture_unit.bind_target != GL_TEXTURE_CUBE_MAP) { 7794 if (texture_unit.bind_target != GL_TEXTURE_CUBE_MAP) {
7742 Texture* texture = texture_ref->texture(); 7795 Texture* texture = texture_ref->texture();
7796 Texture::ImageState image_state;
7743 gfx::GLImage* image = 7797 gfx::GLImage* image =
7744 texture->GetLevelImage(texture_unit.bind_target, 0); 7798 texture->GetLevelImage(texture_unit.bind_target, 0, &image_state);
7745 if (image && !texture->IsAttachedToFramebuffer()) { 7799 if (image && !texture->IsAttachedToFramebuffer()) {
7746 ScopedGLErrorSuppressor suppressor( 7800 ScopedGLErrorSuppressor suppressor(
7747 "GLES2DecoderImpl::RestoreStateForTextures", GetErrorState()); 7801 "GLES2DecoderImpl::RestoreStateForTextures", GetErrorState());
7748 glActiveTexture(GL_TEXTURE0 + texture_unit_index); 7802 glActiveTexture(GL_TEXTURE0 + texture_unit_index);
7749 image->DidUseTexImage(); 7803 DoDidUseTexImage(image, image_state);
7750 continue; 7804 continue;
7751 } 7805 }
7752 } 7806 }
7753 } 7807 }
7754 } 7808 }
7755 } 7809 }
7756 // Set the active texture back to whatever the user had it as. 7810 // Set the active texture back to whatever the user had it as.
7757 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); 7811 glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit);
7758 } 7812 }
7759 7813
(...skipping 1706 matching lines...) Expand 10 before | Expand all | Expand 10 after
9466 const void* cmd_data) { 9520 const void* cmd_data) {
9467 const gles2::cmds::ScheduleOverlayPlaneCHROMIUM& c = 9521 const gles2::cmds::ScheduleOverlayPlaneCHROMIUM& c =
9468 *static_cast<const gles2::cmds::ScheduleOverlayPlaneCHROMIUM*>(cmd_data); 9522 *static_cast<const gles2::cmds::ScheduleOverlayPlaneCHROMIUM*>(cmd_data);
9469 TextureRef* ref = texture_manager()->GetTexture(c.overlay_texture_id); 9523 TextureRef* ref = texture_manager()->GetTexture(c.overlay_texture_id);
9470 if (!ref) { 9524 if (!ref) {
9471 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, 9525 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
9472 "glScheduleOverlayPlaneCHROMIUM", 9526 "glScheduleOverlayPlaneCHROMIUM",
9473 "unknown texture"); 9527 "unknown texture");
9474 return error::kNoError; 9528 return error::kNoError;
9475 } 9529 }
9530 Texture::ImageState image_state;
9476 gfx::GLImage* image = 9531 gfx::GLImage* image =
9477 ref->texture()->GetLevelImage(ref->texture()->target(), 0); 9532 ref->texture()->GetLevelImage(ref->texture()->target(), 0, &image_state);
9478 if (!image) { 9533 if (!image || image_state != Texture::BOUND) {
9479 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, 9534 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,
9480 "glScheduleOverlayPlaneCHROMIUM", 9535 "glScheduleOverlayPlaneCHROMIUM",
9481 "unsupported texture format"); 9536 "unsupported texture format");
9482 return error::kNoError; 9537 return error::kNoError;
9483 } 9538 }
9484 gfx::OverlayTransform transform = GetGFXOverlayTransform(c.plane_transform); 9539 gfx::OverlayTransform transform = GetGFXOverlayTransform(c.plane_transform);
9485 if (transform == gfx::OVERLAY_TRANSFORM_INVALID) { 9540 if (transform == gfx::OVERLAY_TRANSFORM_INVALID) {
9486 LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, 9541 LOCAL_SET_GL_ERROR(GL_INVALID_ENUM,
9487 "glScheduleOverlayPlaneCHROMIUM", 9542 "glScheduleOverlayPlaneCHROMIUM",
9488 "invalid transform enum"); 9543 "invalid transform enum");
(...skipping 3595 matching lines...) Expand 10 before | Expand all | Expand 10 after
13084 GLboolean unpack_unmultiply_alpha) { 13139 GLboolean unpack_unmultiply_alpha) {
13085 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM"); 13140 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM");
13086 13141
13087 TextureRef* source_texture_ref = GetTexture(source_id); 13142 TextureRef* source_texture_ref = GetTexture(source_id);
13088 TextureRef* dest_texture_ref = GetTexture(dest_id); 13143 TextureRef* dest_texture_ref = GetTexture(dest_id);
13089 Texture* source_texture = source_texture_ref->texture(); 13144 Texture* source_texture = source_texture_ref->texture();
13090 Texture* dest_texture = dest_texture_ref->texture(); 13145 Texture* dest_texture = dest_texture_ref->texture();
13091 int source_width = 0; 13146 int source_width = 0;
13092 int source_height = 0; 13147 int source_height = 0;
13093 gfx::GLImage* image = 13148 gfx::GLImage* image =
13094 source_texture->GetLevelImage(source_texture->target(), 0); 13149 source_texture->GetLevelImage(source_texture->target(), 0, nullptr);
13095 if (image) { 13150 if (image) {
13096 gfx::Size size = image->GetSize(); 13151 gfx::Size size = image->GetSize();
13097 source_width = size.width(); 13152 source_width = size.width();
13098 source_height = size.height(); 13153 source_height = size.height();
13099 if (source_width <= 0 || source_height <= 0) { 13154 if (source_width <= 0 || source_height <= 0) {
13100 LOCAL_SET_GL_ERROR( 13155 LOCAL_SET_GL_ERROR(
13101 GL_INVALID_VALUE, 13156 GL_INVALID_VALUE,
13102 "glCopyTextureChromium", "invalid image size"); 13157 "glCopyTextureChromium", "invalid image size");
13103 return; 13158 return;
13104 } 13159 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
13188 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width, 13243 dest_texture_ref, GL_TEXTURE_2D, 0, internal_format, source_width,
13189 source_height, 1, 0, internal_format, dest_type, 13244 source_height, 1, 0, internal_format, dest_type,
13190 gfx::Rect(source_width, source_height)); 13245 gfx::Rect(source_width, source_height));
13191 } else { 13246 } else {
13192 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 13247 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
13193 true); 13248 true);
13194 } 13249 }
13195 13250
13196 ScopedModifyPixels modify(dest_texture_ref); 13251 ScopedModifyPixels modify(dest_texture_ref);
13197 13252
13198 // Try using GLImage::CopyTexSubImage when possible. 13253 // Try using GLImage::CopyTexImage when possible.
13199 bool unpack_premultiply_alpha_change = 13254 bool unpack_premultiply_alpha_change =
13200 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0; 13255 (unpack_premultiply_alpha ^ unpack_unmultiply_alpha) != 0;
13201 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) { 13256 if (image && !unpack_flip_y && !unpack_premultiply_alpha_change) {
13202 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id()); 13257 glBindTexture(GL_TEXTURE_2D, dest_texture->service_id());
13203 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), 13258 if (image->CopyTexImage(GL_TEXTURE_2D))
13204 gfx::Rect(0, 0, source_width, source_height))) {
13205 return; 13259 return;
13206 }
13207 } 13260 }
13208 13261
13209 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 13262 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
13210 13263
13211 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix 13264 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix
13212 // before presenting. 13265 // before presenting.
13213 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { 13266 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) {
13214 // TODO(hkuang): get the StreamTexture transform matrix in GPU process 13267 // TODO(hkuang): get the StreamTexture transform matrix in GPU process
13215 // instead of using kIdentityMatrix crbug.com/226218. 13268 // instead of using kIdentityMatrix crbug.com/226218.
13216 copy_texture_CHROMIUM_->DoCopyTextureWithTransform( 13269 copy_texture_CHROMIUM_->DoCopyTextureWithTransform(
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
13248 GLboolean unpack_unmultiply_alpha) { 13301 GLboolean unpack_unmultiply_alpha) {
13249 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM"); 13302 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopySubTextureCHROMIUM");
13250 13303
13251 TextureRef* source_texture_ref = GetTexture(source_id); 13304 TextureRef* source_texture_ref = GetTexture(source_id);
13252 TextureRef* dest_texture_ref = GetTexture(dest_id); 13305 TextureRef* dest_texture_ref = GetTexture(dest_id);
13253 Texture* source_texture = source_texture_ref->texture(); 13306 Texture* source_texture = source_texture_ref->texture();
13254 Texture* dest_texture = dest_texture_ref->texture(); 13307 Texture* dest_texture = dest_texture_ref->texture();
13255 int source_width = 0; 13308 int source_width = 0;
13256 int source_height = 0; 13309 int source_height = 0;
13257 gfx::GLImage* image = 13310 gfx::GLImage* image =
13258 source_texture->GetLevelImage(source_texture->target(), 0); 13311 source_texture->GetLevelImage(source_texture->target(), 0, nullptr);
13259 if (image) { 13312 if (image) {
13260 gfx::Size size = image->GetSize(); 13313 gfx::Size size = image->GetSize();
13261 source_width = size.width(); 13314 source_width = size.width();
13262 source_height = size.height(); 13315 source_height = size.height();
13263 if (source_width <= 0 || source_height <= 0) { 13316 if (source_width <= 0 || source_height <= 0) {
13264 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM", 13317 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopySubTextureCHROMIUM",
13265 "invalid image size"); 13318 "invalid image size");
13266 return; 13319 return;
13267 } 13320 }
13268 } else { 13321 } else {
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
13398 GLuint dest_id) { 13451 GLuint dest_id) {
13399 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM"); 13452 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM");
13400 13453
13401 TextureRef* source_texture_ref = GetTexture(source_id); 13454 TextureRef* source_texture_ref = GetTexture(source_id);
13402 TextureRef* dest_texture_ref = GetTexture(dest_id); 13455 TextureRef* dest_texture_ref = GetTexture(dest_id);
13403 Texture* source_texture = source_texture_ref->texture(); 13456 Texture* source_texture = source_texture_ref->texture();
13404 Texture* dest_texture = dest_texture_ref->texture(); 13457 Texture* dest_texture = dest_texture_ref->texture();
13405 int source_width = 0; 13458 int source_width = 0;
13406 int source_height = 0; 13459 int source_height = 0;
13407 gfx::GLImage* image = 13460 gfx::GLImage* image =
13408 source_texture->GetLevelImage(source_texture->target(), 0); 13461 source_texture->GetLevelImage(source_texture->target(), 0, nullptr);
13409 if (image) { 13462 if (image) {
13410 gfx::Size size = image->GetSize(); 13463 gfx::Size size = image->GetSize();
13411 source_width = size.width(); 13464 source_width = size.width();
13412 source_height = size.height(); 13465 source_height = size.height();
13413 if (source_width <= 0 || source_height <= 0) { 13466 if (source_width <= 0 || source_height <= 0) {
13414 LOCAL_SET_GL_ERROR( 13467 LOCAL_SET_GL_ERROR(
13415 GL_INVALID_VALUE, 13468 GL_INVALID_VALUE,
13416 "glCompressedCopyTextureCHROMIUM", "invalid image size"); 13469 "glCompressedCopyTextureCHROMIUM", "invalid image size");
13417 return; 13470 return;
13418 } 13471 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
13516 13569
13517 texture_manager()->SetLevelInfo( 13570 texture_manager()->SetLevelInfo(
13518 dest_texture_ref, GL_TEXTURE_2D, 0, source_internal_format, 13571 dest_texture_ref, GL_TEXTURE_2D, 0, source_internal_format,
13519 source_width, source_height, 1, 0, source_internal_format, 13572 source_width, source_height, 1, 0, source_internal_format,
13520 source_type, gfx::Rect(source_width, source_height)); 13573 source_type, gfx::Rect(source_width, source_height));
13521 } else { 13574 } else {
13522 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 13575 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
13523 true); 13576 true);
13524 } 13577 }
13525 13578
13526 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(0, 0), 13579 if (image->CopyTexImage(GL_TEXTURE_2D))
13527 gfx::Rect(0, 0, source_width, source_height))) {
13528 return; 13580 return;
13529 }
13530 } 13581 }
13531 13582
13532 TRACE_EVENT0( 13583 TRACE_EVENT0(
13533 "gpu", 13584 "gpu",
13534 "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM, fallback"); 13585 "GLES2DecoderImpl::DoCompressedCopyTextureCHROMIUM, fallback");
13535 13586
13536 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 13587 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
13537 13588
13538 // As a fallback, copy into a non-compressed GL_RGBA texture. 13589 // As a fallback, copy into a non-compressed GL_RGBA texture.
13539 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM"); 13590 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glCompressedCopyTextureCHROMIUM");
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
13580 GLsizei height) { 13631 GLsizei height) {
13581 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM"); 13632 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM");
13582 13633
13583 TextureRef* source_texture_ref = GetTexture(source_id); 13634 TextureRef* source_texture_ref = GetTexture(source_id);
13584 TextureRef* dest_texture_ref = GetTexture(dest_id); 13635 TextureRef* dest_texture_ref = GetTexture(dest_id);
13585 Texture* source_texture = source_texture_ref->texture(); 13636 Texture* source_texture = source_texture_ref->texture();
13586 Texture* dest_texture = dest_texture_ref->texture(); 13637 Texture* dest_texture = dest_texture_ref->texture();
13587 int source_width = 0; 13638 int source_width = 0;
13588 int source_height = 0; 13639 int source_height = 0;
13589 gfx::GLImage* image = 13640 gfx::GLImage* image =
13590 source_texture->GetLevelImage(source_texture->target(), 0); 13641 source_texture->GetLevelImage(source_texture->target(), 0, nullptr);
13591 if (image) { 13642 if (image) {
13592 gfx::Size size = image->GetSize(); 13643 gfx::Size size = image->GetSize();
13593 source_width = size.width(); 13644 source_width = size.width();
13594 source_height = size.height(); 13645 source_height = size.height();
13595 if (source_width <= 0 || source_height <= 0) { 13646 if (source_width <= 0 || source_height <= 0) {
13596 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCompressedCopySubTextureCHROMIUM", 13647 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCompressedCopySubTextureCHROMIUM",
13597 "invalid image size"); 13648 "invalid image size");
13598 return; 13649 return;
13599 } 13650 }
13600 } else { 13651 } else {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
13711 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0, 13762 texture_manager()->SetLevelCleared(dest_texture_ref, GL_TEXTURE_2D, 0,
13712 true); 13763 true);
13713 } 13764 }
13714 13765
13715 ScopedTextureBinder binder( 13766 ScopedTextureBinder binder(
13716 &state_, dest_texture->service_id(), GL_TEXTURE_2D); 13767 &state_, dest_texture->service_id(), GL_TEXTURE_2D);
13717 13768
13718 ScopedModifyPixels modify(dest_texture_ref); 13769 ScopedModifyPixels modify(dest_texture_ref);
13719 13770
13720 // Try using GLImage::CopyTexSubImage when possible. 13771 // Try using GLImage::CopyTexSubImage when possible.
13721 if (image) { 13772 if (image &&
13722 if (image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset), 13773 image->CopyTexSubImage(GL_TEXTURE_2D, gfx::Point(xoffset, yoffset),
13723 gfx::Rect(x, y, width, height))) { 13774 gfx::Rect(x, y, width, height))) {
13724 return; 13775 return;
13725 }
13726 } 13776 }
13727 13777
13728 TRACE_EVENT0( 13778 TRACE_EVENT0(
13729 "gpu", 13779 "gpu",
13730 "GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM, fallback"); 13780 "GLES2DecoderImpl::DoCompressedCopySubTextureCHROMIUM, fallback");
13731 13781
13732 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); 13782 DoWillUseTexImageIfNeeded(source_texture, source_texture->target());
13733 13783
13734 // As a fallback, copy into a non-compressed GL_RGBA texture. 13784 // As a fallback, copy into a non-compressed GL_RGBA texture.
13735 if (dest_internal_format != GL_RGBA) { 13785 if (dest_internal_format != GL_RGBA) {
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
14189 // accidents. 14239 // accidents.
14190 TextureRef* texture_ref = 14240 TextureRef* texture_ref =
14191 texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target); 14241 texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
14192 if (!texture_ref) { 14242 if (!texture_ref) {
14193 LOCAL_SET_GL_ERROR( 14243 LOCAL_SET_GL_ERROR(
14194 GL_INVALID_OPERATION, 14244 GL_INVALID_OPERATION,
14195 "glBindTexImage2DCHROMIUM", "no texture bound"); 14245 "glBindTexImage2DCHROMIUM", "no texture bound");
14196 return; 14246 return;
14197 } 14247 }
14198 14248
14199 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); 14249 gfx::GLImage* image = image_manager()->LookupImage(image_id);
14200 if (!gl_image) { 14250 if (!image) {
14201 LOCAL_SET_GL_ERROR( 14251 LOCAL_SET_GL_ERROR(
14202 GL_INVALID_OPERATION, 14252 GL_INVALID_OPERATION,
14203 "glBindTexImage2DCHROMIUM", "no image found with the given ID"); 14253 "glBindTexImage2DCHROMIUM", "no image found with the given ID");
14204 return; 14254 return;
14205 } 14255 }
14206 14256
14257 Texture::ImageState image_state = Texture::UNBOUND;
14258
14207 { 14259 {
14208 ScopedGLErrorSuppressor suppressor( 14260 ScopedGLErrorSuppressor suppressor(
14209 "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM", GetErrorState()); 14261 "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM", GetErrorState());
14210 if (!gl_image->BindTexImage(target)) { 14262
14211 LOCAL_SET_GL_ERROR( 14263 // Note: We fallback to a lazy GLImage::CopyTexImage() call in
14212 GL_INVALID_OPERATION, 14264 // DoWillUseTexImage() when BindTexImage() fails.
14213 "glBindTexImage2DCHROMIUM", "fail to bind image with the given ID"); 14265 if (image->BindTexImage(target))
14214 return; 14266 image_state = Texture::BOUND;
14215 }
14216 } 14267 }
14217 14268
14218 gfx::Size size = gl_image->GetSize(); 14269 // GL_TEXTURE_EXTERNAL_OES is not a supported CopyTexImage() target.
14270 if (target == GL_TEXTURE_EXTERNAL_OES && image_state == Texture::UNBOUND) {
14271 LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, "glBindTexImage2DCHROMIUM",
14272 "invalid target");
14273 return;
14274 }
14275
14276 gfx::Size size = image->GetSize();
14219 texture_manager()->SetLevelInfo( 14277 texture_manager()->SetLevelInfo(
14220 texture_ref, target, 0, gl_image->GetInternalFormat(), size.width(), 14278 texture_ref, target, 0, image->GetInternalFormat(), size.width(),
14221 size.height(), 1, 0, gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, 14279 size.height(), 1, 0, image->GetInternalFormat(), GL_UNSIGNED_BYTE,
14222 gfx::Rect(size)); 14280 gfx::Rect(size));
14223 texture_manager()->SetLevelImage(texture_ref, target, 0, gl_image); 14281 texture_manager()->SetLevelImage(texture_ref, target, 0, image, image_state);
14224 } 14282 }
14225 14283
14226 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( 14284 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
14227 GLenum target, GLint image_id) { 14285 GLenum target, GLint image_id) {
14228 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM"); 14286 TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM");
14229 14287
14230 // Default target might be conceptually valid, but disallow it to avoid 14288 // Default target might be conceptually valid, but disallow it to avoid
14231 // accidents. 14289 // accidents.
14232 TextureRef* texture_ref = 14290 TextureRef* texture_ref =
14233 texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target); 14291 texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
14234 if (!texture_ref) { 14292 if (!texture_ref) {
14235 LOCAL_SET_GL_ERROR( 14293 LOCAL_SET_GL_ERROR(
14236 GL_INVALID_OPERATION, 14294 GL_INVALID_OPERATION,
14237 "glReleaseTexImage2DCHROMIUM", "no texture bound"); 14295 "glReleaseTexImage2DCHROMIUM", "no texture bound");
14238 return; 14296 return;
14239 } 14297 }
14240 14298
14241 gfx::GLImage* gl_image = image_manager()->LookupImage(image_id); 14299 gfx::GLImage* image = image_manager()->LookupImage(image_id);
14242 if (!gl_image) { 14300 if (!image) {
14243 LOCAL_SET_GL_ERROR( 14301 LOCAL_SET_GL_ERROR(
14244 GL_INVALID_OPERATION, 14302 GL_INVALID_OPERATION,
14245 "glReleaseTexImage2DCHROMIUM", "no image found with the given ID"); 14303 "glReleaseTexImage2DCHROMIUM", "no image found with the given ID");
14246 return; 14304 return;
14247 } 14305 }
14248 14306
14307 Texture::ImageState image_state;
14308
14249 // Do nothing when image is not currently bound. 14309 // Do nothing when image is not currently bound.
14250 if (texture_ref->texture()->GetLevelImage(target, 0) != gl_image) 14310 if (texture_ref->texture()->GetLevelImage(target, 0, &image_state) != image)
14251 return; 14311 return;
14252 14312
14253 { 14313 {
14254 ScopedGLErrorSuppressor suppressor( 14314 ScopedGLErrorSuppressor suppressor(
14255 "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", GetErrorState()); 14315 "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", GetErrorState());
14256 gl_image->ReleaseTexImage(target); 14316
14317 if (image_state == Texture::BOUND)
14318 image->ReleaseTexImage(target);
14319
14320 if (image_state == Texture::COPIED) {
14321 // Effectively frees the texture storage without deleting the texture id.
14322 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA,
14323 GL_UNSIGNED_BYTE, nullptr);
14324 }
14257 } 14325 }
14258 14326
14259 texture_manager()->SetLevelInfo( 14327 texture_manager()->SetLevelInfo(
14260 texture_ref, target, 0, gl_image->GetInternalFormat(), 0, 0, 1, 0, 14328 texture_ref, target, 0, image->GetInternalFormat(), 0, 0, 1, 0,
14261 gl_image->GetInternalFormat(), GL_UNSIGNED_BYTE, gfx::Rect()); 14329 image->GetInternalFormat(), GL_UNSIGNED_BYTE, gfx::Rect());
14262 } 14330 }
14263 14331
14264 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( 14332 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM(
14265 uint32 immediate_data_size, 14333 uint32 immediate_data_size,
14266 const void* cmd_data) { 14334 const void* cmd_data) {
14267 const gles2::cmds::TraceBeginCHROMIUM& c = 14335 const gles2::cmds::TraceBeginCHROMIUM& c =
14268 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data); 14336 *static_cast<const gles2::cmds::TraceBeginCHROMIUM*>(cmd_data);
14269 Bucket* category_bucket = GetBucket(c.category_bucket_id); 14337 Bucket* category_bucket = GetBucket(c.category_bucket_id);
14270 Bucket* name_bucket = GetBucket(c.name_bucket_id); 14338 Bucket* name_bucket = GetBucket(c.name_bucket_id);
14271 if (!category_bucket || category_bucket->size() == 0 || 14339 if (!category_bucket || category_bucket->size() == 0 ||
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
15066 return error::kNoError; 15134 return error::kNoError;
15067 } 15135 }
15068 15136
15069 // Include the auto-generated part of this file. We split this because it means 15137 // Include the auto-generated part of this file. We split this because it means
15070 // we can easily edit the non-auto generated parts right here in this file 15138 // we can easily edit the non-auto generated parts right here in this file
15071 // instead of having to edit some template or the code generator. 15139 // instead of having to edit some template or the code generator.
15072 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 15140 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
15073 15141
15074 } // namespace gles2 15142 } // namespace gles2
15075 } // namespace gpu 15143 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698