Commit 803bcd7b authored by kainino's avatar kainino Committed by Commit bot

Prevent crash when using getExtension while a PBO is bound.

BUG=641643
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel

Review-Url: https://codereview.chromium.org/2291753002
Cr-Commit-Position: refs/heads/master@{#415547}
parent 8d849fd2
......@@ -71,7 +71,8 @@ TEST_F(ContextGroupTest, Basic) {
TEST_F(ContextGroupTest, InitializeNoExtensions) {
TestHelper::SetupContextGroupInitExpectations(
gl_.get(), DisallowedFeatures(), "", "", kBindGeneratesResource);
gl_.get(), DisallowedFeatures(), "", "",
CONTEXT_TYPE_OPENGLES2, kBindGeneratesResource);
group_->Initialize(decoder_.get(), CONTEXT_TYPE_OPENGLES2,
DisallowedFeatures());
EXPECT_EQ(static_cast<uint32_t>(TestHelper::kNumVertexAttribs),
......@@ -107,7 +108,8 @@ TEST_F(ContextGroupTest, InitializeNoExtensions) {
TEST_F(ContextGroupTest, MultipleContexts) {
std::unique_ptr<MockGLES2Decoder> decoder2_(new MockGLES2Decoder());
TestHelper::SetupContextGroupInitExpectations(
gl_.get(), DisallowedFeatures(), "", "", kBindGeneratesResource);
gl_.get(), DisallowedFeatures(), "", "",
CONTEXT_TYPE_OPENGLES2, kBindGeneratesResource);
EXPECT_TRUE(group_->Initialize(decoder_.get(), CONTEXT_TYPE_OPENGLES2,
DisallowedFeatures()));
EXPECT_FALSE(group_->Initialize(decoder2_.get(), CONTEXT_TYPE_WEBGL1,
......
......@@ -80,6 +80,34 @@ class StringSet {
std::set<std::string> string_set_;
};
class ScopedPixelUnpackBufferOverride {
public:
explicit ScopedPixelUnpackBufferOverride(
bool is_es3_capable,
ContextType context_type,
GLuint binding_override)
: orig_binding_(-1) {
if (!(context_type == CONTEXT_TYPE_WEBGL1 ||
context_type == CONTEXT_TYPE_OPENGLES2) && is_es3_capable) {
GLint orig_binding;
glGetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, &orig_binding);
if (static_cast<GLuint>(orig_binding) != binding_override) {
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, binding_override);
orig_binding_ = orig_binding;
}
}
}
~ScopedPixelUnpackBufferOverride() {
if (orig_binding_ != -1) {
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, static_cast<GLuint>(orig_binding_));
}
}
private:
GLint orig_binding_;
};
} // anonymous namespace.
FeatureInfo::FeatureFlags::FeatureFlags()
......@@ -323,6 +351,11 @@ void FeatureInfo::InitializeFeatures() {
gl_version_info_.reset(
new gl::GLVersionInfo(version_str, renderer_str, extensions.GetImpl()));
// TODO(kainino): This call to IsES3Capable is sort of a hack to get some
// mocked tests working.
ScopedPixelUnpackBufferOverride scoped_pbo_override(
IsES3Capable(), context_type_, 0);
AddExtensionString("GL_ANGLE_translated_shader_source");
AddExtensionString("GL_CHROMIUM_async_pixel_transfers");
AddExtensionString("GL_CHROMIUM_bind_uniform_location");
......
......@@ -95,7 +95,7 @@ class FeatureInfoTest
const char* extensions, const char* renderer, const char* version) {
GpuServiceTest::SetUpWithGLVersion(version, extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), extensions, renderer, version);
gl_.get(), extensions, renderer, version, GetContextType());
info_ = new FeatureInfo();
info_->Initialize(GetContextType(), DisallowedFeatures());
}
......@@ -107,7 +107,7 @@ class FeatureInfoTest
const DisallowedFeatures& disallowed_features) {
GpuServiceTest::SetUpWithGLVersion(version, extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), extensions, renderer, version);
gl_.get(), extensions, renderer, version, GetContextType());
info_ = new FeatureInfo();
info_->Initialize(GetContextType(), disallowed_features);
}
......@@ -119,7 +119,7 @@ class FeatureInfoTest
const base::CommandLine& command_line) {
GpuServiceTest::SetUpWithGLVersion(version, extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), extensions, renderer, version);
gl_.get(), extensions, renderer, version, GetContextType());
GpuDriverBugWorkarounds gpu_driver_bug_workaround(&command_line);
info_ = new FeatureInfo(command_line, gpu_driver_bug_workaround);
info_->Initialize(GetContextType(), DisallowedFeatures());
......@@ -136,7 +136,7 @@ class FeatureInfoTest
const base::CommandLine& command_line) {
GpuServiceTest::SetUpWithGLVersion("2.0", extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), extensions, "", "");
gl_.get(), extensions, "", "", GetContextType());
GpuDriverBugWorkarounds gpu_driver_bug_workaround(&command_line);
info_ = new FeatureInfo(command_line, gpu_driver_bug_workaround);
info_->Initialize(GetContextType(), DisallowedFeatures());
......
......@@ -149,7 +149,7 @@ class FramebufferInfoTestBase : public GpuServiceTest {
void InitializeContext(const char* gl_version, const char* extensions) {
GpuServiceTest::SetUpWithGLVersion(gl_version, extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(),
extensions, "", gl_version);
extensions, "", gl_version, manager_.context_type());
feature_info_->InitializeForTesting();
decoder_.reset(new MockGLES2Decoder());
manager_.CreateFramebuffer(kClient1Id, kService1Id);
......@@ -1554,7 +1554,7 @@ class FramebufferInfoES3Test : public FramebufferInfoTestBase {
void InitializeContext(const char* gl_version, const char* extensions) {
GpuServiceTest::SetUpWithGLVersion(gl_version, extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(),
extensions, "", gl_version);
extensions, "", gl_version, manager_.context_type());
feature_info_->InitializeForTesting(CONTEXT_TYPE_OPENGLES3);
decoder_.reset(new MockGLES2Decoder());
manager_.CreateFramebuffer(kClient1Id, kService1Id);
......
......@@ -219,6 +219,7 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine(
DisallowedFeatures(),
normalized_init.extensions.c_str(),
normalized_init.gl_version.c_str(),
init.context_type,
normalized_init.bind_generates_resource);
// We initialize the ContextGroup with a MockGLES2Decoder so that
......
......@@ -70,10 +70,10 @@ class ProgramManagerTestBase : public GpuServiceTest {
const char* gl_extensions,
FeatureInfo* feature_info = nullptr) {
GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions);
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), gl_extensions, "", gl_version);
if (!feature_info)
feature_info = new FeatureInfo();
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), gl_extensions, "", gl_version, feature_info->context_type());
feature_info->InitializeForTesting();
feature_info_ = feature_info;
SetupProgramManager();
......
......@@ -36,7 +36,8 @@ class RenderbufferManagerTestBase : public GpuServiceTest {
gl_.get(),
depth24_supported ? "GL_OES_depth24" : "",
"",
use_gles ? "OpenGL ES 2.0" : "2.1");
use_gles ? "OpenGL ES 2.0" : "2.1",
feature_info_->context_type());
feature_info_->InitializeForTesting();
manager_.reset(new RenderbufferManager(
memory_tracker, kMaxSize, kMaxSamples, feature_info_.get()));
......
......@@ -34,6 +34,7 @@ using ::testing::NotNull;
using ::testing::Return;
using ::testing::SetArrayArgument;
using ::testing::SetArgumentPointee;
using ::testing::SetArgPointee;
using ::testing::StrEq;
using ::testing::StrictMock;
......@@ -331,13 +332,17 @@ void TestHelper::SetupContextGroupInitExpectations(
const DisallowedFeatures& disallowed_features,
const char* extensions,
const char* gl_version,
ContextType context_type,
bool bind_generates_resource) {
InSequence sequence;
SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", gl_version);
gl::GLVersionInfo gl_info(gl_version, "", extensions);
SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", gl_version,
context_type,
context_type == CONTEXT_TYPE_WEBGL2 ||
context_type == CONTEXT_TYPE_OPENGLES3);
EXPECT_CALL(*gl, GetIntegerv(GL_MAX_RENDERBUFFER_SIZE, _))
.WillOnce(SetArgumentPointee<1>(kMaxRenderbufferSize))
.RetiresOnSaturation();
......@@ -468,7 +473,8 @@ void TestHelper::SetupContextGroupInitExpectations(
void TestHelper::SetupFeatureInfoInitExpectations(::gl::MockGLInterface* gl,
const char* extensions) {
SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", "");
SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", "",
CONTEXT_TYPE_OPENGLES2);
}
void TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
......@@ -476,6 +482,7 @@ void TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
const char* extensions,
const char* gl_renderer,
const char* gl_version,
ContextType context_type,
bool enable_es3) {
InSequence sequence;
......@@ -514,6 +521,14 @@ void TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
.WillOnce(Return(reinterpret_cast<const uint8_t*>(gl_renderer)))
.RetiresOnSaturation();
if (!(context_type == CONTEXT_TYPE_WEBGL1 ||
context_type == CONTEXT_TYPE_OPENGLES2) &&
gl_info.is_es3_capable && enable_es3) {
EXPECT_CALL(*gl, GetIntegerv(GL_PIXEL_UNPACK_BUFFER_BINDING, _))
.WillOnce(SetArgPointee<1>(0))
.RetiresOnSaturation();
}
if ((strstr(extensions, "GL_ARB_texture_float") ||
gl_info.is_desktop_core_profile) ||
(gl_info.is_es3 && strstr(extensions, "GL_EXT_color_buffer_float"))) {
......
......@@ -10,6 +10,7 @@
#include <string>
#include <vector>
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
#include "gpu/command_buffer/service/shader_translator.h"
#include "ui/gl/gl_implementation.h"
#include "ui/gl/gl_mock.h"
......@@ -106,6 +107,7 @@ class TestHelper {
const DisallowedFeatures& disallowed_features,
const char* extensions,
const char* gl_version,
ContextType context_type,
bool bind_generates_resource);
static void SetupFeatureInfoInitExpectations(::gl::MockGLInterface* gl,
const char* extensions);
......@@ -114,6 +116,7 @@ class TestHelper {
const char* extensions,
const char* gl_renderer,
const char* gl_version,
ContextType context_type,
bool enable_es3 = false);
static void SetupTextureManagerInitExpectations(::gl::MockGLInterface* gl,
bool is_es3_enabled,
......
......@@ -112,7 +112,8 @@ class TextureManagerTest : public GpuServiceTest {
const char* gl_version,
bool enable_es3) {
TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
gl_.get(), gl_extensions, "", gl_version, enable_es3);
gl_.get(), gl_extensions, "", gl_version,
feature_info_->context_type(), enable_es3);
feature_info_->InitializeForTesting();
if (enable_es3) {
EXPECT_CALL(*gl_, GetIntegerv(GL_MAX_COLOR_ATTACHMENTS, _))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment