| Index: gpu/command_buffer/service/framebuffer_manager_unittest.cc
 | 
| diff --git a/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
 | 
| index a9b4388eda6af1d07f8d336360a100433be79fc9..6cb7df8a156c88a193e41235bea9fc9ba7493243 100644
 | 
| --- a/gpu/command_buffer/service/framebuffer_manager_unittest.cc
 | 
| +++ b/gpu/command_buffer/service/framebuffer_manager_unittest.cc
 | 
| @@ -33,7 +33,6 @@ class FramebufferManagerTest : public testing::Test {
 | 
|            NULL, new FeatureInfo(), kMaxTextureSize, kMaxCubemapSize),
 | 
|          renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples,
 | 
|                                kDepth24Supported) {
 | 
| -
 | 
|    }
 | 
|    virtual ~FramebufferManagerTest() {
 | 
|      manager_.Destroy(false);
 | 
| @@ -110,21 +109,29 @@ class FramebufferInfoTest : public testing::Test {
 | 
|  
 | 
|    FramebufferInfoTest()
 | 
|        : manager_(1, 1),
 | 
| -        texture_manager_(
 | 
| -          NULL, new FeatureInfo(), kMaxTextureSize, kMaxCubemapSize),
 | 
| +        feature_info_(new FeatureInfo()),
 | 
|          renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples,
 | 
|                                kDepth24Supported) {
 | 
| +    texture_manager_.reset(new TextureManager(NULL, feature_info_.get(),
 | 
| +        kMaxTextureSize, kMaxCubemapSize));
 | 
|    }
 | 
|    virtual ~FramebufferInfoTest() {
 | 
|      manager_.Destroy(false);
 | 
| -    texture_manager_.Destroy(false);
 | 
| +    texture_manager_->Destroy(false);
 | 
|      renderbuffer_manager_.Destroy(false);
 | 
|    }
 | 
|  
 | 
|   protected:
 | 
|    virtual void SetUp() {
 | 
| +    InitializeContext("", "");
 | 
| +  }
 | 
| +
 | 
| +  void InitializeContext(const char* gl_version, const char* extensions) {
 | 
|      gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>());
 | 
|      ::gfx::MockGLInterface::SetGLInterface(gl_.get());
 | 
| +    TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(),
 | 
| +        extensions, "", gl_version);
 | 
| +    feature_info_->Initialize();
 | 
|      manager_.CreateFramebuffer(kClient1Id, kService1Id);
 | 
|      error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
 | 
|      framebuffer_ = manager_.GetFramebuffer(kClient1Id);
 | 
| @@ -140,7 +147,8 @@ class FramebufferInfoTest : public testing::Test {
 | 
|    scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_;
 | 
|    FramebufferManager manager_;
 | 
|    Framebuffer* framebuffer_;
 | 
| -  TextureManager texture_manager_;
 | 
| +  scoped_refptr<FeatureInfo> feature_info_;
 | 
| +  scoped_ptr<TextureManager> texture_manager_;
 | 
|    RenderbufferManager renderbuffer_manager_;
 | 
|    scoped_ptr<MockErrorState> error_state_;
 | 
|  };
 | 
