Skip to content

Commit

Permalink
Bug 1236762 - Simplify locking APIs for SharedSurface. - r=jrmuizel
Browse files Browse the repository at this point in the history
  • Loading branch information
kdashg committed Jan 5, 2016
1 parent e0dc3b7 commit b66e705
Show file tree
Hide file tree
Showing 16 changed files with 28 additions and 378 deletions.
21 changes: 0 additions & 21 deletions gfx/gl/SharedSurface.cpp
Expand Up @@ -249,27 +249,6 @@ SharedSurface::UnlockProd()
mIsLocked = false;
}

void
SharedSurface::Fence_ContentThread()
{
MOZ_ASSERT(NS_GetCurrentThread() == mOwningThread);
Fence_ContentThread_Impl();
}

bool
SharedSurface::WaitSync_ContentThread()
{
MOZ_ASSERT(NS_GetCurrentThread() == mOwningThread);
return WaitSync_ContentThread_Impl();
}

bool
SharedSurface::PollSync_ContentThread()
{
MOZ_ASSERT(NS_GetCurrentThread() == mOwningThread);
return PollSync_ContentThread_Impl();
}

////////////////////////////////////////////////////////////////////////
// SurfaceFactory

Expand Down
46 changes: 4 additions & 42 deletions gfx/gl/SharedSurface.h
Expand Up @@ -100,16 +100,10 @@ class SharedSurface
virtual void LockProdImpl() = 0;
virtual void UnlockProdImpl() = 0;

virtual void ProducerAcquireImpl() {}
virtual void ProducerReleaseImpl() {
Fence();
}
virtual void ProducerReadAcquireImpl() {}
virtual void ProducerReadReleaseImpl() {}
virtual void ConsumerAcquireImpl() {
WaitSync();
}
virtual void ConsumerReleaseImpl() {}
virtual void ProducerAcquireImpl() = 0;
virtual void ProducerReleaseImpl() = 0;
virtual void ProducerReadAcquireImpl() { ProducerAcquireImpl(); }
virtual void ProducerReadReleaseImpl() { ProducerReleaseImpl(); }

public:
void ProducerAcquire() {
Expand All @@ -132,39 +126,7 @@ class SharedSurface
ProducerReadReleaseImpl();
mIsProducerAcquired = false;
}
void ConsumerAcquire() {
MOZ_ASSERT(!mIsConsumerAcquired);
ConsumerAcquireImpl();
mIsConsumerAcquired = true;
}
void ConsumerRelease() {
MOZ_ASSERT(mIsConsumerAcquired);
ConsumerReleaseImpl();
mIsConsumerAcquired = false;
}

virtual void Fence() = 0;
virtual bool WaitSync() = 0;
virtual bool PollSync() = 0;

// Use these if you can. They can only be called from the Content
// thread, though!
void Fence_ContentThread();
bool WaitSync_ContentThread();
bool PollSync_ContentThread();

protected:
virtual void Fence_ContentThread_Impl() {
Fence();
}
virtual bool WaitSync_ContentThread_Impl() {
return WaitSync();
}
virtual bool PollSync_ContentThread_Impl() {
return PollSync();
}

public:
// This function waits until the buffer is no longer being used.
// To optimize the performance, some implementaions recycle SharedSurfaces
// even when its buffer is still being used.
Expand Down
91 changes: 1 addition & 90 deletions gfx/gl/SharedSurfaceANGLE.cpp
Expand Up @@ -134,24 +134,6 @@ SharedSurface_ANGLEShareHandle::UnlockProdImpl()
{
}

void
SharedSurface_ANGLEShareHandle::Fence()
{
mGL->fFinish();
}

bool
SharedSurface_ANGLEShareHandle::WaitSync()
{
return true;
}

bool
SharedSurface_ANGLEShareHandle::PollSync()
{
return true;
}

void
SharedSurface_ANGLEShareHandle::ProducerAcquireImpl()
{
Expand All @@ -174,7 +156,7 @@ SharedSurface_ANGLEShareHandle::ProducerReleaseImpl()
mKeyedMutex->ReleaseSync(0);
return;
}
Fence();
mGL->fFinish();
}

void
Expand All @@ -192,77 +174,6 @@ SharedSurface_ANGLEShareHandle::ProducerReadReleaseImpl()
}
}

void
SharedSurface_ANGLEShareHandle::ConsumerAcquireImpl()
{
if (!mConsumerTexture) {
RefPtr<ID3D11Texture2D> tex;
HRESULT hr = gfxWindowsPlatform::GetPlatform()->GetD3D11Device()->OpenSharedResource(mShareHandle,
__uuidof(ID3D11Texture2D),
(void**)(ID3D11Texture2D**)getter_AddRefs(tex));
if (SUCCEEDED(hr)) {
mConsumerTexture = tex;
RefPtr<IDXGIKeyedMutex> mutex;
hr = tex->QueryInterface((IDXGIKeyedMutex**)getter_AddRefs(mutex));

if (SUCCEEDED(hr)) {
mConsumerKeyedMutex = mutex;
}
}
}

if (mConsumerKeyedMutex) {
HRESULT hr = mConsumerKeyedMutex->AcquireSync(0, 10000);
if (hr == WAIT_TIMEOUT) {
MOZ_CRASH("GFX: ANGLE consumer mutex timeout");
}
}
}

void
SharedSurface_ANGLEShareHandle::ConsumerReleaseImpl()
{
if (mConsumerKeyedMutex) {
mConsumerKeyedMutex->ReleaseSync(0);
}
}

