15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "gpu/command_buffer/service/error_state_mock.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/framebuffer_manager.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "gpu/command_buffer/service/gpu_service_test.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/renderbuffer_manager.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/test_helper.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gpu/command_buffer/service/texture_manager.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gl/gl_mock.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using ::testing::_;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const GLint kMaxTextureSize = 64;
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const GLint kMaxCubemapSize = 64;
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const GLint kMaxRenderbufferSize = 64;
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const GLint kMaxSamples = 4;
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const uint32 kMaxDrawBuffers = 16;
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const uint32 kMaxColorAttachments = 16;
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const bool kDepth24Supported = false;
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst bool kUseDefaultTextures = false;
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class FramebufferManagerTest : public GpuServiceTest {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FramebufferManagerTest()
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : manager_(1, 1),
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        texture_manager_(NULL,
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         new FeatureInfo(),
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         kMaxTextureSize,
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         kMaxCubemapSize,
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         kUseDefaultTextures),
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        renderbuffer_manager_(NULL,
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              kMaxRenderbufferSize,
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              kMaxSamples,
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                              kDepth24Supported) {}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FramebufferManagerTest() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_.Destroy(false);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    texture_manager_.Destroy(false);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderbuffer_manager_.Destroy(false);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FramebufferManager manager_;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager texture_manager_;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferManager renderbuffer_manager_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferManagerTest, Basic) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient2Id = 2;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create framebuffer.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.CreateFramebuffer(kClient1Id, kService1Id);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check framebuffer got created.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer* framebuffer1 = manager_.GetFramebuffer(kClient1Id);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(framebuffer1 != NULL);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer1->IsDeleted());
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kService1Id, framebuffer1->service_id());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint client_id = 0;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetClientId(framebuffer1->service_id(), &client_id));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kClient1Id, client_id);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we get nothing for a non-existent framebuffer.
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetFramebuffer(kClient2Id) == NULL);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check trying to a remove non-existent framebuffers does not crash.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.RemoveFramebuffer(kClient2Id);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check framebuffer gets deleted when last reference is released.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, ::testing::Pointee(kService1Id)))
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can't get the framebuffer after we remove it.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.RemoveFramebuffer(kClient1Id);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.GetFramebuffer(kClient1Id) == NULL);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferManagerTest, Destroy) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kClient1Id = 1;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kService1Id = 11;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check we can create framebuffer.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.CreateFramebuffer(kClient1Id, kService1Id);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check framebuffer got created.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer* framebuffer1 = manager_.GetFramebuffer(kClient1Id);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(framebuffer1 != NULL);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, ::testing::Pointee(kService1Id)))
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_.Destroy(true);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the resources were released.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer1 = manager_.GetFramebuffer(kClient1Id);
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(framebuffer1 == NULL);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class FramebufferInfoTest : public GpuServiceTest {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClient1Id = 1;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kService1Id = 11;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FramebufferInfoTest()
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : manager_(kMaxDrawBuffers,  kMaxColorAttachments),
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        feature_info_(new FeatureInfo()),
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples,
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                              kDepth24Supported) {
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    texture_manager_.reset(new TextureManager(NULL,
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              feature_info_.get(),
115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              kMaxTextureSize,
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              kMaxCubemapSize,
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                              kUseDefaultTextures));
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FramebufferInfoTest() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_.Destroy(false);
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    texture_manager_->Destroy(false);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    renderbuffer_manager_.Destroy(false);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InitializeContext("", "");
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void InitializeContext(const char* gl_version, const char* extensions) {
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    GpuServiceTest::SetUp();
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(),
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extensions, "", gl_version);
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    feature_info_->Initialize();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.CreateFramebuffer(kClient1Id, kService1Id);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>());
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    framebuffer_ = manager_.GetFramebuffer(kClient1Id);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(framebuffer_ != NULL);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FramebufferManager manager_;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Framebuffer* framebuffer_;
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TextureManager> texture_manager_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferManager renderbuffer_manager_;
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<MockErrorState> error_state_;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GCC requires these declarations, but MSVC requires they not be present
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPILER_MSVC
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint FramebufferInfoTest::kClient1Id;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GLuint FramebufferInfoTest::kService1Id;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferInfoTest, Basic) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kService1Id, framebuffer_->service_id());
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsDeleted());
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NULL == framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0));
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NULL == framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT));
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NULL == framebuffer_->GetAttachment(GL_STENCIL_ATTACHMENT));
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NULL == framebuffer_->GetAttachment(GL_DEPTH_STENCIL_ATTACHMENT));
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasDepthAttachment());
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasStencilAttachment());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_.IsComplete(framebuffer_));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferInfoTest, AttachRenderbuffer) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient1Id = 33;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService1Id = 333;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient2Id = 34;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService2Id = 334;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient3Id = 35;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService3Id = 335;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient4Id = 36;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService4Id = 336;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth1 = 16;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight1 = 32;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat1 = GL_RGBA4;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kBadFormat1 = GL_DEPTH_COMPONENT16;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples1 = 0;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth2 = 16;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight2 = 32;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat2 = GL_DEPTH_COMPONENT16;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples2 = 0;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth3 = 16;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight3 = 32;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat3 = GL_STENCIL_INDEX8;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples3 = 0;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth4 = 16;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight4 = 32;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat4 = GL_STENCIL_INDEX8;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples4 = 0;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      framebuffer_->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient1Id, kRenderbufferService1Id);
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer1 =
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer1 != NULL);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check adding one attachment
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT0, renderbuffer1);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_RGBA4),
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasDepthAttachment());
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasStencilAttachment());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try a format that's not good for COLOR_ATTACHMENT0.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer1, kSamples1, kBadFormat1, kWidth1, kHeight1);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try a good format.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer1, kSamples1, kFormat1, kWidth1, kHeight1);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat1),
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasDepthAttachment());
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasStencilAttachment());
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check adding another
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient2Id, kRenderbufferService2Id);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer2 =
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient2Id);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer2 != NULL);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer2);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat1),
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasDepthAttachment());
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasStencilAttachment());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The attachment has a size of 0,0 so depending on the order of the map
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of attachments it could either get INCOMPLETE_ATTACHMENT because it's 0,0
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or INCOMPLETE_DIMENSIONS because it's not the same size as the other
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // attachment.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum status = framebuffer_->IsPossiblyComplete();
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT ||
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status == GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT);
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer2, kSamples2, kFormat2, kWidth2, kHeight2);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check marking them as cleared.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_.MarkAttachmentsAsCleared(
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      framebuffer_, &renderbuffer_manager_, texture_manager_.get());
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check adding one that is already cleared.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient3Id, kRenderbufferService3Id);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer3 =
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient3Id);
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer3 != NULL);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer3, kSamples3, kFormat3, kWidth3, kHeight3);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.SetCleared(renderbuffer3, true);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, renderbuffer3);
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat1),
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasDepthAttachment());
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasStencilAttachment());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check marking the renderbuffer as unclared.
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer1, kSamples1, kFormat1, kWidth1, kHeight1);
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat1),
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasDepthAttachment());
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasStencilAttachment());
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Framebuffer::Attachment* attachment =
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(attachment != NULL);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kWidth1, attachment->width());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kHeight1, attachment->height());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamples1, attachment->samples());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFormat1, attachment->internal_format());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(attachment->cleared());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear it.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_.MarkAttachmentsAsCleared(
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      framebuffer_, &renderbuffer_manager_, texture_manager_.get());
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check replacing an attachment
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient4Id, kRenderbufferService4Id);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer4 =
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient4Id);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer4 != NULL);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer4, kSamples4, kFormat4, kWidth4, kHeight4);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, renderbuffer4);
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  attachment = framebuffer_->GetAttachment(GL_STENCIL_ATTACHMENT);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(attachment != NULL);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kWidth4, attachment->width());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kHeight4, attachment->height());
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamples4, attachment->samples());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFormat4, attachment->internal_format());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(attachment->cleared());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing an attachment.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderbuffer_manager_.SetInfo(
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer4, kSamples4, kFormat4, kWidth4 + 1, kHeight4);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  attachment = framebuffer_->GetAttachment(GL_STENCIL_ATTACHMENT);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(attachment != NULL);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kWidth4 + 1, attachment->width());
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kHeight4, attachment->height());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamples4, attachment->samples());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFormat4, attachment->internal_format());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(attachment->cleared());
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT),
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check removing it.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_STENCIL_ATTACHMENT, NULL);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat1),
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasDepthAttachment());
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasStencilAttachment());
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove depth, Set color to 0 size.
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, NULL);
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.SetInfo(renderbuffer1, kSamples1, kFormat1, 0, 0);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove color.
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT0, NULL);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferInfoTest, AttachTexture) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureClient1Id = 33;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureService1Id = 333;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureClient2Id = 34;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureService2Id = 334;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kDepth = 1;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kBorder = 0;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kType = GL_UNSIGNED_BYTE;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth1 = 16;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight1 = 32;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel1 = 0;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat1 = GL_RGBA;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kBadFormat1 = GL_DEPTH_COMPONENT16;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget1 = GL_TEXTURE_2D;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples1 = 0;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth2 = 16;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight2 = 32;
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel2 = 0;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat2 = GL_RGB;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget2 = GL_TEXTURE_2D;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples2 = 0;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kWidth3 = 75;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kHeight3 = 123;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel3 = 0;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kFormat3 = GL_RGB565;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLsizei kSamples3 = 0;
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      framebuffer_->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClient1Id, kTextureService1Id);
42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture1(
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClient1Id));
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture1.get() != NULL);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check adding one attachment
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachTexture(
4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, texture1.get(), kTarget1, kLevel1, kSamples1);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try format that doesn't work with COLOR_ATTACHMENT0
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetTarget(texture1.get(), GL_TEXTURE_2D);
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture1.get(),
440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                GL_TEXTURE_2D,
441868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kLevel1,
442868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBadFormat1,
443868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kWidth1,
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kHeight1,
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kDepth,
446868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBorder,
447868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBadFormat1,
448868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kType,
449868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                true);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try a good format.
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture1.get(),
455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                GL_TEXTURE_2D,
456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kLevel1,
457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat1,
458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kWidth1,
459868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kHeight1,
460868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kDepth,
461868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBorder,
462868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat1,
463868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kType,
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                false);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture1.get(),
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                GL_TEXTURE_2D,
470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kLevel1,
471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat1,
472868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kWidth1,
473868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kHeight1,
474868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kDepth,
475868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBorder,
476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat1,
477868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kType,
478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                true);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat1),
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Framebuffer::Attachment* attachment =
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(attachment != NULL);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kWidth1, attachment->width());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kHeight1, attachment->height());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamples1, attachment->samples());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFormat1, attachment->internal_format());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(attachment->cleared());
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check replacing an attachment
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture2(
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClient2Id));
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture2.get() != NULL);
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D);
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture2.get(),
501868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                GL_TEXTURE_2D,
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kLevel2,
503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat2,
504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kWidth2,
505868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kHeight2,
506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kDepth,
507868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBorder,
508868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat2,
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kType,
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                true);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachTexture(
5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, texture2.get(), kTarget2, kLevel2, kSamples2);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat2),
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  attachment = framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(attachment != NULL);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kWidth2, attachment->width());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kHeight2, attachment->height());
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamples2, attachment->samples());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFormat2, attachment->internal_format());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(attachment->cleared());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing attachment
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture2.get(),
530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                GL_TEXTURE_2D,
531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kLevel3,
532868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat3,
533868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kWidth3,
534868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kHeight3,
535868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kDepth,
536868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBorder,
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat3,
538868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kType,
539868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                false);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  attachment = framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(attachment != NULL);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kWidth3, attachment->width());
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kHeight3, attachment->height());
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kSamples3, attachment->samples());
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kFormat3, attachment->internal_format());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(attachment->cleared());
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(kFormat3),
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->GetColorAttachmentFormat());
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set to size 0
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture2.get(),
555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                GL_TEXTURE_2D,
556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kLevel3,
557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat3,
558868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                0,
559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                0,
560868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kDepth,
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kBorder,
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kFormat3,
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                kType,
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                false);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT),
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check removing it.
5697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  framebuffer_->AttachTexture(GL_COLOR_ATTACHMENT0, NULL, 0, 0, 0);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) == NULL);
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT),
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            framebuffer_->IsPossiblyComplete());
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(FramebufferInfoTest, DrawBuffers) {
57946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const GLuint kTextureClientId[] = { 33, 34 };
58046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const GLuint kTextureServiceId[] = { 333, 334 };
58146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GLenum i = GL_COLOR_ATTACHMENT0;
58346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       i < GL_COLOR_ATTACHMENT0 + kMaxColorAttachments; ++i) {
58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(i));
58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedColorAttachments());
58746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_COLOR_ATTACHMENT0),
58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            framebuffer_->GetDrawBuffer(GL_DRAW_BUFFER0_ARB));
59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GLenum i = GL_DRAW_BUFFER1_ARB;
59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       i < GL_DRAW_BUFFER0_ARB + kMaxDrawBuffers; ++i) {
59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(static_cast<GLenum>(GL_NONE),
59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              framebuffer_->GetDrawBuffer(i));
59446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (size_t ii = 0; ii < arraysize(kTextureClientId); ++ii) {
59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    texture_manager_->CreateTexture(
59846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        kTextureClientId[ii], kTextureServiceId[ii]);
59946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<TextureRef> texture(
60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        texture_manager_->GetTexture(kTextureClientId[ii]));
60146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_TRUE(texture.get() != NULL);
60246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    framebuffer_->AttachTexture(
60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        GL_COLOR_ATTACHMENT0 + ii, texture.get(), GL_TEXTURE_2D, 0, 0);
60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_FALSE(
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0 + ii));
60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
60846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const Framebuffer::Attachment* attachment =
60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0 + ii);
61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_TRUE(attachment != NULL);
61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_TRUE(attachment->cleared());
61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->IsCleared());
61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedColorAttachments());
61546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
61646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Set a texture as uncleared.
61746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<TextureRef> texture1(
61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      texture_manager_->GetTexture(kTextureClientId[1]));
61946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  texture_manager_->SetTarget(texture1.get(), GL_TEXTURE_2D);
62046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  texture_manager_->SetLevelInfo(
62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      texture1.get(), GL_TEXTURE_2D, 0, GL_RGBA, 4, 4,
62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false);
62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const Framebuffer::Attachment* attachment1 =
62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT1);
62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(attachment1 != NULL);
62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(attachment1->cleared());
62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(framebuffer_->IsCleared());
62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT1));
63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->HasUnclearedColorAttachments());
63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->SetDrawBuffers(2, buffers);
63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_COLOR_ATTACHMENT0),
63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            framebuffer_->GetDrawBuffer(GL_DRAW_BUFFER0_ARB));
63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_COLOR_ATTACHMENT1),
63746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            framebuffer_->GetDrawBuffer(GL_DRAW_BUFFER1_ARB));
63846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (GLenum i = GL_DRAW_BUFFER2_ARB;
63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       i < GL_DRAW_BUFFER0_ARB + kMaxDrawBuffers; ++i) {
64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(static_cast<GLenum>(GL_NONE),
64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              framebuffer_->GetDrawBuffer(i));
64246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
64346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Nothing happens.
64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->PrepareDrawBuffersForClear();
64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->RestoreDrawBuffersAfterClear();
64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Now we disable a draw buffer 1.
64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  buffers[1] = GL_NONE;
65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->SetDrawBuffers(2, buffers);
65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // We will enable the disabled draw buffer for clear(), and disable it
65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // after the clear.
65346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
65446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      .Times(1)
65546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      .RetiresOnSaturation();
65646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->PrepareDrawBuffersForClear();
65746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _))
65846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      .Times(1)
65946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      .RetiresOnSaturation();
66046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->RestoreDrawBuffersAfterClear();
66146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
66246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Now remove draw buffer 1's attachment.
66346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->AttachTexture(GL_COLOR_ATTACHMENT1, NULL, 0, 0, 0);
66446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT1) == NULL);
66546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
66646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Nothing happens.
66746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->PrepareDrawBuffersForClear();
66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  framebuffer_->RestoreDrawBuffersAfterClear();
66946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
67046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FramebufferInfoFloatTest : public FramebufferInfoTest {
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FramebufferInfoFloatTest()
6745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : FramebufferInfoTest() {
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~FramebufferInfoFloatTest() {
6775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
6805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() {
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InitializeContext("OpenGL ES 3.0",
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "GL_OES_texture_float GL_EXT_color_buffer_float");
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(FramebufferInfoFloatTest, AttachFloatTexture) {
6875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLuint kTextureClientId = 33;
6885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLuint kTextureServiceId = 333;
6895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLint kDepth = 1;
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLint kBorder = 0;
6915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLenum kType = GL_FLOAT;
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLsizei kWidth = 16;
6935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLsizei kHeight = 32;
6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLint kLevel = 0;
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLenum kFormat = GL_RGBA;
6965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLenum kInternalFormat = GL_RGBA32F;
6975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLenum kTarget = GL_TEXTURE_2D;
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GLsizei kSamples = 0;
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0));
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT));
7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT));
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClientId, kTextureServiceId);
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<TextureRef> texture(
7055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClientId));
7065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(texture.get() != NULL);
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->AttachTexture(
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GL_COLOR_ATTACHMENT0, texture.get(), kTarget, kLevel, kSamples);
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat());
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetTarget(texture.get(), GL_TEXTURE_2D);
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetLevelInfo(texture.get(),
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                GL_TEXTURE_2D,
7155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kLevel,
7165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kInternalFormat,
7175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kWidth,
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kHeight,
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kDepth,
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kBorder,
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kFormat,
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                kType,
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                false);
7245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Texture with a sized float internalformat is allowed as an attachment
7255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // since float color attachment extension is present.
7265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
7275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            framebuffer_->IsPossiblyComplete());
7285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferInfoTest, UnbindRenderbuffer) {
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient1Id = 33;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService1Id = 333;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient2Id = 34;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService2Id = 334;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient1Id, kRenderbufferService1Id);
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer1 =
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer1 != NULL);
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient2Id, kRenderbufferService2Id);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer2 =
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient2Id);
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer2 != NULL);
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attach to 2 attachment points.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_COLOR_ATTACHMENT0, renderbuffer1);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check they were attached.
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) != NULL);
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT) != NULL);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unbind unattached renderbuffer.
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer2);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be no-op.
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) != NULL);
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT) != NULL);
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unbind renderbuffer.
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1);
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check they were detached
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) == NULL);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT) == NULL);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferInfoTest, UnbindTexture) {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureClient1Id = 33;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureService1Id = 333;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureClient2Id = 34;
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureService2Id = 334;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget1 = GL_TEXTURE_2D;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel1 = 0;
7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const GLint kSamples1 = 0;
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClient1Id, kTextureService1Id);
77590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture1(
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClient1Id));
777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture1.get() != NULL);
7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture2(
7805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClient2Id));
781868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture2.get() != NULL);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attach to 2 attachment points.
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachTexture(
7857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, texture1.get(), kTarget1, kLevel1, kSamples1);
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachTexture(
7877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_DEPTH_ATTACHMENT, texture1.get(), kTarget1, kLevel1, kSamples1);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check they were attached.
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) != NULL);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT) != NULL);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unbind unattached texture.
792868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_->UnbindTexture(kTarget1, texture2.get());
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be no-op.
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) != NULL);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT) != NULL);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unbind texture.
797868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_->UnbindTexture(kTarget1, texture1.get());
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check they were detached
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0) == NULL);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(framebuffer_->GetAttachment(GL_DEPTH_ATTACHMENT) == NULL);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FramebufferInfoTest, IsCompleteMarkAsComplete) {
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient1Id = 33;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService1Id = 333;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureClient2Id = 34;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureService2Id = 334;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget1 = GL_TEXTURE_2D;
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel1 = 0;
8107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const GLint kSamples1 = 0;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient1Id, kRenderbufferService1Id);
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer1 =
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id);
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer1 != NULL);
8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
81890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture2(
8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClient2Id));
820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture2.get() != NULL);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check MarkAsComlete marks as complete.
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsComplete(framebuffer_);
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.IsComplete(framebuffer_));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check at attaching marks as not complete.
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachTexture(
8287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1);
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_.IsComplete(framebuffer_));
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsComplete(framebuffer_);
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.IsComplete(framebuffer_));
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1);
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_.IsComplete(framebuffer_));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check MarkAttachmentsAsCleared marks as complete.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_.MarkAttachmentsAsCleared(
8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      framebuffer_, &renderbuffer_manager_, texture_manager_.get());
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.IsComplete(framebuffer_));
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check Unbind marks as not complete.
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1);
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_.IsComplete(framebuffer_));
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manager_.MarkAsComplete(framebuffer_);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(manager_.IsComplete(framebuffer_));
845868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  framebuffer_->UnbindTexture(kTarget1, texture2.get());
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(manager_.IsComplete(framebuffer_));
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FramebufferInfoTest, GetStatus) {
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferClient1Id = 33;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kRenderbufferService1Id = 333;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureClient2Id = 34;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLuint kTextureService2Id = 334;
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLenum kTarget1 = GL_TEXTURE_2D;
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLint kLevel1 = 0;
8567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const GLint kSamples1 = 0;
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderbuffer_manager_.CreateRenderbuffer(
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kRenderbufferClient1Id, kRenderbufferService1Id);
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Renderbuffer* renderbuffer1 =
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id);
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(renderbuffer1 != NULL);
8635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id);
86490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_refptr<TextureRef> texture2(
8655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      texture_manager_->GetTexture(kTextureClient2Id));
866868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(texture2.get() != NULL);
8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
8725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check a second call for the same type does not call anything
875c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
876c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
877c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
878c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .RetiresOnSaturation();
879c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
8805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing the attachments calls CheckFramebufferStatus.
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachTexture(
8847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
886868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation();
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check a second call for the same type does not call anything.
890c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
891c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER))
892c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
893c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .RetiresOnSaturation();
894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check a second call with a different target calls CheckFramebufferStatus.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check a second call for the same type does not call anything.
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .RetiresOnSaturation();
908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check adding another attachment calls CheckFramebufferStatus.
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check a second call for the same type does not call anything.
919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .RetiresOnSaturation();
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check changing the format calls CheckFramebuffferStatus.
927a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestHelper::SetTexParameteriWithExpectations(gl_.get(),
928a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               error_state_.get(),
929a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               texture_manager_.get(),
930a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               texture2.get(),
931a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               GL_TEXTURE_WRAP_S,
932a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               GL_CLAMP_TO_EDGE,
933a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               GL_NO_ERROR);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT))
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check since it did not return FRAMEBUFFER_COMPLETE that it calls
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CheckFramebufferStatus
9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check putting it back does not call CheckFramebufferStatus.
946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .RetiresOnSaturation();
950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
951a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TestHelper::SetTexParameteriWithExpectations(gl_.get(),
952a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               error_state_.get(),
953a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               texture_manager_.get(),
954a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               texture2.get(),
955a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               GL_TEXTURE_WRAP_S,
956a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               GL_REPEAT,
957a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               GL_NO_ERROR);
9585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check Unbinding does not call CheckFramebufferStatus
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1);
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) {
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER))
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE))
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        .RetiresOnSaturation();
966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
9675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
974