• 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 
74   bool Initialize();
75 
GetIdHandler(int namespace_id)76   IdHandlerInterface* GetIdHandler(int namespace_id) const {
77     return id_handlers_[namespace_id].get();
78   }
79 
program_info_manager()80   ProgramInfoManager* program_info_manager() {
81     return program_info_manager_.get();
82   }
83 
FreeContext(GLES2Implementation * gl_impl)84   void FreeContext(GLES2Implementation* gl_impl) {
85     for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) {
86       id_handlers_[i]->FreeContext(gl_impl);
87     }
88   }
89 
90  private:
91   friend class gpu::RefCountedThreadSafe<ShareGroup>;
92   friend class gpu::gles2::GLES2ImplementationTest;
93   ~ShareGroup();
94 
95   // Install a new program info manager. Used for testing only;
96   void set_program_info_manager(ProgramInfoManager* manager);
97 
98   scoped_ptr<IdHandlerInterface> id_handlers_[id_namespaces::kNumIdNamespaces];
99   scoped_ptr<ProgramInfoManager> program_info_manager_;
100 
101   bool bind_generates_resource_;
102 
103   DISALLOW_COPY_AND_ASSIGN(ShareGroup);
104 };
105 
106 }  // namespace gles2
107 }  // namespace gpu
108 
109 #endif  // GPU_COMMAND_BUFFER_CLIENT_SHARE_GROUP_H_
110