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 3 // found in the LICENSE file. 4 5 #ifndef GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ 6 #define GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ 7 8 #include <GLES2/gl2.h> 9 #include "base/memory/scoped_ptr.h" 10 #include "gles2_impl_export.h" 11 #include "gpu/command_buffer/client/ref_counted.h" 12 #include "gpu/command_buffer/common/gles2_cmd_format.h" 13 14 namespace gpu { 15 namespace gles2 { 16 17 class GLES2Implementation; 18 class GLES2ImplementationTest; 19 class ProgramInfoManager; 20 21 typedef void (GLES2Implementation::*DeleteFn)(GLsizei n, const GLuint* ids); 22 23 class ShareGroupContextData { 24 public: 25 struct IdHandlerData { 26 IdHandlerData(); 27 ~IdHandlerData(); 28 29 std::vector<GLuint> freed_ids_; 30 uint32 flush_generation_; 31 }; 32 33 IdHandlerData* id_handler_data(int namespace_id) { 34 return &id_handler_data_[namespace_id]; 35 } 36 37 private: 38 IdHandlerData id_handler_data_[id_namespaces::kNumIdNamespaces]; 39 }; 40 41 // Base class for IdHandlers 42 class IdHandlerInterface { 43 public: 44 IdHandlerInterface() { } 45 virtual ~IdHandlerInterface() { } 46 47 // Makes some ids at or above id_offset. 48 virtual void MakeIds( 49 GLES2Implementation* gl_impl, 50 GLuint id_offset, GLsizei n, GLuint* ids) = 0; 51 52 // Frees some ids. 53 virtual bool FreeIds( 54 GLES2Implementation* gl_impl, GLsizei n, const GLuint* ids, 55 DeleteFn delete_fn) = 0; 56 57 // Marks an id as used for glBind functions. id = 0 does nothing. 58 virtual bool MarkAsUsedForBind(GLuint id) = 0; 59 60 // Called when a context in the share group is destructed. 61 virtual void FreeContext(GLES2Implementation* gl_impl) = 0; 62 }; 63 64 // ShareGroup manages shared resources for contexts that are sharing resources. 65 class GLES2_IMPL_EXPORT ShareGroup 66 : public gpu::RefCountedThreadSafe<ShareGroup> { 67 public: 68 ShareGroup(bool bind_generates_resource); 69 70 bool bind_generates_resource() const { 71 return bind_generates_resource_; 72 } 73 74 IdHandlerInterface* GetIdHandler(int namespace_id) const { 75 return id_handlers_[namespace_id].get(); 76 } 77 78 ProgramInfoManager* program_info_manager() { 79 return program_info_manager_.get(); 80 } 81 82 void FreeContext(GLES2Implementation* gl_impl) { 83 for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { 84 id_handlers_[i]->FreeContext(gl_impl); 85 } 86 } 87 88 private: 89 friend class gpu::RefCountedThreadSafe<ShareGroup>; 90 friend class gpu::gles2::GLES2ImplementationTest; 91 ~ShareGroup(); 92 93 // Install a new program info manager. Used for testing only; 94 void set_program_info_manager(ProgramInfoManager* manager); 95 96 scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces]; 97 scoped_ptr<ProgramInfoManager> program_info_manager_; 98 99 bool bind_generates_resource_; 100 101 DISALLOW_COPY_AND_ASSIGN(ShareGroup); 102 }; 103 104 } // namespace gles2 105 } // namespace gpu 106 107 #endif // GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_ 108