diff options
author | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-25 06:01:15 +0000 |
---|---|---|
committer | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-06-25 06:01:15 +0000 |
commit | 56ea558ea8dd546c112ff9fe971fe12df0ce0a1a (patch) | |
tree | 722195e7dedc8e0bafa777de2824a9433fda439c /gpu | |
parent | dd588676da0907a763be672c734a9a120e49f57a (diff) | |
download | chromium_src-56ea558ea8dd546c112ff9fe971fe12df0ce0a1a.zip chromium_src-56ea558ea8dd546c112ff9fe971fe12df0ce0a1a.tar.gz chromium_src-56ea558ea8dd546c112ff9fe971fe12df0ce0a1a.tar.bz2 |
gpu: Expose GLFence impls
Move implementations to their own header+source files.
Then specifically use EGL_KHR_fence_sync implementation for
mailbox synchronizing because it's the only one working across
contexts and share groups.
Review URL: https://codereview.chromium.org/337783005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@279621 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | 38 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_definition.cc | 140 | ||||
-rw-r--r-- | gpu/command_buffer/service/texture_definition.h | 35 |
3 files changed, 129 insertions, 84 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index f97a6dc5b..15eb0ea 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -721,6 +721,11 @@ static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test, EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) .WillOnce(Return(kGlSync)) .RetiresOnSaturation(); +#if DCHECK_IS_ON + EXPECT_CALL(*gl, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif } EndQueryEXT end_cmd; @@ -737,6 +742,11 @@ static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test, .RetiresOnSaturation(); } if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { +#if DCHECK_IS_ON + EXPECT_CALL(*gl, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _)) .WillOnce(Return(GL_ALREADY_SIGNALED)) .RetiresOnSaturation(); @@ -752,8 +762,14 @@ static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test, if (query_type.is_gl) { EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); } - if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { +#if DCHECK_IS_ON + EXPECT_CALL(*gl, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); + } test->ResetDecoder(); } @@ -879,6 +895,11 @@ TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) .WillOnce(Return(kGlSync)) .RetiresOnSaturation(); +#if DCHECK_IS_ON + EXPECT_CALL(*gl_, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif EndQueryEXT end_cmd; end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1); @@ -886,6 +907,11 @@ TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_TRUE(query->pending()); +#if DCHECK_IS_ON + EXPECT_CALL(*gl_, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) .WillOnce(Return(GL_TIMEOUT_EXPIRED)) .RetiresOnSaturation(); @@ -894,6 +920,11 @@ TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { EXPECT_TRUE(process_success); EXPECT_TRUE(query->pending()); +#if DCHECK_IS_ON + EXPECT_CALL(*gl_, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) .WillOnce(Return(GL_ALREADY_SIGNALED)) .RetiresOnSaturation(); @@ -904,6 +935,11 @@ TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result)); +#if DCHECK_IS_ON + EXPECT_CALL(*gl_, IsSync(kGlSync)) + .WillOnce(Return(GL_TRUE)) + .RetiresOnSaturation(); +#endif EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); ResetDecoder(); } diff --git a/gpu/command_buffer/service/texture_definition.cc b/gpu/command_buffer/service/texture_definition.cc index 24382f0..d7b99b2 100644 --- a/gpu/command_buffer/service/texture_definition.cc +++ b/gpu/command_buffer/service/texture_definition.cc @@ -105,11 +105,32 @@ class NativeImageBufferEGL : public NativeImageBuffer { EGLDisplay display, EGLImageKHR image); virtual ~NativeImageBufferEGL(); + virtual void AddClient(gfx::GLImage* client) OVERRIDE; + virtual void RemoveClient(gfx::GLImage* client) OVERRIDE; + virtual bool IsClient(gfx::GLImage* client) OVERRIDE; virtual void BindToTexture(GLenum target) OVERRIDE; + virtual void WillRead(gfx::GLImage* client) OVERRIDE; + virtual void WillWrite(gfx::GLImage* client) OVERRIDE; + virtual void DidRead(gfx::GLImage* client) OVERRIDE; + virtual void DidWrite(gfx::GLImage* client) OVERRIDE; EGLDisplay egl_display_; EGLImageKHR egl_image_; + base::Lock lock_; + + struct ClientInfo { + ClientInfo(gfx::GLImage* client); + ~ClientInfo(); + + gfx::GLImage* client; + bool needs_wait_before_read; + linked_ptr<gfx::GLFence> read_fence; + }; + std::list<ClientInfo> client_infos_; + scoped_ptr<gfx::GLFence> write_fence_; + gfx::GLImage* write_client_; + DISALLOW_COPY_AND_ASSIGN(NativeImageBufferEGL); }; @@ -142,76 +163,35 @@ scoped_refptr<NativeImageBufferEGL> NativeImageBufferEGL::Create( make_scoped_ptr(gfx::GLFence::Create()), egl_display, egl_image); } +NativeImageBufferEGL::ClientInfo::ClientInfo(gfx::GLImage* client) + : client(client), needs_wait_before_read(true) {} + +NativeImageBufferEGL::ClientInfo::~ClientInfo() {} + NativeImageBufferEGL::NativeImageBufferEGL(scoped_ptr<gfx::GLFence> write_fence, EGLDisplay display, EGLImageKHR image) - : NativeImageBuffer(write_fence.Pass()), + : NativeImageBuffer(), egl_display_(display), - egl_image_(image) { + egl_image_(image), + write_fence_(write_fence.Pass()), + write_client_(NULL) { DCHECK(egl_display_ != EGL_NO_DISPLAY); DCHECK(egl_image_ != EGL_NO_IMAGE_KHR); } NativeImageBufferEGL::~NativeImageBufferEGL() { + DCHECK(client_infos_.empty()); if (egl_image_ != EGL_NO_IMAGE_KHR) eglDestroyImageKHR(egl_display_, egl_image_); } -void NativeImageBufferEGL::BindToTexture(GLenum target) { - DCHECK(egl_image_ != EGL_NO_IMAGE_KHR); - glEGLImageTargetTexture2DOES(target, egl_image_); - DCHECK_EQ(static_cast<EGLint>(EGL_SUCCESS), eglGetError()); - DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); -} -#endif - -class NativeImageBufferStub : public NativeImageBuffer { - public: - NativeImageBufferStub() : NativeImageBuffer(scoped_ptr<gfx::GLFence>()) {} - - private: - virtual ~NativeImageBufferStub() {} - virtual void BindToTexture(GLenum target) OVERRIDE {} - - DISALLOW_COPY_AND_ASSIGN(NativeImageBufferStub); -}; - -} // anonymous namespace - -// static -scoped_refptr<NativeImageBuffer> NativeImageBuffer::Create(GLuint texture_id) { - switch (gfx::GetGLImplementation()) { -#if !defined(OS_MACOSX) - case gfx::kGLImplementationEGLGLES2: - return NativeImageBufferEGL::Create(texture_id); -#endif - case gfx::kGLImplementationMockGL: - return new NativeImageBufferStub; - default: - NOTREACHED(); - return NULL; - } -} - -NativeImageBuffer::ClientInfo::ClientInfo(gfx::GLImage* client) - : client(client), needs_wait_before_read(true) {} - -NativeImageBuffer::ClientInfo::~ClientInfo() {} - -NativeImageBuffer::NativeImageBuffer(scoped_ptr<gfx::GLFence> write_fence) - : write_fence_(write_fence.Pass()), write_client_(NULL) { -} - -NativeImageBuffer::~NativeImageBuffer() { - DCHECK(client_infos_.empty()); -} - -void NativeImageBuffer::AddClient(gfx::GLImage* client) { +void NativeImageBufferEGL::AddClient(gfx::GLImage* client) { base::AutoLock lock(lock_); client_infos_.push_back(ClientInfo(client)); } -void NativeImageBuffer::RemoveClient(gfx::GLImage* client) { +void NativeImageBufferEGL::RemoveClient(gfx::GLImage* client) { base::AutoLock lock(lock_); if (write_client_ == client) write_client_ = NULL; @@ -226,7 +206,7 @@ void NativeImageBuffer::RemoveClient(gfx::GLImage* client) { NOTREACHED(); } -bool NativeImageBuffer::IsClient(gfx::GLImage* client) { +bool NativeImageBufferEGL::IsClient(gfx::GLImage* client) { base::AutoLock lock(lock_); for (std::list<ClientInfo>::iterator it = client_infos_.begin(); it != client_infos_.end(); @@ -237,7 +217,14 @@ bool NativeImageBuffer::IsClient(gfx::GLImage* client) { return false; } -void NativeImageBuffer::WillRead(gfx::GLImage* client) { +void NativeImageBufferEGL::BindToTexture(GLenum target) { + DCHECK(egl_image_ != EGL_NO_IMAGE_KHR); + glEGLImageTargetTexture2DOES(target, egl_image_); + DCHECK_EQ(static_cast<EGLint>(EGL_SUCCESS), eglGetError()); + DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); +} + +void NativeImageBufferEGL::WillRead(gfx::GLImage* client) { base::AutoLock lock(lock_); if (!write_fence_.get() || write_client_ == client) return; @@ -256,7 +243,7 @@ void NativeImageBuffer::WillRead(gfx::GLImage* client) { NOTREACHED(); } -void NativeImageBuffer::WillWrite(gfx::GLImage* client) { +void NativeImageBufferEGL::WillWrite(gfx::GLImage* client) { base::AutoLock lock(lock_); if (write_client_ != client) write_fence_->ServerWait(); @@ -269,7 +256,7 @@ void NativeImageBuffer::WillWrite(gfx::GLImage* client) { } } -void NativeImageBuffer::DidRead(gfx::GLImage* client) { +void NativeImageBufferEGL::DidRead(gfx::GLImage* client) { base::AutoLock lock(lock_); for (std::list<ClientInfo>::iterator it = client_infos_.begin(); it != client_infos_.end(); @@ -282,7 +269,7 @@ void NativeImageBuffer::DidRead(gfx::GLImage* client) { NOTREACHED(); } -void NativeImageBuffer::DidWrite(gfx::GLImage* client) { +void NativeImageBufferEGL::DidWrite(gfx::GLImage* client) { base::AutoLock lock(lock_); // Sharing semantics require the client to flush in order to make changes // visible to other clients. @@ -295,6 +282,43 @@ void NativeImageBuffer::DidWrite(gfx::GLImage* client) { } } +#endif + +class NativeImageBufferStub : public NativeImageBuffer { + public: + NativeImageBufferStub() : NativeImageBuffer() {} + + private: + virtual ~NativeImageBufferStub() {} + virtual void AddClient(gfx::GLImage* client) OVERRIDE {} + virtual void RemoveClient(gfx::GLImage* client) OVERRIDE {} + virtual bool IsClient(gfx::GLImage* client) OVERRIDE { return true; } + virtual void BindToTexture(GLenum target) OVERRIDE {} + virtual void WillRead(gfx::GLImage* client) OVERRIDE {} + virtual void WillWrite(gfx::GLImage* client) OVERRIDE {} + virtual void DidRead(gfx::GLImage* client) OVERRIDE {} + virtual void DidWrite(gfx::GLImage* client) OVERRIDE {} + + DISALLOW_COPY_AND_ASSIGN(NativeImageBufferStub); +}; + +} // anonymous namespace + +// static +scoped_refptr<NativeImageBuffer> NativeImageBuffer::Create(GLuint texture_id) { + switch (gfx::GetGLImplementation()) { +#if !defined(OS_MACOSX) + case gfx::kGLImplementationEGLGLES2: + return NativeImageBufferEGL::Create(texture_id); +#endif + case gfx::kGLImplementationMockGL: + return new NativeImageBufferStub; + default: + NOTREACHED(); + return NULL; + } +} + TextureDefinition::LevelInfo::LevelInfo(GLenum target, GLenum internal_format, GLsizei width, diff --git a/gpu/command_buffer/service/texture_definition.h b/gpu/command_buffer/service/texture_definition.h index 7708902..0b4816a 100644 --- a/gpu/command_buffer/service/texture_definition.h +++ b/gpu/command_buffer/service/texture_definition.h @@ -29,35 +29,20 @@ class Texture; class NativeImageBuffer : public base::RefCountedThreadSafe<NativeImageBuffer> { public: static scoped_refptr<NativeImageBuffer> Create(GLuint texture_id); - virtual void BindToTexture(GLenum target) = 0; - - void AddClient(gfx::GLImage* client); - void RemoveClient(gfx::GLImage* client); - bool IsClient(gfx::GLImage* client); - void WillRead(gfx::GLImage* client); - void WillWrite(gfx::GLImage* client); - void DidRead(gfx::GLImage* client); - void DidWrite(gfx::GLImage* client); + virtual void AddClient(gfx::GLImage* client) = 0; + virtual void RemoveClient(gfx::GLImage* client) = 0; + virtual bool IsClient(gfx::GLImage* client) = 0; + virtual void BindToTexture(GLenum target) = 0; + virtual void WillRead(gfx::GLImage* client) = 0; + virtual void WillWrite(gfx::GLImage* client) = 0; + virtual void DidRead(gfx::GLImage* client) = 0; + virtual void DidWrite(gfx::GLImage* client) = 0; protected: friend class base::RefCountedThreadSafe<NativeImageBuffer>; - explicit NativeImageBuffer(scoped_ptr<gfx::GLFence> write_fence); - virtual ~NativeImageBuffer(); - - base::Lock lock_; - - struct ClientInfo { - ClientInfo(gfx::GLImage* client); - ~ClientInfo(); - - gfx::GLImage* client; - bool needs_wait_before_read; - linked_ptr<gfx::GLFence> read_fence; - }; - std::list<ClientInfo> client_infos_; - scoped_ptr<gfx::GLFence> write_fence_; - gfx::GLImage* write_client_; + NativeImageBuffer() {} + virtual ~NativeImageBuffer() {} DISALLOW_COPY_AND_ASSIGN(NativeImageBuffer); }; |