Remove default textures in (!bind_generates_resource) context groups.
Previously texture ids for default textures in Renderer compositor and Browser compositor contexts are different, so during a context switch we'd be restoring default textures for all units which can be slow. This change makes all default textures 'null' for context groups with bind_generates_resource == false. Since Renderer and Browser compositors will both have 'null' default textures, state switching will be avoided. BUG=333063, 353822 Review URL: https://codereview.chromium.org/224763002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@262288 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
@@ -178,7 +178,8 @@ bool ContextGroup::Initialize(
|
||||
texture_manager_.reset(new TextureManager(memory_tracker_.get(),
|
||||
feature_info_.get(),
|
||||
max_texture_size,
|
||||
max_cube_map_texture_size));
|
||||
max_cube_map_texture_size,
|
||||
bind_generates_resource_));
|
||||
texture_manager_->set_framebuffer_manager(framebuffer_manager_.get());
|
||||
|
||||
const GLint kMinTextureImageUnits = 8;
|
||||
|
@@ -30,8 +30,9 @@ namespace gles2 {
|
||||
|
||||
class ContextGroupTest : public testing::Test {
|
||||
public:
|
||||
ContextGroupTest() {
|
||||
}
|
||||
static const bool kBindGeneratesResource = false;
|
||||
|
||||
ContextGroupTest() {}
|
||||
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
@@ -39,7 +40,7 @@ class ContextGroupTest : public testing::Test {
|
||||
::gfx::MockGLInterface::SetGLInterface(gl_.get());
|
||||
decoder_.reset(new MockGLES2Decoder());
|
||||
group_ = scoped_refptr<ContextGroup>(
|
||||
new ContextGroup(NULL, NULL, NULL, NULL, NULL, true));
|
||||
new ContextGroup(NULL, NULL, NULL, NULL, NULL, kBindGeneratesResource));
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
@@ -70,8 +71,8 @@ TEST_F(ContextGroupTest, Basic) {
|
||||
}
|
||||
|
||||
TEST_F(ContextGroupTest, InitializeNoExtensions) {
|
||||
TestHelper::SetupContextGroupInitExpectations(gl_.get(),
|
||||
DisallowedFeatures(), "", "");
|
||||
TestHelper::SetupContextGroupInitExpectations(
|
||||
gl_.get(), DisallowedFeatures(), "", "", kBindGeneratesResource);
|
||||
group_->Initialize(decoder_.get(), DisallowedFeatures());
|
||||
EXPECT_EQ(static_cast<uint32>(TestHelper::kNumVertexAttribs),
|
||||
group_->max_vertex_attribs());
|
||||
@@ -105,8 +106,8 @@ TEST_F(ContextGroupTest, InitializeNoExtensions) {
|
||||
|
||||
TEST_F(ContextGroupTest, MultipleContexts) {
|
||||
scoped_ptr<MockGLES2Decoder> decoder2_(new MockGLES2Decoder());
|
||||
TestHelper::SetupContextGroupInitExpectations(gl_.get(),
|
||||
DisallowedFeatures(), "", "");
|
||||
TestHelper::SetupContextGroupInitExpectations(
|
||||
gl_.get(), DisallowedFeatures(), "", "", kBindGeneratesResource);
|
||||
group_->Initialize(decoder_.get(), DisallowedFeatures());
|
||||
group_->Initialize(decoder2_.get(), DisallowedFeatures());
|
||||
|
||||
|
@@ -22,6 +22,7 @@ const GLint kMaxCubemapSize = 64;
|
||||
const GLint kMaxRenderbufferSize = 64;
|
||||
const GLint kMaxSamples = 4;
|
||||
const bool kDepth24Supported = false;
|
||||
const bool kUseDefaultTextures = false;
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -29,11 +30,15 @@ class FramebufferManagerTest : public testing::Test {
|
||||
public:
|
||||
FramebufferManagerTest()
|
||||
: manager_(1, 1),
|
||||
texture_manager_(
|
||||
NULL, new FeatureInfo(), kMaxTextureSize, kMaxCubemapSize),
|
||||
renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples,
|
||||
kDepth24Supported) {
|
||||
}
|
||||
texture_manager_(NULL,
|
||||
new FeatureInfo(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubemapSize,
|
||||
kUseDefaultTextures),
|
||||
renderbuffer_manager_(NULL,
|
||||
kMaxRenderbufferSize,
|
||||
kMaxSamples,
|
||||
kDepth24Supported) {}
|
||||
virtual ~FramebufferManagerTest() {
|
||||
manager_.Destroy(false);
|
||||
texture_manager_.Destroy(false);
|
||||
@@ -112,8 +117,11 @@ class FramebufferInfoTest : public testing::Test {
|
||||
feature_info_(new FeatureInfo()),
|
||||
renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples,
|
||||
kDepth24Supported) {
|
||||
texture_manager_.reset(new TextureManager(NULL, feature_info_.get(),
|
||||
kMaxTextureSize, kMaxCubemapSize));
|
||||
texture_manager_.reset(new TextureManager(NULL,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubemapSize,
|
||||
kUseDefaultTextures));
|
||||
}
|
||||
virtual ~FramebufferInfoTest() {
|
||||
manager_.Destroy(false);
|
||||
|
@@ -2394,20 +2394,20 @@ bool GLES2DecoderImpl::Initialize(
|
||||
ref = texture_manager()->GetDefaultTextureInfo(
|
||||
GL_TEXTURE_EXTERNAL_OES);
|
||||
state_.texture_units[tt].bound_texture_external_oes = ref;
|
||||
glBindTexture(GL_TEXTURE_EXTERNAL_OES, ref->service_id());
|
||||
glBindTexture(GL_TEXTURE_EXTERNAL_OES, ref ? ref->service_id() : 0);
|
||||
}
|
||||
if (features().arb_texture_rectangle) {
|
||||
ref = texture_manager()->GetDefaultTextureInfo(
|
||||
GL_TEXTURE_RECTANGLE_ARB);
|
||||
state_.texture_units[tt].bound_texture_rectangle_arb = ref;
|
||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, ref->service_id());
|
||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, ref ? ref->service_id() : 0);
|
||||
}
|
||||
ref = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP);
|
||||
state_.texture_units[tt].bound_texture_cube_map = ref;
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, ref->service_id());
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, ref ? ref->service_id() : 0);
|
||||
ref = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D);
|
||||
state_.texture_units[tt].bound_texture_2d = ref;
|
||||
glBindTexture(GL_TEXTURE_2D, ref->service_id());
|
||||
glBindTexture(GL_TEXTURE_2D, ref ? ref->service_id() : 0);
|
||||
}
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
CHECK_GL_ERROR();
|
||||
@@ -4041,21 +4041,25 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) {
|
||||
} else {
|
||||
texture_ref = texture_manager()->GetDefaultTextureInfo(target);
|
||||
}
|
||||
Texture* texture = texture_ref->texture();
|
||||
|
||||
// Check the texture exists
|
||||
// Check that we are not trying to bind it to a different target.
|
||||
if (texture->target() != 0 && texture->target() != target) {
|
||||
LOCAL_SET_GL_ERROR(
|
||||
GL_INVALID_OPERATION,
|
||||
"glBindTexture", "texture bound to more than 1 target.");
|
||||
return;
|
||||
if (texture_ref) {
|
||||
Texture* texture = texture_ref->texture();
|
||||
// Check that we are not trying to bind it to a different target.
|
||||
if (texture->target() != 0 && texture->target() != target) {
|
||||
LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION,
|
||||
"glBindTexture",
|
||||
"texture bound to more than 1 target.");
|
||||
return;
|
||||
}
|
||||
LogClientServiceForInfo(texture, client_id, "glBindTexture");
|
||||
if (texture->target() == 0) {
|
||||
texture_manager()->SetTarget(texture_ref, target);
|
||||
}
|
||||
glBindTexture(target, texture->service_id());
|
||||
} else {
|
||||
glBindTexture(target, 0);
|
||||
}
|
||||
LogClientServiceForInfo(texture, client_id, "glBindTexture");
|
||||
if (texture->target() == 0) {
|
||||
texture_manager()->SetTarget(texture_ref, target);
|
||||
}
|
||||
glBindTexture(target, texture->service_id());
|
||||
|
||||
TextureUnit& unit = state_.texture_units[state_.active_texture_unit];
|
||||
unit.bind_target = target;
|
||||
|
@@ -5660,6 +5660,244 @@ TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) {
|
||||
EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, DefaultTextureZero) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
BindTexture cmd2;
|
||||
cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, DefaultTextureBGR) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
init.bind_generates_resource = true;
|
||||
InitDecoder(init);
|
||||
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(
|
||||
*gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
BindTexture cmd2;
|
||||
cmd2.Init(GL_TEXTURE_CUBE_MAP, 0);
|
||||
EXPECT_CALL(*gl_,
|
||||
BindTexture(GL_TEXTURE_CUBE_MAP,
|
||||
TestHelper::kServiceDefaultTextureCubemapId));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
}
|
||||
|
||||
// Test that default texture 0 is immutable.
|
||||
TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameterf) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameterf cmd2;
|
||||
cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameterf cmd2;
|
||||
cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameteri) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameteri cmd2;
|
||||
cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameteri cmd2;
|
||||
cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameterfv) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameterfv cmd2;
|
||||
cmd2.Init(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MAG_FILTER,
|
||||
shared_memory_id_,
|
||||
shared_memory_offset_);
|
||||
GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST;
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameterfv cmd2;
|
||||
cmd2.Init(GL_TEXTURE_CUBE_MAP,
|
||||
GL_TEXTURE_MAG_FILTER,
|
||||
shared_memory_id_,
|
||||
shared_memory_offset_);
|
||||
GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST;
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, NoDefaultTexParameteriv) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameteriv cmd2;
|
||||
cmd2.Init(GL_TEXTURE_2D,
|
||||
GL_TEXTURE_MAG_FILTER,
|
||||
shared_memory_id_,
|
||||
shared_memory_offset_);
|
||||
GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST;
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
|
||||
{
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_CUBE_MAP, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexParameteriv cmd2;
|
||||
cmd2.Init(GL_TEXTURE_CUBE_MAP,
|
||||
GL_TEXTURE_MAG_FILTER,
|
||||
shared_memory_id_,
|
||||
shared_memory_offset_);
|
||||
GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST;
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, NoDefaultTexImage2D) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexImage2D cmd2;
|
||||
cmd2.Init(GL_TEXTURE_2D,
|
||||
0,
|
||||
GL_RGBA,
|
||||
2,
|
||||
2,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
kSharedMemoryId,
|
||||
kSharedMemoryOffset);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, NoDefaultTexSubImage2D) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
BindTexture cmd1;
|
||||
cmd1.Init(GL_TEXTURE_2D, 0);
|
||||
EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0));
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
|
||||
TexSubImage2D cmd2;
|
||||
cmd2.Init(GL_TEXTURE_2D,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
kSharedMemoryId,
|
||||
kSharedMemoryOffset,
|
||||
GL_FALSE);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2));
|
||||
EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) {
|
||||
InitState init;
|
||||
init.extensions = "GL_ARB_texture_rectangle";
|
||||
@@ -8632,9 +8870,10 @@ TEST_F(GLES2DecoderTest, DiscardFramebufferEXTUnsupported) {
|
||||
EXPECT_EQ(GL_INVALID_OPERATION, GetGLError());
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NullPreviousState) {
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NullPreviousStateBGR) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
init.bind_generates_resource = true;
|
||||
InitDecoder(init);
|
||||
SetupTexture();
|
||||
|
||||
@@ -8660,6 +8899,56 @@ TEST_F(GLES2DecoderRestoreStateTest, NullPreviousState) {
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(NULL);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NullPreviousState) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
SetupTexture();
|
||||
|
||||
InSequence sequence;
|
||||
// Expect to restore texture bindings for unit GL_TEXTURE0.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
||||
|
||||
// Expect to restore texture bindings for remaining units.
|
||||
for (uint32 i = 1; i < group().max_texture_units(); ++i) {
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0 + i);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
||||
}
|
||||
|
||||
// Expect to restore the active texture unit to GL_TEXTURE0.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(NULL);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, WithPreviousStateBGR) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
init.bind_generates_resource = true;
|
||||
InitDecoder(init);
|
||||
SetupTexture();
|
||||
|
||||
// Construct a previous ContextState with all texture bindings
|
||||
// set to default textures.
|
||||
ContextState prev_state(NULL, NULL, NULL);
|
||||
InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0);
|
||||
|
||||
InSequence sequence;
|
||||
// Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit,
|
||||
// since the rest of the bindings haven't changed between the current
|
||||
// state and the |prev_state|.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
||||
|
||||
// Expect to restore active texture unit to GL_TEXTURE0.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, WithPreviousState) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
@@ -8715,9 +9004,10 @@ TEST_F(GLES2DecoderRestoreStateTest, ActiveUnit1) {
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit0) {
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit0BGR) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
init.bind_generates_resource = true;
|
||||
InitDecoder(init);
|
||||
|
||||
// Bind a non-default texture to GL_TEXTURE1 unit.
|
||||
@@ -8753,9 +9043,10 @@ TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit0) {
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit1) {
|
||||
TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit1BGR) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
init.bind_generates_resource = true;
|
||||
InitDecoder(init);
|
||||
|
||||
// Bind a non-default texture to GL_TEXTURE0 unit.
|
||||
@@ -8785,6 +9076,74 @@ TEST_F(GLES2DecoderRestoreStateTest, NonDefaultUnit1) {
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, DefaultUnit0) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
// Bind a non-default texture to GL_TEXTURE1 unit.
|
||||
EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1));
|
||||
SpecializedSetup<ActiveTexture, 0>(true);
|
||||
ActiveTexture cmd;
|
||||
cmd.Init(GL_TEXTURE1);
|
||||
EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
|
||||
EXPECT_EQ(GL_NO_ERROR, GetGLError());
|
||||
SetupTexture();
|
||||
|
||||
// Construct a previous ContextState with GL_TEXTURE_2D target in
|
||||
// GL_TEXTURE0 unit bound to a non-default texture and the rest
|
||||
// set to default textures.
|
||||
ContextState prev_state(NULL, NULL, NULL);
|
||||
InitializeContextState(&prev_state, 0, kServiceTextureId);
|
||||
|
||||
InSequence sequence;
|
||||
// Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to
|
||||
// the 0 texture.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
// Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to
|
||||
// non-default.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE1);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
||||
|
||||
// Expect to restore active texture unit to GL_TEXTURE1.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE1);
|
||||
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderRestoreStateTest, DefaultUnit1) {
|
||||
InitState init;
|
||||
init.gl_version = "3.0";
|
||||
InitDecoder(init);
|
||||
|
||||
// Bind a non-default texture to GL_TEXTURE0 unit.
|
||||
SetupTexture();
|
||||
|
||||
// Construct a previous ContextState with GL_TEXTURE_2D target in
|
||||
// GL_TEXTURE1 unit bound to a non-default texture and the rest
|
||||
// set to default textures.
|
||||
ContextState prev_state(NULL, NULL, NULL);
|
||||
InitializeContextState(&prev_state, 1, kServiceTextureId);
|
||||
|
||||
InSequence sequence;
|
||||
// Expect to restore GL_TEXTURE_2D binding to the non-default texture
|
||||
// for GL_TEXTURE0 unit.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId);
|
||||
|
||||
// Expect to restore GL_TEXTURE_2D binding to the 0 texture
|
||||
// for GL_TEXTURE1 unit.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE1);
|
||||
AddExpectationsForBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
// Expect to restore active texture unit to GL_TEXTURE0.
|
||||
AddExpectationsForActiveTexture(GL_TEXTURE0);
|
||||
|
||||
GetDecoder()->RestoreAllTextureUnitBindings(&prev_state);
|
||||
}
|
||||
|
||||
TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) {
|
||||
CommandLine command_line(0, NULL);
|
||||
command_line.AppendSwitchASCII(
|
||||
|
@@ -116,6 +116,7 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine(
|
||||
new ShaderTranslatorCache,
|
||||
feature_info.get(),
|
||||
init.bind_generates_resource));
|
||||
bool use_default_textures = init.bind_generates_resource;
|
||||
|
||||
InSequence sequence;
|
||||
|
||||
@@ -135,7 +136,8 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine(
|
||||
TestHelper::SetupContextGroupInitExpectations(gl_.get(),
|
||||
DisallowedFeatures(),
|
||||
init.extensions.c_str(),
|
||||
init.gl_version.c_str());
|
||||
init.gl_version.c_str(),
|
||||
init.bind_generates_resource);
|
||||
|
||||
// We initialize the ContextGroup with a MockGLES2Decoder so that
|
||||
// we can use the ContextGroup to figure out how the real GLES2Decoder
|
||||
@@ -182,25 +184,36 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine(
|
||||
.Times(1)
|
||||
.RetiresOnSaturation();
|
||||
if (group_->feature_info()->feature_flags().oes_egl_image_external) {
|
||||
EXPECT_CALL(*gl_, BindTexture(
|
||||
GL_TEXTURE_EXTERNAL_OES,
|
||||
TestHelper::kServiceDefaultExternalTextureId))
|
||||
EXPECT_CALL(*gl_,
|
||||
BindTexture(GL_TEXTURE_EXTERNAL_OES,
|
||||
use_default_textures
|
||||
? TestHelper::kServiceDefaultExternalTextureId
|
||||
: 0))
|
||||
.Times(1)
|
||||
.RetiresOnSaturation();
|
||||
}
|
||||
if (group_->feature_info()->feature_flags().arb_texture_rectangle) {
|
||||
EXPECT_CALL(*gl_, BindTexture(
|
||||
GL_TEXTURE_RECTANGLE_ARB,
|
||||
TestHelper::kServiceDefaultRectangleTextureId))
|
||||
EXPECT_CALL(
|
||||
*gl_,
|
||||
BindTexture(GL_TEXTURE_RECTANGLE_ARB,
|
||||
use_default_textures
|
||||
? TestHelper::kServiceDefaultRectangleTextureId
|
||||
: 0))
|
||||
.Times(1)
|
||||
.RetiresOnSaturation();
|
||||
}
|
||||
EXPECT_CALL(*gl_, BindTexture(
|
||||
GL_TEXTURE_CUBE_MAP, TestHelper::kServiceDefaultTextureCubemapId))
|
||||
EXPECT_CALL(*gl_,
|
||||
BindTexture(GL_TEXTURE_CUBE_MAP,
|
||||
use_default_textures
|
||||
? TestHelper::kServiceDefaultTextureCubemapId
|
||||
: 0))
|
||||
.Times(1)
|
||||
.RetiresOnSaturation();
|
||||
EXPECT_CALL(*gl_, BindTexture(
|
||||
GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId))
|
||||
EXPECT_CALL(
|
||||
*gl_,
|
||||
BindTexture(
|
||||
GL_TEXTURE_2D,
|
||||
use_default_textures ? TestHelper::kServiceDefaultTexture2dId : 0))
|
||||
.Times(1)
|
||||
.RetiresOnSaturation();
|
||||
}
|
||||
|
@@ -61,7 +61,9 @@ const GLint TestHelper::kMaxVertexUniformComponents;
|
||||
#endif
|
||||
|
||||
void TestHelper::SetupTextureInitializationExpectations(
|
||||
::gfx::MockGLInterface* gl, GLenum target) {
|
||||
::gfx::MockGLInterface* gl,
|
||||
GLenum target,
|
||||
bool use_default_textures) {
|
||||
InSequence sequence;
|
||||
|
||||
bool needs_initialization = (target != GL_TEXTURE_EXTERNAL_OES);
|
||||
@@ -98,7 +100,7 @@ void TestHelper::SetupTextureInitializationExpectations(
|
||||
NOTREACHED();
|
||||
}
|
||||
|
||||
int array_size = 2;
|
||||
int array_size = use_default_textures ? 2 : 1;
|
||||
|
||||
EXPECT_CALL(*gl, GenTextures(array_size, _))
|
||||
.WillOnce(SetArrayArgument<1>(texture_ids,
|
||||
@@ -139,11 +141,14 @@ void TestHelper::SetupTextureInitializationExpectations(
|
||||
|
||||
void TestHelper::SetupTextureManagerInitExpectations(
|
||||
::gfx::MockGLInterface* gl,
|
||||
const char* extensions) {
|
||||
const char* extensions,
|
||||
bool use_default_textures) {
|
||||
InSequence sequence;
|
||||
|
||||
SetupTextureInitializationExpectations(gl, GL_TEXTURE_2D);
|
||||
SetupTextureInitializationExpectations(gl, GL_TEXTURE_CUBE_MAP);
|
||||
SetupTextureInitializationExpectations(
|
||||
gl, GL_TEXTURE_2D, use_default_textures);
|
||||
SetupTextureInitializationExpectations(
|
||||
gl, GL_TEXTURE_CUBE_MAP, use_default_textures);
|
||||
|
||||
bool ext_image_external = false;
|
||||
bool arb_texture_rectangle = false;
|
||||
@@ -160,15 +165,22 @@ void TestHelper::SetupTextureManagerInitExpectations(
|
||||
}
|
||||
|
||||
if (ext_image_external) {
|
||||
SetupTextureInitializationExpectations(gl, GL_TEXTURE_EXTERNAL_OES);
|
||||
SetupTextureInitializationExpectations(
|
||||
gl, GL_TEXTURE_EXTERNAL_OES, use_default_textures);
|
||||
}
|
||||
if (arb_texture_rectangle) {
|
||||
SetupTextureInitializationExpectations(gl, GL_TEXTURE_RECTANGLE_ARB);
|
||||
SetupTextureInitializationExpectations(
|
||||
gl, GL_TEXTURE_RECTANGLE_ARB, use_default_textures);
|
||||
}
|
||||
}
|
||||
|
||||
void TestHelper::SetupTextureDestructionExpectations(
|
||||
::gfx::MockGLInterface* gl, GLenum target) {
|
||||
::gfx::MockGLInterface* gl,
|
||||
GLenum target,
|
||||
bool use_default_textures) {
|
||||
if (!use_default_textures)
|
||||
return;
|
||||
|
||||
GLuint texture_id = 0;
|
||||
switch (target) {
|
||||
case GL_TEXTURE_2D:
|
||||
@@ -194,9 +206,11 @@ void TestHelper::SetupTextureDestructionExpectations(
|
||||
|
||||
void TestHelper::SetupTextureManagerDestructionExpectations(
|
||||
::gfx::MockGLInterface* gl,
|
||||
const char* extensions) {
|
||||
SetupTextureDestructionExpectations(gl, GL_TEXTURE_2D);
|
||||
SetupTextureDestructionExpectations(gl, GL_TEXTURE_CUBE_MAP);
|
||||
const char* extensions,
|
||||
bool use_default_textures) {
|
||||
SetupTextureDestructionExpectations(gl, GL_TEXTURE_2D, use_default_textures);
|
||||
SetupTextureDestructionExpectations(
|
||||
gl, GL_TEXTURE_CUBE_MAP, use_default_textures);
|
||||
|
||||
bool ext_image_external = false;
|
||||
bool arb_texture_rectangle = false;
|
||||
@@ -213,10 +227,12 @@ void TestHelper::SetupTextureManagerDestructionExpectations(
|
||||
}
|
||||
|
||||
if (ext_image_external) {
|
||||
SetupTextureDestructionExpectations(gl, GL_TEXTURE_EXTERNAL_OES);
|
||||
SetupTextureDestructionExpectations(
|
||||
gl, GL_TEXTURE_EXTERNAL_OES, use_default_textures);
|
||||
}
|
||||
if (arb_texture_rectangle) {
|
||||
SetupTextureDestructionExpectations(gl, GL_TEXTURE_RECTANGLE_ARB);
|
||||
SetupTextureDestructionExpectations(
|
||||
gl, GL_TEXTURE_RECTANGLE_ARB, use_default_textures);
|
||||
}
|
||||
|
||||
EXPECT_CALL(*gl, DeleteTextures(4, _))
|
||||
@@ -225,10 +241,11 @@ void TestHelper::SetupTextureManagerDestructionExpectations(
|
||||
}
|
||||
|
||||
void TestHelper::SetupContextGroupInitExpectations(
|
||||
::gfx::MockGLInterface* gl,
|
||||
const DisallowedFeatures& disallowed_features,
|
||||
const char* extensions,
|
||||
const char* gl_version) {
|
||||
::gfx::MockGLInterface* gl,
|
||||
const DisallowedFeatures& disallowed_features,
|
||||
const char* extensions,
|
||||
const char* gl_version,
|
||||
bool bind_generates_resource) {
|
||||
InSequence sequence;
|
||||
|
||||
SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", gl_version);
|
||||
@@ -277,7 +294,8 @@ void TestHelper::SetupContextGroupInitExpectations(
|
||||
.WillOnce(SetArgumentPointee<1>(kMaxVertexUniformComponents))
|
||||
.RetiresOnSaturation();
|
||||
|
||||
SetupTextureManagerInitExpectations(gl, extensions);
|
||||
bool use_default_textures = bind_generates_resource;
|
||||
SetupTextureManagerInitExpectations(gl, extensions, use_default_textures);
|
||||
}
|
||||
|
||||
void TestHelper::SetupFeatureInfoInitExpectations(
|
||||
|
@@ -66,7 +66,8 @@ class TestHelper {
|
||||
::gfx::MockGLInterface* gl,
|
||||
const DisallowedFeatures& disallowed_features,
|
||||
const char* extensions,
|
||||
const char* gl_version);
|
||||
const char* gl_version,
|
||||
bool bind_generates_resource);
|
||||
static void SetupFeatureInfoInitExpectations(
|
||||
::gfx::MockGLInterface* gl, const char* extensions);
|
||||
static void SetupFeatureInfoInitExpectationsWithGLVersion(
|
||||
@@ -74,10 +75,13 @@ class TestHelper {
|
||||
const char* extensions,
|
||||
const char* gl_renderer,
|
||||
const char* gl_version);
|
||||
static void SetupTextureManagerInitExpectations(
|
||||
::gfx::MockGLInterface* gl, const char* extensions);
|
||||
static void SetupTextureManagerInitExpectations(::gfx::MockGLInterface* gl,
|
||||
const char* extensions,
|
||||
bool use_default_textures);
|
||||
static void SetupTextureManagerDestructionExpectations(
|
||||
::gfx::MockGLInterface* gl, const char* extensions);
|
||||
::gfx::MockGLInterface* gl,
|
||||
const char* extensions,
|
||||
bool use_default_textures);
|
||||
|
||||
static void SetupExpectationsForClearingUniforms(
|
||||
::gfx::MockGLInterface* gl, UniformInfo* uniforms, size_t num_uniforms);
|
||||
@@ -104,10 +108,12 @@ class TestHelper {
|
||||
GLenum pname, GLint value, GLenum error);
|
||||
|
||||
private:
|
||||
static void SetupTextureInitializationExpectations(
|
||||
::gfx::MockGLInterface* gl, GLenum target);
|
||||
static void SetupTextureDestructionExpectations(
|
||||
::gfx::MockGLInterface* gl, GLenum target);
|
||||
static void SetupTextureInitializationExpectations(::gfx::MockGLInterface* gl,
|
||||
GLenum target,
|
||||
bool use_default_textures);
|
||||
static void SetupTextureDestructionExpectations(::gfx::MockGLInterface* gl,
|
||||
GLenum target,
|
||||
bool use_default_textures);
|
||||
};
|
||||
|
||||
// This object temporaritly Sets what gfx::GetGLImplementation returns. During
|
||||
|
@@ -895,9 +895,10 @@ TextureRef::~TextureRef() {
|
||||
TextureManager::TextureManager(MemoryTracker* memory_tracker,
|
||||
FeatureInfo* feature_info,
|
||||
GLint max_texture_size,
|
||||
GLint max_cube_map_texture_size)
|
||||
: memory_tracker_managed_(new MemoryTypeTracker(memory_tracker,
|
||||
MemoryTracker::kManaged)),
|
||||
GLint max_cube_map_texture_size,
|
||||
bool use_default_textures)
|
||||
: memory_tracker_managed_(
|
||||
new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)),
|
||||
memory_tracker_unmanaged_(
|
||||
new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)),
|
||||
feature_info_(feature_info),
|
||||
@@ -912,6 +913,7 @@ TextureManager::TextureManager(MemoryTracker* memory_tracker,
|
||||
max_cube_map_texture_size,
|
||||
max_cube_map_texture_size,
|
||||
max_cube_map_texture_size)),
|
||||
use_default_textures_(use_default_textures),
|
||||
num_unrenderable_textures_(0),
|
||||
num_unsafe_textures_(0),
|
||||
num_uncleared_mips_(0),
|
||||
@@ -959,8 +961,9 @@ scoped_refptr<TextureRef>
|
||||
|
||||
// Make default textures and texture for replacing non-renderable textures.
|
||||
GLuint ids[2];
|
||||
glGenTextures(arraysize(ids), ids);
|
||||
for (unsigned long ii = 0; ii < arraysize(ids); ++ii) {
|
||||
const unsigned long num_ids = use_default_textures_ ? 2 : 1;
|
||||
glGenTextures(num_ids, ids);
|
||||
for (unsigned long ii = 0; ii < num_ids; ++ii) {
|
||||
glBindTexture(target, ids[ii]);
|
||||
if (needs_initialization) {
|
||||
if (needs_faces) {
|
||||
@@ -976,48 +979,50 @@ scoped_refptr<TextureRef>
|
||||
}
|
||||
glBindTexture(target, 0);
|
||||
|
||||
scoped_refptr<TextureRef> default_texture(
|
||||
TextureRef::Create(this, 0, ids[1]));
|
||||
SetTarget(default_texture.get(), target);
|
||||
if (needs_faces) {
|
||||
for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) {
|
||||
SetLevelInfo(default_texture.get(),
|
||||
GLES2Util::IndexToGLFaceTarget(ii),
|
||||
0,
|
||||
GL_RGBA,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true);
|
||||
}
|
||||
} else {
|
||||
if (needs_initialization) {
|
||||
SetLevelInfo(default_texture.get(),
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
GL_RGBA,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true);
|
||||
scoped_refptr<TextureRef> default_texture;
|
||||
if (use_default_textures_) {
|
||||
default_texture = TextureRef::Create(this, 0, ids[1]);
|
||||
SetTarget(default_texture.get(), target);
|
||||
if (needs_faces) {
|
||||
for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) {
|
||||
SetLevelInfo(default_texture.get(),
|
||||
GLES2Util::IndexToGLFaceTarget(ii),
|
||||
0,
|
||||
GL_RGBA,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true);
|
||||
}
|
||||
} else {
|
||||
SetLevelInfo(default_texture.get(),
|
||||
GL_TEXTURE_EXTERNAL_OES,
|
||||
0,
|
||||
GL_RGBA,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true);
|
||||
if (needs_initialization) {
|
||||
SetLevelInfo(default_texture.get(),
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
GL_RGBA,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true);
|
||||
} else {
|
||||
SetLevelInfo(default_texture.get(),
|
||||
GL_TEXTURE_EXTERNAL_OES,
|
||||
0,
|
||||
GL_RGBA,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
GL_RGBA,
|
||||
GL_UNSIGNED_BYTE,
|
||||
true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -481,7 +481,8 @@ class GPU_EXPORT TextureManager {
|
||||
TextureManager(MemoryTracker* memory_tracker,
|
||||
FeatureInfo* feature_info,
|
||||
GLsizei max_texture_size,
|
||||
GLsizei max_cube_map_texture_size);
|
||||
GLsizei max_cube_map_texture_size,
|
||||
bool use_default_textures);
|
||||
~TextureManager();
|
||||
|
||||
void set_framebuffer_manager(FramebufferManager* manager) {
|
||||
@@ -774,6 +775,8 @@ class GPU_EXPORT TextureManager {
|
||||
GLint max_levels_;
|
||||
GLint max_cube_map_levels_;
|
||||
|
||||
const bool use_default_textures_;
|
||||
|
||||
int num_unrenderable_textures_;
|
||||
int num_unsafe_textures_;
|
||||
int num_uncleared_mips_;
|
||||
|
@@ -47,10 +47,9 @@ class TextureManagerTest : public testing::Test {
|
||||
static const GLint kMax2dLevels = 5;
|
||||
static const GLint kMaxCubeMapLevels = 4;
|
||||
static const GLint kMaxExternalLevels = 1;
|
||||
static const bool kUseDefaultTextures = false;
|
||||
|
||||
TextureManagerTest()
|
||||
: feature_info_(new FeatureInfo()) {
|
||||
}
|
||||
TextureManagerTest() : feature_info_(new FeatureInfo()) {}
|
||||
|
||||
virtual ~TextureManagerTest() {
|
||||
}
|
||||
@@ -60,10 +59,13 @@ class TextureManagerTest : public testing::Test {
|
||||
gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
|
||||
::gfx::MockGLInterface::SetGLInterface(gl_.get());
|
||||
|
||||
manager_.reset(new TextureManager(
|
||||
NULL, feature_info_.get(),
|
||||
kMaxTextureSize, kMaxCubeMapTextureSize));
|
||||
TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
|
||||
manager_.reset(new TextureManager(NULL,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures));
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "", kUseDefaultTextures);
|
||||
manager_->Initialize();
|
||||
error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
|
||||
}
|
||||
@@ -162,11 +164,54 @@ TEST_F(TextureManagerTest, SetParameter) {
|
||||
SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE);
|
||||
}
|
||||
|
||||
TEST_F(TextureManagerTest, UseDefaultTexturesTrue) {
|
||||
bool use_default_textures = true;
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "GL_ANGLE_texture_usage", use_default_textures);
|
||||
TextureManager manager(NULL,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
use_default_textures);
|
||||
manager.Initialize();
|
||||
|
||||
EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) != NULL);
|
||||
EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) != NULL);
|
||||
|
||||
// TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
|
||||
|
||||
manager.Destroy(false);
|
||||
}
|
||||
|
||||
TEST_F(TextureManagerTest, UseDefaultTexturesFalse) {
|
||||
bool use_default_textures = false;
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "GL_ANGLE_texture_usage", use_default_textures);
|
||||
TextureManager manager(NULL,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
use_default_textures);
|
||||
manager.Initialize();
|
||||
|
||||
EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) == NULL);
|
||||
EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) == NULL);
|
||||
|
||||
// TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB.
|
||||
|
||||
manager.Destroy(false);
|
||||
}
|
||||
|
||||
TEST_F(TextureManagerTest, TextureUsageExt) {
|
||||
TestHelper::SetupTextureManagerInitExpectations(gl_.get(),
|
||||
"GL_ANGLE_texture_usage");
|
||||
TextureManager manager(
|
||||
NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "GL_ANGLE_texture_usage", kUseDefaultTextures);
|
||||
TextureManager manager(NULL,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.Initialize();
|
||||
const GLuint kClient1Id = 1;
|
||||
const GLuint kService1Id = 11;
|
||||
@@ -186,9 +231,13 @@ TEST_F(TextureManagerTest, TextureUsageExt) {
|
||||
TEST_F(TextureManagerTest, Destroy) {
|
||||
const GLuint kClient1Id = 1;
|
||||
const GLuint kService1Id = 11;
|
||||
TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
|
||||
TextureManager manager(
|
||||
NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "", kUseDefaultTextures);
|
||||
TextureManager manager(NULL,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.Initialize();
|
||||
// Check we can create texture.
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
@@ -198,7 +247,8 @@ TEST_F(TextureManagerTest, Destroy) {
|
||||
EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id)))
|
||||
.Times(1)
|
||||
.RetiresOnSaturation();
|
||||
TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), "");
|
||||
TestHelper::SetupTextureManagerDestructionExpectations(
|
||||
gl_.get(), "", kUseDefaultTextures);
|
||||
manager.Destroy(true);
|
||||
// Check that resources got freed.
|
||||
texture = manager.GetTexture(kClient1Id);
|
||||
@@ -319,8 +369,11 @@ TEST_F(TextureManagerTest, ValidForTargetNPOT) {
|
||||
gl_.get(), "GL_OES_texture_npot");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
// Check NPOT width on level 0
|
||||
EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1));
|
||||
// Check NPOT height on level 0
|
||||
@@ -340,6 +393,7 @@ class TextureTestBase : public testing::Test {
|
||||
static const GLint kMaxCubeMapLevels = 4;
|
||||
static const GLuint kClient1Id = 1;
|
||||
static const GLuint kService1Id = 11;
|
||||
static const bool kUseDefaultTextures = false;
|
||||
|
||||
TextureTestBase()
|
||||
: feature_info_(new FeatureInfo()) {
|
||||
@@ -359,9 +413,11 @@ class TextureTestBase : public testing::Test {
|
||||
feature_info_->Initialize();
|
||||
}
|
||||
|
||||
manager_.reset(new TextureManager(
|
||||
memory_tracker, feature_info_.get(),
|
||||
kMaxTextureSize, kMaxCubeMapTextureSize));
|
||||
manager_.reset(new TextureManager(memory_tracker,
|
||||
feature_info_.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures));
|
||||
decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>());
|
||||
error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
|
||||
manager_->CreateTexture(kClient1Id, kService1Id);
|
||||
@@ -795,8 +851,11 @@ TEST_F(TextureTest, NPOT2DNPOTOK) {
|
||||
gl_.get(), "GL_OES_texture_npot");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -1083,8 +1142,11 @@ TEST_F(TextureTest, FloatNotLinear) {
|
||||
gl_.get(), "GL_OES_texture_float");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -1110,8 +1172,11 @@ TEST_F(TextureTest, FloatLinear) {
|
||||
gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -1129,8 +1194,11 @@ TEST_F(TextureTest, HalfFloatNotLinear) {
|
||||
gl_.get(), "GL_OES_texture_half_float");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -1156,8 +1224,11 @@ TEST_F(TextureTest, HalfFloatLinear) {
|
||||
gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -1175,8 +1246,11 @@ TEST_F(TextureTest, EGLImageExternal) {
|
||||
gl_.get(), "GL_OES_EGL_image_external");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -1192,8 +1266,11 @@ TEST_F(TextureTest, DepthTexture) {
|
||||
gl_.get(), "GL_ANGLE_depth_texture");
|
||||
scoped_refptr<FeatureInfo> feature_info(new FeatureInfo());
|
||||
feature_info->Initialize();
|
||||
TextureManager manager(
|
||||
NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize);
|
||||
TextureManager manager(NULL,
|
||||
feature_info.get(),
|
||||
kMaxTextureSize,
|
||||
kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures);
|
||||
manager.CreateTexture(kClient1Id, kService1Id);
|
||||
TextureRef* texture_ref = manager.GetTexture(kClient1Id);
|
||||
ASSERT_TRUE(texture_ref != NULL);
|
||||
@@ -2126,9 +2203,9 @@ class CountingMemoryTracker : public MemoryTracker {
|
||||
|
||||
class SharedTextureTest : public testing::Test {
|
||||
public:
|
||||
SharedTextureTest()
|
||||
: feature_info_(new FeatureInfo()) {
|
||||
}
|
||||
static const bool kUseDefaultTextures = false;
|
||||
|
||||
SharedTextureTest() : feature_info_(new FeatureInfo()) {}
|
||||
|
||||
virtual ~SharedTextureTest() {
|
||||
}
|
||||
@@ -2142,16 +2219,20 @@ class SharedTextureTest : public testing::Test {
|
||||
new TextureManager(memory_tracker1_.get(),
|
||||
feature_info_.get(),
|
||||
TextureManagerTest::kMaxTextureSize,
|
||||
TextureManagerTest::kMaxCubeMapTextureSize));
|
||||
TextureManagerTest::kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures));
|
||||
memory_tracker2_ = new CountingMemoryTracker;
|
||||
texture_manager2_.reset(
|
||||
new TextureManager(memory_tracker2_.get(),
|
||||
feature_info_.get(),
|
||||
TextureManagerTest::kMaxTextureSize,
|
||||
TextureManagerTest::kMaxCubeMapTextureSize));
|
||||
TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
|
||||
TextureManagerTest::kMaxCubeMapTextureSize,
|
||||
kUseDefaultTextures));
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "", kUseDefaultTextures);
|
||||
texture_manager1_->Initialize();
|
||||
TestHelper::SetupTextureManagerInitExpectations(gl_.get(), "");
|
||||
TestHelper::SetupTextureManagerInitExpectations(
|
||||
gl_.get(), "", kUseDefaultTextures);
|
||||
texture_manager2_->Initialize();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user