summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-04 18:27:18 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-04 18:27:18 +0000
commitf5719fb859e2011e55e743de56602422f446ab7d (patch)
tree7c085478c291dc16a0b67a7cd8783e8b6928612d /gpu
parentfeb6e5499bc2abfda723e754f1455a286bf48695 (diff)
downloadchromium_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')
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py1
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc19
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h37
-rw-r--r--gpu/command_buffer/service/texture_manager.cc2
-rw-r--r--gpu/command_buffer/service/texture_manager_unittest.cc24
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;