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   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