| 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 #ifndef GPU_COMMAND_BUFFER_SERVICE_BUFFER_MANAGER_H_ | 5 #ifndef GPU_COMMAND_BUFFER_SERVICE_BUFFER_MANAGER_H_ |
| 6 #define GPU_COMMAND_BUFFER_SERVICE_BUFFER_MANAGER_H_ | 6 #define GPU_COMMAND_BUFFER_SERVICE_BUFFER_MANAGER_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "gpu/command_buffer/common/buffer.h" |
| 14 #include "gpu/command_buffer/service/gl_utils.h" | 15 #include "gpu/command_buffer/service/gl_utils.h" |
| 15 #include "gpu/command_buffer/service/memory_tracking.h" | 16 #include "gpu/command_buffer/service/memory_tracking.h" |
| 16 #include "gpu/gpu_export.h" | 17 #include "gpu/gpu_export.h" |
| 17 | 18 |
| 18 namespace gpu { | 19 namespace gpu { |
| 19 namespace gles2 { | 20 namespace gles2 { |
| 20 | 21 |
| 21 class BufferManager; | 22 class BufferManager; |
| 22 struct ContextState; | 23 struct ContextState; |
| 23 class ErrorState; | 24 class ErrorState; |
| 24 class FeatureInfo; | 25 class FeatureInfo; |
| 25 class TestHelper; | 26 class TestHelper; |
| 26 | 27 |
| 27 // Info about Buffers currently in the system. | 28 // Info about Buffers currently in the system. |
| 28 class GPU_EXPORT Buffer : public base::RefCounted<Buffer> { | 29 class GPU_EXPORT Buffer : public base::RefCounted<Buffer> { |
| 29 public: | 30 public: |
| 31 struct MappedRange { |
| 32 GLintptr offset; |
| 33 GLsizeiptr size; |
| 34 GLenum access; |
| 35 void* pointer; // Pointer returned by driver. |
| 36 scoped_refptr<gpu::Buffer> shm; // Client side mem. |
| 37 |
| 38 MappedRange(GLintptr offset, GLsizeiptr size, GLenum access, |
| 39 void* pointer, scoped_refptr<gpu::Buffer> shm); |
| 40 ~MappedRange(); |
| 41 void* GetShmPointer() const; |
| 42 }; |
| 43 |
| 30 Buffer(BufferManager* manager, GLuint service_id); | 44 Buffer(BufferManager* manager, GLuint service_id); |
| 31 | 45 |
| 32 GLuint service_id() const { | 46 GLuint service_id() const { |
| 33 return service_id_; | 47 return service_id_; |
| 34 } | 48 } |
| 35 | 49 |
| 36 GLenum target() const { | 50 GLenum target() const { |
| 37 return target_; | 51 return target_; |
| 38 } | 52 } |
| 39 | 53 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 60 } | 74 } |
| 61 | 75 |
| 62 bool IsValid() const { | 76 bool IsValid() const { |
| 63 return target() && !IsDeleted(); | 77 return target() && !IsDeleted(); |
| 64 } | 78 } |
| 65 | 79 |
| 66 bool IsClientSideArray() const { | 80 bool IsClientSideArray() const { |
| 67 return is_client_side_array_; | 81 return is_client_side_array_; |
| 68 } | 82 } |
| 69 | 83 |
| 84 void SetMappedRange(GLintptr offset, GLsizeiptr size, GLenum access, |
| 85 void* pointer, scoped_refptr<gpu::Buffer> shm) { |
| 86 mapped_range_.reset(new MappedRange(offset, size, access, pointer, shm)); |
| 87 } |
| 88 |
| 89 void RemoveMappedRange() { |
| 90 mapped_range_.reset(nullptr); |
| 91 } |
| 92 |
| 93 const MappedRange* GetMappedRange() const { |
| 94 return mapped_range_.get(); |
| 95 } |
| 96 |
| 70 private: | 97 private: |
| 71 friend class BufferManager; | 98 friend class BufferManager; |
| 72 friend class BufferManagerTestBase; | 99 friend class BufferManagerTestBase; |
| 73 friend class base::RefCounted<Buffer>; | 100 friend class base::RefCounted<Buffer>; |
| 74 | 101 |
| 75 // Represents a range in a buffer. | 102 // Represents a range in a buffer. |
| 76 class Range { | 103 class Range { |
| 77 public: | 104 public: |
| 78 Range(GLuint offset, GLsizei count, GLenum type) | 105 Range(GLuint offset, GLsizei count, GLenum type) |
| 79 : offset_(offset), | 106 : offset_(offset), |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 GLuint service_id_; | 183 GLuint service_id_; |
| 157 | 184 |
| 158 // The type of buffer. 0 = unset, GL_BUFFER_ARRAY = vertex data, | 185 // The type of buffer. 0 = unset, GL_BUFFER_ARRAY = vertex data, |
| 159 // GL_ELEMENT_BUFFER_ARRAY = index data. | 186 // GL_ELEMENT_BUFFER_ARRAY = index data. |
| 160 // Once set a buffer can not be used for something else. | 187 // Once set a buffer can not be used for something else. |
| 161 GLenum target_; | 188 GLenum target_; |
| 162 | 189 |
| 163 // Usage of buffer. | 190 // Usage of buffer. |
| 164 GLenum usage_; | 191 GLenum usage_; |
| 165 | 192 |
| 193 // Data cached from last glMapBufferRange call. |
| 194 scoped_ptr<MappedRange> mapped_range_; |
| 195 |
| 166 // A map of ranges to the highest value in that range of a certain type. | 196 // A map of ranges to the highest value in that range of a certain type. |
| 167 typedef std::map<Range, GLuint, Range::Less> RangeToMaxValueMap; | 197 typedef std::map<Range, GLuint, Range::Less> RangeToMaxValueMap; |
| 168 RangeToMaxValueMap range_set_; | 198 RangeToMaxValueMap range_set_; |
| 169 }; | 199 }; |
| 170 | 200 |
| 171 // This class keeps track of the buffers and their sizes so we can do | 201 // This class keeps track of the buffers and their sizes so we can do |
| 172 // bounds checking. | 202 // bounds checking. |
| 173 // | 203 // |
| 174 // NOTE: To support shared resources an instance of this class will need to be | 204 // NOTE: To support shared resources an instance of this class will need to be |
| 175 // shared by multiple GLES2Decoders. | 205 // shared by multiple GLES2Decoders. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 return memory_tracker_->GetMemRepresented(); | 255 return memory_tracker_->GetMemRepresented(); |
| 226 } | 256 } |
| 227 | 257 |
| 228 // Tells for a given usage if this would be a client side array. | 258 // Tells for a given usage if this would be a client side array. |
| 229 bool IsUsageClientSideArray(GLenum usage); | 259 bool IsUsageClientSideArray(GLenum usage); |
| 230 | 260 |
| 231 // Tells whether a buffer that is emulated using client-side arrays should be | 261 // Tells whether a buffer that is emulated using client-side arrays should be |
| 232 // set to a non-zero size. | 262 // set to a non-zero size. |
| 233 bool UseNonZeroSizeForClientSideArrayBuffer(); | 263 bool UseNonZeroSizeForClientSideArrayBuffer(); |
| 234 | 264 |
| 265 Buffer* GetBufferInfoForTarget(ContextState* state, GLenum target) const; |
| 266 |
| 235 private: | 267 private: |
| 236 friend class Buffer; | 268 friend class Buffer; |
| 237 friend class TestHelper; // Needs access to DoBufferData. | 269 friend class TestHelper; // Needs access to DoBufferData. |
| 238 friend class BufferManagerTestBase; // Needs access to DoBufferSubData. | 270 friend class BufferManagerTestBase; // Needs access to DoBufferSubData. |
| 271 |
| 239 void StartTracking(Buffer* buffer); | 272 void StartTracking(Buffer* buffer); |
| 240 void StopTracking(Buffer* buffer); | 273 void StopTracking(Buffer* buffer); |
| 241 | 274 |
| 242 Buffer* GetBufferInfoForTarget(ContextState* state, GLenum target); | |
| 243 | |
| 244 // Does a glBufferSubData and updates the approriate accounting. | 275 // Does a glBufferSubData and updates the approriate accounting. |
| 245 // Assumes the values have already been validated. | 276 // Assumes the values have already been validated. |
| 246 void DoBufferSubData( | 277 void DoBufferSubData( |
| 247 ErrorState* error_state, | 278 ErrorState* error_state, |
| 248 Buffer* buffer, | 279 Buffer* buffer, |
| 249 GLintptr offset, | 280 GLintptr offset, |
| 250 GLsizeiptr size, | 281 GLsizeiptr size, |
| 251 const GLvoid* data); | 282 const GLvoid* data); |
| 252 | 283 |
| 253 // Does a glBufferData and updates the approprate accounting. Currently | 284 // Does a glBufferData and updates the approprate accounting. Currently |
| (...skipping 30 matching lines...) Expand all Loading... |
| 284 bool have_context_; | 315 bool have_context_; |
| 285 bool use_client_side_arrays_for_stream_buffers_; | 316 bool use_client_side_arrays_for_stream_buffers_; |
| 286 | 317 |
| 287 DISALLOW_COPY_AND_ASSIGN(BufferManager); | 318 DISALLOW_COPY_AND_ASSIGN(BufferManager); |
| 288 }; | 319 }; |
| 289 | 320 |
| 290 } // namespace gles2 | 321 } // namespace gles2 |
| 291 } // namespace gpu | 322 } // namespace gpu |
| 292 | 323 |
| 293 #endif // GPU_COMMAND_BUFFER_SERVICE_BUFFER_MANAGER_H_ | 324 #endif // GPU_COMMAND_BUFFER_SERVICE_BUFFER_MANAGER_H_ |
| OLD | NEW |