diff options
author | dongseong.hwang <dongseong.hwang@intel.com> | 2015-08-20 02:09:23 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-20 09:09:56 +0000 |
commit | a326ed46c3923c0e3a29d030c10e3e76b3bdc288 (patch) | |
tree | cf143aee2c938fd7c15166e8121113736a79067f /gpu | |
parent | 53a6dde573f020d57b4fff5923f272f98da66e27 (diff) | |
download | chromium_src-a326ed46c3923c0e3a29d030c10e3e76b3bdc288.zip chromium_src-a326ed46c3923c0e3a29d030c10e3e76b3bdc288.tar.gz chromium_src-a326ed46c3923c0e3a29d030c10e3e76b3bdc288.tar.bz2 |
gpu: If not cube complete, the texture isn't renderable, no matter mipmap complete.
GLES2 spec 3.8.2 says
"A cube map sampler is called, and either the corresponding cube map texture
image is not cube complete, or TEXTURE_MIN_FILTER is one that requires
a mipmap and the texture is not mipmap cube complete."
However, Texture::GetCanRenderCondition() checks cube complete only if the texture
needs mipmap.
TEST=gpu_unittests TextureTest.POTCubeMapWithoutMipmap
BUG=517548
Review URL: https://codereview.chromium.org/1299683002
Cr-Commit-Position: refs/heads/master@{#344456}
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/texture_manager.cc | 5 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_manager_unittest.cc | 70 |
2 files changed, 73 insertions, 2 deletions
diff --git a/gpu/command_buffer/service/texture_manager.cc b/gpu/command_buffer/service/texture_manager.cc index ed0fd10..5085efa 100644 --- a/gpu/command_buffer/service/texture_manager.cc +++ b/gpu/command_buffer/service/texture_manager.cc @@ -443,10 +443,11 @@ Texture::CanRenderCondition Texture::GetCanRenderCondition() const { if (needs_mips) { if (!texture_complete()) return CAN_RENDER_NEVER; - if (target_ == GL_TEXTURE_CUBE_MAP && !cube_complete()) - return CAN_RENDER_NEVER; } + if (target_ == GL_TEXTURE_CUBE_MAP && !cube_complete()) + return CAN_RENDER_NEVER; + bool is_npot_compatible = !needs_mips && wrap_s_ == GL_CLAMP_TO_EDGE && wrap_t_ == GL_CLAMP_TO_EDGE; diff --git a/gpu/command_buffer/service/texture_manager_unittest.cc b/gpu/command_buffer/service/texture_manager_unittest.cc index cfb3200..6cadd97 100644 --- a/gpu/command_buffer/service/texture_manager_unittest.cc +++ b/gpu/command_buffer/service/texture_manager_unittest.cc @@ -840,6 +840,76 @@ TEST_F(TextureTest, POTCubeMap) { EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture)); } +TEST_F(TextureTest, POTCubeMapWithoutMipmap) { + manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP); + SetParameter( + texture_ref_.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST, GL_NO_ERROR); + SetParameter( + texture_ref_.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); + SetParameter( + texture_ref_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE, GL_NO_ERROR); + SetParameter( + texture_ref_.get(), GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE, GL_NO_ERROR); + + Texture* texture = texture_ref_->texture(); + EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), texture->target()); + // Check Setting level 0 each face to POT + manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, + GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + gfx::Rect(4, 4)); + EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); + EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); + EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); + EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get())); + EXPECT_FALSE(manager_->CanRender(texture_ref_.get())); + EXPECT_TRUE(manager_->HaveUnrenderableTextures()); + manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, + GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + gfx::Rect(4, 4)); + EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); + EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); + EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); + EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get())); + EXPECT_FALSE(manager_->CanRender(texture_ref_.get())); + EXPECT_TRUE(manager_->HaveUnrenderableTextures()); + manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, + GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + gfx::Rect(4, 4)); + EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); + EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); + EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); + EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get())); + EXPECT_FALSE(manager_->CanRender(texture_ref_.get())); + EXPECT_TRUE(manager_->HaveUnrenderableTextures()); + manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, + GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + gfx::Rect(4, 4)); + EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); + EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); + EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); + EXPECT_FALSE(manager_->CanRender(texture_ref_.get())); + EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get())); + EXPECT_TRUE(manager_->HaveUnrenderableTextures()); + manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, + GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + gfx::Rect(4, 4)); + EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); + EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); + EXPECT_FALSE(TextureTestHelper::IsCubeComplete(texture)); + EXPECT_FALSE(manager_->CanGenerateMipmaps(texture_ref_.get())); + EXPECT_FALSE(manager_->CanRender(texture_ref_.get())); + EXPECT_TRUE(manager_->HaveUnrenderableTextures()); + manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, + GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, + gfx::Rect(4, 4)); + EXPECT_FALSE(TextureTestHelper::IsNPOT(texture)); + EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); + EXPECT_TRUE(TextureTestHelper::IsCubeComplete(texture)); + EXPECT_TRUE(manager_->CanGenerateMipmaps(texture_ref_.get())); + EXPECT_TRUE(manager_->CanRender(texture_ref_.get())); + EXPECT_FALSE(manager_->HaveUnrenderableTextures()); +} + TEST_F(TextureTest, GetLevelSize) { manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_3D); manager_->SetLevelInfo(texture_ref_.get(), GL_TEXTURE_3D, 1, GL_RGBA, 4, 5, 6, |