Home | History | Annotate | Download | only in client
      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   bool Initialize();
     75 
     76   IdHandlerInterface* GetIdHandler(int namespace_id) const {
     77     return id_handlers_[namespace_id].get();
     78   }
     79 
     80   ProgramInfoManager* program_info_manager() {
     81     return program_info_manager_.get();
     82   }
     83 
     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