OLD | NEW |
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 "gpu/command_buffer/service/context_group.h" | 5 #include "gpu/command_buffer/service/context_group.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 #include "ui/gl/gl_implementation.h" | 25 #include "ui/gl/gl_implementation.h" |
26 | 26 |
27 namespace gpu { | 27 namespace gpu { |
28 namespace gles2 { | 28 namespace gles2 { |
29 | 29 |
30 ContextGroup::ContextGroup( | 30 ContextGroup::ContextGroup( |
31 const scoped_refptr<MailboxManager>& mailbox_manager, | 31 const scoped_refptr<MailboxManager>& mailbox_manager, |
32 const scoped_refptr<MemoryTracker>& memory_tracker, | 32 const scoped_refptr<MemoryTracker>& memory_tracker, |
33 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, | 33 const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache, |
34 const scoped_refptr<FeatureInfo>& feature_info, | 34 const scoped_refptr<FeatureInfo>& feature_info, |
| 35 const scoped_refptr<SubscriptionRefSet>& subscription_ref_set, |
35 const scoped_refptr<ValueStateMap>& pending_valuebuffer_state, | 36 const scoped_refptr<ValueStateMap>& pending_valuebuffer_state, |
36 bool bind_generates_resource) | 37 bool bind_generates_resource) |
37 : mailbox_manager_(mailbox_manager), | 38 : mailbox_manager_(mailbox_manager), |
38 memory_tracker_(memory_tracker), | 39 memory_tracker_(memory_tracker), |
39 shader_translator_cache_(shader_translator_cache), | 40 shader_translator_cache_(shader_translator_cache), |
| 41 subscription_ref_set_(subscription_ref_set), |
40 pending_valuebuffer_state_(pending_valuebuffer_state), | 42 pending_valuebuffer_state_(pending_valuebuffer_state), |
41 enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( | 43 enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( |
42 switches::kEnforceGLMinimums)), | 44 switches::kEnforceGLMinimums)), |
43 bind_generates_resource_(bind_generates_resource), | 45 bind_generates_resource_(bind_generates_resource), |
44 max_vertex_attribs_(0u), | 46 max_vertex_attribs_(0u), |
45 max_texture_units_(0u), | 47 max_texture_units_(0u), |
46 max_texture_image_units_(0u), | 48 max_texture_image_units_(0u), |
47 max_vertex_texture_image_units_(0u), | 49 max_vertex_texture_image_units_(0u), |
48 max_fragment_uniform_vectors_(0u), | 50 max_fragment_uniform_vectors_(0u), |
49 max_varying_vectors_(0u), | 51 max_varying_vectors_(0u), |
50 max_vertex_uniform_vectors_(0u), | 52 max_vertex_uniform_vectors_(0u), |
51 max_color_attachments_(1u), | 53 max_color_attachments_(1u), |
52 max_draw_buffers_(1u), | 54 max_draw_buffers_(1u), |
53 program_cache_(NULL), | 55 program_cache_(NULL), |
54 feature_info_(feature_info), | 56 feature_info_(feature_info), |
55 draw_buffer_(GL_BACK) { | 57 draw_buffer_(GL_BACK) { |
56 { | 58 { |
57 if (!mailbox_manager_.get()) | 59 if (!mailbox_manager_.get()) |
58 mailbox_manager_ = new MailboxManagerImpl; | 60 mailbox_manager_ = new MailboxManagerImpl; |
| 61 if (!subscription_ref_set_.get()) |
| 62 subscription_ref_set_ = new SubscriptionRefSet(); |
59 if (!pending_valuebuffer_state_.get()) | 63 if (!pending_valuebuffer_state_.get()) |
60 pending_valuebuffer_state_ = new ValueStateMap(); | 64 pending_valuebuffer_state_ = new ValueStateMap(); |
61 if (!feature_info.get()) | 65 if (!feature_info.get()) |
62 feature_info_ = new FeatureInfo; | 66 feature_info_ = new FeatureInfo; |
63 TransferBufferManager* manager = new TransferBufferManager(); | 67 TransferBufferManager* manager = new TransferBufferManager(); |
64 transfer_buffer_manager_.reset(manager); | 68 transfer_buffer_manager_.reset(manager); |
65 manager->Initialize(); | 69 manager->Initialize(); |
66 } | 70 } |
67 } | 71 } |
68 | 72 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 | 125 |
122 buffer_manager_.reset( | 126 buffer_manager_.reset( |
123 new BufferManager(memory_tracker_.get(), feature_info_.get())); | 127 new BufferManager(memory_tracker_.get(), feature_info_.get())); |
124 framebuffer_manager_.reset( | 128 framebuffer_manager_.reset( |
125 new FramebufferManager(max_draw_buffers_, max_color_attachments_)); | 129 new FramebufferManager(max_draw_buffers_, max_color_attachments_)); |
126 renderbuffer_manager_.reset(new RenderbufferManager( | 130 renderbuffer_manager_.reset(new RenderbufferManager( |
127 memory_tracker_.get(), max_renderbuffer_size, max_samples, | 131 memory_tracker_.get(), max_renderbuffer_size, max_samples, |
128 depth24_supported)); | 132 depth24_supported)); |
129 shader_manager_.reset(new ShaderManager()); | 133 shader_manager_.reset(new ShaderManager()); |
130 valuebuffer_manager_.reset( | 134 valuebuffer_manager_.reset( |
131 new ValuebufferManager(pending_valuebuffer_state_.get())); | 135 new ValuebufferManager(subscription_ref_set_.get(), |
| 136 pending_valuebuffer_state_.get())); |
132 | 137 |
133 // Lookup GL things we need to know. | 138 // Lookup GL things we need to know. |
134 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; | 139 const GLint kGLES2RequiredMinimumVertexAttribs = 8u; |
135 if (!QueryGLFeatureU( | 140 if (!QueryGLFeatureU( |
136 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, | 141 GL_MAX_VERTEX_ATTRIBS, kGLES2RequiredMinimumVertexAttribs, |
137 &max_vertex_attribs_)) { | 142 &max_vertex_attribs_)) { |
138 LOG(ERROR) << "ContextGroup::Initialize failed because too few " | 143 LOG(ERROR) << "ContextGroup::Initialize failed because too few " |
139 << "vertex attributes supported."; | 144 << "vertex attributes supported."; |
140 return false; | 145 return false; |
141 } | 146 } |
142 | 147 |
143 const GLuint kGLES2RequiredMinimumTextureUnits = 8u; | 148 const GLuint kGLES2RequiredMinimumTextureUnits = 8u; |
144 if (!QueryGLFeatureU( | 149 if (!QueryGLFeatureU( |
145 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, kGLES2RequiredMinimumTextureUnits, | 150 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, kGLES2RequiredMinimumTextureUnits, |
146 &max_texture_units_)) { | 151 &max_texture_units_)) { |
147 LOG(ERROR) << "ContextGroup::Initialize failed because too few " | 152 LOG(ERROR) << "ContextGroup::Initialize failed because too few " |
148 << "texture units supported."; | 153 << "texture units supported."; |
149 return false; | 154 return false; |
150 } | 155 } |
151 | 156 |
152 GLint max_texture_size = 0; | 157 GLint max_texture_size = 0; |
153 GLint max_cube_map_texture_size = 0; | 158 GLint max_cube_map_texture_size = 0; |
| 159 GLint max_rectangle_texture_size = 0; |
154 const GLint kMinTextureSize = 2048; // GL actually says 64!?!? | 160 const GLint kMinTextureSize = 2048; // GL actually says 64!?!? |
155 const GLint kMinCubeMapSize = 256; // GL actually says 16!?!? | 161 const GLint kMinCubeMapSize = 256; // GL actually says 16!?!? |
156 if (!QueryGLFeature( | 162 const GLint kMinRectangleTextureSize = 64; |
157 GL_MAX_TEXTURE_SIZE, kMinTextureSize, &max_texture_size) || | 163 if (!QueryGLFeature(GL_MAX_TEXTURE_SIZE, kMinTextureSize, |
158 !QueryGLFeature( | 164 &max_texture_size) || |
159 GL_MAX_CUBE_MAP_TEXTURE_SIZE, kMinCubeMapSize, | 165 !QueryGLFeature(GL_MAX_CUBE_MAP_TEXTURE_SIZE, kMinCubeMapSize, |
160 &max_cube_map_texture_size)) { | 166 &max_cube_map_texture_size)) { |
161 LOG(ERROR) << "ContextGroup::Initialize failed because maximum texture size" | 167 LOG(ERROR) << "ContextGroup::Initialize failed because maximum " |
162 << "is too small."; | 168 << " texture size is too small."; |
163 return false; | 169 return false; |
164 } | 170 } |
| 171 if (feature_info_->feature_flags().arb_texture_rectangle) { |
| 172 if (!QueryGLFeature(GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB, |
| 173 kMinRectangleTextureSize, |
| 174 &max_rectangle_texture_size)) { |
| 175 LOG(ERROR) << "ContextGroup::Initialize failed because maximum " |
| 176 << "rectangle texture size is too small."; |
| 177 return false; |
| 178 } |
| 179 } |
165 | 180 |
166 if (feature_info_->workarounds().max_texture_size) { | 181 if (feature_info_->workarounds().max_texture_size) { |
167 max_texture_size = std::min( | 182 max_texture_size = std::min( |
168 max_texture_size, feature_info_->workarounds().max_texture_size); | 183 max_texture_size, |
| 184 feature_info_->workarounds().max_texture_size); |
| 185 max_rectangle_texture_size = std::min( |
| 186 max_rectangle_texture_size, |
| 187 feature_info_->workarounds().max_texture_size); |
169 } | 188 } |
170 if (feature_info_->workarounds().max_cube_map_texture_size) { | 189 if (feature_info_->workarounds().max_cube_map_texture_size) { |
171 max_cube_map_texture_size = std::min( | 190 max_cube_map_texture_size = std::min( |
172 max_cube_map_texture_size, | 191 max_cube_map_texture_size, |
173 feature_info_->workarounds().max_cube_map_texture_size); | 192 feature_info_->workarounds().max_cube_map_texture_size); |
174 } | 193 } |
175 | 194 |
176 texture_manager_.reset(new TextureManager(memory_tracker_.get(), | 195 texture_manager_.reset(new TextureManager(memory_tracker_.get(), |
177 feature_info_.get(), | 196 feature_info_.get(), |
178 max_texture_size, | 197 max_texture_size, |
179 max_cube_map_texture_size, | 198 max_cube_map_texture_size, |
| 199 max_rectangle_texture_size, |
180 bind_generates_resource_)); | 200 bind_generates_resource_)); |
181 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); | 201 texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); |
182 | 202 |
183 const GLint kMinTextureImageUnits = 8; | 203 const GLint kMinTextureImageUnits = 8; |
184 const GLint kMinVertexTextureImageUnits = 0; | 204 const GLint kMinVertexTextureImageUnits = 0; |
185 if (!QueryGLFeatureU( | 205 if (!QueryGLFeatureU( |
186 GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, | 206 GL_MAX_TEXTURE_IMAGE_UNITS, kMinTextureImageUnits, |
187 &max_texture_image_units_) || | 207 &max_texture_image_units_) || |
188 !QueryGLFeatureU( | 208 !QueryGLFeatureU( |
189 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, kMinVertexTextureImageUnits, | 209 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, kMinVertexTextureImageUnits, |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 GLenum pname, GLint min_required, uint32* v) { | 403 GLenum pname, GLint min_required, uint32* v) { |
384 uint32 value = 0; | 404 uint32 value = 0; |
385 GetIntegerv(pname, &value); | 405 GetIntegerv(pname, &value); |
386 bool result = CheckGLFeatureU(min_required, &value); | 406 bool result = CheckGLFeatureU(min_required, &value); |
387 *v = value; | 407 *v = value; |
388 return result; | 408 return result; |
389 } | 409 } |
390 | 410 |
391 } // namespace gles2 | 411 } // namespace gles2 |
392 } // namespace gpu | 412 } // namespace gpu |
OLD | NEW |