diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-04 18:27:18 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-04 18:27:18 +0000 |
commit | f5719fb859e2011e55e743de56602422f446ab7d (patch) | |
tree | 7c085478c291dc16a0b67a7cd8783e8b6928612d /gpu | |
parent | feb6e5499bc2abfda723e754f1455a286bf48695 (diff) | |
download | chromium_src-f5719fb859e2011e55e743de56602422f446ab7d.zip chromium_src-f5719fb859e2011e55e743de56602422f446ab7d.tar.gz chromium_src-f5719fb859e2011e55e743de56602422f446ab7d.tar.bz2 |
A couple of minor fixes for CopyTexImage2D
TEST=unit tests
BUG=none
Review URL: http://codereview.chromium.org/3030038
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@54935 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
5 files changed, 39 insertions, 44 deletions
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index 58c3025..ef65df7 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -1060,6 +1060,7 @@ _FUNCTION_INFO = { }, 'CopyTexImage2D': { 'decoder_func': 'DoCopyTexImage2D', + 'unit_test': False, }, 'CopyTexSubImage2D': { 'decoder_func': 'DoCopyTexSubImage2D', diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index ec09fd9..bef335d 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -4408,27 +4408,28 @@ error::Error GLES2DecoderImpl::DoTexImage2D( pixels = zero.get(); } + GLenum gl_internal_format = internal_format; if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { if (format == GL_BGRA_EXT && internal_format == GL_BGRA_EXT) { - internal_format = GL_RGBA; + gl_internal_format = GL_RGBA; } else if (type == GL_FLOAT) { if (format == GL_RGBA) { - internal_format = GL_RGBA32F_ARB; + gl_internal_format = GL_RGBA32F_ARB; } else if (format == GL_RGB) { - internal_format = GL_RGB32F_ARB; + gl_internal_format = GL_RGB32F_ARB; } } else if (type == GL_HALF_FLOAT_OES) { if (format == GL_RGBA) { - internal_format = GL_RGBA16F_ARB; + gl_internal_format = GL_RGBA16F_ARB; } else if (format == GL_RGB) { - internal_format = GL_RGB16F_ARB; + gl_internal_format = GL_RGB16F_ARB; } } } CopyRealGLErrorsToWrapper(); glTexImage2D( - target, level, internal_format, width, height, border, format, type, + target, level, gl_internal_format, width, height, border, format, type, pixels); GLenum error = glGetError(); if (error == GL_NO_ERROR) { @@ -4538,6 +4539,12 @@ void GLES2DecoderImpl::DoCopyTexImage2D( "glCopyTexImage2D: unknown texture for target"); return; } + if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || + border != 0) { + SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D: dimensions out of range"); + return; + } + // TODO(gman): Need to check that current FBO is compatible with // internal_format. // TODO(gman): Type needs to match format for FBO. diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h index ef44a59..00fee19 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h @@ -344,42 +344,7 @@ TEST_F(GLES2DecoderTest1, ColorMaskValidArgs) { // TODO(gman): CompressedTexSubImage2DImmediate // TODO(gman): CompressedTexSubImage2DBucket - -TEST_F(GLES2DecoderTest1, CopyTexImage2DValidArgs) { - EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 2, 3, 4, 5, 6, 7, 8)); - SpecializedSetup<CopyTexImage2D, 0>(true); - CopyTexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 2, 3, 4, 5, 6, 7, 8); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest1, CopyTexImage2DInvalidArgs0_0) { - EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _)).Times(0); - SpecializedSetup<CopyTexImage2D, 0>(false); - CopyTexImage2D cmd; - cmd.Init(GL_PROXY_TEXTURE_CUBE_MAP, 2, 3, 4, 5, 6, 7, 8); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest1, CopyTexImage2DInvalidArgs5_0) { - EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _)).Times(0); - SpecializedSetup<CopyTexImage2D, 0>(false); - CopyTexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 2, 3, 4, 5, -1, 7, 8); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest1, CopyTexImage2DInvalidArgs6_0) { - EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _)).Times(0); - SpecializedSetup<CopyTexImage2D, 0>(false); - CopyTexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 2, 3, 4, 5, 6, -1, 8); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} +// TODO(gman): CopyTexImage2D TEST_F(GLES2DecoderTest1, CopyTexSubImage2DValidArgs) { EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 2, 3, 4, 5, 6, 7, 8)); diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc index a973fa8..2556197 100644 --- a/gpu/command_buffer/service/texture_manager.cc +++ b/gpu/command_buffer/service/texture_manager.cc @@ -378,7 +378,7 @@ bool TextureManager::ValidForTarget( width <= max_size && height <= max_size && depth <= max_size && - (level == 0 || + (level == 0 || npot_ok() || (!GLES2Util::IsNPOT(width) && !GLES2Util::IsNPOT(height) && !GLES2Util::IsNPOT(depth))) && diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc index 8520895..5f55d32 100644 --- a/gpu/command_buffer/service/texture_manager_unittest.cc +++ b/gpu/command_buffer/service/texture_manager_unittest.cc @@ -103,7 +103,7 @@ TEST_F(TextureManagerTest, MaxValues) { manager_.MaxSizeForTarget(GL_TEXTURE_CUBE_MAP)); } -TEST_F(TextureManagerTest, ValidForTexture) { +TEST_F(TextureManagerTest, ValidForTarget) { // check 2d EXPECT_TRUE(manager_.ValidForTarget( GL_TEXTURE_2D, 0, @@ -125,6 +125,14 @@ TEST_F(TextureManagerTest, ValidForTexture) { EXPECT_FALSE(manager_.ValidForTarget( GL_TEXTURE_2D, kMax2dLevels, kMaxTextureSize, 1, 2)); + // Check NPOT width on level 0 + EXPECT_TRUE(manager_.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1)); + // Check NPOT height on level 0 + EXPECT_TRUE(manager_.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1)); + // Check NPOT width on level 1 + EXPECT_FALSE(manager_.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1)); + // Check NPOT height on level 1 + EXPECT_FALSE(manager_.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1)); // check cube EXPECT_TRUE(manager_.ValidForTarget( @@ -147,6 +155,20 @@ TEST_F(TextureManagerTest, ValidForTexture) { kMaxCubeMapTextureSize, 1, 2)); } +TEST_F(TextureManagerTest, ValidForTargetNPOT) { + TextureManager manager( + true, false, false, kMaxTextureSize, kMaxCubeMapTextureSize); + // Check NPOT width on level 0 + EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1)); + // Check NPOT height on level 0 + EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 2, 5, 1)); + // Check NPOT width on level 1 + EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 5, 2, 1)); + // Check NPOT height on level 1 + EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 1, 2, 5, 1)); + manager.Destroy(false); +} + class TextureInfoTest : public testing::Test { public: static const GLint kMaxTextureSize = 16; |