| @@ -162,7 +170,7 @@ TEST_F(FramebufferInfoTest, Basic) {
 | 
|    EXPECT_FALSE(framebuffer_->HasDepthAttachment());
 | 
|    EXPECT_FALSE(framebuffer_->HasStencilAttachment());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|    EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
 | 
|    EXPECT_FALSE(manager_.IsComplete(framebuffer_));
 | 
| @@ -216,14 +224,14 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    EXPECT_FALSE(framebuffer_->HasDepthAttachment());
 | 
|    EXPECT_FALSE(framebuffer_->HasStencilAttachment());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|  
 | 
|    // Try a format that's not good for COLOR_ATTACHMENT0.
 | 
|    renderbuffer_manager_.SetInfo(
 | 
|        renderbuffer1, kSamples1, kBadFormat1, kWidth1, kHeight1);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Try a good format.
 | 
|    renderbuffer_manager_.SetInfo(
 | 
| @@ -233,7 +241,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    EXPECT_FALSE(framebuffer_->HasDepthAttachment());
 | 
|    EXPECT_FALSE(framebuffer_->HasStencilAttachment());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_FALSE(framebuffer_->IsCleared());
 | 
|  
 | 
|    // check adding another
 | 
| @@ -253,7 +261,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    // of attachments it could either get INCOMPLETE_ATTACHMENT because it's 0,0
 | 
|    // or INCOMPLETE_DIMENSIONS because it's not the same size as the other
 | 
|    // attachment.
 | 
| -  GLenum status = framebuffer_->IsPossiblyComplete();
 | 
| +  GLenum status = framebuffer_->IsPossiblyComplete(feature_info_.get());
 | 
|    EXPECT_TRUE(
 | 
|        status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT ||
 | 
|        status == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT);
 | 
| @@ -262,17 +270,17 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    renderbuffer_manager_.SetInfo(
 | 
|        renderbuffer2, kSamples2, kFormat2, kWidth2, kHeight2);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_FALSE(framebuffer_->IsCleared());
 | 
|    EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
 | 
|  
 | 
|    // check marking them as cleared.
 | 
|    manager_.MarkAttachmentsAsCleared(
 | 
| -      framebuffer_, &renderbuffer_manager_, &texture_manager_);
 | 
| +      framebuffer_, &renderbuffer_manager_, texture_manager_.get());
 | 
|    EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
 | 
|    EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|  
 | 
|    // Check adding one that is already cleared.
 | 
| @@ -292,7 +300,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    EXPECT_TRUE(framebuffer_->HasDepthAttachment());
 | 
|    EXPECT_TRUE(framebuffer_->HasStencilAttachment());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|  
 | 
|    // Check marking the renderbuffer as unclared.
 | 
| @@ -303,7 +311,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    EXPECT_TRUE(framebuffer_->HasDepthAttachment());
 | 
|    EXPECT_TRUE(framebuffer_->HasStencilAttachment());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_FALSE(framebuffer_->IsCleared());
 | 
|  
 | 
|    const Framebuffer::Attachment* attachment =
 | 
| @@ -319,7 +327,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|  
 | 
|    // Clear it.
 | 
|    manager_.MarkAttachmentsAsCleared(
 | 
| -      framebuffer_, &renderbuffer_manager_, &texture_manager_);
 | 
| +      framebuffer_, &renderbuffer_manager_, texture_manager_.get());
 | 
|    EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|  
 | 
| @@ -344,7 +352,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    EXPECT_EQ(kFormat4, attachment->internal_format());
 | 
|    EXPECT_FALSE(attachment->cleared());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Check changing an attachment.
 | 
|    renderbuffer_manager_.SetInfo(
 | 
| @@ -359,7 +367,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|    EXPECT_FALSE(attachment->cleared());
 | 
|    EXPECT_FALSE(framebuffer_->IsCleared());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Check removing it.
 | 
|    framebuffer_->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, NULL);
 | 
| @@ -371,18 +379,18 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
 | 
|  
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Remove depth, Set color to 0 size.
 | 
|    framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, NULL);
 | 
|    renderbuffer_manager_.SetInfo(renderbuffer1, kSamples1, kFormat1, 0, 0);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Remove color.
 | 
|    framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT0, NULL);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  }
 | 
|  
 | 
|  TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
| @@ -417,11 +425,11 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|    EXPECT_FALSE(
 | 
|        framebuffer_->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT));
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
| -  texture_manager_.CreateTexture(kTextureClient1Id, kTextureService1Id);
 | 
| +  texture_manager_->CreateTexture(kTextureClient1Id, kTextureService1Id);
 | 
|    scoped_refptr<TextureRef> texture1(
 | 
| -      texture_manager_.GetTexture(kTextureClient1Id));
 | 
| +      texture_manager_->GetTexture(kTextureClient1Id));
 | 
|    ASSERT_TRUE(texture1.get() != NULL);
 | 
|  
 | 
|    // check adding one attachment
 | 
| @@ -429,13 +437,13 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|        GL_COLOR_ATTACHMENT0, texture1.get(), kTarget1, kLevel1, kSamples1);
 | 
|    EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|    EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
 | 
|  
 | 
|    // Try format that doesn't work with COLOR_ATTACHMENT0
 | 
| -  texture_manager_.SetTarget(texture1.get(), GL_TEXTURE_2D);
 | 
