| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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_CLIENT_GLES2_IMPLEMENTATION_H_ | 5 #ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_ |
| 6 #define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_ | 6 #define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_ |
| 7 | 7 |
| 8 #include <GLES2/gl2.h> | 8 #include <GLES2/gl2.h> |
| 9 | 9 |
| 10 #include <map> | 10 #include <map> |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1))); | 69 (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1))); |
| 70 | 70 |
| 71 namespace gpu { | 71 namespace gpu { |
| 72 | 72 |
| 73 class MappedMemoryManager; | 73 class MappedMemoryManager; |
| 74 | 74 |
| 75 namespace gles2 { | 75 namespace gles2 { |
| 76 | 76 |
| 77 class ClientSideBufferHelper; | 77 class ClientSideBufferHelper; |
| 78 class ProgramInfoManager; | 78 class ProgramInfoManager; |
| 79 class AlignedRingBuffer; |
| 79 | 80 |
| 80 // Base class for IdHandlers | 81 // Base class for IdHandlers |
| 81 class IdHandlerInterface { | 82 class IdHandlerInterface { |
| 82 public: | 83 public: |
| 83 IdHandlerInterface() { } | 84 IdHandlerInterface() { } |
| 84 virtual ~IdHandlerInterface() { } | 85 virtual ~IdHandlerInterface() { } |
| 85 | 86 |
| 86 // Makes some ids at or above id_offset. | 87 // Makes some ids at or above id_offset. |
| 87 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) = 0; | 88 virtual void MakeIds(GLuint id_offset, GLsizei n, GLuint* ids) = 0; |
| 88 | 89 |
| 89 // Frees some ids. | 90 // Frees some ids. |
| 90 virtual bool FreeIds(GLsizei n, const GLuint* ids) = 0; | 91 virtual bool FreeIds(GLsizei n, const GLuint* ids) = 0; |
| 91 | 92 |
| 92 // Marks an id as used for glBind functions. id = 0 does nothing. | 93 // Marks an id as used for glBind functions. id = 0 does nothing. |
| 93 virtual bool MarkAsUsedForBind(GLuint id) = 0; | 94 virtual bool MarkAsUsedForBind(GLuint id) = 0; |
| 94 }; | 95 }; |
| 95 | 96 |
| 97 // Wraps RingBufferWrapper to provide aligned allocations. |
| 98 class AlignedRingBuffer : public RingBufferWrapper { |
| 99 public: |
| 100 AlignedRingBuffer( |
| 101 unsigned int alignment, |
| 102 int32 shm_id, |
| 103 RingBuffer::Offset base_offset, |
| 104 unsigned int size, |
| 105 CommandBufferHelper* helper, |
| 106 void* base) |
| 107 : RingBufferWrapper(base_offset, size, helper, base), |
| 108 alignment_(alignment), |
| 109 shm_id_(shm_id) { |
| 110 } |
| 111 ~AlignedRingBuffer(); |
| 112 |
| 113 // Overrriden from RingBufferWrapper |
| 114 void* Alloc(unsigned int size) { |
| 115 return RingBufferWrapper::Alloc(RoundToAlignment(size)); |
| 116 } |
| 117 |
| 118 template <typename T>T* AllocTyped(unsigned int count) { |
| 119 return static_cast<T*>(Alloc(count * sizeof(T))); |
| 120 } |
| 121 |
| 122 int32 GetShmId() const { |
| 123 return shm_id_; |
| 124 } |
| 125 |
| 126 private: |
| 127 unsigned int RoundToAlignment(unsigned int size) { |
| 128 return (size + alignment_ - 1) & ~(alignment_ - 1); |
| 129 } |
| 130 |
| 131 unsigned int alignment_; |
| 132 int32 shm_id_; |
| 133 }; |
| 134 |
| 135 // Manages the transfer buffer. |
| 136 class TransferBuffer { |
| 137 public: |
| 138 TransferBuffer( |
| 139 CommandBufferHelper* helper, |
| 140 int32 buffer_id, |
| 141 void* buffer, |
| 142 size_t buffer_size, |
| 143 size_t result_size, |
| 144 unsigned int alignment); |
| 145 ~TransferBuffer(); |
| 146 |
| 147 AlignedRingBuffer* GetBuffer(); |
| 148 int GetShmId(); |
| 149 void* GetResultBuffer(); |
| 150 int GetResultOffset(); |
| 151 |
| 152 void Free(); |
| 153 |
| 154 // This is for unit testing only. |
| 155 bool HaveBuffer() const { |
| 156 return buffer_id_ != 0; |
| 157 } |
| 158 |
| 159 private: |
| 160 void AllocateRingBuffer(); |
| 161 |
| 162 void Setup(int32 buffer_id, void* buffer); |
| 163 |
| 164 CommandBufferHelper* helper_; |
| 165 scoped_ptr<AlignedRingBuffer> ring_buffer_; |
| 166 unsigned int buffer_size_; |
| 167 unsigned int result_size_; |
| 168 unsigned int alignment_; |
| 169 int32 buffer_id_; |
| 170 void* result_buffer_; |
| 171 uint32 result_shm_offset_; |
| 172 }; |
| 173 |
| 96 // This class emulates GLES2 over command buffers. It can be used by a client | 174 // This class emulates GLES2 over command buffers. It can be used by a client |
| 97 // program so that the program does not need deal with shared memory and command | 175 // program so that the program does not need deal with shared memory and command |
| 98 // buffer management. See gl2_lib.h. Note that there is a performance gain to | 176 // buffer management. See gl2_lib.h. Note that there is a performance gain to |
| 99 // be had by changing your code to use command buffers directly by using the | 177 // be had by changing your code to use command buffers directly by using the |
| 100 // GLES2CmdHelper but that entails changing your code to use and deal with | 178 // GLES2CmdHelper but that entails changing your code to use and deal with |
| 101 // shared memory and synchronization issues. | 179 // shared memory and synchronization issues. |
| 102 class GLES2Implementation { | 180 class GLES2Implementation { |
| 103 public: | 181 public: |
| 104 // Stores client side cached GL state. | 182 // Stores client side cached GL state. |
| 105 struct GLState { | 183 struct GLState { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 return id; | 271 return id; |
| 194 } | 272 } |
| 195 | 273 |
| 196 void FreeTextureId(GLuint id) { | 274 void FreeTextureId(GLuint id) { |
| 197 id_handlers_[id_namespaces::kTextures]->FreeIds(1, &id); | 275 id_handlers_[id_namespaces::kTextures]->FreeIds(1, &id); |
| 198 } | 276 } |
| 199 | 277 |
| 200 void SetSharedMemoryChunkSizeMultiple(unsigned int multiple); | 278 void SetSharedMemoryChunkSizeMultiple(unsigned int multiple); |
| 201 | 279 |
| 202 void FreeUnusedSharedMemory(); | 280 void FreeUnusedSharedMemory(); |
| 281 void FreeEverything(); |
| 203 | 282 |
| 204 private: | 283 private: |
| 205 // Used to track whether an extension is available | 284 // Used to track whether an extension is available |
| 206 enum ExtensionStatus { | 285 enum ExtensionStatus { |
| 207 kAvailableExtensionStatus, | 286 kAvailableExtensionStatus, |
| 208 kUnavailableExtensionStatus, | 287 kUnavailableExtensionStatus, |
| 209 kUnknownExtensionStatus | 288 kUnknownExtensionStatus |
| 210 }; | 289 }; |
| 211 | 290 |
| 212 // Wraps RingBufferWrapper to provide aligned allocations. | |
| 213 class AlignedRingBuffer : public RingBufferWrapper { | |
| 214 public: | |
| 215 AlignedRingBuffer(RingBuffer::Offset base_offset, | |
| 216 unsigned int size, | |
| 217 CommandBufferHelper *helper, | |
| 218 void *base) | |
| 219 : RingBufferWrapper(base_offset, size, helper, base) { | |
| 220 } | |
| 221 | |
| 222 static unsigned int RoundToAlignment(unsigned int size) { | |
| 223 return (size + kAlignment - 1) & ~(kAlignment - 1); | |
| 224 } | |
| 225 | |
| 226 // Overrriden from RingBufferWrapper | |
| 227 void *Alloc(unsigned int size) { | |
| 228 return RingBufferWrapper::Alloc(RoundToAlignment(size)); | |
| 229 } | |
| 230 | |
| 231 // Overrriden from RingBufferWrapper | |
| 232 template <typename T> T *AllocTyped(unsigned int count) { | |
| 233 return static_cast<T *>(Alloc(count * sizeof(T))); | |
| 234 } | |
| 235 }; | |
| 236 | |
| 237 // Base class for mapped resources. | 291 // Base class for mapped resources. |
| 238 struct MappedResource { | 292 struct MappedResource { |
| 239 MappedResource(GLenum _access, int _shm_id, void* mem, unsigned int offset) | 293 MappedResource(GLenum _access, int _shm_id, void* mem, unsigned int offset) |
| 240 : access(_access), | 294 : access(_access), |
| 241 shm_id(_shm_id), | 295 shm_id(_shm_id), |
| 242 shm_memory(mem), | 296 shm_memory(mem), |
| 243 shm_offset(offset) { | 297 shm_offset(offset) { |
| 244 } | 298 } |
| 245 | 299 |
| 246 // access mode. Currently only GL_WRITE_ONLY is valid | 300 // access mode. Currently only GL_WRITE_ONLY is valid |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 } | 376 } |
| 323 | 377 |
| 324 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture | 378 // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture |
| 325 GLuint bound_texture_2d; | 379 GLuint bound_texture_2d; |
| 326 | 380 |
| 327 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with | 381 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with |
| 328 // glBindTexture | 382 // glBindTexture |
| 329 GLuint bound_texture_cube_map; | 383 GLuint bound_texture_cube_map; |
| 330 }; | 384 }; |
| 331 | 385 |
| 332 // Gets the shared memory id for the result buffer. | 386 // Gets the value of the result. |
| 333 uint32 result_shm_id() const { | 387 template <typename T> |
| 334 return transfer_buffer_id_; | 388 T GetResultAs() { |
| 389 return static_cast<T>(transfer_buffer_.GetResultBuffer()); |
| 335 } | 390 } |
| 336 | 391 |
| 337 // Gets the shared memory offset for the result buffer. | 392 int32 GetResultShmId() { |
| 338 uint32 result_shm_offset() const { | 393 return transfer_buffer_.GetShmId(); |
| 339 return result_shm_offset_; | |
| 340 } | 394 } |
| 341 | 395 |
| 342 // Gets the value of the result. | 396 uint32 GetResultShmOffset() { |
| 343 template <typename T> | 397 return transfer_buffer_.GetResultOffset(); |
| 344 T GetResultAs() const { | |
| 345 return static_cast<T>(result_buffer_); | |
| 346 } | 398 } |
| 347 | 399 |
| 348 // Lazily determines if GL_ANGLE_pack_reverse_row_order is available | 400 // Lazily determines if GL_ANGLE_pack_reverse_row_order is available |
| 349 bool IsAnglePackReverseRowOrderAvailable(); | 401 bool IsAnglePackReverseRowOrderAvailable(); |
| 350 | 402 |
| 351 // Gets the GLError through our wrapper. | 403 // Gets the GLError through our wrapper. |
| 352 GLenum GetGLError(); | 404 GLenum GetGLError(); |
| 353 | 405 |
| 354 // Sets our wrapper for the GLError. | 406 // Sets our wrapper for the GLError. |
| 355 void SetGLError(GLenum error, const char* msg); | 407 void SetGLError(GLenum error, const char* msg); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 bool GetProgramivHelper(GLuint program, GLenum pname, GLint* params); | 478 bool GetProgramivHelper(GLuint program, GLenum pname, GLint* params); |
| 427 bool GetRenderbufferParameterivHelper( | 479 bool GetRenderbufferParameterivHelper( |
| 428 GLenum target, GLenum pname, GLint* params); | 480 GLenum target, GLenum pname, GLint* params); |
| 429 bool GetShaderivHelper(GLuint shader, GLenum pname, GLint* params); | 481 bool GetShaderivHelper(GLuint shader, GLenum pname, GLint* params); |
| 430 bool GetTexParameterfvHelper(GLenum target, GLenum pname, GLfloat* params); | 482 bool GetTexParameterfvHelper(GLenum target, GLenum pname, GLfloat* params); |
| 431 bool GetTexParameterivHelper(GLenum target, GLenum pname, GLint* params); | 483 bool GetTexParameterivHelper(GLenum target, GLenum pname, GLint* params); |
| 432 | 484 |
| 433 GLES2Util util_; | 485 GLES2Util util_; |
| 434 GLES2CmdHelper* helper_; | 486 GLES2CmdHelper* helper_; |
| 435 scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces]; | 487 scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces]; |
| 436 AlignedRingBuffer transfer_buffer_; | 488 TransferBuffer transfer_buffer_; |
| 437 int transfer_buffer_id_; | |
| 438 void* result_buffer_; | |
| 439 uint32 result_shm_offset_; | |
| 440 std::string last_error_; | 489 std::string last_error_; |
| 441 | 490 |
| 442 std::queue<int32> swap_buffers_tokens_; | 491 std::queue<int32> swap_buffers_tokens_; |
| 443 std::queue<int32> rate_limit_tokens_; | 492 std::queue<int32> rate_limit_tokens_; |
| 444 | 493 |
| 445 ExtensionStatus angle_pack_reverse_row_order_status; | 494 ExtensionStatus angle_pack_reverse_row_order_status; |
| 446 | 495 |
| 447 GLState gl_state_; | 496 GLState gl_state_; |
| 448 | 497 |
| 449 // pack alignment as last set by glPixelStorei | 498 // pack alignment as last set by glPixelStorei |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 | 594 |
| 546 inline bool GLES2Implementation::GetTexParameterivHelper( | 595 inline bool GLES2Implementation::GetTexParameterivHelper( |
| 547 GLenum /* target */, GLenum /* pname */, GLint* /* params */) { | 596 GLenum /* target */, GLenum /* pname */, GLint* /* params */) { |
| 548 return false; | 597 return false; |
| 549 } | 598 } |
| 550 | 599 |
| 551 } // namespace gles2 | 600 } // namespace gles2 |
| 552 } // namespace gpu | 601 } // namespace gpu |
| 553 | 602 |
| 554 #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_ | 603 #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_ |
| OLD | NEW |