OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/renderer_host/accelerated_surface_container_mac.h" | 5 #include "chrome/browser/renderer_host/accelerated_surface_container_mac.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "webkit/glue/webplugin.h" | 8 #include "webkit/glue/webplugin.h" |
9 #include "chrome/browser/renderer_host/accelerated_surface_container_manager_mac
.h" | 9 #include "chrome/browser/renderer_host/accelerated_surface_container_manager_mac
.h" |
10 #include "chrome/common/io_surface_support_mac.h" | 10 #include "chrome/common/io_surface_support_mac.h" |
11 | 11 |
12 AcceleratedSurfaceContainerMac::AcceleratedSurfaceContainerMac() | 12 AcceleratedSurfaceContainerMac::AcceleratedSurfaceContainerMac() |
13 : x_(0), | 13 : x_(0), |
14 y_(0), | 14 y_(0), |
15 surface_(NULL), | 15 surface_(NULL), |
16 width_(0), | 16 width_(0), |
17 height_(0), | 17 height_(0), |
18 texture_(0) { | 18 texture_(0), |
| 19 texture_needs_upload_(true) { |
19 } | 20 } |
20 | 21 |
21 AcceleratedSurfaceContainerMac::~AcceleratedSurfaceContainerMac() { | 22 AcceleratedSurfaceContainerMac::~AcceleratedSurfaceContainerMac() { |
22 ReleaseIOSurface(); | 23 ReleaseIOSurface(); |
23 } | 24 } |
24 | 25 |
25 void AcceleratedSurfaceContainerMac::ReleaseIOSurface() { | 26 void AcceleratedSurfaceContainerMac::ReleaseIOSurface() { |
26 if (surface_) { | 27 if (surface_) { |
27 CFRelease(surface_); | 28 CFRelease(surface_); |
28 surface_ = NULL; | 29 surface_ = NULL; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize(); | 71 IOSurfaceSupport* io_surface_support = IOSurfaceSupport::Initialize(); |
71 GLenum target = GL_TEXTURE_RECTANGLE_ARB; | 72 GLenum target = GL_TEXTURE_RECTANGLE_ARB; |
72 if (!texture_) { | 73 if (!texture_) { |
73 if ((io_surface_support && !surface_) || | 74 if ((io_surface_support && !surface_) || |
74 (!io_surface_support && !transport_dib_.get())) | 75 (!io_surface_support && !transport_dib_.get())) |
75 return; | 76 return; |
76 glGenTextures(1, &texture_); | 77 glGenTextures(1, &texture_); |
77 glBindTexture(target, texture_); | 78 glBindTexture(target, texture_); |
78 glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 79 glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
79 glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 80 glTexParameterf(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
80 // When using an IOSurface, the texture does not need to be repeatedly | 81 if (!io_surface_support) { |
81 // uploaded, so bind the IOSurface once during texture gen in this case. | |
82 if (io_surface_support) { | |
83 DCHECK(surface_); | |
84 // Don't think we need to identify a plane. | |
85 GLuint plane = 0; | |
86 io_surface_support->CGLTexImageIOSurface2D(context, | |
87 target, | |
88 GL_RGBA, | |
89 width_, | |
90 height_, | |
91 GL_BGRA, | |
92 GL_UNSIGNED_INT_8_8_8_8_REV, | |
93 surface_, | |
94 plane); | |
95 } else { | |
96 // Reserve space on the card for the actual texture upload, done with the | 82 // Reserve space on the card for the actual texture upload, done with the |
97 // glTexSubImage2D() call, below. | 83 // glTexSubImage2D() call, below. |
98 glTexImage2D(target, | 84 glTexImage2D(target, |
99 0, // mipmap level 0 | 85 0, // mipmap level 0 |
100 GL_RGBA, // internal format | 86 GL_RGBA, // internal format |
101 width_, | 87 width_, |
102 height_, | 88 height_, |
103 0, // no border | 89 0, // no border |
104 GL_BGRA, // The GPU plugin read BGRA pixels | 90 GL_BGRA, // The GPU plugin read BGRA pixels |
105 GL_UNSIGNED_INT_8_8_8_8_REV, | 91 GL_UNSIGNED_INT_8_8_8_8_REV, |
106 NULL); // No data, this call just reserves room. | 92 NULL); // No data, this call just reserves room. |
107 } | 93 } |
108 } | 94 } |
109 | 95 |
| 96 // When using an IOSurface, the texture does not need to be repeatedly |
| 97 // uploaded, just when we've been told we have to. |
| 98 if (io_surface_support && texture_needs_upload_) { |
| 99 DCHECK(surface_); |
| 100 glBindTexture(target, texture_); |
| 101 // Don't think we need to identify a plane. |
| 102 GLuint plane = 0; |
| 103 io_surface_support->CGLTexImageIOSurface2D(context, |
| 104 target, |
| 105 GL_RGBA, |
| 106 width_, |
| 107 height_, |
| 108 GL_BGRA, |
| 109 GL_UNSIGNED_INT_8_8_8_8_REV, |
| 110 surface_, |
| 111 plane); |
| 112 texture_needs_upload_ = false; |
| 113 } |
110 // If using TransportDIBs, the texture needs to be uploaded every frame. | 114 // If using TransportDIBs, the texture needs to be uploaded every frame. |
111 if (transport_dib_.get() != NULL) { | 115 if (transport_dib_.get() != NULL) { |
112 void* pixel_memory = transport_dib_->memory(); | 116 void* pixel_memory = transport_dib_->memory(); |
113 if (pixel_memory) { | 117 if (pixel_memory) { |
114 glBindTexture(target, texture_); | 118 glBindTexture(target, texture_); |
115 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Needed for NPOT textures. | 119 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Needed for NPOT textures. |
116 glTexSubImage2D(target, | 120 glTexSubImage2D(target, |
117 0, // mipmap level 0 | 121 0, // mipmap level 0 |
118 0, // x-offset | 122 0, // x-offset |
119 0, // y-offset | 123 0, // y-offset |
(...skipping 29 matching lines...) Expand all Loading... |
149 glDisable(target); | 153 glDisable(target); |
150 } | 154 } |
151 } | 155 } |
152 | 156 |
153 void AcceleratedSurfaceContainerMac::EnqueueTextureForDeletion( | 157 void AcceleratedSurfaceContainerMac::EnqueueTextureForDeletion( |
154 AcceleratedSurfaceContainerManagerMac* manager) { | 158 AcceleratedSurfaceContainerManagerMac* manager) { |
155 manager->EnqueueTextureForDeletion(texture_); | 159 manager->EnqueueTextureForDeletion(texture_); |
156 texture_ = 0; | 160 texture_ = 0; |
157 } | 161 } |
158 | 162 |
OLD | NEW |