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

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

Issue 168983005: Do not rely on a texture's internalformat matching format (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 6 years, 10 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 <list> 10 #include <list>
(...skipping 1047 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 1058
1059 // Clears any uncleared attachments attached to the given frame buffer. 1059 // Clears any uncleared attachments attached to the given frame buffer.
1060 // Returns false if there was a generated GL error. 1060 // Returns false if there was a generated GL error.
1061 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); 1061 void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer);
1062 1062
1063 // overridden from GLES2Decoder 1063 // overridden from GLES2Decoder
1064 virtual bool ClearLevel(unsigned service_id, 1064 virtual bool ClearLevel(unsigned service_id,
1065 unsigned bind_target, 1065 unsigned bind_target,
1066 unsigned target, 1066 unsigned target,
1067 int level, 1067 int level,
1068 unsigned internal_format,
1068 unsigned format, 1069 unsigned format,
1069 unsigned type, 1070 unsigned type,
1070 int width, 1071 int width,
1071 int height, 1072 int height,
1072 bool is_texture_immutable) OVERRIDE; 1073 bool is_texture_immutable) OVERRIDE;
1073 1074
1074 // Restore all GL state that affects clearing. 1075 // Restore all GL state that affects clearing.
1075 void RestoreClearState(); 1076 void RestoreClearState();
1076 1077
1077 // Remembers the state of some capabilities. 1078 // Remembers the state of some capabilities.
(...skipping 6587 matching lines...) Expand 10 before | Expand all | Expand 10 after
7665 // Just delegate it. Some validation is actually done before this. 7666 // Just delegate it. Some validation is actually done before this.
7666 buffer_manager()->ValidateAndDoBufferSubData( 7667 buffer_manager()->ValidateAndDoBufferSubData(
7667 &state_, target, offset, size, data); 7668 &state_, target, offset, size, data);
7668 } 7669 }
7669 7670
7670 bool GLES2DecoderImpl::ClearLevel( 7671 bool GLES2DecoderImpl::ClearLevel(
7671 unsigned service_id, 7672 unsigned service_id,
7672 unsigned bind_target, 7673 unsigned bind_target,
7673 unsigned target, 7674 unsigned target,
7674 int level, 7675 int level,
7676 unsigned internal_format,
7675 unsigned format, 7677 unsigned format,
7676 unsigned type, 7678 unsigned type,
7677 int width, 7679 int width,
7678 int height, 7680 int height,
7679 bool is_texture_immutable) { 7681 bool is_texture_immutable) {
7680 uint32 channels = GLES2Util::GetChannelsForFormat(format); 7682 uint32 channels = GLES2Util::GetChannelsForFormat(format);
7681 if (feature_info_->feature_flags().angle_depth_texture && 7683 if (feature_info_->feature_flags().angle_depth_texture &&
7682 (channels & GLES2Util::kDepth) != 0) { 7684 (channels & GLES2Util::kDepth) != 0) {
7683 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D 7685 // It's a depth format and ANGLE doesn't allow texImage2D or texSubImage2D
7684 // on depth formats. 7686 // on depth formats.
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
7751 memset(zero.get(), 0, size); 7753 memset(zero.get(), 0, size);
7752 glBindTexture(bind_target, service_id); 7754 glBindTexture(bind_target, service_id);
7753 7755
7754 GLint y = 0; 7756 GLint y = 0;
7755 while (y < height) { 7757 while (y < height) {
7756 GLint h = y + tile_height > height ? height - y : tile_height; 7758 GLint h = y + tile_height > height ? height - y : tile_height;
7757 if (is_texture_immutable || h != height) { 7759 if (is_texture_immutable || h != height) {
7758 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); 7760 glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get());
7759 } else { 7761 } else {
7760 glTexImage2D( 7762 glTexImage2D(
7761 target, level, format, width, h, 0, format, type, zero.get()); 7763 target, level, internal_format, width, h, 0, format, type,
7764 zero.get());
7762 } 7765 }
7763 y += tile_height; 7766 y += tile_height;
7764 } 7767 }
7765 TextureRef* texture = texture_manager()->GetTextureInfoForTarget( 7768 TextureRef* texture = texture_manager()->GetTextureInfoForTarget(
7766 &state_, bind_target); 7769 &state_, bind_target);
7767 glBindTexture(bind_target, texture ? texture->service_id() : 0); 7770 glBindTexture(bind_target, texture ? texture->service_id() : 0);
7768 return true; 7771 return true;
7769 } 7772 }
7770 7773
7771 namespace { 7774 namespace {
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
8286 Clip(x, width, size.width(), &copyX, &copyWidth); 8289 Clip(x, width, size.width(), &copyX, &copyWidth);
8287 Clip(y, height, size.height(), &copyY, &copyHeight); 8290 Clip(y, height, size.height(), &copyY, &copyHeight);
8288 8291
8289 if (copyX != x || 8292 if (copyX != x ||
8290 copyY != y || 8293 copyY != y ||
8291 copyWidth != width || 8294 copyWidth != width ||
8292 copyHeight != height) { 8295 copyHeight != height) {
8293 // some part was clipped so clear the texture. 8296 // some part was clipped so clear the texture.
8294 if (!ClearLevel( 8297 if (!ClearLevel(
8295 texture->service_id(), texture->target(), 8298 texture->service_id(), texture->target(),
8296 target, level, internal_format, GL_UNSIGNED_BYTE, width, height, 8299 target, level, internal_format, internal_format, GL_UNSIGNED_BYTE,
piman 2014/02/18 20:40:10 This is probably wrong for RGBA32F internal format
oetuaho-nv 2014/02/19 09:51:17 CopyTexImage2D is not specified for float textures
piman 2014/02/19 20:26:19 Oh, it will fail ValidateFormatAndTypeCombination
8297 texture->IsImmutable())) { 8300 width, height, texture->IsImmutable())) {
8298 LOCAL_SET_GL_ERROR( 8301 LOCAL_SET_GL_ERROR(
8299 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); 8302 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big");
8300 return; 8303 return;
8301 } 8304 }
8302 if (copyHeight > 0 && copyWidth > 0) { 8305 if (copyHeight > 0 && copyWidth > 0) {
8303 GLint dx = copyX - x; 8306 GLint dx = copyX - x;
8304 GLint dy = copyY - y; 8307 GLint dy = copyY - y;
8305 GLint destX = dx; 8308 GLint destX = dx;
8306 GLint destY = dy; 8309 GLint destY = dy;
8307 glCopyTexSubImage2D(target, level, 8310 glCopyTexSubImage2D(target, level,
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
8532 } 8535 }
8533 ScopedTextureUploadTimer timer(&texture_state_); 8536 ScopedTextureUploadTimer timer(&texture_state_);
8534 glTexSubImage2D( 8537 glTexSubImage2D(
8535 target, level, xoffset, yoffset, width, height, format, type, data); 8538 target, level, xoffset, yoffset, width, height, format, type, data);
8536 return error::kNoError; 8539 return error::kNoError;
8537 } 8540 }
8538 8541
8539 if (!texture_state_.texsubimage2d_faster_than_teximage2d && 8542 if (!texture_state_.texsubimage2d_faster_than_teximage2d &&
8540 !texture->IsImmutable()) { 8543 !texture->IsImmutable()) {
8541 ScopedTextureUploadTimer timer(&texture_state_); 8544 ScopedTextureUploadTimer timer(&texture_state_);
8542 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the 8545 GLenum internal_format;
8543 // same as internal_foramt. If that changes we'll need to look them up. 8546 GLenum tex_type;
8547 texture->GetLevelType(target, level, &tex_type, &internal_format);
8548 // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need
8549 // to look it up.
8544 glTexImage2D( 8550 glTexImage2D(
8545 target, level, format, width, height, 0, format, type, data); 8551 target, level, internal_format, width, height, 0, format, type, data);
8546 } else { 8552 } else {
8547 ScopedTextureUploadTimer timer(&texture_state_); 8553 ScopedTextureUploadTimer timer(&texture_state_);
8548 glTexSubImage2D( 8554 glTexSubImage2D(
8549 target, level, xoffset, yoffset, width, height, format, type, data); 8555 target, level, xoffset, yoffset, width, height, format, type, data);
8550 } 8556 }
8551 texture_manager()->SetLevelCleared(texture_ref, target, level, true); 8557 texture_manager()->SetLevelCleared(texture_ref, target, level, true);
8552 return error::kNoError; 8558 return error::kNoError;
8553 } 8559 }
8554 8560
8555 error::Error GLES2DecoderImpl::HandleTexSubImage2D( 8561 error::Error GLES2DecoderImpl::HandleTexSubImage2D(
(...skipping 1984 matching lines...) Expand 10 before | Expand all | Expand 10 after
10540 DoDidUseTexImageIfNeeded(texture, texture->target()); 10546 DoDidUseTexImageIfNeeded(texture, texture->target());
10541 } 10547 }
10542 10548
10543 // Include the auto-generated part of this file. We split this because it means 10549 // Include the auto-generated part of this file. We split this because it means
10544 // we can easily edit the non-auto generated parts right here in this file 10550 // we can easily edit the non-auto generated parts right here in this file
10545 // instead of having to edit some template or the code generator. 10551 // instead of having to edit some template or the code generator.
10546 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 10552 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
10547 10553
10548 } // namespace gles2 10554 } // namespace gles2
10549 } // namespace gpu 10555 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_decoder.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_mock.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698