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_CLIENT_GLES2_IMPLEMENTATION_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <GLES2/gl2.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <list>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <utility>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/memory/weak_ptr.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/buffer_tracker.h"
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/client_context_state.h"
238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "gpu/command_buffer/client/context_support.h"
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/gles2_cmd_helper.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "gpu/command_buffer/client/gles2_impl_export.h"
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h"
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/gpu_memory_buffer_tracker.h"
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "gpu/command_buffer/client/mapped_memory.h"
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/query_tracker.h"
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/ref_counted.h"
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/ring_buffer.h"
3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/client/share_group.h"
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "gpu/command_buffer/common/capabilities.h"
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/debug_marker_manager.h"
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/command_buffer/common/gles2_cmd_utils.h"
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "gpu/command_buffer/common/id_allocator.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(NDEBUG) && !defined(__native_client__) && !defined(GLES2_CONFORMANCE_TESTS)  // NOLINT
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #if defined(GLES2_INLINE_OPTIMIZATION)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(gman): Replace with macros that work with inline optmization.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_SINGLE_THREAD_CHECK()
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_LOG(args)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_LOG_CODE_BLOCK(code)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_DCHECK_CODE_BLOCK(code)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #else
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #include "base/logging.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_SINGLE_THREAD_CHECK() SingleThreadChecker checker(this);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_LOG(args)  DLOG_IF(INFO, debug_) << args;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_LOG_CODE_BLOCK(code) code
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_DCHECK_CODE_BLOCK(code) code
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #define GPU_CLIENT_DEBUG
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #endif
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_SINGLE_THREAD_CHECK()
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_LOG(args)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_LOG_CODE_BLOCK(code)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_DCHECK_CODE_BLOCK(code)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GPU_CLIENT_DEBUG)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set to 1 to have the client fail when a GL error is generated.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This helps find bugs in the renderer since the debugger stops on the error.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#  if 0
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#    define GL_CLIENT_FAIL_GL_ERRORS
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#  endif
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that destination pointers point to initialized memory.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the context is lost, calling GL function has no effect so if destination
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pointers point to initialized memory it can often lead to crash bugs. eg.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GLsizei len;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// glGetShaderSource(shader, max_size, &len, buffer);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// std::string src(buffer, buffer + len);  // len can be uninitialized here!!!
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Because this check is not official GL this check happens only on Chrome code,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not Pepper.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If it was up to us we'd just always write to the destination but the OpenGL
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// spec defines the behavior of OpenGL functions, not us. :-(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__native_client__) || defined(GLES2_CONFORMANCE_TESTS)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_DCHECK(v)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(GPU_DCHECK)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) GPU_DCHECK(v)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_DCHECK(v) GPU_DCHECK(v)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(DCHECK)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) DCHECK(v)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_DCHECK(v) DCHECK(v)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(v) ASSERT(v)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  #define GPU_CLIENT_DCHECK(v) ASSERT(v)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(type, ptr) \
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(ptr && \
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(type, ptr) \
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION_ASSERT(!ptr || \
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (ptr[0] == static_cast<type>(0) || ptr[0] == static_cast<type>(-1)));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GLUniformDefinitionCHROMIUM;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gpu {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class GpuControl;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedTransferBufferPtr;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransferBufferInterface;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gles2 {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ImageFactory;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VertexArrayObjectManager;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class GLES2ImplementationErrorMessageCallback {
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~GLES2ImplementationErrorMessageCallback() { }
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnErrorMessage(const char* msg, int id) = 0;
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class emulates GLES2 over command buffers. It can be used by a client
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// program so that the program does not need deal with shared memory and command
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// buffer management. See gl2_lib.h.  Note that there is a performance gain to
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be had by changing your code to use command buffers directly by using the
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GLES2CmdHelper but that entails changing your code to use and deal with
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// shared memory and synchronization issues.
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class GLES2_IMPL_EXPORT GLES2Implementation
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : NON_EXPORTED_BASE(public GLES2Interface),
1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      NON_EXPORTED_BASE(public ContextSupport) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  enum MappedMemoryLimit {
1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    kNoLimit = MappedMemoryManager::kNoLimit,
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  };
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stores GL state that never changes.
137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  struct GLES2_IMPL_EXPORT GLStaticState {
138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GLStaticState();
139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ~GLStaticState();
140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct GLES2_IMPL_EXPORT IntState {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IntState();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_combined_texture_image_units;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_cube_map_texture_size;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_fragment_uniform_vectors;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_renderbuffer_size;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_texture_image_units;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_texture_size;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_varying_vectors;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_vertex_attribs;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_vertex_texture_image_units;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint max_vertex_uniform_vectors;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint num_compressed_texture_formats;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint num_shader_binary_formats;
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      GLint bind_generates_resource_chromium;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IntState int_state;
158a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    typedef std::pair<GLenum, GLenum> ShaderPrecisionKey;
160a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    typedef std::map<ShaderPrecisionKey,
161a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                     cmds::GetShaderPrecisionFormat::Result>
162a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        ShaderPrecisionMap;
163a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    ShaderPrecisionMap shader_precisions;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The maxiumum result size from simple GL get commands.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kMaxSizeOfSimpleResult = 16 * sizeof(uint32);  // NOLINT.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // used for testing only. If more things are reseved add them here.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned int kStartingOffset = kMaxSizeOfSimpleResult;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Size in bytes to issue async flush for transfer buffer.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned int kSizeToFlush = 256 * 1024;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bucket used for results. Public for testing only.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const uint32 kResultBucketId = 1;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Alignment of allocations.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned int kAlignment = 4;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GL names for the buffers used to emulate client side buffers.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClientSideArrayId = 0xFEDCBA98u;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const GLuint kClientSideElementArrayId = 0xFEDCBA99u;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of swap buffers allowed before waiting.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kMaxSwapBuffers = 2;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  GLES2Implementation(GLES2CmdHelper* helper,
189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                      ShareGroup* share_group,
190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                      TransferBufferInterface* transfer_buffer,
191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                      bool bind_generates_resource,
192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                      bool lose_context_when_out_of_memory,
193e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                      GpuControl* gpu_control);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GLES2Implementation();
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Initialize(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int starting_transfer_buffer_size,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int min_transfer_buffer_size,
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      unsigned int max_transfer_buffer_size,
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      unsigned int mapped_memory_limit);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The GLES2CmdHelper being used by this GLES2Implementation. You can use
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this to issue cmds at a lower level for certain kinds of optimization.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2CmdHelper* helper() const;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets client side generated errors.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum GetClientSideGLError();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Include the auto-generated part of this class. We split this because
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it means we can easily edit the non-auto generated parts right here in
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this file instead of having to edit some template or the code generator.
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  #include "gpu/command_buffer/client/gles2_implementation_autogen.h"
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DisableVertexAttribArray(GLuint index) OVERRIDE;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EnableVertexAttribArray(GLuint index) OVERRIDE;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetVertexAttribfv(
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint index, GLenum pname, GLfloat* params) OVERRIDE;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetVertexAttribiv(
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint index, GLenum pname, GLint* params) OVERRIDE;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // ContextSupport implementation.
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void Swap() OVERRIDE;
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void PartialSwapBuffers(const gfx::Rect& sub_buffer) OVERRIDE;
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetSwapBuffersCompleteCallback(
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::Closure& swap_buffers_complete_callback)
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          OVERRIDE;
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void ScheduleOverlayPlane(int plane_z_order,
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    gfx::OverlayTransform plane_transform,
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    unsigned overlay_texture_id,
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    const gfx::Rect& display_bounds,
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    const gfx::RectF& uv_rect) OVERRIDE;
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual GLuint InsertFutureSyncPointCHROMIUM() OVERRIDE;
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void RetireSyncPointCHROMIUM(GLuint sync_point) OVERRIDE;
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetProgramInfoCHROMIUMHelper(GLuint program, std::vector<int8>* result);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint GetAttribLocationHelper(GLuint program, const char* name);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint GetUniformLocationHelper(GLuint program, const char* name);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetActiveAttribHelper(
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint program, GLuint index, GLsizei bufsize, GLsizei* length,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint* size, GLenum* type, char* name);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetActiveUniformHelper(
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint program, GLuint index, GLsizei bufsize, GLsizei* length,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLint* size, GLenum* type, char* name);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FreeUnusedSharedMemory();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FreeEverything();
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // ContextSupport implementation.
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SignalSyncPoint(uint32 sync_point,
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                               const base::Closure& callback) OVERRIDE;
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  virtual void SignalQuery(uint32 query,
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                           const base::Closure& callback) OVERRIDE;
254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetSurfaceVisible(bool visible) OVERRIDE;
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetErrorMessageCallback(
257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GLES2ImplementationErrorMessageCallback* callback) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_message_callback_ = callback;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShareGroup* share_group() const {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return share_group_.get();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const Capabilities& capabilities() const {
266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return capabilities_;
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GpuControl* gpu_control() {
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return gpu_control_;
271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ShareGroupContextData* share_group_context_data() {
274a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return &share_group_context_data_;
275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class GLES2ImplementationTest;
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class VertexArrayObjectManager;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to track whether an extension is available
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ExtensionStatus {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kAvailableExtensionStatus,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kUnavailableExtensionStatus,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kUnknownExtensionStatus
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Base class for mapped resources.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MappedResource {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MappedResource(GLenum _access, int _shm_id, void* mem, unsigned int offset)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : access(_access),
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shm_id(_shm_id),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shm_memory(mem),
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          shm_offset(offset) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // access mode. Currently only GL_WRITE_ONLY is valid
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum access;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Shared memory ID for buffer.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int shm_id;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Address of shared memory
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* shm_memory;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Offset of shared memory
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int shm_offset;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to track mapped textures.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MappedTexture : public MappedResource {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MappedTexture(
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLenum access,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int shm_id,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void* shm_mem,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned int shm_offset,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLenum _target,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLint _level,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLint _xoffset,
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLint _yoffset,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLsizei _width,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLsizei _height,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLenum _format,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLenum _type)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : MappedResource(access, shm_id, shm_mem, shm_offset),
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target(_target),
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          level(_level),
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          xoffset(_xoffset),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          yoffset(_yoffset),
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          width(_width),
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          height(_height),
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          format(_format),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type(_type) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These match the arguments to TexSubImage2D.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint level;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint xoffset;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint yoffset;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei width;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizei height;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum format;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum type;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to track mapped buffers.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct MappedBuffer : public MappedResource {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MappedBuffer(
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLenum access,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int shm_id,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        void* shm_mem,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        unsigned int shm_offset,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLenum _target,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLintptr _offset,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GLsizeiptr _size)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : MappedResource(access, shm_id, shm_mem, shm_offset),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          target(_target),
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          offset(_offset),
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          size(_size) {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // These match the arguments to BufferSubData.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum target;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLintptr offset;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLsizeiptr size;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct TextureUnit {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TextureUnit()
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : bound_texture_2d(0),
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          bound_texture_cube_map(0),
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          bound_texture_external_oes(0) {}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // texture currently bound to this unit's GL_TEXTURE_2D with glBindTexture
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint bound_texture_2d;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // glBindTexture
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint bound_texture_cube_map;
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // glBindTexture
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GLuint bound_texture_external_oes;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks for single threaded access.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SingleThreadChecker {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    explicit SingleThreadChecker(GLES2Implementation* gles2_implementation);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~SingleThreadChecker();
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLES2Implementation* gles2_implementation_;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the value of the result.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  T GetResultAs() {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<T>(GetResultBuffer());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* GetResultBuffer();
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 GetResultShmId();
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 GetResultShmOffset();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
407a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool QueryAndCacheStaticState();
408a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
409a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Helpers used to batch synchronous GetIntergerv calls with other
410a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // synchronous calls.
411a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  struct GetMultipleIntegervState {
412a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GetMultipleIntegervState(const GLenum* pnames, GLuint pnames_count,
413a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                             GLint* results, GLsizeiptr results_size)
414a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)       : pnames(pnames),
415a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)         pnames_count(pnames_count),
416a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)         results(results),
417a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)         results_size(results_size)
418a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    { }
419a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // inputs
420a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const GLenum* pnames;
421a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GLuint pnames_count;
422a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // outputs
423a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GLint* results;
424a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GLsizeiptr results_size;
425a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // transfer buffer
426a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int num_results;
427a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int transfer_buffer_size_needed;
428a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    void* buffer;
429a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    void* results_buffer;
430a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
431a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  bool GetMultipleIntegervSetup(
432a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetMultipleIntegervState* state);
433a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void GetMultipleIntegervRequest(
434a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetMultipleIntegervState* state);
435a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void GetMultipleIntegervOnCompleted(
436a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetMultipleIntegervState* state);
437a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
438a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Helpers used to batch synchronous GetShaderPrecision calls with other
439a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // synchronous calls.
440a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  struct GetAllShaderPrecisionFormatsState {
441a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    GetAllShaderPrecisionFormatsState(
442a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        const GLenum (*precision_params)[2],
443a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        int precision_params_count)
444a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)        : precision_params(precision_params),
445a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)          precision_params_count(precision_params_count)
446a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    { }
447a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const GLenum (*precision_params)[2];
448a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int precision_params_count;
449a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int transfer_buffer_size_needed;
450a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    void* results_buffer;
451a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  };
452a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void GetAllShaderPrecisionFormatsSetup(
453a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetAllShaderPrecisionFormatsState* state);
454a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void GetAllShaderPrecisionFormatsRequest(
455a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetAllShaderPrecisionFormatsState* state);
456a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void GetAllShaderPrecisionFormatsOnCompleted(
457a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      GetAllShaderPrecisionFormatsState* state);
458a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lazily determines if GL_ANGLE_pack_reverse_row_order is available
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsAnglePackReverseRowOrderAvailable();
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsChromiumFramebufferMultisampleAvailable();
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsExtensionAvailableHelper(
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const char* extension, ExtensionStatus* status);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the GLError through our wrapper.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLenum GetGLError();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets our wrapper for the GLError.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetGLError(GLenum error, const char* function_name, const char* msg);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetGLErrorInvalidEnum(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const char* function_name, GLenum value, const char* label);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the last error and clears it. Useful for debugging.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& GetLastError() {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_error_;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for all commands to execute.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WaitForCmd();
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(gman): These bucket functions really seem like they belong in
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CommandBufferHelper (or maybe BucketHelper?). Unfortunately they need
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a transfer buffer to function which is currently managed by this class.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the contents of a bucket.
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBucketContents(uint32 bucket_id, std::vector<int8>* data);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the contents of a bucket.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBucketContents(uint32 bucket_id, const void* data, size_t size);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the contents of a bucket as a string.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBucketAsCString(uint32 bucket_id, const char* str);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the contents of a bucket as a string. Returns false if there is no
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // string available which is a separate case from the empty string.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBucketAsString(uint32 bucket_id, std::string* str);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the contents of a bucket as a string.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBucketAsString(uint32 bucket_id, const std::string& str);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if id is reserved.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsBufferReservedId(GLuint id);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFramebufferReservedId(GLuint id) { return false;  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsRenderbufferReservedId(GLuint id) { return false; }
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTextureReservedId(GLuint id) { return false; }
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsVertexArrayReservedId(GLuint id) { return false; }
508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool IsProgramReservedId(GLuint id) { return false; }
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool BindBufferHelper(GLenum target, GLuint texture);
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool BindFramebufferHelper(GLenum target, GLuint texture);
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool BindRenderbufferHelper(GLenum target, GLuint texture);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool BindTextureHelper(GLenum target, GLuint texture);
514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool BindVertexArrayOESHelper(GLuint array);
515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool UseProgramHelper(GLuint program);
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenBuffersHelper(GLsizei n, const GLuint* buffers);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenFramebuffersHelper(GLsizei n, const GLuint* framebuffers);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenRenderbuffersHelper(GLsizei n, const GLuint* renderbuffers);
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenTexturesHelper(GLsizei n, const GLuint* textures);
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenVertexArraysOESHelper(GLsizei n, const GLuint* arrays);
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenQueriesEXTHelper(GLsizei n, const GLuint* queries);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteBuffersHelper(GLsizei n, const GLuint* buffers);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteFramebuffersHelper(GLsizei n, const GLuint* framebuffers);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteRenderbuffersHelper(GLsizei n, const GLuint* renderbuffers);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteTexturesHelper(GLsizei n, const GLuint* textures);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeleteProgramHelper(GLuint program);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeleteShaderHelper(GLuint shader);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DeleteQueriesEXTHelper(GLsizei n, const GLuint* queries);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* arrays);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteBuffersStub(GLsizei n, const GLuint* buffers);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteFramebuffersStub(GLsizei n, const GLuint* framebuffers);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteRenderbuffersStub(GLsizei n, const GLuint* renderbuffers);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteTexturesStub(GLsizei n, const GLuint* textures);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteProgramStub(GLsizei n, const GLuint* programs);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteShaderStub(GLsizei n, const GLuint* shaders);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeleteVertexArraysOESStub(GLsizei n, const GLuint* arrays);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BufferDataHelper(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLsizeiptr size, const void* data, GLenum usage);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BufferSubDataHelper(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLintptr offset, GLsizeiptr size, const void* data);
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BufferSubDataHelperImpl(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLintptr offset, GLsizeiptr size, const void* data,
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScopedTransferBufferPtr* buffer);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  GLuint CreateImageCHROMIUMHelper(GLsizei width,
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   GLsizei height,
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   GLenum internalformat,
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   GLenum usage);
55390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void DestroyImageCHROMIUMHelper(GLuint image_id);
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void* MapImageCHROMIUMHelper(GLuint image_id);
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UnmapImageCHROMIUMHelper(GLuint image_id);
55690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void GetImageParameterivCHROMIUMHelper(
55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GLuint image_id, GLenum pname, GLint* params);
55890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper for GetVertexAttrib
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetVertexAttribHelper(GLuint index, GLenum pname, uint32* param);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint GetMaxValueInBufferCHROMIUMHelper(
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLuint buffer_id, GLsizei count, GLenum type, GLuint offset);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RestoreElementAndArrayBuffers(bool restore);
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RestoreArrayBuffer(bool restrore);
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pixels pointer should already account for unpack skip rows and skip
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pixels.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TexSubImage2DImpl(
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLsizei height, GLenum format, GLenum type, uint32 unpadded_row_size,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const void* pixels, uint32 pixels_padded_row_size, GLboolean internal,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ScopedTransferBufferPtr* buffer, uint32 buffer_padded_row_size);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helpers for query functions.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetHelper(GLenum pname, GLint* params);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBooleanvHelper(GLenum pname, GLboolean* params);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBufferParameterivHelper(GLenum target, GLenum pname, GLint* params);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetFloatvHelper(GLenum pname, GLfloat* params);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetFramebufferAttachmentParameterivHelper(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLenum attachment, GLenum pname, GLint* params);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetIntegervHelper(GLenum pname, GLint* params);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetProgramivHelper(GLuint program, GLenum pname, GLint* params);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetRenderbufferParameterivHelper(
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GLenum target, GLenum pname, GLint* params);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetShaderivHelper(GLuint shader, GLenum pname, GLint* params);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetTexParameterfvHelper(GLenum target, GLenum pname, GLfloat* params);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetTexParameterivHelper(GLenum target, GLenum pname, GLint* params);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GLubyte* GetStringHelper(GLenum name);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionAvailable(const char* ext);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caches certain capabilties state. Return true if cached.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetCapabilityState(GLenum cap, bool enabled);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IdHandlerInterface* GetIdHandler(int id_namespace) const;
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // IdAllocators for objects that can't be shared among contexts.
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // For now, used only for Queries. TODO(hj.r.chung) Should be added for
600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Framebuffer and Vertex array objects.
601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  IdAllocatorInterface* GetIdAllocator(int id_namespace) const;
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishHelper();
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void RunIfContextNotLost(const base::Closure& callback);
6068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void OnSwapBuffersComplete();
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Validate if an offset is valid, i.e., non-negative and fit into 32-bit.
6105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // If not, generate an approriate error, and return false.
6115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool ValidateOffset(const char* func, GLintptr offset);
6125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Validate if a size is valid, i.e., non-negative and fit into 32-bit.
6145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // If not, generate an approriate error, and return false.
6155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool ValidateSize(const char* func, GLsizeiptr offset);
6165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Remove the transfer buffer from the buffer tracker. For buffers used
6184ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // asynchronously the memory is free:ed if the upload has completed. For
6194ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // other buffers, the memory is either free:ed immediately or free:ed pending
6204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // a token.
6214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  void RemoveTransferBuffer(BufferTracker::Buffer* buffer);
6224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Returns true if the async upload token has passed.
6244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  //
6254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // NOTE: This will detect wrapped async tokens by checking if the most
6264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // significant  bit of async token to check is 1 but the last read is 0, i.e.
6274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // the uint32 wrapped.
6284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool HasAsyncUploadTokenPassed(uint32 token) const {
6294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    return async_upload_sync_->HasAsyncUploadTokenPassed(token);
6304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  }
6314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Get the next async upload token.
6334ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  uint32 NextAsyncUploadToken();
6344ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6354ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Ensure that the shared memory used for synchronizing async upload tokens
6364ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // has been mapped.
6374ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  //
6384ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Returns false on error, true on success.
6394ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  bool EnsureAsyncUploadSync();
6404ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6414ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Checks the last read asynchronously upload token and frees any unmanaged
6424ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // transfer buffer that has its async token passed.
6434ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  void PollAsyncUploads();
6444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
6454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Free every async upload buffer. If some async upload buffer is still in use
6464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // wait for them to finish before freeing.
6474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  void FreeAllAsyncUploadBuffers();
6484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool GetBoundPixelTransferBuffer(
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GLenum target, const char* function_name, GLuint* buffer_id);
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BufferTracker::Buffer* GetBoundPixelUnpackTransferBufferIfValid(
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GLuint buffer_id,
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const char* function_name, GLuint offset, GLsizei size);
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& GetLogPrefix() const;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(GL_CLIENT_FAIL_GL_ERRORS)
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckGLError();
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FailGLError(GLenum error);
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void CheckGLError() { }
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FailGLError(GLenum /* error */) { }
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2Util util_;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLES2CmdHelper* helper_;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TransferBufferInterface* transfer_buffer_;
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string last_error_;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DebugMarkerManager debug_marker_manager_;
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string this_in_hex_;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<int32> swap_buffers_tokens_;
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<int32> rate_limit_tokens_;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionStatus angle_pack_reverse_row_order_status_;
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionStatus chromium_framebuffer_multisample_;
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLStaticState static_state_;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClientContextState state_;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pack alignment as last set by glPixelStorei
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint pack_alignment_;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unpack alignment as last set by glPixelStorei
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint unpack_alignment_;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unpack yflip as last set by glPixelstorei
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool unpack_flip_y_;
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unpack row length as last set by glPixelStorei
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint unpack_row_length_;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unpack skip rows as last set by glPixelStorei
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint unpack_skip_rows_;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // unpack skip pixels as last set by glPixelStorei
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLint unpack_skip_pixels_;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pack reverse row order as last set by glPixelstorei
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool pack_reverse_row_order_;
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<TextureUnit[]> texture_units_;
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 0 to gl_state_.max_combined_texture_image_units.
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint active_texture_unit_;
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint bound_framebuffer_;
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint bound_read_framebuffer_;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint bound_renderbuffer_;
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The program in use by glUseProgram
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint current_program_;
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The currently bound array buffer.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint bound_array_buffer_id_;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The currently bound pixel transfer buffers.
718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GLuint bound_pixel_pack_transfer_buffer_id_;
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint bound_pixel_unpack_transfer_buffer_id_;
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // The current asynchronous pixel buffer upload token.
7224ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  uint32 async_upload_token_;
7234ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7244ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // The shared memory used for synchronizing asynchronous upload tokens.
7254ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  AsyncUploadSync* async_upload_sync_;
7264ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  int32 async_upload_sync_shm_id_;
7274ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  unsigned int async_upload_sync_shm_offset_;
7284ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7294ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  // Unmanaged pixel transfer buffer memory pending asynchronous upload token.
7304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  typedef std::list<std::pair<void*, uint32> > DetachedAsyncUploadMemoryList;
7314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  DetachedAsyncUploadMemoryList detached_async_upload_memory_;
7324ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Client side management for vertex array objects. Needed to correctly
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // track client side arrays.
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<VertexArrayObjectManager> vertex_array_object_manager_;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint reserved_ids_[2];
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Current GL error bits.
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 error_bits_;
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether or not to print debugging info.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool debug_;
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // When true, the context is lost when a GL_OUT_OF_MEMORY error occurs.
746e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool lose_context_when_out_of_memory_;
747e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to check for single threaded access.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int use_count_;
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map of GLenum to Strings for glGetString.  We need to cache these because
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pointer passed back to the client has to remain valid for eternity.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<uint32, std::set<std::string> > GLStringMap;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLStringMap gl_strings_;
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar cache for glGetRequestableExtensionsCHROMIUM. We don't
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have an enum for this so handle it separately.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> requestable_extensions_set_;
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<const void*, MappedBuffer> MappedBufferMap;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MappedBufferMap mapped_buffers_;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<const void*, MappedTexture> MappedTextureMap;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MappedTextureMap mapped_textures_;
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MappedMemoryManager> mapped_memory_;
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ShareGroup> share_group_;
769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ShareGroupContextData share_group_context_data_;
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QueryTracker> query_tracker_;
7725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef std::map<GLuint, QueryTracker::Query*> QueryMap;
7735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QueryMap current_queries_;
774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<IdAllocatorInterface> query_id_allocator_;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<BufferTracker> buffer_tracker_;
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
77890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<GpuMemoryBufferTracker> gpu_memory_buffer_tracker_;
77990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GLES2ImplementationErrorMessageCallback* error_message_callback_;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<std::string> current_trace_name_;
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GpuControl* gpu_control_;
78590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Capabilities capabilities_;
787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::Closure swap_buffers_complete_callback_;
789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  base::WeakPtrFactory<GLES2Implementation> weak_ptr_factory_;
7918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GLES2Implementation);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GLES2Implementation::GetBufferParameterivHelper(
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* target */, GLenum /* pname */, GLint* /* params */) {
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GLES2Implementation::GetFramebufferAttachmentParameterivHelper(
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* target */,
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* attachment */,
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* pname */,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLint* /* params */) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GLES2Implementation::GetRenderbufferParameterivHelper(
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* target */, GLenum /* pname */, GLint* /* params */) {
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GLES2Implementation::GetShaderivHelper(
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint /* shader */, GLenum /* pname */, GLint* /* params */) {
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GLES2Implementation::GetTexParameterfvHelper(
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* target */, GLenum /* pname */, GLfloat* /* params */) {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline bool GLES2Implementation::GetTexParameterivHelper(
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLenum /* target */, GLenum /* pname */, GLint* /* params */) {
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gles2
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gpu
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_H_
832