void
SharedSurface_ANGLEShareHandle::Fence_ContentThread_Impl()
{
if (mFence) {
MOZ_ASSERT(mGL->IsExtensionSupported(GLContext::NV_fence));
mGL->fSetFence(mFence, LOCAL_GL_ALL_COMPLETED_NV);
mGL->fFlush();
return;
}

Fence();
}

bool
SharedSurface_ANGLEShareHandle::WaitSync_ContentThread_Impl()
{
if (mFence) {
mGL->MakeCurrent();
mGL->fFinishFence(mFence);
return true;
}

return WaitSync();
}

bool
SharedSurface_ANGLEShareHandle::PollSync_ContentThread_Impl()
{
if (mFence) {
mGL->MakeCurrent();
return mGL->fTestFence(mFence);
}

return PollSync();
}

bool
SharedSurface_ANGLEShareHandle::ToSurfaceDescriptor(layers::SurfaceDescriptor* const out_descriptor)
{
Expand Down
9 changes: 0 additions & 9 deletions gfx/gl/SharedSurfaceANGLE.h
Expand Up @@ -62,19 +62,10 @@ class SharedSurface_ANGLEShareHandle
virtual void LockProdImpl() override;
virtual void UnlockProdImpl() override;

virtual void Fence() override;
virtual void ProducerAcquireImpl() override;
virtual void ProducerReleaseImpl() override;
virtual void ProducerReadAcquireImpl() override;
virtual void ProducerReadReleaseImpl() override;
virtual void ConsumerAcquireImpl() override;
virtual void ConsumerReleaseImpl() override;
virtual bool WaitSync() override;
virtual bool PollSync() override;

virtual void Fence_ContentThread_Impl() override;
virtual bool WaitSync_ContentThread_Impl() override;
virtual bool PollSync_ContentThread_Impl() override;

const RefPtr<ID3D11Texture2D>& GetConsumerTexture() const {
return mConsumerTexture;
Expand Down
95 changes: 2 additions & 93 deletions gfx/gl/SharedSurfaceD3D11Interop.cpp
Expand Up @@ -328,25 +328,6 @@ void
SharedSurface_D3D11Interop::UnlockProdImpl()
{ }

void
SharedSurface_D3D11Interop::Fence()
{
// TODO fence properly. This kills performance.
mGL->fFinish();
}

bool
SharedSurface_D3D11Interop::WaitSync()
{
return true;
}

bool
SharedSurface_D3D11Interop::PollSync()
{
return true;
}

void
SharedSurface_D3D11Interop::ProducerAcquireImpl()
{
Expand Down Expand Up @@ -382,81 +363,9 @@ SharedSurface_D3D11Interop::ProducerReleaseImpl()
if (mKeyedMutex) {
mKeyedMutex->ReleaseSync(0);
}
Fence();
}

void
SharedSurface_D3D11Interop::ConsumerAcquireImpl()
{
if (!mConsumerTexture) {
RefPtr<ID3D11Texture2D> tex;
RefPtr<ID3D11Device> device = gfxWindowsPlatform::GetPlatform()->GetD3D11Device();
HRESULT hr = device->OpenSharedResource(mSharedHandle,
__uuidof(ID3D11Texture2D),
(void**)(ID3D11Texture2D**) getter_AddRefs(tex));
if (SUCCEEDED(hr)) {
mConsumerTexture = tex;
RefPtr<IDXGIKeyedMutex> mutex;
hr = tex->QueryInterface((IDXGIKeyedMutex**) getter_AddRefs(mutex));

if (SUCCEEDED(hr)) {
mConsumerKeyedMutex = mutex;
}
}
}

if (mConsumerKeyedMutex) {
const uint64_t keyValue = 0;
const DWORD timeoutMs = 10000;
HRESULT hr = mConsumerKeyedMutex->AcquireSync(keyValue, timeoutMs);
if (hr == WAIT_TIMEOUT) {
MOZ_CRASH();
}
}
}

void
SharedSurface_D3D11Interop::ConsumerReleaseImpl()
{
if (mConsumerKeyedMutex) {
mConsumerKeyedMutex->ReleaseSync(0);
}
}

void
SharedSurface_D3D11Interop::Fence_ContentThread_Impl()
{
if (mFence) {
MOZ_ASSERT(mGL->IsExtensionSupported(GLContext::NV_fence));
mGL->fSetFence(mFence, LOCAL_GL_ALL_COMPLETED_NV);
mGL->fFlush();
return;
}

Fence();
}

bool
SharedSurface_D3D11Interop::WaitSync_ContentThread_Impl()
{
if (mFence) {
mGL->MakeCurrent();
mGL->fFinishFence(mFence);
return true;
}

return WaitSync();
}

bool
SharedSurface_D3D11Interop::PollSync_ContentThread_Impl()
{
if (mFence) {
mGL->MakeCurrent();
return mGL->fTestFence(mFence);
}

return PollSync();
// TODO fence properly. This kills performance.
mGL->fFinish();
}

bool
Expand Down
9 changes: 0 additions & 9 deletions gfx/gl/SharedSurfaceD3D11Interop.h
Expand Up @@ -65,17 +65,8 @@ class SharedSurface_D3D11Interop
virtual void LockProdImpl() override;
virtual void UnlockProdImpl() override;

virtual void Fence() override;
virtual void ProducerAcquireImpl() override;
virtual void ProducerReleaseImpl() override;
virtual void ConsumerAcquireImpl() override;
virtual void ConsumerReleaseImpl() override;
virtual bool WaitSync() override;
virtual bool PollSync() override;

virtual void Fence_ContentThread_Impl() override;
virtual bool WaitSync_ContentThread_Impl() override;
virtual bool PollSync_ContentThread_Impl() override;

virtual GLuint ProdRenderbuffer() override {
return mProdRB;
Expand Down

0 comments on commit b66e705

Please sign in to comment.