OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_fbo_mac.h" | 5 #include "content/common/gpu/image_transport_surface_fbo_mac.h" |
6 | 6 |
7 #include "content/common/gpu/gpu_messages.h" | 7 #include "content/common/gpu/gpu_messages.h" |
8 #include "content/common/gpu/image_transport_surface_calayer_mac.h" | 8 #include "content/common/gpu/image_transport_surface_calayer_mac.h" |
9 #include "content/common/gpu/image_transport_surface_iosurface_mac.h" | 9 #include "content/common/gpu/image_transport_surface_iosurface_mac.h" |
10 #include "ui/base/cocoa/remote_layer_api.h" | 10 #include "ui/base/cocoa/remote_layer_api.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 | 74 |
75 if (made_current_) | 75 if (made_current_) |
76 return true; | 76 return true; |
77 | 77 |
78 AllocateOrResizeFramebuffer(gfx::Size(1, 1), 1.f); | 78 AllocateOrResizeFramebuffer(gfx::Size(1, 1), 1.f); |
79 | 79 |
80 made_current_ = true; | 80 made_current_ = true; |
81 return true; | 81 return true; |
82 } | 82 } |
83 | 83 |
| 84 void ImageTransportSurfaceFBO::NotifyWasBound() { |
| 85 // Sometimes calling glBindFramebuffer doesn't seem to be enough to get |
| 86 // rendered contents to show up in the color attachment. It appears that doing |
| 87 // a glBegin/End pair with program 0 is enough to tickle the driver into |
| 88 // actually effecting the binding. |
| 89 // http://crbug.com/435786 |
| 90 DCHECK(has_complete_framebuffer_); |
| 91 |
| 92 // We will restore the current program after the dummy glBegin/End pair. |
| 93 // Ensure that we will be able to restore this state before attempting to |
| 94 // change it. |
| 95 GLint old_program_signed = 0; |
| 96 glGetIntegerv(GL_CURRENT_PROGRAM, &old_program_signed); |
| 97 GLuint old_program = static_cast<GLuint>(old_program_signed); |
| 98 if (old_program && glIsProgram(old_program)) { |
| 99 // A deleted program cannot be re-bound. |
| 100 GLint delete_status = GL_FALSE; |
| 101 glGetProgramiv(old_program, GL_DELETE_STATUS, &delete_status); |
| 102 if (delete_status == GL_TRUE) |
| 103 return; |
| 104 // A program which has had the most recent link fail cannot be re-bound. |
| 105 GLint link_status = GL_FALSE; |
| 106 glGetProgramiv(old_program, GL_LINK_STATUS, &link_status); |
| 107 if (link_status != GL_TRUE) |
| 108 return; |
| 109 } |
| 110 |
| 111 // Issue the dummy call and then restore the state. |
| 112 glUseProgram(0); |
| 113 GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); |
| 114 DCHECK(status == GL_FRAMEBUFFER_COMPLETE); |
| 115 glBegin(GL_TRIANGLES); |
| 116 glEnd(); |
| 117 glUseProgram(old_program); |
| 118 } |
| 119 |
84 unsigned int ImageTransportSurfaceFBO::GetBackingFrameBufferObject() { | 120 unsigned int ImageTransportSurfaceFBO::GetBackingFrameBufferObject() { |
85 return fbo_id_; | 121 return fbo_id_; |
86 } | 122 } |
87 | 123 |
88 bool ImageTransportSurfaceFBO::SetBackbufferAllocation(bool allocation) { | 124 bool ImageTransportSurfaceFBO::SetBackbufferAllocation(bool allocation) { |
89 if (backbuffer_suggested_allocation_ == allocation) | 125 if (backbuffer_suggested_allocation_ == allocation) |
90 return true; | 126 return true; |
91 backbuffer_suggested_allocation_ = allocation; | 127 backbuffer_suggested_allocation_ = allocation; |
92 AdjustBufferAllocation(); | 128 AdjustBufferAllocation(); |
93 if (!allocation) | 129 if (!allocation) |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 return; | 361 return; |
326 } | 362 } |
327 | 363 |
328 has_complete_framebuffer_ = true; | 364 has_complete_framebuffer_ = true; |
329 | 365 |
330 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, previous_texture_id); | 366 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, previous_texture_id); |
331 // The FBO remains bound for this GL context. | 367 // The FBO remains bound for this GL context. |
332 } | 368 } |
333 | 369 |
334 } // namespace content | 370 } // namespace content |
OLD | NEW |