| -  texture_manager_.SetLevelInfo(texture1.get(),
 | 
| +  texture_manager_->SetTarget(texture1.get(), GL_TEXTURE_2D);
 | 
| +  texture_manager_->SetLevelInfo(texture1.get(),
 | 
|                                  GL_TEXTURE_2D,
 | 
|                                  kLevel1,
 | 
|                                  kBadFormat1,
 | 
| @@ -447,10 +455,10 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|                                  kType,
 | 
|                                  true);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Try a good format.
 | 
| -  texture_manager_.SetLevelInfo(texture1.get(),
 | 
| +  texture_manager_->SetLevelInfo(texture1.get(),
 | 
|                                  GL_TEXTURE_2D,
 | 
|                                  kLevel1,
 | 
|                                  kFormat1,
 | 
| @@ -462,9 +470,9 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|                                  kType,
 | 
|                                  false);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_FALSE(framebuffer_->IsCleared());
 | 
| -  texture_manager_.SetLevelInfo(texture1.get(),
 | 
| +  texture_manager_->SetLevelInfo(texture1.get(),
 | 
|                                  GL_TEXTURE_2D,
 | 
|                                  kLevel1,
 | 
|                                  kFormat1,
 | 
| @@ -476,7 +484,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|                                  kType,
 | 
|                                  true);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|    EXPECT_EQ(static_cast<GLenum>(kFormat1),
 | 
|              framebuffer_->GetColorAttachmentFormat());
 | 
| @@ -491,12 +499,12 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|    EXPECT_TRUE(attachment->cleared());
 | 
|  
 | 
|    // Check replacing an attachment
 | 
| -  texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
| +  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
|    scoped_refptr<TextureRef> texture2(
 | 
| -      texture_manager_.GetTexture(kTextureClient2Id));
 | 
| +      texture_manager_->GetTexture(kTextureClient2Id));
 | 
|    ASSERT_TRUE(texture2.get() != NULL);
 | 
| -  texture_manager_.SetTarget(texture2.get(), GL_TEXTURE_2D);
 | 
| -  texture_manager_.SetLevelInfo(texture2.get(),
 | 
| +  texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D);
 | 
| +  texture_manager_->SetLevelInfo(texture2.get(),
 | 
|                                  GL_TEXTURE_2D,
 | 
|                                  kLevel2,
 | 
|                                  kFormat2,
 | 
| @@ -513,7 +521,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|    EXPECT_EQ(static_cast<GLenum>(kFormat2),
 | 
|              framebuffer_->GetColorAttachmentFormat());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|  
 | 
|    attachment = framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0);
 | 
| @@ -525,7 +533,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|    EXPECT_TRUE(attachment->cleared());
 | 
|  
 | 
|    // Check changing attachment
 | 
| -  texture_manager_.SetLevelInfo(texture2.get(),
 | 
| +  texture_manager_->SetLevelInfo(texture2.get(),
 | 
|                                  GL_TEXTURE_2D,
 | 
|                                  kLevel3,
 | 
|                                  kFormat3,
 | 
| @@ -546,11 +554,11 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|    EXPECT_EQ(static_cast<GLenum>(kFormat3),
 | 
|              framebuffer_->GetColorAttachmentFormat());
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_FALSE(framebuffer_->IsCleared());
 | 
|  
 | 
|    // Set to size 0
 | 
| -  texture_manager_.SetLevelInfo(texture2.get(),
 | 
| +  texture_manager_->SetLevelInfo(texture2.get(),
 | 
|                                  GL_TEXTURE_2D,
 | 
|                                  kLevel3,
 | 
|                                  kFormat3,
 | 
| @@ -562,7 +570,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|                                  kType,
 | 
|                                  false);
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|  
 | 
|    // Check removing it.
 | 
|    framebuffer_->AttachTexture(GL_COLOR_ATTACHMENT0, NULL, 0, 0, 0);
 | 
| @@ -570,10 +578,153 @@ TEST_F(FramebufferInfoTest, AttachTexture) {
 | 
|    EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
 | 
|  
 | 
|    EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
 | 
| -            framebuffer_->IsPossiblyComplete());
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
|    EXPECT_TRUE(framebuffer_->IsCleared());
 | 
|  }
 | 
|  
 | 
| +TEST_F(FramebufferInfoTest, AttachFloatTextureNotSupported) {
 | 
| +  const GLuint kTextureClientId = 33;
 | 
| +  const GLuint kTextureServiceId = 333;
 | 
| +  const GLint kDepth = 1;
 | 
| +  const GLint kBorder = 0;
 | 
| +  const GLenum kType = GL_FLOAT;
 | 
| +  const GLsizei kWidth = 16;
 | 
| +  const GLsizei kHeight = 32;
 | 
| +  const GLint kLevel = 0;
 | 
| +  const GLenum kFormat = GL_RGBA;
 | 
| +  const GLenum kInternalFormat = GL_RGBA32F;
 | 
| +  const GLenum kBadInternalFormat = GL_RGBA;
 | 
| +  const GLenum kTarget = GL_TEXTURE_2D;
 | 
| +  const GLsizei kSamples = 0;
 | 
| +  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
 | 
| +  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
 | 
| +  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
 | 
| +
 | 
| +  texture_manager_->CreateTexture(kTextureClientId, kTextureServiceId);
 | 
| +  scoped_refptr<TextureRef> texture(
 | 
| +      texture_manager_->GetTexture(kTextureClientId));
 | 
| +  ASSERT_TRUE(texture.get() != NULL);
 | 
| +
 | 
| +  // check adding one attachment
 | 
| +  framebuffer_->AttachTexture(
 | 
| +      GL_COLOR_ATTACHMENT0, texture.get(), kTarget, kLevel, kSamples);
 | 
| +  EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
 | 
| +
 | 
| +  // Try unsized internalformat.
 | 
| +  texture_manager_->SetTarget(texture.get(), GL_TEXTURE_2D);
 | 
| +  texture_manager_->SetLevelInfo(texture.get(),
 | 
| +                                GL_TEXTURE_2D,
 | 
| +                                kLevel,
 | 
| +                                kBadInternalFormat,
 | 
| +                                kWidth,
 | 
| +                                kHeight,
 | 
| +                                kDepth,
 | 
| +                                kBorder,
 | 
| +                                kFormat,
 | 
| +                                kType,
 | 
| +                                true);
 | 
| +  // Texture with an unsized internalformat is not allowed as an attachment
 | 
| +  // regardless of whether float color attachments are allowed in general.
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
| +
 | 
| +  // Try a sized internalformat.
 | 
| +  texture_manager_->SetLevelInfo(texture.get(),
 | 
| +                                GL_TEXTURE_2D,
 | 
| +                                kLevel,
 | 
| +                                kInternalFormat,
 | 
| +                                kWidth,
 | 
| +                                kHeight,
 | 
| +                                kDepth,
 | 
| +                                kBorder,
 | 
| +                                kFormat,
 | 
| +                                kType,
 | 
| +                                false);
 | 
| +  // Texture with a sized float internalformat is allowed as an attachment
 | 
| +  // only if float color attachment extension is present.
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
| +}
 | 
| +
 | 
| +class FramebufferInfoFloatTest : public FramebufferInfoTest {
 | 
| + public:
 | 
| +  FramebufferInfoFloatTest()
 | 
| +    : FramebufferInfoTest() {
 | 
| +  }
 | 
| +  virtual ~FramebufferInfoFloatTest() {
 | 
| +  }
 | 
| +
 | 
| + protected:
 | 
| +  virtual void SetUp() {
 | 
| +    InitializeContext("OpenGL ES 3.0",
 | 
| +        "GL_OES_texture_float GL_EXT_color_buffer_float");
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +TEST_F(FramebufferInfoFloatTest, AttachFloatTextureSupported) {
 | 
| +  const GLuint kTextureClientId = 33;
 | 
| +  const GLuint kTextureServiceId = 333;
 | 
| +  const GLint kDepth = 1;
 | 
| +  const GLint kBorder = 0;
 | 
| +  const GLenum kType = GL_FLOAT;
 | 
| +  const GLsizei kWidth = 16;
 | 
| +  const GLsizei kHeight = 32;
 | 
| +  const GLint kLevel = 0;
 | 
| +  const GLenum kFormat = GL_RGBA;
 | 
| +  const GLenum kInternalFormat = GL_RGBA32F;
 | 
| +  const GLenum kBadInternalFormat = GL_RGBA;
 | 
| +  const GLenum kTarget = GL_TEXTURE_2D;
 | 
| +  const GLsizei kSamples = 0;
 | 
| +  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
 | 
| +  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
 | 
| +  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
 | 
| +
 | 
| +  texture_manager_->CreateTexture(kTextureClientId, kTextureServiceId);
 | 
| +  scoped_refptr<TextureRef> texture(
 | 
| +      texture_manager_->GetTexture(kTextureClientId));
 | 
| +  ASSERT_TRUE(texture.get() != NULL);
 | 
| +
 | 
| +  // check adding one attachment
 | 
| +  framebuffer_->AttachTexture(
 | 
| +      GL_COLOR_ATTACHMENT0, texture.get(), kTarget, kLevel, kSamples);
 | 
| +  EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
 | 
| +
 | 
| +  // Try unsized internalformat.
 | 
| +  texture_manager_->SetTarget(texture.get(), GL_TEXTURE_2D);
 | 
| +  texture_manager_->SetLevelInfo(texture.get(),
 | 
| +                                GL_TEXTURE_2D,
 | 
| +                                kLevel,
 | 
| +                                kBadInternalFormat,
 | 
| +                                kWidth,
 | 
| +                                kHeight,
 | 
| +                                kDepth,
 | 
| +                                kBorder,
 | 
| +                                kFormat,
 | 
| +                                kType,
 | 
| +                                true);
 | 
| +  // Texture with an unsized internalformat is not allowed as an attachment
 | 
| +  // regardless of whether float color attachments are allowed in general.
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
| +
 | 
| +  // Try a sized internalformat.
 | 
| +  texture_manager_->SetLevelInfo(texture.get(),
 | 
| +                                GL_TEXTURE_2D,
 | 
| +                                kLevel,
 | 
| +                                kInternalFormat,
 | 
| +                                kWidth,
 | 
| +                                kHeight,
 | 
| +                                kDepth,
 | 
| +                                kBorder,
 | 
| +                                kFormat,
 | 
| +                                kType,
 | 
| +                                false);
 | 
| +  // Texture with a sized float internalformat is allowed as an attachment
 | 
| +  // since float color attachment extension is present.
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
 | 
| +            framebuffer_->IsPossiblyComplete(feature_info_.get()));
 | 
| +}
 | 
| +
 | 
|  TEST_F(FramebufferInfoTest, UnbindRenderbuffer) {
 | 
|    const GLuint kRenderbufferClient1Id = 33;
 | 
|    const GLuint kRenderbufferService1Id = 333;
 | 
| @@ -618,13 +769,13 @@ TEST_F(FramebufferInfoTest, UnbindTexture) {
 | 
|    const GLint kLevel1 = 0;
 | 
|    const GLint kSamples1 = 0;
 | 
|  
 | 
| -  texture_manager_.CreateTexture(kTextureClient1Id, kTextureService1Id);
 | 
| +  texture_manager_->CreateTexture(kTextureClient1Id, kTextureService1Id);
 | 
|    scoped_refptr<TextureRef> texture1(
 | 
| -      texture_manager_.GetTexture(kTextureClient1Id));
 | 
| +      texture_manager_->GetTexture(kTextureClient1Id));
 | 
|    ASSERT_TRUE(texture1.get() != NULL);
 | 
| -  texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
| +  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
|    scoped_refptr<TextureRef> texture2(
 | 
| -      texture_manager_.GetTexture(kTextureClient2Id));
 | 
| +      texture_manager_->GetTexture(kTextureClient2Id));
 | 
|    ASSERT_TRUE(texture2.get() != NULL);
 | 
|  
 | 
|    // Attach to 2 attachment points.
 | 
| @@ -661,9 +812,9 @@ TEST_F(FramebufferInfoTest, IsCompleteMarkAsComplete) {
 | 
|    Renderbuffer* renderbuffer1 =
 | 
|        renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id);
 | 
|    ASSERT_TRUE(renderbuffer1 != NULL);
 | 
| -  texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
| +  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
|    scoped_refptr<TextureRef> texture2(
 | 
| -      texture_manager_.GetTexture(kTextureClient2Id));
 | 
| +      texture_manager_->GetTexture(kTextureClient2Id));
 | 
|    ASSERT_TRUE(texture2.get() != NULL);
 | 
|  
 | 
|    // Check MarkAsComlete marks as complete.
 | 
| @@ -681,7 +832,7 @@ TEST_F(FramebufferInfoTest, IsCompleteMarkAsComplete) {
 | 
|  
 | 
|    // Check MarkAttachmentsAsCleared marks as complete.
 | 
|    manager_.MarkAttachmentsAsCleared(
 | 
| -      framebuffer_, &renderbuffer_manager_, &texture_manager_);
 | 
| +      framebuffer_, &renderbuffer_manager_, texture_manager_.get());
 | 
|    EXPECT_TRUE(manager_.IsComplete(framebuffer_));
 | 
|  
 | 
|    // Check Unbind marks as not complete.
 | 
| @@ -707,16 +858,16 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|    Renderbuffer* renderbuffer1 =
 | 
|        renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id);
 | 
|    ASSERT_TRUE(renderbuffer1 != NULL);
 | 
| -  texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
| +  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
 | 
|    scoped_refptr<TextureRef> texture2(
 | 
| -      texture_manager_.GetTexture(kTextureClient2Id));
 | 
| +      texture_manager_->GetTexture(kTextureClient2Id));
 | 
|    ASSERT_TRUE(texture2.get() != NULL);
 | 
| -  texture_manager_.SetTarget(texture2.get(), GL_TEXTURE_2D);
 | 
| +  texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D);
 | 
|  
 | 
|    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
 | 
|        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|        .RetiresOnSaturation();
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
 | 
|  
 | 
|    // Check a second call for the same type does not call anything
 | 
|    if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
 | 
| @@ -724,14 +875,14 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|          .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|          .RetiresOnSaturation();
 | 
|    }
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
 | 
