| 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_CLIENT_SHARE_GROUP_H_ | 5 #ifndef GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ |
| 6 #define GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ | 6 #define GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ |
| 7 | 7 |
| 8 #include <GLES2/gl2.h> | 8 #include <GLES2/gl2.h> |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "gles2_impl_export.h" | 10 #include "gles2_impl_export.h" |
| 11 #include "gpu/command_buffer/client/ref_counted.h" | 11 #include "gpu/command_buffer/client/ref_counted.h" |
| 12 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 12 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
| 13 | 13 |
| 14 namespace gpu { | 14 namespace gpu { |
| 15 namespace gles2 { | 15 namespace gles2 { |
| 16 | 16 |
| 17 class GLES2Implementation; | 17 class GLES2Implementation; |
| 18 class GLES2ImplementationTest; | 18 class GLES2ImplementationTest; |
| 19 class ProgramInfoManager; | 19 class ProgramInfoManager; |
| 20 | 20 |
| 21 typedef void (GLES2Implementation::*DeleteFn)(GLsizei n, const GLuint* ids); | 21 typedef void (GLES2Implementation::*DeleteFn)(GLsizei n, const GLuint* ids); |
| 22 typedef void (GLES2Implementation::*DeleteRangeFn)(const GLuint first_id, |
| 23 GLsizei range); |
| 22 typedef void (GLES2Implementation::*BindFn)(GLenum target, GLuint id); | 24 typedef void (GLES2Implementation::*BindFn)(GLenum target, GLuint id); |
| 23 typedef void (GLES2Implementation::*BindIndexedFn)( \ | 25 typedef void (GLES2Implementation::*BindIndexedFn)( \ |
| 24 GLenum target, GLuint index, GLuint id); | 26 GLenum target, GLuint index, GLuint id); |
| 25 typedef void (GLES2Implementation::*BindIndexedRangeFn)( \ | 27 typedef void (GLES2Implementation::*BindIndexedRangeFn)( \ |
| 26 GLenum target, GLuint index, GLuint id, GLintptr offset, GLsizeiptr size); | 28 GLenum target, GLuint index, GLuint id, GLintptr offset, GLsizeiptr size); |
| 27 | 29 |
| 28 class ShareGroupContextData { | 30 class ShareGroupContextData { |
| 29 public: | 31 public: |
| 30 struct IdHandlerData { | 32 struct IdHandlerData { |
| 31 IdHandlerData(); | 33 IdHandlerData(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 GLuint index, | 81 GLuint index, |
| 80 GLuint id, | 82 GLuint id, |
| 81 GLintptr offset, | 83 GLintptr offset, |
| 82 GLsizeiptr size, | 84 GLsizeiptr size, |
| 83 BindIndexedRangeFn bind_fn) = 0; | 85 BindIndexedRangeFn bind_fn) = 0; |
| 84 | 86 |
| 85 // Called when a context in the share group is destructed. | 87 // Called when a context in the share group is destructed. |
| 86 virtual void FreeContext(GLES2Implementation* gl_impl) = 0; | 88 virtual void FreeContext(GLES2Implementation* gl_impl) = 0; |
| 87 }; | 89 }; |
| 88 | 90 |
| 91 class RangeIdHandlerInterface { |
| 92 public: |
| 93 RangeIdHandlerInterface() {} |
| 94 virtual ~RangeIdHandlerInterface() {} |
| 95 |
| 96 // Makes a continuous range of ids. Stores the first allocated id to |
| 97 // |first_id| or 0 if allocation failed. |
| 98 virtual void MakeIdRange(GLES2Implementation* gl_impl, |
| 99 GLsizei n, |
| 100 GLuint* first_id) = 0; |
| 101 |
| 102 // Frees a continuous |range| of ids beginning at |first_id|. |
| 103 virtual void FreeIdRange(GLES2Implementation* gl_impl, |
| 104 const GLuint first_id, |
| 105 GLsizei range, |
| 106 DeleteRangeFn delete_fn) = 0; |
| 107 |
| 108 // Called when a context in the share group is destructed. |
| 109 virtual void FreeContext(GLES2Implementation* gl_impl) = 0; |
| 110 }; |
| 111 |
| 89 // ShareGroup manages shared resources for contexts that are sharing resources. | 112 // ShareGroup manages shared resources for contexts that are sharing resources. |
| 90 class GLES2_IMPL_EXPORT ShareGroup | 113 class GLES2_IMPL_EXPORT ShareGroup |
| 91 : public gpu::RefCountedThreadSafe<ShareGroup> { | 114 : public gpu::RefCountedThreadSafe<ShareGroup> { |
| 92 public: | 115 public: |
| 93 ShareGroup(bool bind_generates_resource); | 116 ShareGroup(bool bind_generates_resource); |
| 94 | 117 |
| 95 bool bind_generates_resource() const { | 118 bool bind_generates_resource() const { |
| 96 return bind_generates_resource_; | 119 return bind_generates_resource_; |
| 97 } | 120 } |
| 98 | 121 |
| 99 IdHandlerInterface* GetIdHandler(int namespace_id) const { | 122 IdHandlerInterface* GetIdHandler(int namespace_id) const { |
| 100 return id_handlers_[namespace_id].get(); | 123 return id_handlers_[namespace_id].get(); |
| 101 } | 124 } |
| 102 | 125 |
| 126 RangeIdHandlerInterface* GetRangeIdHandler(int range_namespace_id) const { |
| 127 return range_id_handlers_[range_namespace_id].get(); |
| 128 } |
| 129 |
| 103 ProgramInfoManager* program_info_manager() { | 130 ProgramInfoManager* program_info_manager() { |
| 104 return program_info_manager_.get(); | 131 return program_info_manager_.get(); |
| 105 } | 132 } |
| 106 | 133 |
| 107 void FreeContext(GLES2Implementation* gl_impl) { | 134 void FreeContext(GLES2Implementation* gl_impl) { |
| 108 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { | 135 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { |
| 109 id_handlers_[i]->FreeContext(gl_impl); | 136 id_handlers_[i]->FreeContext(gl_impl); |
| 110 } | 137 } |
| 138 for (auto& range_id_handler : range_id_handlers_) { |
| 139 range_id_handler->FreeContext(gl_impl); |
| 140 } |
| 111 } | 141 } |
| 112 | 142 |
| 113 private: | 143 private: |
| 114 friend class gpu::RefCountedThreadSafe<ShareGroup>; | 144 friend class gpu::RefCountedThreadSafe<ShareGroup>; |
| 115 friend class gpu::gles2::GLES2ImplementationTest; | 145 friend class gpu::gles2::GLES2ImplementationTest; |
| 116 ~ShareGroup(); | 146 ~ShareGroup(); |
| 117 | 147 |
| 118 // Install a new program info manager. Used for testing only; | 148 // Install a new program info manager. Used for testing only; |
| 119 void set_program_info_manager(ProgramInfoManager* manager); | 149 void set_program_info_manager(ProgramInfoManager* manager); |
| 120 | 150 |
| 121 scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces]; | 151 scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces]; |
| 152 scoped_ptr<RangeIdHandlerInterface> |
| 153 range_id_handlers_[id_namespaces::kNumRangeIdNamespaces]; |
| 122 scoped_ptr<ProgramInfoManager> program_info_manager_; | 154 scoped_ptr<ProgramInfoManager> program_info_manager_; |
| 123 | 155 |
| 124 bool bind_generates_resource_; | 156 bool bind_generates_resource_; |
| 125 | 157 |
| 126 DISALLOW_COPY_AND_ASSIGN(ShareGroup); | 158 DISALLOW_COPY_AND_ASSIGN(ShareGroup); |
| 127 }; | 159 }; |
| 128 | 160 |
| 129 } // namespace gles2 | 161 } // namespace gles2 |
| 130 } // namespace gpu | 162 } // namespace gpu |
| 131 | 163 |
| 132 #endif // GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ | 164 #endif // GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ |
| OLD | NEW |