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
14namespace gpu {
15namespace gles2 {
16
17class GLES2Implementation;
18class GLES2ImplementationTest;
19class ProgramInfoManager;
20
21typedef void (GLES2Implementation::*DeleteFn)(GLsizei n, const GLuint* ids);
22
23class 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
42class 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.
65class 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