blob: c5d0c6c0f980b9e5eddd8600971639ee5ec55a3b [file] [log] [blame]
// Copyright (c) 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gpu/command_buffer/service/valuebuffer_manager.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/common/value_state.h"
#include "gpu/command_buffer/service/common_decoder.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/gpu_service_test.h"
#include "gpu/command_buffer/service/mocks.h"
#include "gpu/command_buffer/service/test_helper.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gl/gl_bindings.h"
#include "ui/gl/gl_mock.h"
namespace gpu {
namespace gles2 {
class MockSubscriptionRefSetObserver : public SubscriptionRefSet::Observer {
public:
MOCK_METHOD1(OnAddSubscription, void(unsigned int target));
MOCK_METHOD1(OnRemoveSubscription, void(unsigned int target));
};
class ValuebufferManagerTest : public GpuServiceTest {
public:
ValuebufferManagerTest() {}
~ValuebufferManagerTest() override {}
void SetUp() override {
GpuServiceTest::SetUp();
subscription_ref_set_ = new SubscriptionRefSet();
pending_state_map_ = new ValueStateMap();
subscription_ref_set_->AddObserver(&mock_observer_);
manager_.reset(new ValuebufferManager(subscription_ref_set_.get(),
pending_state_map_.get()));
}
void TearDown() override {
manager_->Destroy();
subscription_ref_set_->RemoveObserver(&mock_observer_);
GpuServiceTest::TearDown();
}
protected:
MockSubscriptionRefSetObserver mock_observer_;
scoped_refptr<SubscriptionRefSet> subscription_ref_set_;
scoped_refptr<ValueStateMap> pending_state_map_;
scoped_ptr<ValuebufferManager> manager_;
};
TEST_F(ValuebufferManagerTest, Basic) {
const GLuint kClient1Id = 1;
const GLuint kClient2Id = 2;
// Check we can create a Valuebuffer
manager_->CreateValuebuffer(kClient1Id);
Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
// Check we get nothing for a non-existent Valuebuffer.
// Check trying to a remove non-existent Valuebuffer does not crash
manager_->RemoveValuebuffer(kClient2Id);
// Check we can't get the renderbuffer after we remove it.
manager_->RemoveValuebuffer(kClient1Id);
EXPECT_TRUE(manager_->GetValuebuffer(kClient1Id) == NULL);
}
TEST_F(ValuebufferManagerTest, Destroy) {
const GLuint kClient1Id = 1;
// Check we can create Valuebuffer.
manager_->CreateValuebuffer(kClient1Id);
Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
manager_->Destroy();
// Check the resources were released.
Valuebuffer* valuebuffer1 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer1 == NULL);
}
TEST_F(ValuebufferManagerTest, ValueBuffer) {
const GLuint kClient1Id = 1;
// Check we can create a Valuebuffer
manager_->CreateValuebuffer(kClient1Id);
Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
EXPECT_FALSE(valuebuffer0->IsValid());
}
TEST_F(ValuebufferManagerTest, UpdateState) {
const GLuint kClient1Id = 1;
ValueState valuestate1;
valuestate1.int_value[0] = 111;
ValueState valuestate2;
valuestate2.int_value[0] = 222;
manager_->CreateValuebuffer(kClient1Id);
Valuebuffer* valuebuffer0 = manager_->GetValuebuffer(kClient1Id);
ASSERT_TRUE(valuebuffer0 != NULL);
EXPECT_EQ(kClient1Id, valuebuffer0->client_id());
valuebuffer0->AddSubscription(GL_MOUSE_POSITION_CHROMIUM);
ASSERT_TRUE(valuebuffer0->GetState(GL_MOUSE_POSITION_CHROMIUM) == NULL);
pending_state_map_->UpdateState(GL_MOUSE_POSITION_CHROMIUM, valuestate1);
manager_->UpdateValuebufferState(valuebuffer0);
const ValueState* new_state1 =
valuebuffer0->GetState(GL_MOUSE_POSITION_CHROMIUM);
ASSERT_TRUE(new_state1 != NULL);
ASSERT_TRUE(new_state1->int_value[0] == 111);
// Ensure state changes
pending_state_map_->UpdateState(GL_MOUSE_POSITION_CHROMIUM, valuestate2);
manager_->UpdateValuebufferState(valuebuffer0);
const ValueState* new_state2 =
valuebuffer0->GetState(GL_MOUSE_POSITION_CHROMIUM);
ASSERT_TRUE(new_state2 != NULL);
ASSERT_TRUE(new_state2->int_value[0] == 222);
}
TEST_F(ValuebufferManagerTest, NotifySubscriptionRefs) {
const GLuint kClientId1 = 1;
const GLuint kClientId2 = 2;
manager_->CreateValuebuffer(kClientId1);
Valuebuffer* valuebuffer1 = manager_->GetValuebuffer(kClientId1);
ASSERT_TRUE(valuebuffer1 != NULL);
manager_->CreateValuebuffer(kClientId2);
Valuebuffer* valuebuffer2 = manager_->GetValuebuffer(kClientId2);
ASSERT_TRUE(valuebuffer2 != NULL);
EXPECT_CALL(mock_observer_, OnAddSubscription(GL_MOUSE_POSITION_CHROMIUM))
.Times(1);
valuebuffer1->AddSubscription(GL_MOUSE_POSITION_CHROMIUM);
EXPECT_CALL(mock_observer_, OnAddSubscription(GL_MOUSE_POSITION_CHROMIUM))
.Times(0);
valuebuffer2->AddSubscription(GL_MOUSE_POSITION_CHROMIUM);
EXPECT_CALL(mock_observer_, OnRemoveSubscription(GL_MOUSE_POSITION_CHROMIUM))
.Times(0);
valuebuffer1->RemoveSubscription(GL_MOUSE_POSITION_CHROMIUM);
// Ensure the manager still thinks a buffer has a reference to the
// subscription target.
EXPECT_CALL(mock_observer_, OnRemoveSubscription(GL_MOUSE_POSITION_CHROMIUM))
.Times(1);
valuebuffer2->RemoveSubscription(GL_MOUSE_POSITION_CHROMIUM);
}
} // namespace gles2
} // namespace gpu