15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_format.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/service/feature_info.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "gpu/command_buffer/service/gles2_cmd_validation.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "gpu/command_buffer/service/shader_translator_cache.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/gpu_export.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IdAllocatorInterface;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransferBufferManagerInterface;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProgramCache;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BufferManager;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLES2Decoder;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FramebufferManager;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MailboxManager;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderbufferManager;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProgramManager;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShaderManager;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TextureManager;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryTracker;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DisallowedFeatures;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Context Group helps manage multiple GLES2Decoders that share
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resources.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GPU_EXPORT ContextGroup : public base::RefCounted<ContextGroup> {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContextGroup(
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<MailboxManager>& mailbox_manager,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<MemoryTracker>& memory_tracker,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<ShaderTranslatorCache>& shader_translator_cache,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const scoped_refptr<FeatureInfo>& feature_info,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool bind_generates_resource);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should only be called by GLES2Decoder. This must be paired with a
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // call to destroy if it succeeds.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool Initialize(
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLES2Decoder* decoder,
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const DisallowedFeatures& disallowed_features);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroys all the resources when called for the last context in the group.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should only be called by GLES2Decoder.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Destroy(GLES2Decoder* decoder, bool have_context);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MailboxManager* mailbox_manager() const {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return mailbox_manager_.get();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MemoryTracker* memory_tracker() const {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return memory_tracker_.get();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ShaderTranslatorCache* shader_translator_cache() const {
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return shader_translator_cache_.get();
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bind_generates_resource() {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return bind_generates_resource_;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_vertex_attribs() const {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_vertex_attribs_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_texture_units() const {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_texture_units_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_texture_image_units() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_texture_image_units_;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_vertex_texture_image_units() const {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_vertex_texture_image_units_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_fragment_uniform_vectors() const {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_fragment_uniform_vectors_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_varying_vectors() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_varying_vectors_;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_vertex_uniform_vectors() const {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_vertex_uniform_vectors_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_color_attachments() const {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return max_color_attachments_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_draw_buffers() const {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return max_draw_buffers_;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FeatureInfo* feature_info() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return feature_info_.get();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BufferManager* buffer_manager() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return buffer_manager_.get();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FramebufferManager* framebuffer_manager() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return framebuffer_manager_.get();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderbufferManager* renderbuffer_manager() const {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return renderbuffer_manager_.get();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TextureManager* texture_manager() const {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return texture_manager_.get();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProgramManager* program_manager() const {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return program_manager_.get();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_program_cache() const {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return program_cache_ != NULL;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_program_cache(ProgramCache* program_cache) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    program_cache_ = program_cache;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShaderManager* shader_manager() const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return shader_manager_.get();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransferBufferManagerInterface* transfer_buffer_manager() const {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return transfer_buffer_manager_.get();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IdAllocatorInterface* GetIdAllocator(unsigned namespace_id);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 GetMemRepresented() const;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loses all the context associated with this group.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LoseContexts(GLenum reset_status);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // EXT_draw_buffer related states for backbuffer.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum draw_buffer() const {
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return draw_buffer_;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_draw_buffer(GLenum buf) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    draw_buffer_ = buf;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCounted<ContextGroup>;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ContextGroup();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckGLFeature(GLint min_required, GLint* v);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckGLFeatureU(GLint min_required, uint32* v);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool QueryGLFeature(GLenum pname, GLint min_required, GLint* v);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool QueryGLFeatureU(GLenum pname, GLint min_required, uint32* v);
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HaveContexts();
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MailboxManager> mailbox_manager_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MemoryTracker> memory_tracker_;
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<ShaderTranslatorCache> shader_translator_cache_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enforce_gl_minimums_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool bind_generates_resource_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_vertex_attribs_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_texture_units_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_texture_image_units_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_vertex_texture_image_units_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_fragment_uniform_vectors_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_varying_vectors_;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 max_vertex_uniform_vectors_;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_color_attachments_;
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  uint32 max_draw_buffers_;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProgramCache* program_cache_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BufferManager> buffer_manager_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FramebufferManager> framebuffer_manager_;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderbufferManager> renderbuffer_manager_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TextureManager> texture_manager_;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ProgramManager> program_manager_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ShaderManager> shader_manager_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  linked_ptr<IdAllocatorInterface>
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_namespaces_[id_namespaces::kNumIdNamespaces];
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<FeatureInfo> feature_info_;
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::WeakPtr<gles2::GLES2Decoder> > decoders_;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLenum draw_buffer_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ContextGroup);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_GROUP_H_
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229