summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py7
-rw-r--r--gpu/command_buffer/client/gles2_cmd_helper_autogen.h10
-rw-r--r--gpu/command_buffer/client/gles2_implementation.cc17
-rw-r--r--gpu/command_buffer/client/gles2_implementation.h7
-rw-r--r--gpu/command_buffer/client/gles2_implementation_unittest.cc2
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_autogen.h34
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_test_autogen.h4
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc107
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h90
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc29
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));
}