// Copyright 2019 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/shared_context_state.h" #include #include #include #include #include "base/callback_helpers.h" #include "base/command_line.h" #include "base/memory/ptr_util.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/service/context_state_test_helpers.h" #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/test_helper.h" #include "gpu/config/gpu_driver_bug_workarounds.h" #include "gpu/config/gpu_feature_info.h" #include "gpu/config/gpu_preferences.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_context_stub.h" #include "ui/gl/gl_mock.h" #include "ui/gl/gl_surface_stub.h" #include "ui/gl/init/gl_factory.h" #include "ui/gl/test/gl_surface_test_support.h" using ::testing::_; using ::testing::InSequence; using ::testing::Return; using ::testing::SetArgPointee; using ::testing::StrictMock; namespace gpu { class SharedContextStateTest : public ::testing::Test { public: SharedContextStateTest() = default; }; TEST_F(SharedContextStateTest, InitFailsIfLostContext) { const ContextType context_type = CONTEXT_TYPE_OPENGLES2; // For easier substring/extension matching gl::SetGLGetProcAddressProc(gl::MockGLInterface::GetGLProcAddress); gl::GLSurfaceTestSupport::InitializeOneOffWithMockBindings(); StrictMock gl_interface; gl::MockGLInterface::SetGLInterface(&gl_interface); InSequence sequence; auto surface = base::MakeRefCounted(); auto context = base::MakeRefCounted(); const char gl_version[] = "2.1"; context->SetGLVersionString(gl_version); const char gl_extensions[] = "GL_KHR_robustness"; context->SetExtensionsString(gl_extensions); context->MakeCurrent(surface.get()); GpuFeatureInfo gpu_feature_info; GpuDriverBugWorkarounds workarounds; auto feature_info = base::MakeRefCounted(workarounds, gpu_feature_info); gles2::TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( &gl_interface, gl_extensions, "", gl_version, context_type); feature_info->Initialize(gpu::CONTEXT_TYPE_OPENGLES2, false /* passthrough */, gles2::DisallowedFeatures()); // Setup expectations for SharedContextState::InitializeGL(). EXPECT_CALL(gl_interface, GetIntegerv(GL_MAX_VERTEX_ATTRIBS, _)) .WillOnce(SetArgPointee<1>(8u)) .RetiresOnSaturation(); EXPECT_CALL(gl_interface, GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, _)) .WillOnce(SetArgPointee<1>(8u)) .RetiresOnSaturation(); ContextStateTestHelpers::SetupInitState(&gl_interface, feature_info.get(), gfx::Size(1, 1)); EXPECT_CALL(gl_interface, GetGraphicsResetStatusARB()) .WillOnce(Return(GL_GUILTY_CONTEXT_RESET_ARB)); auto shared_context_state = base::MakeRefCounted( new gl::GLShareGroup(), surface, context, false /* use_virtualized_gl_contexts */, base::DoNothing()); bool result = shared_context_state->InitializeGL(GpuPreferences(), feature_info); EXPECT_FALSE(result); } } // namespace gpu