| Index: content/common/gpu/image_transport_surface_linux.cc
|
| diff --git a/content/common/gpu/image_transport_surface_linux.cc b/content/common/gpu/image_transport_surface_linux.cc
|
| index 90341b5b0c25d83a8289dd37413aaaf76fbf8f53..11ecae4e9ef5d51d35f06f77d6927e6c3fcf8215 100644
|
| --- a/content/common/gpu/image_transport_surface_linux.cc
|
| +++ b/content/common/gpu/image_transport_surface_linux.cc
|
| @@ -93,7 +93,8 @@ class EGLImageTransportSurface
|
| virtual gfx::Size GetSize() OVERRIDE;
|
| virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
|
| virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
|
| - virtual void SetBufferAllocation(BufferAllocationState state) OVERRIDE;
|
| + virtual void SetBackbufferAllocation(bool allocated) OVERRIDE;
|
| + virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE;
|
|
|
| protected:
|
| // ImageTransportSurface implementation
|
| @@ -102,6 +103,7 @@ class EGLImageTransportSurface
|
| virtual void OnBuffersSwappedACK() OVERRIDE;
|
| virtual void OnPostSubBufferACK() OVERRIDE;
|
| virtual void OnResizeViewACK() OVERRIDE;
|
| + virtual void OnDiscardSurface(uint64 surface_id) OVERRIDE;
|
| virtual void OnResize(gfx::Size size) OVERRIDE;
|
|
|
| private:
|
| @@ -111,7 +113,8 @@ class EGLImageTransportSurface
|
| void SendPostSubBuffer(int x, int y, int width, int height);
|
|
|
| // Tracks the current buffer allocation state.
|
| - BufferAllocationState buffer_allocation_state_;
|
| + bool backbuffer_allocated_;
|
| + bool frontbuffer_allocated_;
|
|
|
| uint32 fbo_id_;
|
|
|
| @@ -145,7 +148,8 @@ class GLXImageTransportSurface
|
| virtual std::string GetExtensions();
|
| virtual gfx::Size GetSize() OVERRIDE;
|
| virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
|
| - virtual void SetBufferAllocation(BufferAllocationState state) OVERRIDE;
|
| + virtual void SetBackbufferAllocation(bool allocated) OVERRIDE;
|
| + virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE;
|
|
|
| protected:
|
| // ImageTransportSurface implementation:
|
| @@ -154,6 +158,7 @@ class GLXImageTransportSurface
|
| virtual void OnBuffersSwappedACK() OVERRIDE;
|
| virtual void OnPostSubBufferACK() OVERRIDE;
|
| virtual void OnResizeViewACK() OVERRIDE;
|
| + virtual void OnDiscardSurface(uint64 surface_id) OVERRIDE;
|
| virtual void OnResize(gfx::Size size) OVERRIDE;
|
|
|
| private:
|
| @@ -168,7 +173,8 @@ class GLXImageTransportSurface
|
| void ResizeSurface(gfx::Size size);
|
|
|
| // Tracks the current buffer allocation state.
|
| - BufferAllocationState buffer_allocation_state_;
|
| + bool backbuffer_allocated_;
|
| + bool frontbuffer_allocated_;
|
|
|
| XID dummy_parent_;
|
| gfx::Size size_;
|
| @@ -212,6 +218,7 @@ class OSMesaImageTransportSurface : public ImageTransportSurface,
|
| virtual void OnBuffersSwappedACK() OVERRIDE;
|
| virtual void OnPostSubBufferACK() OVERRIDE;
|
| virtual void OnResizeViewACK() OVERRIDE;
|
| + virtual void OnDiscardSurface(uint64 surface_id) OVERRIDE;
|
| virtual void OnResize(gfx::Size size) OVERRIDE;
|
|
|
| private:
|
| @@ -270,7 +277,8 @@ EGLImageTransportSurface::EGLImageTransportSurface(
|
| GpuChannelManager* manager,
|
| GpuCommandBufferStub* stub)
|
| : gfx::PbufferGLSurfaceEGL(false, gfx::Size(16, 16)),
|
| - buffer_allocation_state_(BUFFER_ALLOCATION_FRONT_AND_BACK),
|
| + backbuffer_allocated_(true),
|
| + frontbuffer_allocated_(true),
|
| fbo_id_(0),
|
| made_current_(false) {
|
| helper_.reset(new ImageTransportHelper(this,
|
| @@ -336,33 +344,27 @@ unsigned int EGLImageTransportSurface::GetBackingFrameBufferObject() {
|
| return fbo_id_;
|
| }
|
|
|
| -void EGLImageTransportSurface::SetBufferAllocation(
|
| - BufferAllocationState state) {
|
| - if (buffer_allocation_state_ == state)
|
| +void EGLImageTransportSurface::SetBackbufferAllocation(bool allocated) {
|
| + if (backbuffer_allocated_ == allocated)
|
| + return;
|
| + // TODO(mmocny): Remove dependancy on front_surface_->size()
|
| + if (!front_surface_.get())
|
| return;
|
| - buffer_allocation_state_ = state;
|
| -
|
| - switch (state) {
|
| - case BUFFER_ALLOCATION_FRONT_AND_BACK:
|
| - if (!back_surface_.get() && front_surface_.get())
|
| - OnResize(front_surface_->size());
|
| - break;
|
| -
|
| - case BUFFER_ALLOCATION_FRONT_ONLY:
|
| - if (back_surface_.get() && front_surface_.get())
|
| - ReleaseSurface(&back_surface_);
|
| - break;
|
| -
|
| - case BUFFER_ALLOCATION_NONE:
|
| - if (back_surface_.get() && front_surface_.get())
|
| - ReleaseSurface(&back_surface_);
|
| - break;
|
|
|
| - default:
|
| - NOTREACHED();
|
| + if (allocated) {
|
| + if (!back_surface_.get())
|
| + OnResize(front_surface_->size());
|
| + backbuffer_allocated_ = true;
|
| + } else {
|
| + if (back_surface_.get())
|
| + ReleaseSurface(&back_surface_);
|
| + backbuffer_allocated_ = false;
|
| }
|
| }
|
|
|
| +void EGLImageTransportSurface::SetFrontbufferAllocation(bool allocated) {
|
| +}
|
| +
|
| void EGLImageTransportSurface::ReleaseSurface(
|
| scoped_refptr<EGLAcceleratedSurface>* surface) {
|
| if (surface->get()) {
|
| @@ -399,6 +401,8 @@ void EGLImageTransportSurface::OnResize(gfx::Size size) {
|
| }
|
|
|
| bool EGLImageTransportSurface::SwapBuffers() {
|
| + DCHECK(backbuffer_allocated_);
|
| + DCHECK(frontbuffer_allocated_);
|
| front_surface_.swap(back_surface_);
|
| DCHECK_NE(front_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL));
|
| helper_->DeferToFence(base::Bind(
|
| @@ -428,7 +432,8 @@ void EGLImageTransportSurface::SendBuffersSwapped() {
|
|
|
| bool EGLImageTransportSurface::PostSubBuffer(
|
| int x, int y, int width, int height) {
|
| -
|
| + DCHECK(backbuffer_allocated_);
|
| + DCHECK(frontbuffer_allocated_);
|
| DCHECK_NE(back_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL));
|
| gfx::Size expected_size = back_surface_->size();
|
| bool surfaces_same_size = front_surface_.get() &&
|
| @@ -511,6 +516,10 @@ void EGLImageTransportSurface::OnNewSurfaceACK(
|
| helper_->SetScheduled(true);
|
| }
|
|
|
| +void EGLImageTransportSurface::OnDiscardSurface(
|
| + uint64 surface_id) {
|
| +}
|
| +
|
| void EGLImageTransportSurface::OnBuffersSwappedACK() {
|
| helper_->SetScheduled(true);
|
| }
|
| @@ -527,7 +536,8 @@ GLXImageTransportSurface::GLXImageTransportSurface(
|
| GpuChannelManager* manager,
|
| GpuCommandBufferStub* stub)
|
| : gfx::NativeViewGLSurfaceGLX(),
|
| - buffer_allocation_state_(BUFFER_ALLOCATION_FRONT_AND_BACK),
|
| + backbuffer_allocated_(true),
|
| + frontbuffer_allocated_(true),
|
| dummy_parent_(0),
|
| size_(1, 1),
|
| bound_(false),
|
| @@ -611,32 +621,24 @@ void GLXImageTransportSurface::ReleaseSurface() {
|
| bound_ = false;
|
| }
|
|
|
| -void GLXImageTransportSurface::SetBufferAllocation(
|
| - BufferAllocationState state) {
|
| - if (buffer_allocation_state_ == state)
|
| +void GLXImageTransportSurface::SetBackbufferAllocation(bool allocated) {
|
| + if (backbuffer_allocated_ == allocated)
|
| return;
|
| - buffer_allocation_state_ = state;
|
|
|
| - switch (state) {
|
| - case BUFFER_ALLOCATION_FRONT_AND_BACK: {
|
| - ResizeSurface(size_);
|
| - break;
|
| - }
|
| - case BUFFER_ALLOCATION_FRONT_ONLY: {
|
| - ResizeSurface(gfx::Size(1,1));
|
| - break;
|
| - }
|
| - case BUFFER_ALLOCATION_NONE: {
|
| - ResizeSurface(gfx::Size(1,1));
|
| - if (bound_)
|
| - ReleaseSurface();
|
| - break;
|
| - }
|
| - default:
|
| - NOTREACHED();
|
| + if (allocated) {
|
| + // cannot allocate backbuffer without also allocating a frontbuffer.
|
| + ResizeSurface(size_);
|
| + backbuffer_allocated_ = true;
|
| + frontbuffer_allocated_ = true;
|
| + } else {
|
| + ResizeSurface(gfx::Size(1,1));
|
| + backbuffer_allocated_ = false;
|
| }
|
| }
|
|
|
| +void GLXImageTransportSurface::SetFrontbufferAllocation(bool allocated) {
|
| +}
|
| +
|
| void GLXImageTransportSurface::ResizeSurface(gfx::Size size) {
|
| Display* dpy = static_cast<Display*>(GetDisplay());
|
| XResizeWindow(dpy, window_, size.width(), size.height());
|
| @@ -656,6 +658,8 @@ void GLXImageTransportSurface::OnResize(gfx::Size size) {
|
| }
|
|
|
| bool GLXImageTransportSurface::SwapBuffers() {
|
| + DCHECK(backbuffer_allocated_);
|
| + DCHECK(frontbuffer_allocated_);
|
| gfx::NativeViewGLSurfaceGLX::SwapBuffers();
|
| helper_->DeferToFence(base::Bind(
|
| &GLXImageTransportSurface::SendBuffersSwapped,
|
| @@ -682,6 +686,8 @@ void GLXImageTransportSurface::SendBuffersSwapped() {
|
|
|
| bool GLXImageTransportSurface::PostSubBuffer(
|
| int x, int y, int width, int height) {
|
| + DCHECK(backbuffer_allocated_);
|
| + DCHECK(frontbuffer_allocated_);
|
| gfx::NativeViewGLSurfaceGLX::PostSubBuffer(x, y, width, height);
|
| helper_->DeferToFence(base::Bind(
|
| &GLXImageTransportSurface::SendPostSubBuffer,
|
| @@ -749,6 +755,10 @@ void GLXImageTransportSurface::OnNewSurfaceACK(
|
| uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) {
|
| }
|
|
|
| +void GLXImageTransportSurface::OnDiscardSurface(
|
| + uint64 surface_id) {
|
| +}
|
| +
|
| void GLXImageTransportSurface::OnBuffersSwappedACK() {
|
| helper_->SetScheduled(true);
|
| }
|
| @@ -835,6 +845,10 @@ void OSMesaImageTransportSurface::OnNewSurfaceACK(
|
| helper_->SetScheduled(true);
|
| }
|
|
|
| +void OSMesaImageTransportSurface::OnDiscardSurface(
|
| + uint64 surface_id) {
|
| +}
|
| +
|
| void OSMesaImageTransportSurface::OnResizeViewACK() {
|
| NOTREACHED();
|
| }
|
|
|