blob: 73cc152a4df1deff1e2c03b671ecc911ddebc45b [file] [log] [blame]
// Copyright (c) 2010 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.
#include "gpu/command_buffer/service/texture_manager.h"
#include "base/scoped_ptr.h"
#include "gpu/GLES2/gles2_command_buffer.h"
#include "gpu/command_buffer/common/gl_mock.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::Pointee;
using ::testing::_;
namespace gpu {
namespace gles2 {
class TextureManagerTest : public testing::Test {
public:
static const GLint kMaxTextureSize = 16;
static const GLint kMaxCubeMapTextureSize = 8;
static const GLint kMax2dLevels = 5;
static const GLint kMaxCubeMapLevels = 4;
static const GLuint kServiceBlackTexture2dId = 701;
static const GLuint kServiceBlackTextureCubemapId = 702;
static const GLuint kServiceDefaultTexture2dId = 703;
static const GLuint kServiceDefaultTextureCubemapId = 704;
TextureManagerTest()
: manager_(kMaxTextureSize, kMaxCubeMapTextureSize) {
}
~TextureManagerTest() {
manager_.Destroy(false);
}
protected:
virtual void SetUp() {
gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
::gfx::GLInterface::SetGLInterface(gl_.get());
TestHelper::SetupTextureManagerInitExpectations(gl_.get());
manager_.Initialize();
}
virtual void TearDown() {
::gfx::GLInterface::SetGLInterface(NULL);
gl_.reset();
}
// Use StrictMock to make 100% sure we know how GL will be called.
scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
TextureManager manager_;
FeatureInfo feature_info_;
};
// GCC requires these declarations, but MSVC requires they not be present
#ifndef COMPILER_MSVC
const GLint TextureManagerTest::kMaxTextureSize;
const GLint TextureManagerTest::kMaxCubeMapTextureSize;
const GLint TextureManagerTest::kMax2dLevels;
const GLint TextureManagerTest::kMaxCubeMapLevels;
const GLuint TextureManagerTest::kServiceBlackTexture2dId;
const GLuint TextureManagerTest::kServiceBlackTextureCubemapId;
const GLuint TextureManagerTest::kServiceDefaultTexture2dId;
const GLuint TextureManagerTest::kServiceDefaultTextureCubemapId;
#endif
TEST_F(TextureManagerTest, Basic) {
const GLuint kClient1Id = 1;
const GLuint kService1Id = 11;
const GLuint kClient2Id = 2;
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
// Check we can create texture.
manager_.CreateTextureInfo(&feature_info_, kClient1Id, kService1Id);
// Check texture got created.
TextureManager::TextureInfo* info1 = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info1 != NULL);
EXPECT_EQ(kService1Id, info1->service_id());
GLuint client_id = 0;
EXPECT_TRUE(manager_.GetClientId(info1->service_id(), &client_id));
EXPECT_EQ(kClient1Id, client_id);
// Check we get nothing for a non-existent texture.
EXPECT_TRUE(manager_.GetTextureInfo(kClient2Id) == NULL);
// Check trying to a remove non-existent textures does not crash.
manager_.RemoveTextureInfo(&feature_info_, kClient2Id);
// Check we can't get the texture after we remove it.
manager_.RemoveTextureInfo(&feature_info_, kClient1Id);
EXPECT_TRUE(manager_.GetTextureInfo(kClient1Id) == NULL);
}
TEST_F(TextureManagerTest, Destroy) {
const GLuint kClient1Id = 1;
const GLuint kService1Id = 11;
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
// Check we can create texture.
manager_.CreateTextureInfo(&feature_info_, kClient1Id, kService1Id);
// Check texture got created.
TextureManager::TextureInfo* info1 = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info1 != NULL);
EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
.Times(1)
.RetiresOnSaturation();
EXPECT_CALL(*gl_, DeleteTextures(4, _))
.Times(1)
.RetiresOnSaturation();
manager_.Destroy(true);
// Check that resources got freed.
info1 = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info1 == NULL);
}
TEST_F(TextureManagerTest, MaxValues) {
// Check we get the right values for the max sizes.
EXPECT_EQ(kMax2dLevels, manager_.MaxLevelsForTarget(GL_TEXTURE_2D));
EXPECT_EQ(kMaxCubeMapLevels,
manager_.MaxLevelsForTarget(GL_TEXTURE_CUBE_MAP));
EXPECT_EQ(kMaxTextureSize, manager_.MaxSizeForTarget(GL_TEXTURE_2D));
EXPECT_EQ(kMaxCubeMapTextureSize,
manager_.MaxSizeForTarget(GL_TEXTURE_CUBE_MAP));
}
TEST_F(TextureManagerTest, ValidForTarget) {
// check 2d
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, 0,
kMaxTextureSize, kMaxTextureSize, 1));
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, kMax2dLevels - 1,
kMaxTextureSize, kMaxTextureSize, 1));
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, kMax2dLevels - 1,
1, kMaxTextureSize, 1));
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, kMax2dLevels - 1,
kMaxTextureSize, 1, 1));
// check level out of range.
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, kMax2dLevels,
kMaxTextureSize, 1, 1));
// check has depth.
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, kMax2dLevels,
kMaxTextureSize, 1, 2));
// Check NPOT width on level 0
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, 0, 5, 2, 1));
// Check NPOT height on level 0
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, 0, 2, 5, 1));
// Check NPOT width on level 1
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, 1, 5, 2, 1));
// Check NPOT height on level 1
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_2D, 1, 2, 5, 1));
// check cube
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_CUBE_MAP, 0,
kMaxCubeMapTextureSize, kMaxCubeMapTextureSize, 1));
EXPECT_TRUE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels - 1,
kMaxCubeMapTextureSize, kMaxCubeMapTextureSize, 1));
// check level out of range.
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
kMaxCubeMapTextureSize, 1, 1));
// check not square.
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
kMaxCubeMapTextureSize, 1, 1));
// check has depth.
EXPECT_FALSE(manager_.ValidForTarget(
&feature_info_, GL_TEXTURE_CUBE_MAP, kMaxCubeMapLevels,
kMaxCubeMapTextureSize, 1, 2));
}
TEST_F(TextureManagerTest, ValidForTargetNPOT) {
TextureManager manager(kMaxTextureSize, kMaxCubeMapTextureSize);
TestHelper::SetupFeatureInfoInitExpectations(
gl_.get(), "GL_OES_texture_npot");
FeatureInfo feature_info;
feature_info.Initialize(NULL);
// Check NPOT width on level 0
EXPECT_TRUE(manager.ValidForTarget(&feature_info, GL_TEXTURE_2D, 0, 5, 2, 1));
// Check NPOT height on level 0
EXPECT_TRUE(manager.ValidForTarget(&feature_info, GL_TEXTURE_2D, 0, 2, 5, 1));
// Check NPOT width on level 1
EXPECT_TRUE(manager.ValidForTarget(&feature_info, GL_TEXTURE_2D, 1, 5, 2, 1));
// Check NPOT height on level 1
EXPECT_TRUE(manager.ValidForTarget(&feature_info, GL_TEXTURE_2D, 1, 2, 5, 1));
manager.Destroy(false);
}
class TextureInfoTest : public testing::Test {
public:
static const GLint kMaxTextureSize = 16;
static const GLint kMaxCubeMapTextureSize = 8;
static const GLint kMax2dLevels = 5;
static const GLint kMaxCubeMapLevels = 4;
static const GLuint kClient1Id = 1;
static const GLuint kService1Id = 11;
TextureInfoTest()
: manager_(kMaxTextureSize, kMaxCubeMapTextureSize) {
}
~TextureInfoTest() {
manager_.Destroy(false);
}
protected:
virtual void SetUp() {
gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
::gfx::GLInterface::SetGLInterface(gl_.get());
manager_.CreateTextureInfo(&feature_info_, kClient1Id, kService1Id);
info_ = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info_ != NULL);
}
virtual void TearDown() {
::gfx::GLInterface::SetGLInterface(NULL);
gl_.reset();
}
// Use StrictMock to make 100% sure we know how GL will be called.
scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
TextureManager manager_;
TextureManager::TextureInfo* info_;
FeatureInfo feature_info_;
};
TEST_F(TextureInfoTest, Basic) {
EXPECT_EQ(0u, info_->target());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->cube_complete());
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
}
TEST_F(TextureInfoTest, POT2D) {
manager_.SetInfoTarget(info_, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info_->target());
// Check Setting level 0 to POT
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
// Set filters to something that will work with a single mip.
manager_.SetParameter(
&feature_info_, info_, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
EXPECT_TRUE(info_->CanRender(&feature_info_));
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
// Set them back.
manager_.SetParameter(
&feature_info_, info_, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
// Make mips.
EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
EXPECT_TRUE(info_->texture_complete());
EXPECT_TRUE(info_->CanRender(&feature_info_));
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
// Change a mip.
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
// Set a level past the number of mips that would get generated.
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
// Make mips.
EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_FALSE(info_->texture_complete());
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
}
TEST_F(TextureInfoTest, NPOT2D) {
manager_.SetInfoTarget(info_, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info_->target());
// Check Setting level 0 to NPOT
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_TRUE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetParameter(
&feature_info_, info_, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetParameter(
&feature_info_, info_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetParameter(
&feature_info_, info_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
EXPECT_TRUE(info_->CanRender(&feature_info_));
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
// Change it to POT.
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
}
TEST_F(TextureInfoTest, NPOT2DNPOTOK) {
TextureManager manager(kMaxTextureSize, kMaxCubeMapTextureSize);
TestHelper::SetupFeatureInfoInitExpectations(
gl_.get(), "GL_OES_texture_npot");
FeatureInfo feature_info;
feature_info.Initialize(NULL);
manager.CreateTextureInfo(&feature_info, kClient1Id, kService1Id);
TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info_ != NULL);
manager.SetInfoTarget(info, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info->target());
// Check Setting level 0 to NPOT
manager.SetLevelInfo(&feature_info, info,
GL_TEXTURE_2D, 0, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_TRUE(info->npot());
EXPECT_FALSE(info->texture_complete());
EXPECT_TRUE(info->CanGenerateMipmaps(&feature_info));
EXPECT_FALSE(info->CanRender(&feature_info));
EXPECT_TRUE(manager.HaveUnrenderableTextures());
EXPECT_TRUE(manager.MarkMipmapsGenerated(&feature_info, info));
EXPECT_TRUE(info->texture_complete());
EXPECT_TRUE(info->CanRender(&feature_info));
EXPECT_FALSE(manager.HaveUnrenderableTextures());
manager.Destroy(false);
}
TEST_F(TextureInfoTest, POTCubeMap) {
manager_.SetInfoTarget(info_, GL_TEXTURE_CUBE_MAP);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP), info_->target());
// Check Setting level 0 each face to POT
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_POSITIVE_X,
0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->cube_complete());
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->cube_complete());
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->cube_complete());
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->cube_complete());
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_FALSE(info_->cube_complete());
EXPECT_FALSE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
0, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_TRUE(info_->cube_complete());
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
EXPECT_FALSE(info_->CanRender(&feature_info_));
EXPECT_TRUE(manager_.HaveUnrenderableTextures());
// Make mips.
EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
EXPECT_TRUE(info_->texture_complete());
EXPECT_TRUE(info_->cube_complete());
EXPECT_TRUE(info_->CanRender(&feature_info_));
EXPECT_FALSE(manager_.HaveUnrenderableTextures());
// Change a mip.
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_FALSE(info_->npot());
EXPECT_FALSE(info_->texture_complete());
EXPECT_TRUE(info_->cube_complete());
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
// Set a level past the number of mips that would get generated.
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
3, GL_RGBA, 4, 4, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
EXPECT_TRUE(info_->CanGenerateMipmaps(&feature_info_));
// Make mips.
EXPECT_TRUE(manager_.MarkMipmapsGenerated(&feature_info_, info_));
EXPECT_FALSE(info_->texture_complete());
EXPECT_TRUE(info_->cube_complete());
}
TEST_F(TextureInfoTest, GetLevelSize) {
manager_.SetInfoTarget(info_, GL_TEXTURE_2D);
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
GLsizei width = -1;
GLsizei height = -1;
EXPECT_FALSE(info_->GetLevelSize(GL_TEXTURE_2D, -1, &width, &height));
EXPECT_FALSE(info_->GetLevelSize(GL_TEXTURE_2D, 1000, &width, &height));
EXPECT_TRUE(info_->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height));
EXPECT_EQ(0, width);
EXPECT_EQ(0, height);
EXPECT_TRUE(info_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
EXPECT_EQ(4, width);
EXPECT_EQ(5, height);
manager_.RemoveTextureInfo(&feature_info_, kClient1Id);
EXPECT_FALSE(info_->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height));
}
TEST_F(TextureInfoTest, GetLevelType) {
manager_.SetInfoTarget(info_, GL_TEXTURE_2D);
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
GLenum type = -1;
GLenum format = -1;
EXPECT_FALSE(info_->GetLevelType(GL_TEXTURE_2D, -1, &type, &format));
EXPECT_FALSE(info_->GetLevelType(GL_TEXTURE_2D, 1000, &type, &format));
EXPECT_TRUE(info_->GetLevelType(GL_TEXTURE_2D, 0, &type, &format));
EXPECT_EQ(0u, type);
EXPECT_EQ(0u, format);
EXPECT_TRUE(info_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type);
EXPECT_EQ(static_cast<GLenum>(GL_RGBA), format);
manager_.RemoveTextureInfo(&feature_info_, kClient1Id);
EXPECT_FALSE(info_->GetLevelType(GL_TEXTURE_2D, 1, &type, &format));
}
TEST_F(TextureInfoTest, ValidForTexture) {
manager_.SetInfoTarget(info_, GL_TEXTURE_2D);
manager_.SetLevelInfo(&feature_info_, info_,
GL_TEXTURE_2D, 1, GL_RGBA, 4, 5, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE);
// Check bad face.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad level.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad xoffset.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad xoffset + width > width.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad yoffset.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad yoffset + height > height.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad width.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad height.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE));
// Check bad format.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE));
// Check bad type.
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4));
// Check valid full size
EXPECT_TRUE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
// Check valid particial size.
EXPECT_TRUE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE));
manager_.RemoveTextureInfo(&feature_info_, kClient1Id);
EXPECT_FALSE(info_->ValidForTexture(
GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE));
}
TEST_F(TextureInfoTest, FloatNotLinear) {
TextureManager manager(kMaxTextureSize, kMaxCubeMapTextureSize);
TestHelper::SetupFeatureInfoInitExpectations(
gl_.get(), "GL_OES_texture_float");
FeatureInfo feature_info;
feature_info.Initialize(NULL);
manager.CreateTextureInfo(&feature_info, kClient1Id, kService1Id);
TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info != NULL);
manager.SetInfoTarget(info, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info->target());
manager.SetLevelInfo(&feature_info, info,
GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT);
EXPECT_FALSE(info->texture_complete());
manager.SetParameter(&feature_info, info, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
EXPECT_FALSE(info->texture_complete());
manager.SetParameter(
&feature_info, info, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
EXPECT_TRUE(info->texture_complete());
manager.Destroy(false);
}
TEST_F(TextureInfoTest, FloatLinear) {
TextureManager manager(kMaxTextureSize, kMaxCubeMapTextureSize);
TestHelper::SetupFeatureInfoInitExpectations(
gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
FeatureInfo feature_info;
feature_info.Initialize(NULL);
manager.CreateTextureInfo(&feature_info, kClient1Id, kService1Id);
TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info != NULL);
manager.SetInfoTarget(info, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info->target());
manager.SetLevelInfo(&feature_info, info,
GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT);
EXPECT_TRUE(info->texture_complete());
manager.Destroy(false);
}
TEST_F(TextureInfoTest, HalfFloatNotLinear) {
TextureManager manager(kMaxTextureSize, kMaxCubeMapTextureSize);
TestHelper::SetupFeatureInfoInitExpectations(
gl_.get(), "GL_OES_texture_half_float");
FeatureInfo feature_info;
feature_info.Initialize(NULL);
manager.CreateTextureInfo(&feature_info, kClient1Id, kService1Id);
TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info != NULL);
manager.SetInfoTarget(info, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info->target());
manager.SetLevelInfo(&feature_info, info,
GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES);
EXPECT_FALSE(info->texture_complete());
manager.SetParameter(&feature_info, info, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
EXPECT_FALSE(info->texture_complete());
manager.SetParameter(
&feature_info, info, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
EXPECT_TRUE(info->texture_complete());
manager.Destroy(false);
}
TEST_F(TextureInfoTest, HalfFloatLinear) {
TextureManager manager(kMaxTextureSize, kMaxCubeMapTextureSize);
TestHelper::SetupFeatureInfoInitExpectations(
gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
FeatureInfo feature_info;
feature_info.Initialize(NULL);
manager.CreateTextureInfo(&feature_info, kClient1Id, kService1Id);
TextureManager::TextureInfo* info = manager_.GetTextureInfo(kClient1Id);
ASSERT_TRUE(info != NULL);
manager.SetInfoTarget(info, GL_TEXTURE_2D);
EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_2D), info->target());
manager.SetLevelInfo(&feature_info, info,
GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES);
EXPECT_TRUE(info->texture_complete());
manager.Destroy(false);
}
} // namespace gles2
} // namespace gpu