|  
 | 
|    // Check changing the attachments calls CheckFramebufferStatus.
 | 
|    framebuffer_->AttachTexture(
 | 
|        GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1);
 | 
|    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
 | 
|        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation();
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
 | 
|  
 | 
|    // Check a second call for the same type does not call anything.
 | 
|    if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
 | 
| @@ -739,13 +890,13 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|          .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|          .RetiresOnSaturation();
 | 
|    }
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
 | 
|  
 | 
|    // Check a second call with a different target calls CheckFramebufferStatus.
 | 
|    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
 | 
|        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|        .RetiresOnSaturation();
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check a second call for the same type does not call anything.
 | 
|    if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
 | 
| @@ -753,14 +904,14 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|          .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|          .RetiresOnSaturation();
 | 
|    }
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check adding another attachment calls CheckFramebufferStatus.
 | 
|    framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1);
 | 
|    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
 | 
|        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|        .RetiresOnSaturation();
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check a second call for the same type does not call anything.
 | 
|    if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
 | 
| @@ -768,12 +919,12 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|          .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|          .RetiresOnSaturation();
 | 
|    }
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check changing the format calls CheckFramebuffferStatus.
 | 
|    TestHelper::SetTexParameterWithExpectations(gl_.get(),
 | 
|                                                error_state_.get(),
 | 
| -                                              &texture_manager_,
 | 
| +                                              texture_manager_.get(),
 | 
|                                                texture2.get(),
 | 
|                                                GL_TEXTURE_WRAP_S,
 | 
|                                                GL_CLAMP_TO_EDGE,
 | 
| @@ -783,11 +934,11 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|        .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT))
 | 
|        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|        .RetiresOnSaturation();
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check since it did not return FRAMEBUFFER_COMPLETE that it calls
 | 
|    // CheckFramebufferStatus
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check putting it back does not call CheckFramebufferStatus.
 | 
|    if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
 | 
| @@ -797,12 +948,12 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|    }
 | 
|    TestHelper::SetTexParameterWithExpectations(gl_.get(),
 | 
|                                                error_state_.get(),
 | 
| -                                              &texture_manager_,
 | 
| +                                              texture_manager_.get(),
 | 
|                                                texture2.get(),
 | 
|                                                GL_TEXTURE_WRAP_S,
 | 
|                                                GL_REPEAT,
 | 
|                                                GL_NO_ERROR);
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  
 | 
|    // Check Unbinding does not call CheckFramebufferStatus
 | 
|    framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1);
 | 
| @@ -811,7 +962,7 @@ TEST_F(FramebufferInfoTest, GetStatus) {
 | 
|          .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
 | 
|          .RetiresOnSaturation();
 | 
|    }
 | 
| -  framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER);
 | 
| +  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
 | 
|  }
 | 
|  
 | 
|  }  // namespace gles2
 | 
| 
 |