diff options
author | zmo@google.com <zmo@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-13 23:52:00 +0000 |
---|---|---|
committer | zmo@google.com <zmo@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-13 23:52:00 +0000 |
commit | b493ee621680084e4028e8c9f02cad13ea99cb08 (patch) | |
tree | 397ad9fe681aec54a7c00586edddc87a9de92aef /gpu | |
parent | ba496a7f57ef38960f419cfb64d342d69c19f257 (diff) | |
download | chromium_src-b493ee621680084e4028e8c9f02cad13ea99cb08.zip chromium_src-b493ee621680084e4028e8c9f02cad13ea99cb08.tar.gz chromium_src-b493ee621680084e4028e8c9f02cad13ea99cb08.tar.bz2 |
Handle the situation in command buffer when texImage2D fails. Current implementation breaks texImage2D into texImage2D with null data and one or more texSubImage2D calls. If the first texImage2D call fails, all the related texSubImage2D calls should be cancelled. However, at the moment they still get called, thus generates GL errors that shouldn't be generated. This CL fixes this issue.
BUG=79172
TEST=unittest, texture-npot.html green
Review URL: http://codereview.chromium.org/6839003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81510 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
10 files changed, 177 insertions, 130 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index dd9bfab..8ff4959 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -1494,8 +1494,11 @@ _FUNCTION_INFO = { 'decoder_func': 'DoTexParameteriv', }, 'TexSubImage2D': { - 'type': 'Data', - 'decoder_func': 'DoTexSubImage2D', + 'type': 'Manual', + 'immediate': True, + 'cmd_args': 'GLenum target, GLint level, GLint xoffset, GLint yoffset, ' + 'GLsizei width, GLsizei height, GLenum format, GLenum type, ' + 'const void* pixels, GLboolean internal' }, 'Uniform1f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 1}, 'Uniform1fv': { diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index c0adf24..e6568da 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h @@ -828,20 +828,22 @@ void TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, uint32 pixels_shm_id, - uint32 pixels_shm_offset) { + uint32 pixels_shm_offset, GLboolean internal) { gles2::TexSubImage2D& c = GetCmdSpace<gles2::TexSubImage2D>(); c.Init( target, level, xoffset, yoffset, width, height, format, type, - pixels_shm_id, pixels_shm_offset); + pixels_shm_id, pixels_shm_offset, internal); } void TexSubImage2DImmediate( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type) { + GLsizei height, GLenum format, GLenum type, GLboolean internal) { const uint32 s = 0; // TODO(gman): compute correct size gles2::TexSubImage2DImmediate& c = GetImmediateCmdSpaceTotalSize<gles2::TexSubImage2DImmediate>(s); - c.Init(target, level, xoffset, yoffset, width, height, format, type); + c.Init( + target, level, xoffset, yoffset, width, height, format, type, + internal); } void Uniform1f(GLint location, GLfloat x) { diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index b51aefa..c482d39 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -986,13 +986,22 @@ void GLES2Implementation::TexImage2D( helper_->TexImage2D( target, level, internalformat, width, height, border, format, type, 0, 0); if (pixels) { - TexSubImage2D(target, level, 0, 0, width, height, format, type, pixels); + TexSubImage2DImpl( + target, level, 0, 0, width, height, format, type, pixels, GL_TRUE); } } void GLES2Implementation::TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels) { + TexSubImage2DImpl( + target, level, 0, 0, width, height, format, type, pixels, GL_FALSE); +} + +void GLES2Implementation::TexSubImage2DImpl( + GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, + GLsizei height, GLenum format, GLenum type, const void* pixels, + GLboolean internal) { if (level < 0 || height < 0 || width < 0) { SetGLError(GL_INVALID_VALUE, "glTexSubImage2D dimension < 0"); return; @@ -1031,7 +1040,7 @@ void GLES2Implementation::TexSubImage2D( memcpy(buffer, source, part_size); helper_->TexSubImage2D( target, level, xoffset, yoffset, width, num_rows, format, type, - transfer_buffer_id_, transfer_buffer_.GetOffset(buffer)); + transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal); transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); yoffset += num_rows; source += part_size; @@ -1056,7 +1065,7 @@ void GLES2Implementation::TexSubImage2D( memcpy(buffer, row_source, part_size); helper_->TexSubImage2D( target, level, temp_xoffset, yoffset, temp_width, 1, format, type, - transfer_buffer_id_, transfer_buffer_.GetOffset(buffer)); + transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal); transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); row_source += part_size; temp_xoffset += num_pixels; @@ -1637,7 +1646,7 @@ void GLES2Implementation::UnmapTexSubImage2DCHROMIUM(const void* mem) { const MappedTexture& mt = it->second; helper_->TexSubImage2D( mt.target, mt.level, mt.xoffset, mt.yoffset, mt.width, mt.height, - mt.format, mt.type, mt.shm_id, mt.shm_offset); + mt.format, mt.type, mt.shm_id, mt.shm_offset, GL_FALSE); mapped_memory_->FreePendingToken(mt.shm_memory, helper_->InsertToken()); mapped_textures_.erase(it); } diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h index 1017ef1..6104802 100644 --- a/gpu/command_buffer/client/gles2_implementation.h +++ b/gpu/command_buffer/client/gles2_implementation.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -280,6 +280,11 @@ class GLES2Implementation { GLsizei GetMaxIndexInElementArrayBuffer( GLuint buffer_id, GLsizei count, GLenum type, GLuint offset); + void TexSubImage2DImpl( + GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, + GLsizei height, GLenum format, GLenum type, const void* pixels, + GLboolean internal); + GLES2Util util_; GLES2CmdHelper* helper_; scoped_ptr<IdHandlerInterface> buffer_id_handler_; diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc index d7ca276..5665b96 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest.cc +++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc @@ -860,7 +860,7 @@ TEST_F(GLES2ImplementationTest, MapUnmapTexSubImage2DCHROMIUM) { Cmds expected; expected.tex.Init( GL_TEXTURE_2D, kLevel, kXOffset, kYOffset, kWidth, kHeight, kFormat, - kType, kTransferBufferId, offset); + kType, kTransferBufferId, offset, GL_FALSE); expected.set_token.Init(token++); void* mem = gl_->MapTexSubImage2DCHROMIUM( diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index 340273a..0536887 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h @@ -6010,7 +6010,7 @@ struct TexSubImage2D { void Init( GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, - uint32 _pixels_shm_id, uint32 _pixels_shm_offset) { + uint32 _pixels_shm_id, uint32 _pixels_shm_offset, GLboolean _internal) { SetHeader(); target = _target; level = _level; @@ -6022,16 +6022,17 @@ struct TexSubImage2D { type = _type; pixels_shm_id = _pixels_shm_id; pixels_shm_offset = _pixels_shm_offset; + internal = _internal; } void* Set( void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, - uint32 _pixels_shm_id, uint32 _pixels_shm_offset) { + uint32 _pixels_shm_id, uint32 _pixels_shm_offset, GLboolean _internal) { static_cast<ValueType*>( cmd)->Init( _target, _level, _xoffset, _yoffset, _width, _height, _format, - _type, _pixels_shm_id, _pixels_shm_offset); + _type, _pixels_shm_id, _pixels_shm_offset, _internal); return NextCmdAddress<ValueType>(cmd); } @@ -6046,10 +6047,11 @@ struct TexSubImage2D { uint32 type; uint32 pixels_shm_id; uint32 pixels_shm_offset; + uint32 internal; }; -COMPILE_ASSERT(sizeof(TexSubImage2D) == 44, - Sizeof_TexSubImage2D_is_not_44); +COMPILE_ASSERT(sizeof(TexSubImage2D) == 48, + Sizeof_TexSubImage2D_is_not_48); COMPILE_ASSERT(offsetof(TexSubImage2D, header) == 0, OffsetOf_TexSubImage2D_header_not_0); COMPILE_ASSERT(offsetof(TexSubImage2D, target) == 4, @@ -6072,6 +6074,8 @@ COMPILE_ASSERT(offsetof(TexSubImage2D, pixels_shm_id) == 36, OffsetOf_TexSubImage2D_pixels_shm_id_not_36); COMPILE_ASSERT(offsetof(TexSubImage2D, pixels_shm_offset) == 40, OffsetOf_TexSubImage2D_pixels_shm_offset_not_40); +COMPILE_ASSERT(offsetof(TexSubImage2D, internal) == 44, + OffsetOf_TexSubImage2D_internal_not_44); struct TexSubImage2DImmediate { typedef TexSubImage2DImmediate ValueType; @@ -6090,8 +6094,9 @@ struct TexSubImage2DImmediate { void Init( GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLenum _type) { - uint32 total_size = 0; // TODO(gman): get correct size + GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, + GLboolean _internal) { + uint32 total_size = 0; // TODO(gman): get correct size. SetHeader(total_size); target = _target; level = _level; @@ -6101,16 +6106,18 @@ struct TexSubImage2DImmediate { height = _height; format = _format; type = _type; + internal = _internal; } void* Set( void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLenum _type) { - uint32 total_size = 0; // TODO(gman): get correct size + GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, + GLboolean _internal) { + uint32 total_size = 0; // TODO(gman): get correct size. static_cast<ValueType*>( cmd)->Init( _target, _level, _xoffset, _yoffset, _width, _height, _format, - _type); + _type, _internal); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, total_size); } @@ -6123,10 +6130,11 @@ struct TexSubImage2DImmediate { int32 height; uint32 format; uint32 type; + uint32 internal; }; -COMPILE_ASSERT(sizeof(TexSubImage2DImmediate) == 36, - Sizeof_TexSubImage2DImmediate_is_not_36); +COMPILE_ASSERT(sizeof(TexSubImage2DImmediate) == 40, + Sizeof_TexSubImage2DImmediate_is_not_40); COMPILE_ASSERT(offsetof(TexSubImage2DImmediate, header) == 0, OffsetOf_TexSubImage2DImmediate_header_not_0); COMPILE_ASSERT(offsetof(TexSubImage2DImmediate, target) == 4, @@ -6145,6 +6153,8 @@ COMPILE_ASSERT(offsetof(TexSubImage2DImmediate, format) == 28, OffsetOf_TexSubImage2DImmediate_format_not_28); COMPILE_ASSERT(offsetof(TexSubImage2DImmediate, type) == 32, OffsetOf_TexSubImage2DImmediate_type_not_32); +COMPILE_ASSERT(offsetof(TexSubImage2DImmediate, internal) == 36, + OffsetOf_TexSubImage2DImmediate_internal_not_36); struct Uniform1f { typedef Uniform1f ValueType; diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index a69078a..77660e2 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h @@ -2221,7 +2221,8 @@ TEST(GLES2FormatTest, TexSubImage2D) { static_cast<GLenum>(17), static_cast<GLenum>(18), static_cast<uint32>(19), - static_cast<uint32>(20)); + static_cast<uint32>(20), + static_cast<GLboolean>(21)); EXPECT_EQ(static_cast<uint32>(TexSubImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); @@ -2237,6 +2238,7 @@ TEST(GLES2FormatTest, TexSubImage2D) { EXPECT_EQ(static_cast<GLenum>(18), cmd.type); EXPECT_EQ(static_cast<uint32>(19), cmd.pixels_shm_id); EXPECT_EQ(static_cast<uint32>(20), cmd.pixels_shm_offset); + EXPECT_EQ(static_cast<GLboolean>(21), cmd.internal); } // TODO(gman): Implement test for TexSubImage2DImmediate diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index a1eab92..3b6990d 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -1467,6 +1467,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, const Validators* validators_; FeatureInfo* feature_info_; + // This indicates all the following texSubImage2D calls that are part of the + // failed texImage2D call should be ignored. + bool tex_image_2d_failed_; + DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); }; @@ -1789,7 +1793,8 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) current_decoder_error_(error::kNoError), use_shader_translator_(true), validators_(group_->feature_info()->validators()), - feature_info_(group_->feature_info()) { + feature_info_(group_->feature_info()), + tex_image_2d_failed_(false) { attrib_0_value_.v[0] = 0.0f; attrib_0_value_.v[1] = 0.0f; attrib_0_value_.v[2] = 0.0f; @@ -5565,12 +5570,14 @@ error::Error GLES2DecoderImpl::DoTexImage2D( if (error == GL_NO_ERROR) { texture_manager()->SetLevelInfo(feature_info_, info, target, level, internal_format, width, height, 1, border, format, type); + tex_image_2d_failed_ = false; } return error::kNoError; } error::Error GLES2DecoderImpl::HandleTexImage2D( uint32 immediate_data_size, const gles2::TexImage2D& c) { + tex_image_2d_failed_ = true; GLenum target = static_cast<GLenum>(c.target); GLint level = static_cast<GLint>(c.level); GLint internal_format = static_cast<GLint>(c.internalformat); @@ -5881,6 +5888,104 @@ void GLES2DecoderImpl::DoTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, data); } +error::Error GLES2DecoderImpl::HandleTexSubImage2D( + uint32 immediate_data_size, const gles2::TexSubImage2D& c) { + GLboolean internal = static_cast<GLboolean>(c.internal); + if (internal == GL_TRUE && tex_image_2d_failed_) + return error::kNoError; + + GLenum target = static_cast<GLenum>(c.target); + GLint level = static_cast<GLint>(c.level); + GLint xoffset = static_cast<GLint>(c.xoffset); + GLint yoffset = static_cast<GLint>(c.yoffset); + GLsizei width = static_cast<GLsizei>(c.width); + GLsizei height = static_cast<GLsizei>(c.height); + GLenum format = static_cast<GLenum>(c.format); + GLenum type = static_cast<GLenum>(c.type); + uint32 data_size; + if (!GLES2Util::ComputeImageDataSize( + width, height, format, type, unpack_alignment_, &data_size)) { + return error::kOutOfBounds; + } + const void* pixels = GetSharedMemoryAs<const void*>( + c.pixels_shm_id, c.pixels_shm_offset, data_size); + if (!validators_->texture_target.IsValid(target)) { + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); + return error::kNoError; + } + if (width < 0) { + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); + return error::kNoError; + } + if (height < 0) { + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); + return error::kNoError; + } + if (!validators_->texture_format.IsValid(format)) { + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); + return error::kNoError; + } + if (!validators_->pixel_type.IsValid(type)) { + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); + return error::kNoError; + } + if (pixels == NULL) { + return error::kOutOfBounds; + } + DoTexSubImage2D( + target, level, xoffset, yoffset, width, height, format, type, pixels); + return error::kNoError; +} + +error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate( + uint32 immediate_data_size, const gles2::TexSubImage2DImmediate& c) { + GLboolean internal = static_cast<GLboolean>(c.internal); + if (internal == GL_TRUE && tex_image_2d_failed_) + return error::kNoError; + + GLenum target = static_cast<GLenum>(c.target); + GLint level = static_cast<GLint>(c.level); + GLint xoffset = static_cast<GLint>(c.xoffset); + GLint yoffset = static_cast<GLint>(c.yoffset); + GLsizei width = static_cast<GLsizei>(c.width); + GLsizei height = static_cast<GLsizei>(c.height); + GLenum format = static_cast<GLenum>(c.format); + GLenum type = static_cast<GLenum>(c.type); + uint32 data_size; + if (!GLES2Util::ComputeImageDataSize( + width, height, format, type, unpack_alignment_, &data_size)) { + return error::kOutOfBounds; + } + const void* pixels = GetImmediateDataAs<const void*>( + c, data_size, immediate_data_size); + if (!validators_->texture_target.IsValid(target)) { + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); + return error::kNoError; + } + if (width < 0) { + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); + return error::kNoError; + } + if (height < 0) { + SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); + return error::kNoError; + } + if (!validators_->texture_format.IsValid(format)) { + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); + return error::kNoError; + } + if (!validators_->pixel_type.IsValid(type)) { + SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); + return error::kNoError; + } + if (pixels == NULL) { + return error::kOutOfBounds; + } + DoTexSubImage2D( + target, level, xoffset, yoffset, width, height, format, type, pixels); + return error::kNoError; +} + error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( uint32 immediate_data_size, const gles2::GetVertexAttribPointerv& c) { GLuint index = static_cast<GLuint>(c.index); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index 7ac471a..2ae8a03 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -1762,96 +1762,6 @@ error::Error GLES2DecoderImpl::HandleTexParameterivImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleTexSubImage2D( - uint32 immediate_data_size, const gles2::TexSubImage2D& c) { - GLenum target = static_cast<GLenum>(c.target); - GLint level = static_cast<GLint>(c.level); - GLint xoffset = static_cast<GLint>(c.xoffset); - GLint yoffset = static_cast<GLint>(c.yoffset); - GLsizei width = static_cast<GLsizei>(c.width); - GLsizei height = static_cast<GLsizei>(c.height); - GLenum format = static_cast<GLenum>(c.format); - GLenum type = static_cast<GLenum>(c.type); - uint32 data_size; - if (!GLES2Util::ComputeImageDataSize( - width, height, format, type, unpack_alignment_, &data_size)) { - return error::kOutOfBounds; - } - const void* pixels = GetSharedMemoryAs<const void*>( - c.pixels_shm_id, c.pixels_shm_offset, data_size); - if (!validators_->texture_target.IsValid(target)) { - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); - return error::kNoError; - } - if (width < 0) { - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); - return error::kNoError; - } - if (height < 0) { - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); - return error::kNoError; - } - if (!validators_->texture_format.IsValid(format)) { - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); - return error::kNoError; - } - if (!validators_->pixel_type.IsValid(type)) { - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); - return error::kNoError; - } - if (pixels == NULL) { - return error::kOutOfBounds; - } - DoTexSubImage2D( - target, level, xoffset, yoffset, width, height, format, type, pixels); - return error::kNoError; -} - -error::Error GLES2DecoderImpl::HandleTexSubImage2DImmediate( - uint32 immediate_data_size, const gles2::TexSubImage2DImmediate& c) { - GLenum target = static_cast<GLenum>(c.target); - GLint level = static_cast<GLint>(c.level); - GLint xoffset = static_cast<GLint>(c.xoffset); - GLint yoffset = static_cast<GLint>(c.yoffset); - GLsizei width = static_cast<GLsizei>(c.width); - GLsizei height = static_cast<GLsizei>(c.height); - GLenum format = static_cast<GLenum>(c.format); - GLenum type = static_cast<GLenum>(c.type); - uint32 data_size; - if (!GLES2Util::ComputeImageDataSize( - width, height, format, type, unpack_alignment_, &data_size)) { - return error::kOutOfBounds; - } - const void* pixels = GetImmediateDataAs<const void*>( - c, data_size, immediate_data_size); - if (!validators_->texture_target.IsValid(target)) { - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: target GL_INVALID_ENUM"); - return error::kNoError; - } - if (width < 0) { - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: width < 0"); - return error::kNoError; - } - if (height < 0) { - SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: height < 0"); - return error::kNoError; - } - if (!validators_->texture_format.IsValid(format)) { - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: format GL_INVALID_ENUM"); - return error::kNoError; - } - if (!validators_->pixel_type.IsValid(type)) { - SetGLError(GL_INVALID_ENUM, "glTexSubImage2D: type GL_INVALID_ENUM"); - return error::kNoError; - } - if (pixels == NULL) { - return error::kOutOfBounds; - } - DoTexSubImage2D( - target, level, xoffset, yoffset, width, height, format, type, pixels); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform1f( uint32 immediate_data_size, const gles2::Uniform1f& c) { GLint location = static_cast<GLint>(c.location); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index 99b41de..49968a3 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -2394,7 +2394,7 @@ TEST_F(GLES2DecoderTest, TexSubImage2DValidArgs) { .RetiresOnSaturation(); TexSubImage2D cmd; cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } @@ -2408,54 +2408,55 @@ TEST_F(GLES2DecoderTest, TexSubImage2DBadArgs) { 0, 0); TexSubImage2D cmd; cmd.Init(GL_TEXTURE0, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_TRUE, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_INT, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, -1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, -1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth + 1, kHeight, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); + GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight + 1, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); + GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, - GL_UNSIGNED_SHORT_4_4_4_4, kSharedMemoryId, kSharedMemoryOffset); + GL_UNSIGNED_SHORT_4_4_4_4, kSharedMemoryId, kSharedMemoryOffset, + GL_FALSE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kInvalidSharedMemoryId, kSharedMemoryOffset); + kInvalidSharedMemoryId, kSharedMemoryOffset, GL_FALSE); EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kInvalidSharedMemoryOffset); + kSharedMemoryId, kInvalidSharedMemoryOffset, GL_FALSE); EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } |