diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-16 08:39:35 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-16 08:39:35 +0000 |
commit | bf5a8d13ec2321d56c34a986070476f61f3e5b1c (patch) | |
tree | 0109d0e0b685b97d93eb467192fb84f6317e5319 /gpu/command_buffer/service | |
parent | 2c9bc58faf9a0d67e64d6c38d94dbafea2f4e07b (diff) | |
download | chromium_src-bf5a8d13ec2321d56c34a986070476f61f3e5b1c.zip chromium_src-bf5a8d13ec2321d56c34a986070476f61f3e5b1c.tar.gz chromium_src-bf5a8d13ec2321d56c34a986070476f61f3e5b1c.tar.bz2 |
Add option to not generate resources on bind in OpenGL ES
This allowes us to more efficiently manage ids. It is
not OpenGL ES 2.0 compatible though it probably fits most OpenGL ES
programs.
Note that we need to turn this off on Pepper and/or probably
provide a way for Pepper to turn on on. I'm not sure of the
path Pepper takes to setup. Assuming it goes through
GraphicsContext3D then changes to webkit will be needed to
get the flag all the way down through IPC to the GPU process.
TEST=unit tests and ran a few pages in a chrome build
BUG=92260
Review URL: http://codereview.chromium.org/7633060
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96904 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service')
7 files changed, 121 insertions, 31 deletions
diff --git a/gpu/command_buffer/service/context_group.cc b/gpu/command_buffer/service/context_group.cc index 36c8d03..b93c034 100644 --- a/gpu/command_buffer/service/context_group.cc +++ b/gpu/command_buffer/service/context_group.cc @@ -16,9 +16,10 @@ namespace gpu { namespace gles2 { -ContextGroup::ContextGroup() +ContextGroup::ContextGroup(bool bind_generates_resource) : initialized_(false), have_context_(true), + bind_generates_resource_(bind_generates_resource), max_vertex_attribs_(0u), max_texture_units_(0u), max_texture_image_units_(0u), diff --git a/gpu/command_buffer/service/context_group.h b/gpu/command_buffer/service/context_group.h index a2e6382..f130dc6 100644 --- a/gpu/command_buffer/service/context_group.h +++ b/gpu/command_buffer/service/context_group.h @@ -36,7 +36,7 @@ class ContextGroup : public base::RefCounted<ContextGroup> { public: typedef scoped_refptr<ContextGroup> Ref; - ContextGroup(); + explicit ContextGroup(bool bind_generates_resource); ~ContextGroup(); // This should only be called by GLES2Decoder. @@ -48,6 +48,10 @@ class ContextGroup : public base::RefCounted<ContextGroup> { have_context_ = have_context; } + bool bind_generates_resource() { + return bind_generates_resource_; + } + uint32 max_vertex_attribs() const { return max_vertex_attribs_; } @@ -113,6 +117,7 @@ class ContextGroup : public base::RefCounted<ContextGroup> { // Whether or not this context is initialized. bool initialized_; bool have_context_; + bool bind_generates_resource_; uint32 max_vertex_attribs_; uint32 max_texture_units_; diff --git a/gpu/command_buffer/service/context_group_unittest.cc b/gpu/command_buffer/service/context_group_unittest.cc index a651854..c8a78f3 100644 --- a/gpu/command_buffer/service/context_group_unittest.cc +++ b/gpu/command_buffer/service/context_group_unittest.cc @@ -36,7 +36,7 @@ class ContextGroupTest : public testing::Test { virtual void SetUp() { gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); ::gfx::GLInterface::SetGLInterface(gl_.get()); - group_ = ContextGroup::Ref(new ContextGroup()); + group_ = ContextGroup::Ref(new ContextGroup(true)); } virtual void TearDown() { diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 7a04a7c..22e01c2 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -2682,6 +2682,12 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) { if (client_id != 0) { info = GetBufferInfo(client_id); if (!info) { + if (!group_->bind_generates_resource()) { + SetGLError(GL_INVALID_VALUE, + "glBindBuffer: id not generated by glGenBuffers"); + return; + } + // It's a new id so make a buffer info for it. glGenBuffersARB(1, &service_id); CreateBufferInfo(client_id, service_id); @@ -2761,6 +2767,12 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { if (client_id != 0) { info = GetFramebufferInfo(client_id); if (!info) { + if (!group_->bind_generates_resource()) { + SetGLError(GL_INVALID_VALUE, + "glBindFramebuffer: id not generated by glGenFramebuffers"); + return; + } + // It's a new id so make a framebuffer info for it. glGenFramebuffersEXT(1, &service_id); CreateFramebufferInfo(client_id, service_id); @@ -2800,6 +2812,13 @@ void GLES2DecoderImpl::DoBindRenderbuffer(GLenum target, GLuint client_id) { if (client_id != 0) { info = GetRenderbufferInfo(client_id); if (!info) { + if (!group_->bind_generates_resource()) { + SetGLError( + GL_INVALID_VALUE, + "glBindRenderbuffer: id not generated by glGenRenderbuffers"); + return; + } + // It's a new id so make a renderbuffer info for it. glGenRenderbuffersEXT(1, &service_id); CreateRenderbufferInfo(client_id, service_id); @@ -2822,6 +2841,12 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { if (client_id != 0) { info = GetTextureInfo(client_id); if (!info) { + if (!group_->bind_generates_resource()) { + SetGLError(GL_INVALID_VALUE, + "glBindTexture: id not generated by glGenTextures"); + return; + } + // It's a new id so make a texture info for it. glGenTextures(1, &service_id); CreateTextureInfo(client_id, service_id); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index d619b12..fa85ea5 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -96,7 +96,8 @@ class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource SetupDefaultProgram(); } }; @@ -3190,7 +3191,8 @@ TEST_F(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) { false, // has stencil true, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3220,7 +3222,8 @@ TEST_F(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3250,7 +3253,8 @@ TEST_F(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) { false, // has stencil false, // request alpha true, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3280,7 +3284,8 @@ TEST_F(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3310,7 +3315,8 @@ TEST_F(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) { true, // has stencil false, // request alpha false, // request depth - true); // request stencil + true, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3340,7 +3346,8 @@ TEST_F(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) { true, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3370,7 +3377,8 @@ TEST_F(GLES2DecoderManualInitTest, DepthEnableWithDepth) { false, // has stencil false, // request alpha true, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource Enable cmd; cmd.Init(GL_DEPTH_TEST); @@ -3426,7 +3434,8 @@ TEST_F(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource Enable cmd; cmd.Init(GL_DEPTH_TEST); @@ -3482,7 +3491,8 @@ TEST_F(GLES2DecoderManualInitTest, StencilEnableWithStencil) { true, // has stencil false, // request alpha false, // request depth - true); // request stencil + true, // request stencil + true); // bind generates resource Enable cmd; cmd.Init(GL_STENCIL_TEST); @@ -3538,7 +3548,8 @@ TEST_F(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) { true, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource Enable cmd; cmd.Init(GL_STENCIL_TEST); @@ -3594,7 +3605,8 @@ TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilReportsCorrectValues) { true, // has stencil false, // request alpha true, // request depth - true); // request stencil + true, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3637,7 +3649,8 @@ TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilNoRequestedStencil) { true, // has stencil false, // request alpha true, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -3680,7 +3693,8 @@ TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferDepth) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, @@ -3756,7 +3770,8 @@ TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferStencil) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, @@ -4107,7 +4122,8 @@ TEST_F(GLES2DecoderManualInitTest, RenderbufferStorageMultisampleGLError) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); EXPECT_CALL(*gl_, GetError()) @@ -4169,7 +4185,8 @@ TEST_F(GLES2DecoderManualInitTest, GetCompressedTextureFormats) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -4225,7 +4242,8 @@ TEST_F(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) @@ -4296,7 +4314,8 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId)); EXPECT_CALL(*gl_, GenTextures(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); @@ -4317,7 +4336,8 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); EXPECT_CALL(*gl_, GetError()) @@ -4349,7 +4369,8 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); TextureManager::TextureInfo* info = GetTextureInfo(client_texture_id_); @@ -4368,7 +4389,8 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); @@ -4425,7 +4447,8 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); @@ -4464,7 +4487,8 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) { false, // has stencil false, // request alpha false, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource GLenum target = GL_TEXTURE_EXTERNAL_OES; GLint level = 0; @@ -4485,6 +4509,38 @@ TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } +TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { + InitDecoder( + "", // extensions + false, // has alpha + false, // has depth + false, // has stencil + false, // request alpha + false, // request depth + false, // request stencil + false); // bind generates resource + + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, kInvalidClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + BindBuffer cmd2; + cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + BindFramebuffer cmd3; + cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + BindRenderbuffer cmd4; + cmd4.Init(GL_RENDERBUFFER, kInvalidClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + // TODO(gman): Complete this test. // TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) { // } diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index d80576d..41e42ad0 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -55,7 +55,8 @@ void GLES2DecoderTestBase::SetUp() { false, // has stencil true, // request alpha true, // request depth - false); // request stencil + false, // request stencil + true); // bind generates resource } void GLES2DecoderTestBase::InitDecoder( @@ -65,11 +66,12 @@ void GLES2DecoderTestBase::InitDecoder( bool has_stencil, bool request_alpha, bool request_depth, - bool request_stencil) { + bool request_stencil, + bool bind_generates_resource) { gl_.reset(new StrictMock<MockGLInterface>()); ::gfx::GLInterface::SetGLInterface(gl_.get()); surface_manager_.reset(new StrictMock<MockSurfaceManager>); - group_ = ContextGroup::Ref(new ContextGroup()); + group_ = ContextGroup::Ref(new ContextGroup(bind_generates_resource)); InSequence sequence; diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h index 22d341a..be2ba02 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h @@ -168,7 +168,8 @@ class GLES2DecoderTestBase : public testing::Test { bool has_stencil, bool request_alpha, bool request_depth, - bool request_stencil); + bool request_stencil, + bool bind_generates_resource); const ContextGroup& group() const { return *group_.get(); |