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