Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Side by Side Diff: content/common/gpu/image_transport_surface_linux.cc

Issue 10052018: Drop frontbuffers with ui-use-gpu-process, synchronized with browser, decoupled from backbuffer dro… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor cleanup Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/common/gpu/image_transport_surface.h" 5 #include "content/common/gpu/image_transport_surface.h"
6 6
7 // This conflicts with the defines in Xlib.h and must come first. 7 // This conflicts with the defines in Xlib.h and must come first.
8 #include "content/common/gpu/gpu_messages.h" 8 #include "content/common/gpu/gpu_messages.h"
9 9
10 #include <map> 10 #include <map>
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 // gfx::GLSurface implementation 86 // gfx::GLSurface implementation
87 virtual bool Initialize() OVERRIDE; 87 virtual bool Initialize() OVERRIDE;
88 virtual void Destroy() OVERRIDE; 88 virtual void Destroy() OVERRIDE;
89 virtual bool IsOffscreen() OVERRIDE; 89 virtual bool IsOffscreen() OVERRIDE;
90 virtual bool SwapBuffers() OVERRIDE; 90 virtual bool SwapBuffers() OVERRIDE;
91 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; 91 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE;
92 virtual std::string GetExtensions() OVERRIDE; 92 virtual std::string GetExtensions() OVERRIDE;
93 virtual gfx::Size GetSize() OVERRIDE; 93 virtual gfx::Size GetSize() OVERRIDE;
94 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; 94 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
95 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; 95 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
96 virtual void SetBufferAllocation(BufferAllocationState state) OVERRIDE; 96 virtual void SetBackbufferAllocation(bool allocated) OVERRIDE;
97 virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE;
97 98
98 protected: 99 protected:
99 // ImageTransportSurface implementation 100 // ImageTransportSurface implementation
100 virtual void OnNewSurfaceACK( 101 virtual void OnNewSurfaceACK(
101 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; 102 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE;
103 virtual void OnReleaseSurfaceACK(uint64 surface_id, bool success) OVERRIDE;
102 virtual void OnBuffersSwappedACK() OVERRIDE; 104 virtual void OnBuffersSwappedACK() OVERRIDE;
103 virtual void OnPostSubBufferACK() OVERRIDE; 105 virtual void OnPostSubBufferACK() OVERRIDE;
104 virtual void OnResizeViewACK() OVERRIDE; 106 virtual void OnResizeViewACK() OVERRIDE;
105 virtual void OnResize(gfx::Size size) OVERRIDE; 107 virtual void OnResize(gfx::Size size) OVERRIDE;
106 108
107 private: 109 private:
108 virtual ~EGLImageTransportSurface() OVERRIDE; 110 virtual ~EGLImageTransportSurface() OVERRIDE;
109 void ReleaseSurface(scoped_refptr<EGLAcceleratedSurface>* surface); 111 void ReleaseSurface(scoped_refptr<EGLAcceleratedSurface>* surface);
110 void SendBuffersSwapped(); 112 void SendBuffersSwapped();
111 void SendPostSubBuffer(int x, int y, int width, int height); 113 void SendPostSubBuffer(int x, int y, int width, int height);
112 114
113 // Tracks the current buffer allocation state. 115 // Tracks the current buffer allocation state.
114 BufferAllocationState buffer_allocation_state_; 116 bool backbuffer_allocated_;
117 bool frontbuffer_allocated_;
115 118
116 uint32 fbo_id_; 119 uint32 fbo_id_;
117 120
118 scoped_refptr<EGLAcceleratedSurface> back_surface_; 121 scoped_refptr<EGLAcceleratedSurface> back_surface_;
119 scoped_refptr<EGLAcceleratedSurface> front_surface_; 122 scoped_refptr<EGLAcceleratedSurface> front_surface_;
120 gfx::Rect previous_damage_rect_; 123 gfx::Rect previous_damage_rect_;
121 124
122 // Whether or not we've successfully made the surface current once. 125 // Whether or not we've successfully made the surface current once.
123 bool made_current_; 126 bool made_current_;
124 127
(...skipping 13 matching lines...) Expand all
138 GpuCommandBufferStub* stub); 141 GpuCommandBufferStub* stub);
139 142
140 // gfx::GLSurface implementation: 143 // gfx::GLSurface implementation:
141 virtual bool Initialize() OVERRIDE; 144 virtual bool Initialize() OVERRIDE;
142 virtual void Destroy() OVERRIDE; 145 virtual void Destroy() OVERRIDE;
143 virtual bool SwapBuffers() OVERRIDE; 146 virtual bool SwapBuffers() OVERRIDE;
144 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; 147 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE;
145 virtual std::string GetExtensions(); 148 virtual std::string GetExtensions();
146 virtual gfx::Size GetSize() OVERRIDE; 149 virtual gfx::Size GetSize() OVERRIDE;
147 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; 150 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
148 virtual void SetBufferAllocation(BufferAllocationState state) OVERRIDE; 151 virtual void SetBackbufferAllocation(bool allocated) OVERRIDE;
152 virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE;
149 153
150 protected: 154 protected:
151 // ImageTransportSurface implementation: 155 // ImageTransportSurface implementation:
152 virtual void OnNewSurfaceACK( 156 virtual void OnNewSurfaceACK(
153 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; 157 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE;
158 virtual void OnReleaseSurfaceACK(uint64 surface_id, bool success) OVERRIDE;
154 virtual void OnBuffersSwappedACK() OVERRIDE; 159 virtual void OnBuffersSwappedACK() OVERRIDE;
155 virtual void OnPostSubBufferACK() OVERRIDE; 160 virtual void OnPostSubBufferACK() OVERRIDE;
156 virtual void OnResizeViewACK() OVERRIDE; 161 virtual void OnResizeViewACK() OVERRIDE;
157 virtual void OnResize(gfx::Size size) OVERRIDE; 162 virtual void OnResize(gfx::Size size) OVERRIDE;
158 163
159 private: 164 private:
160 virtual ~GLXImageTransportSurface(); 165 virtual ~GLXImageTransportSurface();
161 166
162 // Tell the browser to release the surface. 167 // Tell the browser to release the surface.
163 void ReleaseSurface(); 168 void ReleaseSurface();
164 169
165 void SendBuffersSwapped(); 170 void SendBuffersSwapped();
166 void SendPostSubBuffer(int x, int y, int width, int height); 171 void SendPostSubBuffer(int x, int y, int width, int height);
167 172
168 void ResizeSurface(gfx::Size size); 173 void ResizeSurface(gfx::Size size);
169 174
170 // Tracks the current buffer allocation state. 175 // Tracks the current buffer allocation state.
171 BufferAllocationState buffer_allocation_state_; 176 bool backbuffer_allocated_;
177 bool frontbuffer_allocated_;
172 178
173 XID dummy_parent_; 179 XID dummy_parent_;
174 gfx::Size size_; 180 gfx::Size size_;
175 181
176 // Whether or not the image has been bound on the browser side. 182 // Whether or not the image has been bound on the browser side.
177 bool bound_; 183 bool bound_;
178 184
179 // Whether or not we need to send a resize on the next swap. 185 // Whether or not we need to send a resize on the next swap.
180 bool needs_resize_; 186 bool needs_resize_;
181 187
(...skipping 20 matching lines...) Expand all
202 virtual bool IsOffscreen() OVERRIDE; 208 virtual bool IsOffscreen() OVERRIDE;
203 virtual bool SwapBuffers() OVERRIDE; 209 virtual bool SwapBuffers() OVERRIDE;
204 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; 210 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE;
205 virtual std::string GetExtensions() OVERRIDE; 211 virtual std::string GetExtensions() OVERRIDE;
206 virtual gfx::Size GetSize() OVERRIDE; 212 virtual gfx::Size GetSize() OVERRIDE;
207 213
208 protected: 214 protected:
209 // ImageTransportSurface implementation: 215 // ImageTransportSurface implementation:
210 virtual void OnNewSurfaceACK( 216 virtual void OnNewSurfaceACK(
211 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE; 217 uint64 surface_handle, TransportDIB::Handle shm_handle) OVERRIDE;
218 virtual void OnReleaseSurfaceACK(uint64 surface_id, bool success) OVERRIDE;
212 virtual void OnBuffersSwappedACK() OVERRIDE; 219 virtual void OnBuffersSwappedACK() OVERRIDE;
213 virtual void OnPostSubBufferACK() OVERRIDE; 220 virtual void OnPostSubBufferACK() OVERRIDE;
214 virtual void OnResizeViewACK() OVERRIDE; 221 virtual void OnResizeViewACK() OVERRIDE;
215 virtual void OnResize(gfx::Size size) OVERRIDE; 222 virtual void OnResize(gfx::Size size) OVERRIDE;
216 223
217 private: 224 private:
218 virtual ~OSMesaImageTransportSurface(); 225 virtual ~OSMesaImageTransportSurface();
219 226
220 // Tell the browser to release the surface. 227 // Tell the browser to release the surface.
221 void ReleaseSurface(); 228 void ReleaseSurface();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 EGLAcceleratedSurface::~EGLAcceleratedSurface() { 270 EGLAcceleratedSurface::~EGLAcceleratedSurface() {
264 glDeleteTextures(1, &texture_); 271 glDeleteTextures(1, &texture_);
265 eglDestroyImageKHR(gfx::GLSurfaceEGL::GetHardwareDisplay(), image_); 272 eglDestroyImageKHR(gfx::GLSurfaceEGL::GetHardwareDisplay(), image_);
266 XFreePixmap(gfx::GLSurfaceEGL::GetNativeDisplay(), pixmap_); 273 XFreePixmap(gfx::GLSurfaceEGL::GetNativeDisplay(), pixmap_);
267 } 274 }
268 275
269 EGLImageTransportSurface::EGLImageTransportSurface( 276 EGLImageTransportSurface::EGLImageTransportSurface(
270 GpuChannelManager* manager, 277 GpuChannelManager* manager,
271 GpuCommandBufferStub* stub) 278 GpuCommandBufferStub* stub)
272 : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)), 279 : gfx::PbufferGLSurfaceEGL(false, gfx::Size(1, 1)),
273 buffer_allocation_state_(BUFFER_ALLOCATION_FRONT_AND_BACK), 280 backbuffer_allocated_(true),
281 frontbuffer_allocated_(true),
274 fbo_id_(0), 282 fbo_id_(0),
275 made_current_(false) { 283 made_current_(false) {
276 helper_.reset(new ImageTransportHelper(this, 284 helper_.reset(new ImageTransportHelper(this,
277 manager, 285 manager,
278 stub, 286 stub,
279 gfx::kNullPluginWindow)); 287 gfx::kNullPluginWindow));
280 } 288 }
281 289
282 EGLImageTransportSurface::~EGLImageTransportSurface() { 290 EGLImageTransportSurface::~EGLImageTransportSurface() {
283 Destroy(); 291 Destroy();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 } 334 }
327 335
328 made_current_ = true; 336 made_current_ = true;
329 return true; 337 return true;
330 } 338 }
331 339
332 unsigned int EGLImageTransportSurface::GetBackingFrameBufferObject() { 340 unsigned int EGLImageTransportSurface::GetBackingFrameBufferObject() {
333 return fbo_id_; 341 return fbo_id_;
334 } 342 }
335 343
336 void EGLImageTransportSurface::SetBufferAllocation( 344 void EGLImageTransportSurface::SetBackbufferAllocation(bool allocated) {
337 BufferAllocationState state) { 345 if (backbuffer_allocated_ == allocated)
338 if (buffer_allocation_state_ == state)
339 return; 346 return;
340 buffer_allocation_state_ = state; 347 // TODO(mmocny): Remove dependancy on front_surface_->size()
348 if (!front_surface_.get())
349 return;
341 350
342 switch (state) { 351 if (allocated) {
343 case BUFFER_ALLOCATION_FRONT_AND_BACK: 352 if (!back_surface_.get())
344 if (!back_surface_.get() && front_surface_.get()) 353 OnResize(front_surface_->size());
345 OnResize(front_surface_->size()); 354 backbuffer_allocated_ = true;
346 break; 355 } else {
356 if (back_surface_.get())
357 ReleaseSurface(&back_surface_);
358 backbuffer_allocated_ = false;
359 }
360 }
347 361
348 case BUFFER_ALLOCATION_FRONT_ONLY: 362 void EGLImageTransportSurface::SetFrontbufferAllocation(bool allocated) {
349 if (back_surface_.get() && front_surface_.get()) 363 // TODO(mmocny): Copy logic from texture image transport.
350 ReleaseSurface(&back_surface_);
351 break;
352
353 case BUFFER_ALLOCATION_NONE:
354 if (back_surface_.get() && front_surface_.get())
355 ReleaseSurface(&back_surface_);
356 break;
357
358 default:
359 NOTREACHED();
360 }
361 } 364 }
362 365
363 void EGLImageTransportSurface::ReleaseSurface( 366 void EGLImageTransportSurface::ReleaseSurface(
364 scoped_refptr<EGLAcceleratedSurface>* surface) { 367 scoped_refptr<EGLAcceleratedSurface>* surface) {
365 if (surface->get()) { 368 if (surface->get()) {
366 GpuHostMsg_AcceleratedSurfaceRelease_Params params; 369 GpuHostMsg_AcceleratedSurfaceRelease_Params params;
367 params.identifier = (*surface)->pixmap(); 370 params.identifier = (*surface)->pixmap();
368 helper_->SendAcceleratedSurfaceRelease(params); 371 helper_->SendAcceleratedSurfaceRelease(params);
369 *surface = NULL; 372 *surface = NULL;
370 } 373 }
(...skipping 18 matching lines...) Expand all
389 GpuHostMsg_AcceleratedSurfaceNew_Params params; 392 GpuHostMsg_AcceleratedSurfaceNew_Params params;
390 params.width = size.width(); 393 params.width = size.width();
391 params.height = size.height(); 394 params.height = size.height();
392 params.surface_handle = back_surface_->pixmap(); 395 params.surface_handle = back_surface_->pixmap();
393 helper_->SendAcceleratedSurfaceNew(params); 396 helper_->SendAcceleratedSurfaceNew(params);
394 397
395 helper_->SetScheduled(false); 398 helper_->SetScheduled(false);
396 } 399 }
397 400
398 bool EGLImageTransportSurface::SwapBuffers() { 401 bool EGLImageTransportSurface::SwapBuffers() {
402 DCHECK(backbuffer_allocated_);
403 DCHECK(frontbuffer_allocated_);
399 front_surface_.swap(back_surface_); 404 front_surface_.swap(back_surface_);
400 DCHECK_NE(front_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL)); 405 DCHECK_NE(front_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL));
401 helper_->DeferToFence(base::Bind( 406 helper_->DeferToFence(base::Bind(
402 &EGLImageTransportSurface::SendBuffersSwapped, 407 &EGLImageTransportSurface::SendBuffersSwapped,
403 AsWeakPtr())); 408 AsWeakPtr()));
404 409
405 gfx::Size expected_size = front_surface_->size(); 410 gfx::Size expected_size = front_surface_->size();
406 if (!back_surface_.get() || back_surface_->size() != expected_size) { 411 if (!back_surface_.get() || back_surface_->size() != expected_size) {
407 OnResize(expected_size); 412 OnResize(expected_size);
408 } else { 413 } else {
409 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, 414 glFramebufferTexture2DEXT(GL_FRAMEBUFFER,
410 GL_COLOR_ATTACHMENT0, 415 GL_COLOR_ATTACHMENT0,
411 GL_TEXTURE_2D, 416 GL_TEXTURE_2D,
412 back_surface_->texture(), 417 back_surface_->texture(),
413 0); 418 0);
414 } 419 }
415 previous_damage_rect_ = gfx::Rect(front_surface_->size()); 420 previous_damage_rect_ = gfx::Rect(front_surface_->size());
416 return true; 421 return true;
417 } 422 }
418 423
419 void EGLImageTransportSurface::SendBuffersSwapped() { 424 void EGLImageTransportSurface::SendBuffersSwapped() {
420 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 425 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
421 params.surface_handle = front_surface_->pixmap(); 426 params.surface_handle = front_surface_->pixmap();
422 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 427 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
423 helper_->SetScheduled(false); 428 helper_->SetScheduled(false);
424 } 429 }
425 430
426 bool EGLImageTransportSurface::PostSubBuffer( 431 bool EGLImageTransportSurface::PostSubBuffer(
427 int x, int y, int width, int height) { 432 int x, int y, int width, int height) {
428 433 DCHECK(backbuffer_allocated_);
434 DCHECK(frontbuffer_allocated_);
429 DCHECK_NE(back_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL)); 435 DCHECK_NE(back_surface_.get(), static_cast<EGLAcceleratedSurface*>(NULL));
430 gfx::Size expected_size = back_surface_->size(); 436 gfx::Size expected_size = back_surface_->size();
431 bool surfaces_same_size = front_surface_.get() && 437 bool surfaces_same_size = front_surface_.get() &&
432 front_surface_->size() == expected_size; 438 front_surface_->size() == expected_size;
433 439
434 const gfx::Rect new_damage_rect(x, y, width, height); 440 const gfx::Rect new_damage_rect(x, y, width, height);
435 441
436 // An empty damage rect is a successful no-op. 442 // An empty damage rect is a successful no-op.
437 if (new_damage_rect.IsEmpty()) 443 if (new_damage_rect.IsEmpty())
438 return true; 444 return true;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 gfx::Size EGLImageTransportSurface::GetSize() { 507 gfx::Size EGLImageTransportSurface::GetSize() {
502 return back_surface_->size(); 508 return back_surface_->size();
503 } 509 }
504 510
505 void EGLImageTransportSurface::OnNewSurfaceACK( 511 void EGLImageTransportSurface::OnNewSurfaceACK(
506 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { 512 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) {
507 DCHECK_EQ(back_surface_->pixmap(), surface_handle); 513 DCHECK_EQ(back_surface_->pixmap(), surface_handle);
508 helper_->SetScheduled(true); 514 helper_->SetScheduled(true);
509 } 515 }
510 516
517 void EGLImageTransportSurface::OnReleaseSurfaceACK(
518 uint64 surface_id, bool success) {
519 }
520
511 void EGLImageTransportSurface::OnBuffersSwappedACK() { 521 void EGLImageTransportSurface::OnBuffersSwappedACK() {
512 helper_->SetScheduled(true); 522 helper_->SetScheduled(true);
513 } 523 }
514 524
515 void EGLImageTransportSurface::OnPostSubBufferACK() { 525 void EGLImageTransportSurface::OnPostSubBufferACK() {
516 helper_->SetScheduled(true); 526 helper_->SetScheduled(true);
517 } 527 }
518 528
519 void EGLImageTransportSurface::OnResizeViewACK() { 529 void EGLImageTransportSurface::OnResizeViewACK() {
520 NOTREACHED(); 530 NOTREACHED();
521 } 531 }
522 532
523 GLXImageTransportSurface::GLXImageTransportSurface( 533 GLXImageTransportSurface::GLXImageTransportSurface(
524 GpuChannelManager* manager, 534 GpuChannelManager* manager,
525 GpuCommandBufferStub* stub) 535 GpuCommandBufferStub* stub)
526 : gfx::NativeViewGLSurfaceGLX(), 536 : gfx::NativeViewGLSurfaceGLX(),
527 buffer_allocation_state_(BUFFER_ALLOCATION_FRONT_AND_BACK), 537 backbuffer_allocated_(true),
538 frontbuffer_allocated_(true),
528 dummy_parent_(0), 539 dummy_parent_(0),
529 size_(1, 1), 540 size_(1, 1),
530 bound_(false), 541 bound_(false),
531 needs_resize_(false), 542 needs_resize_(false),
532 made_current_(false) { 543 made_current_(false) {
533 helper_.reset(new ImageTransportHelper(this, 544 helper_.reset(new ImageTransportHelper(this,
534 manager, 545 manager,
535 stub, 546 stub,
536 gfx::kNullPluginWindow)); 547 gfx::kNullPluginWindow));
537 } 548 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 } 612 }
602 613
603 void GLXImageTransportSurface::ReleaseSurface() { 614 void GLXImageTransportSurface::ReleaseSurface() {
604 DCHECK(bound_); 615 DCHECK(bound_);
605 GpuHostMsg_AcceleratedSurfaceRelease_Params params; 616 GpuHostMsg_AcceleratedSurfaceRelease_Params params;
606 params.identifier = window_; 617 params.identifier = window_;
607 helper_->SendAcceleratedSurfaceRelease(params); 618 helper_->SendAcceleratedSurfaceRelease(params);
608 bound_ = false; 619 bound_ = false;
609 } 620 }
610 621
611 void GLXImageTransportSurface::SetBufferAllocation( 622 void GLXImageTransportSurface::SetBackbufferAllocation(bool allocated) {
612 BufferAllocationState state) { 623 if (backbuffer_allocated_ == allocated)
613 if (buffer_allocation_state_ == state)
614 return; 624 return;
615 buffer_allocation_state_ = state;
616 625
617 switch (state) { 626 if (allocated) {
618 case BUFFER_ALLOCATION_FRONT_AND_BACK: { 627 // cannot allocate backbuffer without also allocating a frontbuffer.
619 ResizeSurface(size_); 628 ResizeSurface(size_);
620 break; 629 backbuffer_allocated_ = true;
621 } 630 frontbuffer_allocated_ = true;
622 case BUFFER_ALLOCATION_FRONT_ONLY: { 631 } else {
623 ResizeSurface(gfx::Size(1,1)); 632 ResizeSurface(gfx::Size(1,1));
624 break; 633 backbuffer_allocated_ = false;
625 }
626 case BUFFER_ALLOCATION_NONE: {
627 ResizeSurface(gfx::Size(1,1));
628 if (bound_)
629 ReleaseSurface();
630 break;
631 }
632 default:
633 NOTREACHED();
634 } 634 }
635 } 635 }
636 636
637 void GLXImageTransportSurface::SetFrontbufferAllocation(bool allocated) {
638 }
639
637 void GLXImageTransportSurface::ResizeSurface(gfx::Size size) { 640 void GLXImageTransportSurface::ResizeSurface(gfx::Size size) {
638 Display* dpy = static_cast<Display*>(GetDisplay()); 641 Display* dpy = static_cast<Display*>(GetDisplay());
639 XResizeWindow(dpy, window_, size.width(), size.height()); 642 XResizeWindow(dpy, window_, size.width(), size.height());
640 glXWaitX(); 643 glXWaitX();
641 // Seems necessary to perform a swap after a resize 644 // Seems necessary to perform a swap after a resize
642 // in order to resize the front and back buffers (Intel driver bug). 645 // in order to resize the front and back buffers (Intel driver bug).
643 // This doesn't always happen with scissoring enabled, so do it now. 646 // This doesn't always happen with scissoring enabled, so do it now.
644 if (gfx::g_GLX_MESA_copy_sub_buffer && gfx::GLSurface::GetCurrent() == this) 647 if (gfx::g_GLX_MESA_copy_sub_buffer && gfx::GLSurface::GetCurrent() == this)
645 gfx::NativeViewGLSurfaceGLX::SwapBuffers(); 648 gfx::NativeViewGLSurfaceGLX::SwapBuffers();
646 needs_resize_ = true; 649 needs_resize_ = true;
647 } 650 }
648 651
649 void GLXImageTransportSurface::OnResize(gfx::Size size) { 652 void GLXImageTransportSurface::OnResize(gfx::Size size) {
650 TRACE_EVENT0("gpu", "GLXImageTransportSurface::OnResize"); 653 TRACE_EVENT0("gpu", "GLXImageTransportSurface::OnResize");
651 size_ = size; 654 size_ = size;
652 ResizeSurface(size_); 655 ResizeSurface(size_);
653 } 656 }
654 657
655 bool GLXImageTransportSurface::SwapBuffers() { 658 bool GLXImageTransportSurface::SwapBuffers() {
659 DCHECK(backbuffer_allocated_);
660 DCHECK(frontbuffer_allocated_);
656 gfx::NativeViewGLSurfaceGLX::SwapBuffers(); 661 gfx::NativeViewGLSurfaceGLX::SwapBuffers();
657 helper_->DeferToFence(base::Bind( 662 helper_->DeferToFence(base::Bind(
658 &GLXImageTransportSurface::SendBuffersSwapped, 663 &GLXImageTransportSurface::SendBuffersSwapped,
659 AsWeakPtr())); 664 AsWeakPtr()));
660 665
661 if (needs_resize_) { 666 if (needs_resize_) {
662 GpuHostMsg_AcceleratedSurfaceNew_Params params; 667 GpuHostMsg_AcceleratedSurfaceNew_Params params;
663 params.width = size_.width(); 668 params.width = size_.width();
664 params.height = size_.height(); 669 params.height = size_.height();
665 params.surface_handle = window_; 670 params.surface_handle = window_;
666 helper_->SendAcceleratedSurfaceNew(params); 671 helper_->SendAcceleratedSurfaceNew(params);
667 bound_ = true; 672 bound_ = true;
668 needs_resize_ = false; 673 needs_resize_ = false;
669 } 674 }
670 return true; 675 return true;
671 } 676 }
672 677
673 void GLXImageTransportSurface::SendBuffersSwapped() { 678 void GLXImageTransportSurface::SendBuffersSwapped() {
674 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; 679 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
675 params.surface_handle = window_; 680 params.surface_handle = window_;
676 helper_->SendAcceleratedSurfaceBuffersSwapped(params); 681 helper_->SendAcceleratedSurfaceBuffersSwapped(params);
677 helper_->SetScheduled(false); 682 helper_->SetScheduled(false);
678 } 683 }
679 684
680 bool GLXImageTransportSurface::PostSubBuffer( 685 bool GLXImageTransportSurface::PostSubBuffer(
681 int x, int y, int width, int height) { 686 int x, int y, int width, int height) {
687 DCHECK(backbuffer_allocated_);
688 DCHECK(frontbuffer_allocated_);
682 gfx::NativeViewGLSurfaceGLX::PostSubBuffer(x, y, width, height); 689 gfx::NativeViewGLSurfaceGLX::PostSubBuffer(x, y, width, height);
683 helper_->DeferToFence(base::Bind( 690 helper_->DeferToFence(base::Bind(
684 &GLXImageTransportSurface::SendPostSubBuffer, 691 &GLXImageTransportSurface::SendPostSubBuffer,
685 AsWeakPtr(), x, y, width, height)); 692 AsWeakPtr(), x, y, width, height));
686 693
687 if (needs_resize_) { 694 if (needs_resize_) {
688 GpuHostMsg_AcceleratedSurfaceNew_Params params; 695 GpuHostMsg_AcceleratedSurfaceNew_Params params;
689 params.width = size_.width(); 696 params.width = size_.width();
690 params.height = size_.height(); 697 params.height = size_.height();
691 params.surface_handle = window_; 698 params.surface_handle = window_;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 context->SetSwapInterval(0); 746 context->SetSwapInterval(0);
740 747
741 made_current_ = true; 748 made_current_ = true;
742 return true; 749 return true;
743 } 750 }
744 751
745 void GLXImageTransportSurface::OnNewSurfaceACK( 752 void GLXImageTransportSurface::OnNewSurfaceACK(
746 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) { 753 uint64 surface_handle, TransportDIB::Handle /*shm_handle*/) {
747 } 754 }
748 755
756 void GLXImageTransportSurface::OnReleaseSurfaceACK(
757 uint64 surface_id, bool success) {
758 }
759
749 void GLXImageTransportSurface::OnBuffersSwappedACK() { 760 void GLXImageTransportSurface::OnBuffersSwappedACK() {
750 helper_->SetScheduled(true); 761 helper_->SetScheduled(true);
751 } 762 }
752 763
753 void GLXImageTransportSurface::OnPostSubBufferACK() { 764 void GLXImageTransportSurface::OnPostSubBufferACK() {
754 helper_->SetScheduled(true); 765 helper_->SetScheduled(true);
755 } 766 }
756 767
757 void GLXImageTransportSurface::OnResizeViewACK() { 768 void GLXImageTransportSurface::OnResizeViewACK() {
758 NOTREACHED(); 769 NOTREACHED();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 836
826 void OSMesaImageTransportSurface::OnNewSurfaceACK( 837 void OSMesaImageTransportSurface::OnNewSurfaceACK(
827 uint64 surface_handle, TransportDIB::Handle shm_handle) { 838 uint64 surface_handle, TransportDIB::Handle shm_handle) {
828 shared_id_ = surface_handle; 839 shared_id_ = surface_handle;
829 shared_mem_.reset(TransportDIB::Map(shm_handle)); 840 shared_mem_.reset(TransportDIB::Map(shm_handle));
830 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL)); 841 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
831 842
832 helper_->SetScheduled(true); 843 helper_->SetScheduled(true);
833 } 844 }
834 845
846 void OSMesaImageTransportSurface::OnReleaseSurfaceACK(
847 uint64 surface_id, bool success) {
848 }
849
835 void OSMesaImageTransportSurface::OnResizeViewACK() { 850 void OSMesaImageTransportSurface::OnResizeViewACK() {
836 NOTREACHED(); 851 NOTREACHED();
837 } 852 }
838 853
839 bool OSMesaImageTransportSurface::SwapBuffers() { 854 bool OSMesaImageTransportSurface::SwapBuffers() {
840 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL)); 855 DCHECK_NE(shared_mem_.get(), static_cast<void*>(NULL));
841 856
842 // Copy the OSMesa buffer to the shared memory 857 // Copy the OSMesa buffer to the shared memory
843 glFinish(); 858 glFinish();
844 memcpy(shared_mem_->memory(), GetHandle(), size_.GetArea() * 4); 859 memcpy(shared_mem_->memory(), GetHandle(), size_.GetArea() * 4);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 stub, 951 stub,
937 surface.get(), 952 surface.get(),
938 handle.transport); 953 handle.transport);
939 } 954 }
940 955
941 if (surface->Initialize()) 956 if (surface->Initialize())
942 return surface; 957 return surface;
943 else 958 else
944 return NULL; 959 return NULL;
945 } 960 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698