• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
id_handler_data(int namespace_id)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:
IdHandlerInterface()44   IdHandlerInterface() { }
~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 
bind_generates_resource()70   bool bind_generates_resource() const {
71     return bind_generates_resource_;
72   }
73 
GetIdHandler(int namespace_id)74   IdHandlerInterface* GetIdHandler(int namespace_id) const {
75     return id_handlers_[namespace_id].get();
76   }
77 
program_info_manager()78   ProgramInfoManager* program_info_manager() {
79     return program_info_manager_.get();
80   }
81 
FreeContext(GLES2Implementation * gl_impl)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